UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ShaderParameterUtils.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 ShaderParameters.h: Shader parameter inline definitions.
5=============================================================================*/
6
7#pragma once
8
9#include "CoreMinimal.h"
10#include "RHI.h"
11#include "RHIUtilities.h"
12#include "ShaderParameters.h"
13#include "ShaderCore.h"
14#include "Misc/App.h"
15
17
18template<typename TBufferStruct> class TUniformBuffer;
19template<typename TBufferStruct> class TUniformBufferRef;
20template<typename ShaderType, typename PointerTableType> class TShaderRefBase;
22
23template<class ParameterType>
26 , const FShaderParameter& Parameter
27 , const ParameterType& Value
28 , uint32 ElementIndex = 0
29)
30{
31 // This will trigger if the parameter was not serialized
32 checkSlow(Parameter.IsInitialized());
33
34 static_assert(!TIsPointer<ParameterType>::Value, "Passing by value is not valid.");
35
37 const uint32 ElementByteOffset = ElementIndex * AlignedTypeSize;
38 const int32 NumBytesToSet = FMath::Min<int32>(sizeof(ParameterType), static_cast<int32>(Parameter.GetNumBytes()) - ElementByteOffset);
39
40 if (NumBytesToSet > 0)
41 {
42 BatchedParameters.SetShaderParameter(
43 Parameter.GetBufferIndex(),
44 Parameter.GetBaseIndex() + ElementByteOffset,
46 &Value);
47 }
48}
49
50template<class ParameterType>
53 , const FShaderParameter& Parameter
54 , const ParameterType* Values
55 , uint32 NumElements
56 , uint32 ElementIndex = 0
57)
58{
60 const uint32 ElementByteOffset = ElementIndex * AlignedTypeSize;
61 const int32 NumBytesToSet = FMath::Min<int32>(NumElements * AlignedTypeSize, Parameter.GetNumBytes() - ElementByteOffset);
62
63 // This will trigger if the parameter was not serialized
64 checkSlow(Parameter.IsInitialized());
65
66 if (NumBytesToSet > 0)
67 {
68 BatchedParameters.SetShaderParameter(
69 Parameter.GetBufferIndex(),
70 Parameter.GetBaseIndex() + ElementByteOffset,
72 Values
73 );
74 }
75}
76
78{
79 if (Parameter.IsBound())
80 {
81#if PLATFORM_SUPPORTS_BINDLESS_RENDERING
82 if (Parameter.GetType() == EShaderParameterType::BindlessSRV)
83 {
84 BatchedParameters.SetBindlessTexture(Parameter.GetBaseIndex(), TextureRHI);
85 }
86 else
87#endif
88 {
89 BatchedParameters.SetShaderTexture(Parameter.GetBaseIndex(), TextureRHI);
90 }
91 }
92}
93
95{
96 if (Parameter.IsBound())
97 {
98#if PLATFORM_SUPPORTS_BINDLESS_RENDERING
99 if (Parameter.GetType() == EShaderParameterType::BindlessSampler)
100 {
101 BatchedParameters.SetBindlessSampler(Parameter.GetBaseIndex(), SamplerStateRHI);
102 }
103 else
104#endif
105 {
106 BatchedParameters.SetShaderSampler(Parameter.GetBaseIndex(), SamplerStateRHI);
107 }
108 }
109}
110
113 const FShaderResourceParameter& TextureParameter,
115 FRHISamplerState* SamplerStateRHI,
116 FRHITexture* TextureRHI
117)
118{
119 SetTextureParameter(BatchedParameters, TextureParameter, TextureRHI);
121}
122
125 const FShaderResourceParameter& TextureParameter,
127 const FTexture* Texture
128)
129{
130 if (TextureParameter.IsBound())
131 {
132 Texture->LastRenderTime = FApp::GetCurrentTime();
133 }
134
135 SetTextureParameter(BatchedParameters, TextureParameter, Texture->TextureRHI);
137}
138
140{
141 if (Parameter.IsBound())
142 {
143#if PLATFORM_SUPPORTS_BINDLESS_RENDERING
144 if (Parameter.GetType() == EShaderParameterType::BindlessSRV)
145 {
146 BatchedParameters.SetBindlessResourceView(Parameter.GetBaseIndex(), SRV);
147 }
148 else
149#endif
150 {
151 BatchedParameters.SetShaderResourceViewParameter(Parameter.GetBaseIndex(), SRV);
152 }
153 }
154}
155
157{
158 if (Parameter.IsBound())
159 {
160#if PLATFORM_SUPPORTS_BINDLESS_RENDERING
161 if (Parameter.GetType() == EShaderParameterType::BindlessUAV)
162 {
163 BatchedParameters.SetBindlessUAV(Parameter.GetBaseIndex(), UAV);
164 }
165 else
166#endif
167 {
168 BatchedParameters.SetUAVParameter(Parameter.GetBaseIndex(), UAV);
169 }
170 }
171}
172
174{
175 if (Parameter.IsBound())
176 {
177#if PLATFORM_SUPPORTS_BINDLESS_RENDERING
178 if (Parameter.GetType() == EShaderParameterType::BindlessSRV)
179 {
180 // We don't need to clear Bindless views
181 }
182 else
183#endif
184 {
185 BatchedUnbinds.UnsetSRV(Parameter.GetBaseIndex());
186 }
187 }
188}
189
191{
192 if (Parameter.IsBound())
193 {
194#if PLATFORM_SUPPORTS_BINDLESS_RENDERING
195 if (Parameter.GetType() == EShaderParameterType::BindlessSRV)
196 {
197 // We don't need to clear Bindless views
198 }
199 else
200#endif
201 {
202 BatchedUnbinds.UnsetUAV(Parameter.GetBaseIndex());
203 }
204 }
205}
206
208{
209 // This will trigger if the parameter was not serialized
210 checkSlow(Parameter.IsInitialized());
211 // If it is bound, we must set it so something valid
212 checkSlow(!Parameter.IsBound() || UniformBufferRHI);
213 if (Parameter.IsBound())
214 {
215 BatchedParameters.SetShaderUniformBuffer(Parameter.GetBaseIndex(), UniformBufferRHI);
216 }
217}
218
219template<typename TBufferStruct>
221{
222 // This will trigger if the parameter was not serialized
223 checkSlow(Parameter.IsInitialized());
224 // If it is bound, we must set it so something valid
225 checkSlow(!Parameter.IsBound() || IsValidRef(UniformBufferRef));
226 if (Parameter.IsBound())
227 {
229 }
230}
231
232template<typename TBufferStruct>
234{
235 // This will trigger if the parameter was not serialized
236 checkSlow(Parameter.IsInitialized());
237 // If it is bound, we must set it so something valid
238 checkSlow(!Parameter.IsBound() || UniformBuffer.GetUniformBufferRHI());
239 if (Parameter.IsBound())
240 {
241 SetUniformBufferParameter(BatchedParameters, Parameter, UniformBuffer.GetUniformBufferRHI());
242 }
243}
244
245template<typename TBufferStruct>
247{
248 // This will trigger if the parameter was not serialized
249 checkSlow(Parameter.IsInitialized());
250 if (Parameter.IsBound())
251 {
252 FUniformBufferRHIRef UniformBufferRef = RHICreateUniformBuffer(&UniformBufferValue, &TBufferStruct::FTypeInfo::GetStructMetadata()->GetLayout(), UniformBuffer_SingleDraw);
254 }
255}
256
257// Utility to set a single shader value on a shader. Should only be used if a shader requires only a single value.
258template<typename TRHICmdList, typename TShaderTypeRHI, class ParameterType>
260 TRHICmdList& RHICmdList
262 , const FShaderParameter& Parameter
263 , const ParameterType& Value
264)
265{
266 FRHIBatchedShaderParameters& BatchedParameters = RHICmdList.GetScratchShaderParameters();
268 RHICmdList.SetBatchedShaderParameters(InShaderRHI, BatchedParameters);
269}
270
271// Mixed mode binding utilities
272
274template<typename TShaderType, typename... TArguments>
278 const typename TShaderType::FParameters& Parameters,
280{
281 // New Style first
283
284 // Legacy second
286}
287
289template<typename TRHICmdList, typename TShaderType, typename TShaderTypeRHI, typename... TArguments>
291 TRHICmdList& RHICmdList,
294 const typename TShaderType::FParameters& Parameters,
296{
297 FRHIBatchedShaderParameters& BatchedParameters = RHICmdList.GetScratchShaderParameters();
299 RHICmdList.SetBatchedShaderParameters(InShaderRHI, BatchedParameters);
300}
301
303template<typename TRHICmdList, typename TShaderType, typename... TArguments>
304inline void SetShaderParametersMixedVS(TRHICmdList& RHICmdList, const TShaderRef<TShaderType>& InShader, const typename TShaderType::FParameters& Parameters, TArguments&&... InArguments)
305{
306 SetShaderParametersMixed(RHICmdList, InShader, InShader.GetVertexShader(), Parameters, Forward<TArguments>(InArguments)...);
307}
308
310template<typename TRHICmdList, typename TShaderType, typename... TArguments>
311inline void SetShaderParametersMixedMS(TRHICmdList& RHICmdList, const TShaderRef<TShaderType>& InShader, const typename TShaderType::FParameters& Parameters, TArguments&&... InArguments)
312{
313 SetShaderParametersMixed(RHICmdList, InShader, InShader.GetMeshShader(), Parameters, Forward<TArguments>(InArguments)...);
314}
315
317template<typename TRHICmdList, typename TShaderType, typename... TArguments>
318inline void SetShaderParametersMixedAS(TRHICmdList& RHICmdList, const TShaderRef<TShaderType>& InShader, const typename TShaderType::FParameters& Parameters, TArguments&&... InArguments)
319{
320 SetShaderParametersMixed(RHICmdList, InShader, InShader.GetAmplificationShader(), Parameters, Forward<TArguments>(InArguments)...);
321}
322
324template<typename TRHICmdList, typename TShaderType, typename... TArguments>
325inline void SetShaderParametersMixedPS(TRHICmdList& RHICmdList, const TShaderRef<TShaderType>& InShader, const typename TShaderType::FParameters& Parameters, TArguments&&... InArguments)
326{
327 SetShaderParametersMixed(RHICmdList, InShader, InShader.GetPixelShader(), Parameters, Forward<TArguments>(InArguments)...);
328}
329
331template<typename TRHICmdList, typename TShaderType, typename... TArguments>
332inline void SetShaderParametersMixedGS(TRHICmdList& RHICmdList, const TShaderRef<TShaderType>& InShader, const typename TShaderType::FParameters& Parameters, TArguments&&... InArguments)
333{
334 SetShaderParametersMixed(RHICmdList, InShader, InShader.GetGeometryShader(), Parameters, Forward<TArguments>(InArguments)...);
335}
336
338template<typename TRHICmdList, typename TShaderType, typename... TArguments>
339inline void SetShaderParametersMixedCS(TRHICmdList& RHICmdList, const TShaderRef<TShaderType>& InShader, const typename TShaderType::FParameters& Parameters, TArguments&&... InArguments)
340{
341 SetShaderParametersMixed(RHICmdList, InShader, InShader.GetComputeShader(), Parameters, Forward<TArguments>(InArguments)...);
342}
343
344// Legacy binding utilities
345
347template<typename TRHICmdList, typename TShaderType, typename TShaderTypeRHI, typename... TArguments>
349{
350 FRHIBatchedShaderParameters& BatchedParameters = RHICmdList.GetScratchShaderParameters();
352 RHICmdList.SetBatchedShaderParameters(InShaderRHI, BatchedParameters);
353}
354
356template<typename TRHICmdList, typename TShaderType, typename... TArguments>
361
363template<typename TRHICmdList, typename TShaderType, typename... TArguments>
368
370template<typename TRHICmdList, typename TShaderType, typename... TArguments>
375
377template<typename TRHICmdList, typename TShaderType, typename... TArguments>
382
384template<typename TRHICmdList, typename TShaderType, typename... TArguments>
389
391template<typename TRHICmdList, typename TShaderType, typename... TArguments>
396
398template<typename TRHICmdList, typename TShaderType>
400{
401 if (RHICmdList.NeedsShaderUnbinds())
402 {
403 FRHIBatchedShaderUnbinds& BatchedUnbinds = RHICmdList.GetScratchShaderUnbinds();
404 InShader->UnsetParameters(BatchedUnbinds);
405 RHICmdList.SetBatchedShaderUnbinds(InShader.GetPixelShader(), BatchedUnbinds);
406 }
407}
408
410template<typename TRHICmdList, typename TShaderType>
412{
413 if (RHICmdList.NeedsShaderUnbinds())
414 {
415 FRHIBatchedShaderUnbinds& BatchedUnbinds = RHICmdList.GetScratchShaderUnbinds();
416 InShader->UnsetParameters(BatchedUnbinds);
417 RHICmdList.SetBatchedShaderUnbinds(InShader.GetComputeShader(), BatchedUnbinds);
418 }
419}
420
421// LWC_TODO: Setting guards to catch attempts to pass a type with double components. Could just convert these to the correct type internally, but would prefer to catch potential issues + optimize where possible.
422#define GUARD_SETSHADERVALUE(_TYPE) \
423template<typename ShaderRHIParamRef, typename TRHICmdList> \
424void SetShaderValue( TRHICmdList& RHICmdList, const ShaderRHIParamRef& Shader, const FShaderParameter& Parameter, \
425 const _TYPE##d& Value, uint32 ElementIndex = 0) { static_assert(sizeof(ShaderRHIParamRef) == 0, "Passing unsupported "#_TYPE"d. Requires "#_TYPE"f"); } \
426template<typename ShaderRHIParamRef> \
427void SetShaderValueOnContext(IRHICommandContext& RHICmdListContext, const ShaderRHIParamRef& Shader, const FShaderParameter& Parameter, \
428 const _TYPE##d& Value, uint32 ElementIndex = 0) { static_assert(sizeof(ShaderRHIParamRef) == 0, "Passing unsupported "#_TYPE"d. Requires "#_TYPE"f"); } \
429template<typename ShaderRHIParamRef, typename TRHICmdList> \
430void SetShaderValueArray(TRHICmdList& RHICmdList, const ShaderRHIParamRef& Shader, const FShaderParameter& Parameter, \
431 const _TYPE##d* Values, uint32 NumElements, uint32 BaseElementIndex = 0) { static_assert(sizeof(ShaderRHIParamRef) == 0, "Passing unsupported "#_TYPE"d*. Requires "#_TYPE"f*"); } \
432
433// Primary
434GUARD_SETSHADERVALUE(FMatrix44)
440// Secondary
443
444
447template<typename TRHIShader, typename TRHICmdList>
448inline void SetTextureParameter(TRHICmdList& RHICmdList, TRHIShader* Shader, const FShaderResourceParameter& TextureParameter, const FShaderResourceParameter& SamplerParameter, FRHISamplerState* SamplerStateRHI, FRHITexture* TextureRHI)
449{
450 FRHIBatchedShaderParameters& BatchedParameters = RHICmdList.GetScratchShaderParameters();
451 SetTextureParameter(BatchedParameters, TextureParameter, SamplerParameter, SamplerStateRHI, TextureRHI);
452 RHICmdList.SetBatchedShaderParameters(Shader, BatchedParameters);
453}
#define checkSlow(expr)
Definition AssertionMacros.h:332
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
FUniformBufferRHIRef RHICreateUniformBuffer(const void *Contents, const FRHIUniformBufferLayout *Layout, EUniformBufferUsage Usage, EUniformBufferValidation Validation=EUniformBufferValidation::ValidateResources)
Definition DynamicRHI.h:1231
bool IsValidRef(const FVertexBufferAndSRV &Buffer)
Definition GPUSkinVertexFactory.h:92
@ UniformBuffer_SingleDraw
Definition RHIDefinitions.h:538
#define SHADER_PARAMETER_ARRAY_ELEMENT_ALIGNMENT
Definition RHIDefinitions.h:28
void SetShaderParameters(FRHIBatchedShaderParameters &BatchedParameters, const FShaderParameterBindings &Bindings, const FShaderParametersMetadata *ParametersMetadata, const void *InParametersData)
Definition ShaderParameterStruct.cpp:883
void UnsetUAVParameter(FRHIBatchedShaderUnbinds &BatchedUnbinds, const FShaderResourceParameter &Parameter)
Definition ShaderParameterUtils.h:190
void SetShaderParametersMixed(TRHICmdList &RHICmdList, const TShaderRef< TShaderType > &InShader, TShaderTypeRHI *InShaderRHI, const typename TShaderType::FParameters &Parameters, TArguments &&... InArguments)
Utility to set all legacy and non-legacy parameters for a shader. Requires the shader type to impleme...
Definition ShaderParameterUtils.h:290
void SetShaderParametersLegacyCS(TRHICmdList &RHICmdList, const TShaderRef< TShaderType > &InShader, TArguments &&... InArguments)
Utility to set all legacy parameters for a Compute shader. Requires the shader type to implement SetP...
Definition ShaderParameterUtils.h:392
void SetSingleShaderValue(TRHICmdList &RHICmdList, TShaderTypeRHI *InShaderRHI, const FShaderParameter &Parameter, const ParameterType &Value)
Definition ShaderParameterUtils.h:259
void SetShaderParametersMixedVS(TRHICmdList &RHICmdList, const TShaderRef< TShaderType > &InShader, const typename TShaderType::FParameters &Parameters, TArguments &&... InArguments)
Utility to set all legacy and non-legacy parameters for a Vertex shader. Requires the shader type to ...
Definition ShaderParameterUtils.h:304
void SetShaderParametersMixedGS(TRHICmdList &RHICmdList, const TShaderRef< TShaderType > &InShader, const typename TShaderType::FParameters &Parameters, TArguments &&... InArguments)
Utility to set all legacy and non-legacy parameters for a Geometry shader. Requires the shader type t...
Definition ShaderParameterUtils.h:332
void SetUAVParameter(FRHIBatchedShaderParameters &BatchedParameters, const FShaderResourceParameter &Parameter, FRHIUnorderedAccessView *UAV)
Definition ShaderParameterUtils.h:156
void SetShaderParametersMixedMS(TRHICmdList &RHICmdList, const TShaderRef< TShaderType > &InShader, const typename TShaderType::FParameters &Parameters, TArguments &&... InArguments)
Utility to set all legacy and non-legacy parameters for a Mesh shader. Requires the shader type to im...
Definition ShaderParameterUtils.h:311
void SetShaderParametersMixedAS(TRHICmdList &RHICmdList, const TShaderRef< TShaderType > &InShader, const typename TShaderType::FParameters &Parameters, TArguments &&... InArguments)
Utility to set all legacy and non-legacy parameters for an Amplification shader. Requires the shader ...
Definition ShaderParameterUtils.h:318
void SetTextureParameter(FRHIBatchedShaderParameters &BatchedParameters, const FShaderResourceParameter &Parameter, FRHITexture *TextureRHI)
Definition ShaderParameterUtils.h:77
void SetUniformBufferParameter(FRHIBatchedShaderParameters &BatchedParameters, const FShaderUniformBufferParameter &Parameter, FRHIUniformBuffer *UniformBufferRHI)
Definition ShaderParameterUtils.h:207
void SetShaderValue(FRHIBatchedShaderParameters &BatchedParameters, const FShaderParameter &Parameter, const ParameterType &Value, uint32 ElementIndex=0)
Definition ShaderParameterUtils.h:24
void SetShaderValueArray(FRHIBatchedShaderParameters &BatchedParameters, const FShaderParameter &Parameter, const ParameterType *Values, uint32 NumElements, uint32 ElementIndex=0)
Definition ShaderParameterUtils.h:51
void SetShaderParametersMixedPS(TRHICmdList &RHICmdList, const TShaderRef< TShaderType > &InShader, const typename TShaderType::FParameters &Parameters, TArguments &&... InArguments)
Utility to set all legacy and non-legacy parameters for a Pixel shader. Requires the shader type to i...
Definition ShaderParameterUtils.h:325
void SetShaderParametersLegacyMS(TRHICmdList &RHICmdList, const TShaderRef< TShaderType > &InShader, TArguments &&... InArguments)
Utility to set all legacy parameters for a Mesh shader. Requires the shader type to implement SetPara...
Definition ShaderParameterUtils.h:364
void SetShaderParametersLegacyVS(TRHICmdList &RHICmdList, const TShaderRef< TShaderType > &InShader, TArguments &&... InArguments)
Utility to set all legacy parameters for a Vertex shader. Requires the shader type to implement SetPa...
Definition ShaderParameterUtils.h:357
#define GUARD_SETSHADERVALUE(_TYPE)
Definition ShaderParameterUtils.h:422
void UnsetShaderParametersLegacyCS(TRHICmdList &RHICmdList, const TShaderRef< TShaderType > &InShader)
Utility to unset all legacy parameters for a Compute shader. Requires the shader type to implement Un...
Definition ShaderParameterUtils.h:411
void SetShaderParametersMixedCS(TRHICmdList &RHICmdList, const TShaderRef< TShaderType > &InShader, const typename TShaderType::FParameters &Parameters, TArguments &&... InArguments)
Utility to set all legacy and non-legacy parameters for a Compute shader. Requires the shader type to...
Definition ShaderParameterUtils.h:339
void UnsetShaderParametersLegacyPS(TRHICmdList &RHICmdList, const TShaderRef< TShaderType > &InShader)
Utility to unset all legacy parameters for a Pixel shader. Requires the shader type to implement Unse...
Definition ShaderParameterUtils.h:399
void SetSRVParameter(FRHIBatchedShaderParameters &BatchedParameters, const FShaderResourceParameter &Parameter, FRHIShaderResourceView *SRV)
Definition ShaderParameterUtils.h:139
void SetSamplerParameter(FRHIBatchedShaderParameters &BatchedParameters, const FShaderResourceParameter &Parameter, FRHISamplerState *SamplerStateRHI)
Definition ShaderParameterUtils.h:94
void SetShaderParametersLegacy(TRHICmdList &RHICmdList, const TShaderRef< TShaderType > &InShader, TShaderTypeRHI *InShaderRHI, TArguments &&... InArguments)
Utility to set all legacy parameters for a shader. Requires the shader type to implement SetParameter...
Definition ShaderParameterUtils.h:348
void UnsetSRVParameter(FRHIBatchedShaderUnbinds &BatchedUnbinds, const FShaderResourceParameter &Parameter)
Definition ShaderParameterUtils.h:173
void SetShaderParametersLegacyPS(TRHICmdList &RHICmdList, const TShaderRef< TShaderType > &InShader, TArguments &&... InArguments)
Utility to set all legacy parameters for a Pixel shader. Requires the shader type to implement SetPar...
Definition ShaderParameterUtils.h:378
void SetShaderParametersLegacyAS(TRHICmdList &RHICmdList, const TShaderRef< TShaderType > &InShader, TArguments &&... InArguments)
Utility to set all legacy parameters for an Amplification shader. Requires the shader type to impleme...
Definition ShaderParameterUtils.h:371
void SetShaderParametersLegacyGS(TRHICmdList &RHICmdList, const TShaderRef< TShaderType > &InShader, TArguments &&... InArguments)
Utility to set all legacy parameters for a Geometry shader. Requires the shader type to implement Set...
Definition ShaderParameterUtils.h:385
void SetBatchedShaderParametersMixed(FRHIBatchedShaderParameters &BatchedParameters, const TShaderRef< TShaderType > &InShader, const typename TShaderType::FParameters &Parameters, TArguments &&... InArguments)
Utility to set all legacy and non-legacy parameters for a shader. Requires the shader type to impleme...
Definition ShaderParameterUtils.h:275
void SetUniformBufferParameterImmediate(FRHIBatchedShaderParameters &BatchedParameters, const TShaderUniformBufferParameter< TBufferStruct > &Parameter, const TBufferStruct &UniformBufferValue)
Definition ShaderParameterUtils.h:246
uint32_t uint32
Definition binka_ue_file_header.h:6
static FORCEINLINE double GetCurrentTime()
Definition App.h:602
Definition RHIResources.h:671
Definition RHIResources.h:3304
Definition RHIResources.h:2153
Definition RHIResources.h:1232
Definition RHIResources.h:3294
Definition Shader.h:637
Definition ShaderParameters.h:56
Definition ShaderParameters.h:87
bool IsBound() const
Definition ShaderParameters.h:95
Definition ShaderParameters.h:109
Definition RenderResource.h:354
Definition Shader.h:1021
Definition ShaderParameters.h:148
Definition ShaderParameterMacros.h:136
Definition UniformBuffer.h:29
Definition RHIShaderParameters.h:241
Definition RHIShaderParameters.h:374
Definition IsPointer.h:12