UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ShaderParameterStruct.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 ShaderParameterStruct.h: API to submit all shader parameters in single function call.
5=============================================================================*/
6
7#pragma once
8
9#include "Containers/Array.h"
10#include "CoreMinimal.h"
11#include "HAL/Platform.h"
13#include "RHI.h"
14#include "RHIDefinitions.h"
17#include "Shader.h"
18
19class FRHICommandList;
23class FRHIResource;
27
28template <typename FParameterStruct>
29void BindForLegacyShaderParameters(FShader* Shader, int32 PermutationId, const FShaderParameterMap& ParameterMap, bool bShouldBindEverything = false)
30{
31 Shader->Bindings.BindForLegacyShaderParameters(Shader, PermutationId, ParameterMap, *FParameterStruct::FTypeInfo::GetStructMetadata(), bShouldBindEverything);
32}
33
50#define SHADER_USE_PARAMETER_STRUCT_INTERNAL(ShaderClass, ShaderParentClass, bShouldBindEverything) \
51 ShaderClass() = default; \
52 ShaderClass(const ShaderMetaType::CompiledShaderInitializerType& Initializer) \
53 : ShaderParentClass(Initializer) \
54 { \
55 BindForLegacyShaderParameters<FParameters>(this, Initializer.PermutationId, Initializer.ParameterMap, bShouldBindEverything); \
56 }
57
58#define SHADER_ROOT_PARAMETERS_SIGNATURE() \
59 static inline const FShaderParametersMetadata* GetRootParametersMetadata() { return FParameters::FTypeInfo::GetStructMetadata(); }
60
61// TODO(RDG): would not even need ShaderParentClass anymore. And in fact should not so Bindings.Bind() is not being called twice.
62#define SHADER_USE_PARAMETER_STRUCT(ShaderClass, ShaderParentClass) \
63 SHADER_USE_PARAMETER_STRUCT_INTERNAL(ShaderClass, ShaderParentClass, true) \
64 SHADER_ROOT_PARAMETERS_SIGNATURE()
65
69#define SHADER_USE_PARAMETER_STRUCT_WITH_LEGACY_BASE(ShaderClass, ShaderParentClass) \
70 SHADER_USE_PARAMETER_STRUCT_INTERNAL(ShaderClass, ShaderParentClass, false)
71
75#define SHADER_USE_PARAMETER_STRUCT_MIXED(ShaderClass, ShaderParentClass) \
76 SHADER_USE_PARAMETER_STRUCT_INTERNAL(ShaderClass, ShaderParentClass, false) \
77 SHADER_ROOT_PARAMETERS_SIGNATURE()
78
79#define SHADER_USE_ROOT_PARAMETER_STRUCT(ShaderClass, ShaderParentClass) \
80 SHADER_ROOT_PARAMETERS_SIGNATURE() \
81 ShaderClass() = default; \
82 ShaderClass(const ShaderMetaType::CompiledShaderInitializerType& Initializer) \
83 : ShaderParentClass(Initializer) \
84 { \
85 this->Bindings.BindForRootShaderParameters(this, Initializer.PermutationId, Initializer.ParameterMap); \
86 }
87
89inline FRHIResource* GetShaderParameterResourceRHI(const void* Contents, uint16 MemberOffset, EUniformBufferBaseType MemberType)
90{
91 checkSlow(Contents);
93 {
94 return nullptr;
95 }
96
97 const uint8* MemberPtr = (const uint8*)Contents + MemberOffset;
98
100 {
101 const FRDGResource* ResourcePtr = *reinterpret_cast<const FRDGResource* const*>(MemberPtr);
102 return ResourcePtr ? ResourcePtr->GetRHI() : nullptr;
103 }
104 else
105 {
106 return *reinterpret_cast<FRHIResource* const*>(MemberPtr);
107 }
108}
109
111#if DO_CHECK
113#else
114inline void ValidateShaderParameterResourcesRHI(const void* Contents, const FRHIUniformBufferLayout& Layout) {}
115#endif
116
117
120
122#if DO_CHECK
124#else
126#endif
127
128template<typename TShaderClass>
129inline void ValidateShaderParameters(const TShaderRef<TShaderClass>& Shader, const typename TShaderClass::FParameters& Parameters)
130{
131 return ValidateShaderParameters(Shader, TShaderClass::FParameters::FTypeInfo::GetStructMetadata(), &Parameters);
132}
133
134template<typename TParameterType>
136{
137 for (const TParameterType& Parameter : InParameters)
138 {
139 if (Parameter.BaseType == UBMT_UAV ||
140 Parameter.BaseType == UBMT_RDG_TEXTURE_UAV ||
141 Parameter.BaseType == UBMT_RDG_BUFFER_UAV)
142 {
143 BatchedUnbinds.UnsetUAV(GetParameterIndex(Parameter));
144 }
145 }
146}
147
148template<typename TParameterType>
150{
151 for (const TParameterType& Parameter : InParameters)
152 {
153 if (Parameter.BaseType == UBMT_SRV ||
154 Parameter.BaseType == UBMT_RDG_TEXTURE_SRV ||
155 Parameter.BaseType == UBMT_RDG_TEXTURE_NON_PIXEL_SRV ||
156 Parameter.BaseType == UBMT_RDG_BUFFER_SRV)
157 {
158 BatchedUnbinds.UnsetSRV(GetParameterIndex(Parameter));
159 }
160 }
161}
162
164{
165 CollectUAVsToUnset(BatchedUnbinds, Bindings.ResourceParameters);
166}
167
169{
170 CollectSRVsToUnset(BatchedUnbinds, Bindings.ResourceParameters);
171}
172
173template<typename TShaderClass>
175{
176 // TODO(RDG): Once all shader sets their parameter through this, can refactor RHI so all UAVs of a shader get unset through a single RHI function call.
177 const FShaderParameterBindings& Bindings = Shader->Bindings;
178
179 checkf(Bindings.RootParameterBufferIndex == FShaderParameterBindings::kInvalidBufferIndex, TEXT("Can't use UnsetShaderUAVs() for root parameter buffer index."));
180
182}
183
184template<typename TShaderClass>
186{
187 // TODO(RDG): Once all shader sets their parameter through this, can refactor RHI so all SRVs of a shader get unset through a single RHI function call.
188 const FShaderParameterBindings& Bindings = Shader->Bindings;
189
190 checkf(Bindings.RootParameterBufferIndex == FShaderParameterBindings::kInvalidBufferIndex, TEXT("Can't use UnsetShaderSRVs() for root parameter buffer index."));
191
193}
194
196template<typename TRHICmdList, typename TShaderClass>
198{
199 if (RHICmdList.NeedsShaderUnbinds())
200 {
201 FRHIBatchedShaderUnbinds& BatchedUnbinds = RHICmdList.GetScratchShaderUnbinds();
203 RHICmdList.SetBatchedShaderUnbinds(ShaderRHI, BatchedUnbinds);
204 }
205}
206
208template<typename TRHICmdList, typename TShaderClass>
210{
211 if (RHICmdList.NeedsShaderUnbinds())
212 {
213 FRHIBatchedShaderUnbinds& BatchedUnbinds = RHICmdList.GetScratchShaderUnbinds();
215 RHICmdList.SetBatchedShaderUnbinds(ShaderRHI, BatchedUnbinds);
216 }
217}
218
220template<typename TRHICmdList, typename TShaderClass>
222{
223 if (RHICmdList.NeedsShaderUnbinds())
224 {
225 FRHIBatchedShaderUnbinds& BatchedUnbinds = RHICmdList.GetScratchShaderUnbinds();
227 RHICmdList.SetBatchedShaderUnbinds(ShaderRHI, BatchedUnbinds);
228 }
229}
230
235 const void* ParametersData
236);
237
238template<typename TParameters>
246
249 const FShaderParameterBindings& Bindings,
251 const void* ParametersData);
252
253template<typename TShaderClass>
258 const typename TShaderClass::FParameters& Parameters)
259{
261
262#if RHI_RAYTRACING
263 if (IsRayTracingShaderFrequency(Shader->GetFrequency()))
264 {
266 }
267 else
268#endif // RHI_RAYTRACING
269 {
271 }
272}
273
274template<typename TShaderClass>
275inline void SetShaderParameters(FRHIBatchedShaderParameters& BatchedParameters, const TShaderRef<TShaderClass>& Shader, const typename TShaderClass::FParameters& Parameters)
276{
277 const FShaderParametersMetadata* ParametersMetadata = TShaderClass::FParameters::FTypeInfo::GetStructMetadata();
279}
280
282 FRHIComputeCommandList& RHICmdList,
284 const FShaderParameterBindings& Bindings,
286 const void* ParametersData);
287
289 FRHICommandList& RHICmdList,
291 const FShaderParameterBindings& Bindings,
293 const void* ParametersData);
294
296 FRHICommandList& RHICmdList,
298 const FShaderParameterBindings& Bindings,
300 const void* ParametersData);
301
302template<typename TRHICmdList, typename TShaderClass, typename TShaderRHI>
304 TRHICmdList& RHICmdList,
308 const typename TShaderClass::FParameters& Parameters)
309{
311
312 // TODO(RDG): Once all shader sets their parameter through this, can refactor RHI so all shader parameters get sets through a single RHI function call.
313
314 SetShaderParameters(RHICmdList, ShaderRHI, Shader->Bindings, ParametersMetadata, &Parameters);
315}
316
317template<typename TRHICmdList, typename TShaderClass, typename TShaderRHI>
318inline void SetShaderParameters(TRHICmdList& RHICmdList, const TShaderRef<TShaderClass>& Shader, TShaderRHI* ShaderRHI, const typename TShaderClass::FParameters& Parameters)
319{
320 const FShaderParametersMetadata* ParametersMetadata = TShaderClass::FParameters::FTypeInfo::GetStructMetadata();
321 SetShaderParameters(RHICmdList, Shader, ShaderRHI, ParametersMetadata, Parameters);
322}
323
324#if RHI_RAYTRACING
325
333 const FShaderParameterBindings& Bindings,
335 const void* ParametersData);
336
337PRAGMA_DISABLE_DEPRECATION_WARNINGS // Allow FRayTracingShaderBindingsWriter
338
341 const FShaderParameterBindings& Bindings,
343 const void* ParametersData);
344
346template<typename TShaderClass>
347void SetShaderParameters(FRayTracingShaderBindingsWriter& RTBindingsWriter, const TShaderRef<TShaderClass>& Shader, const typename TShaderClass::FParameters& Parameters)
348{
349 const FShaderParametersMetadata* ParametersMetadata = TShaderClass::FParameters::FTypeInfo::GetStructMetadata();
350
352
353 checkf(Shader->Bindings.Parameters.Num() == 0, TEXT("Ray tracing shader should use SHADER_USE_ROOT_PARAMETER_STRUCT() to passdown the cbuffer layout to the shader compiler."));
354
356}
357
359
360#endif // RHI_RAYTRACING
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define PRAGMA_ENABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:12
#define PRAGMA_DISABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:8
EUniformBufferBaseType
Definition RHIDefinitions.h:634
@ UBMT_SRV
Definition RHIDefinitions.h:648
@ UBMT_UAV
Definition RHIDefinitions.h:649
@ UBMT_RDG_BUFFER_UAV
Definition RHIDefinitions.h:662
@ UBMT_RDG_TEXTURE_NON_PIXEL_SRV
Definition RHIDefinitions.h:657
@ UBMT_RDG_TEXTURE_SRV
Definition RHIDefinitions.h:656
@ UBMT_RDG_BUFFER_SRV
Definition RHIDefinitions.h:661
@ UBMT_RDG_TEXTURE_UAV
Definition RHIDefinitions.h:658
bool IsRayTracingShaderFrequency(EShaderFrequency Frequency)
Definition RHIDefinitions.h:1679
bool IsShaderParameterTypeIgnoredByRHI(EUniformBufferBaseType BaseType)
Definition RHIDefinitions.h:1612
bool IsRDGResourceReferenceShaderParameterType(EUniformBufferBaseType BaseType)
Definition RHIDefinitions.h:1575
void CollectUAVsToUnset(FRHIBatchedShaderUnbinds &BatchedUnbinds, const TMemoryImageArray< TParameterType > &InParameters)
Definition ShaderParameterStruct.h:135
RENDERCORE_API void SetAllShaderParametersAsBindless(FRHIBatchedShaderParameters &BatchedParameters, const FShaderParametersMetadata *ParametersMetadata, const void *ParametersData)
Definition ShaderParameterStruct.cpp:746
RENDERCORE_API void SetShaderParameters(FRHIBatchedShaderParameters &BatchedParameters, const FShaderParameterBindings &Bindings, const FShaderParametersMetadata *ParametersMetadata, const void *ParametersData)
Definition ShaderParameterStruct.cpp:883
void UnsetShaderSRVs(FRHIBatchedShaderUnbinds &BatchedUnbinds, const FShaderParameterBindings &Bindings)
Definition ShaderParameterStruct.h:168
RENDERCORE_API void EmitNullShaderParameterFatalError(const TShaderRef< FShader > &Shader, const FShaderParametersMetadata *ParametersMetadata, uint16 MemberOffset)
Definition ShaderParameterStruct.cpp:467
void CollectSRVsToUnset(FRHIBatchedShaderUnbinds &BatchedUnbinds, const TMemoryImageArray< TParameterType > &InParameters)
Definition ShaderParameterStruct.h:149
void UnsetShaderUAVs(FRHIBatchedShaderUnbinds &BatchedUnbinds, const FShaderParameterBindings &Bindings)
Definition ShaderParameterStruct.h:163
void ValidateShaderParameterResourcesRHI(const void *Contents, const FRHIUniformBufferLayout &Layout)
Definition ShaderParameterStruct.h:114
FRHIResource * GetShaderParameterResourceRHI(const void *Contents, uint16 MemberOffset, EUniformBufferBaseType MemberType)
Definition ShaderParameterStruct.h:89
void ValidateShaderParameters(const TShaderRef< FShader > &Shader, const FShaderParametersMetadata *ParametersMetadata, const void *ParametersData)
Definition ShaderParameterStruct.h:125
void BindForLegacyShaderParameters(FShader *Shader, int32 PermutationId, const FShaderParameterMap &ParameterMap, bool bShouldBindEverything=false)
Definition ShaderParameterStruct.h:29
int16 GetParameterIndex(const FShaderParameterBindings::FResourceParameter &Parameter)
Definition Shader.h:802
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
Definition RenderGraphResources.h:131
FRHIResource * GetRHI() const
Definition RenderGraphResources.h:149
Definition RHICommandList.h:3819
Definition RHICommandList.h:2735
Definition RHIResources.h:1018
Definition RHIResources.h:947
Definition RHIResources.h:54
Definition Shader.h:746
static constexpr uint16 kInvalidBufferIndex
Definition Shader.h:783
Definition ShaderCore.h:323
Definition ShaderParameterMetadata.h:136
Definition Shader.h:829
Definition Array.h:670
Definition Shader.h:1021
Definition RHIShaderParameters.h:241
Definition RHIShaderParameters.h:374
Definition RHIResources.h:1150