UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
RHIShaderParameters.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Containers/Array.h"
6#include "RHIResources.h"
8
9#define RHI_VALIDATE_BATCHED_SHADER_PARAMETERS DO_CHECK
10
11class FRHICommandList;
13
29
32{
42
74
76 {
77 return Resource == Other.Resource
78 && Index == Other.Index
79 && Type == Other.Type;
80 }
81
85};
86
88
94
96{
97public:
100
101private:
104
105 FMemStackBase ParametersData;
106 FMemStackBase Parameters;
107 FMemStackBase ResourceParameters;
108 FMemStackBase BindlessParameters;
109
112 {}
113
117 , ParametersData(PageSize)
118 , Parameters(PageSize)
119 , ResourceParameters(PageSize)
120 , BindlessParameters(PageSize)
121 {
122 InOutRootListLink = this;
123 }
124
125 inline void Attach(const FRHIBatchedShaderParameters* InParameters)
126 {
127#if RHI_VALIDATE_BATCHED_SHADER_PARAMETERS
129 {
130 checkf(!AttachedParameters, TEXT("Only one FRHIBatchedShaderParameters instance can be used at a time with this allocator. You must call FRHIBatchedShaderParameters::{Reset, Finish} to start processing a new one."));
132 }
133#endif
134 }
135
136 inline void Detach()
137 {
138#if RHI_VALIDATE_BATCHED_SHADER_PARAMETERS
139 AttachedParameters = nullptr;
140#endif
141 }
142
143 template <typename... ArgsType>
144 inline void EmplaceParameter(TArrayView<FRHIShaderParameter>& InOutArray, ArgsType&& ...Args)
145 {
146 Emplace(Parameters, InOutArray, Forward<ArgsType&&>(Args)...);
147 }
148
149 template <typename... ArgsType>
150 inline void AddResourceParameter(TArrayView<FRHIShaderParameterResource>& InOutArray, ArgsType&& ...Args)
151 {
152 Emplace(ResourceParameters, InOutArray, Forward<ArgsType&&>(Args)...);
153 }
154
155 template <typename... ArgsType>
156 inline void AddBindlessParameter(TArrayView<FRHIShaderParameterResource>& InOutArray, ArgsType&& ...Args)
157 {
158 Emplace(BindlessParameters, InOutArray, Forward<ArgsType&&>(Args)...);
159 }
160
161#if RHI_VALIDATE_BATCHED_SHADER_PARAMETERS
163#endif
164
165 template <typename ElementType, typename... ArgsType>
166 void Emplace(FMemStackBase& MemStack, TArrayView<ElementType>& InOutArray, ArgsType&& ...Args)
167 {
168 static_assert(sizeof(ElementType) % alignof(ElementType) == 0, "Element size must be a multiple of its alignment");
169
170 const size_t ElementSize = sizeof(ElementType);
171 const size_t Alignment = alignof(ElementType);
172 const int32 NumElements = InOutArray.Num() + 1;
173 ElementType* Elements = InOutArray.GetData();
174
175 if (InOutArray.IsEmpty())
176 {
177 Elements = new (MemStack.Alloc(ElementSize, Alignment)) ElementType(Forward<ArgsType&>(Args)...);
178 }
179 else
180 {
181 // Sanity check that the top of the stack contains the last element that was allocated.
182 check(MemStack.GetTop() == (uint8*)(InOutArray.GetData() + InOutArray.Num()));
183
184 // Try to extend the size of the current array without resizing.
185 if (MemStack.CanFitInPage(ElementSize, 1))
186 {
187 new (MemStack.Alloc(ElementSize, 1)) ElementType(Forward<ArgsType&>(Args)...);
188 }
189 // Reached the end of the page. Reallocate the entire array into a new page.
190 else
191 {
192 Elements = reinterpret_cast<ElementType*>(MemStack.Alloc(NumElements * ElementSize, Alignment));
193 ElementType* LastElement = Elements;
194 for (int32 Index = 0; Index < InOutArray.Num(); ++Index, ++LastElement)
195 {
196 new (LastElement) ElementType(MoveTemp(InOutArray[Index]));
197 }
198 new (LastElement) ElementType(Forward<ArgsType&>(Args)...);
199 }
200 }
201
202 InOutArray = TArrayView<ElementType>(Elements, NumElements);
203 }
204
205 void AppendParametersData(TArrayView<uint8>& InOutArray, uint32 NumBytes, const uint8* Bytes)
206 {
207 constexpr size_t Alignment = 1;
208 const int32 NumArrayBytes = InOutArray.Num() + NumBytes;
209 uint8* ArrayBytes = InOutArray.GetData();
210
211 if (InOutArray.IsEmpty())
212 {
213 ArrayBytes = (uint8*)ParametersData.Alloc(NumBytes, Alignment);
214 FMemory::Memcpy(ArrayBytes, Bytes, NumBytes);
215 }
216 else
217 {
218 // Sanity check that the top of the stack contains the last element that was allocated.
219 check(ParametersData.GetTop() == InOutArray.GetData() + InOutArray.Num());
220
221 // Try to extend the size of the current array without resizing.
222 if (ParametersData.CanFitInPage(NumBytes, Alignment))
223 {
224 FMemory::Memcpy(ParametersData.Alloc(NumBytes, Alignment), Bytes, NumBytes);
225 }
226 // Reached the end of the page. Reallocate the entire array into a new page.
227 else
228 {
229 ArrayBytes = (uint8*)ParametersData.Alloc(NumArrayBytes, Alignment);
231 FMemory::Memcpy(ArrayBytes + InOutArray.Num(), Bytes, NumBytes);
232 }
233 }
234
236 }
237};
238
241{
247
251
252 inline bool HasParameters() const
253 {
255 }
256
257 // Marks the parameters as complete and retains the parameter contents.
258 void Finish()
259 {
260 Allocator.Detach();
261 }
262
263 // Resets the parameters back to an empty state.
264 void Reset()
265 {
266 Allocator.Detach();
267 ParametersData = {};
268 Parameters = {};
271 }
272
273 template <typename... ArgsType>
274 inline void AddResourceParameter(ArgsType&& ...Args)
275 {
276 Allocator.Attach(this);
277 Allocator.AddResourceParameter(ResourceParameters, Forward<ArgsType&>(Args)...);
278 }
279
280 template <typename... ArgsType>
281 inline void AddBindlessParameter(ArgsType&& ...Args)
282 {
283 Allocator.Attach(this);
284 Allocator.AddBindlessParameter(BindlessParameters, Forward<ArgsType&>(Args)...);
285 }
286
287 inline void SetShaderParameter(uint32 BufferIndex, uint32 BaseIndex, uint32 NumBytes, const void* NewValue)
288 {
290 Allocator.Attach(this);
291 Allocator.AppendParametersData(ParametersData, NumBytes, (const uint8*)NewValue);
292 Allocator.EmplaceParameter(Parameters, (uint16)BufferIndex, (uint16)BaseIndex, (uint16)DestDataOffset, (uint16)NumBytes);
293 }
294
300
305
310
312 {
314 }
315
320
325
330
335
337 {
339 }
340
345
350};
351
371
396
412
414{
416
417 float DepthMin = 0.0f;
418 float DepthMax = 1.0f;
419
420 float BlendFactor[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
421
423
425};
426
#define check(expr)
Definition AssertionMacros.h:314
#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
EPrimitiveType
Definition RHIDefinitions.h:822
@ PT_TriangleList
Definition RHIDefinitions.h:824
ERHIBatchedShaderParameterAllocatorPageSize
Definition RHIShaderParameters.h:90
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition PipelineStateCache.cpp:1124
Definition RHIResources.h:4572
Definition PipelineStateCache.cpp:1230
Definition MemStack.h:78
UE_FORCEINLINE_HINT uint8 * GetTop() const
Definition MemStack.h:160
EPageSize
Definition MemStack.h:81
void * Alloc(size_t AllocSize, size_t Alignment)
Definition MemStack.h:132
bool CanFitInPage(size_t AllocSize, size_t Alignment) const
Definition MemStack.h:125
Definition RHIShaderParameters.h:96
FRHICommandListBase & RHICmdList
Definition RHIShaderParameters.h:99
FRHIBatchedShaderParametersAllocator * Next
Definition RHIShaderParameters.h:98
Definition RHICommandList.h:455
Definition RHICommandList.h:3819
Definition RHICommandList.h:2735
Definition RHIResources.h:1078
Definition RHIResources.h:1018
Definition RHIResources.h:1058
Definition RHIResourceCollection.h:46
Definition RHIResources.h:54
Definition RHIResources.h:671
Definition RHIResources.h:3304
Definition RHIResources.h:2153
Definition RHIResources.h:1232
Definition RHIResources.h:3294
Definition RHIResources.h:1033
Definition ArrayView.h:139
UE_FORCEINLINE_HINT constexpr SizeType Num() const
Definition ArrayView.h:380
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void Reset(SizeType NewSize=0)
Definition Array.h:2246
UE_FORCEINLINE_HINT SizeType Emplace(ArgsType &&... Args)
Definition Array.h:2561
U16 Index
Definition radfft.cpp:71
static UE_FORCEINLINE_HINT void * Memcpy(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:160
Definition RHIShaderParameters.h:241
void SetBindlessSampler(uint32 Index, FRHISamplerState *State)
Definition RHIShaderParameters.h:336
void AddBindlessParameter(ArgsType &&...Args)
Definition RHIShaderParameters.h:281
TArrayView< FRHIShaderParameter > Parameters
Definition RHIShaderParameters.h:244
void SetUAVParameter(uint32 Index, FRHIUnorderedAccessView *UAV)
Definition RHIShaderParameters.h:316
void SetBindlessTexture(uint32 Index, FRHITexture *Texture)
Definition RHIShaderParameters.h:326
void SetBindlessUAV(uint32 Index, FRHIUnorderedAccessView *UAV)
Definition RHIShaderParameters.h:341
TArrayView< uint8 > ParametersData
Definition RHIShaderParameters.h:243
void SetShaderParameter(uint32 BufferIndex, uint32 BaseIndex, uint32 NumBytes, const void *NewValue)
Definition RHIShaderParameters.h:287
void SetResourceCollection(uint32 Index, FRHIResourceCollection *ResourceCollection)
Definition RHIShaderParameters.h:321
void Finish()
Definition RHIShaderParameters.h:258
TArrayView< FRHIShaderParameterResource > BindlessParameters
Definition RHIShaderParameters.h:246
TArrayView< FRHIShaderParameterResource > ResourceParameters
Definition RHIShaderParameters.h:245
FRHIBatchedShaderParametersAllocator & Allocator
Definition RHIShaderParameters.h:242
void SetShaderResourceViewParameter(uint32 Index, FRHIShaderResourceView *SRV)
Definition RHIShaderParameters.h:306
void SetShaderTexture(uint32 Index, FRHITexture *Texture)
Definition RHIShaderParameters.h:301
void SetShaderUniformBuffer(uint32 Index, FRHIUniformBuffer *UniformBuffer)
Definition RHIShaderParameters.h:295
FRHIBatchedShaderParameters(FRHIBatchedShaderParametersAllocator &InAllocator)
Definition RHIShaderParameters.h:248
void SetShaderSampler(uint32 Index, FRHISamplerState *State)
Definition RHIShaderParameters.h:311
bool HasParameters() const
Definition RHIShaderParameters.h:252
void SetBindlessResourceCollection(uint32 Index, FRHIResourceCollection *ResourceCollection)
Definition RHIShaderParameters.h:346
void AddResourceParameter(ArgsType &&...Args)
Definition RHIShaderParameters.h:274
void SetBindlessResourceView(uint32 Index, FRHIShaderResourceView *SRV)
Definition RHIShaderParameters.h:331
void Reset()
Definition RHIShaderParameters.h:264
Definition RHIShaderParameters.h:374
void Reset()
Definition RHIShaderParameters.h:382
void UnsetSRV(uint32 Index)
Definition RHIShaderParameters.h:387
bool HasParameters() const
Definition RHIShaderParameters.h:377
TArray< FRHIShaderParameterUnbind > Unbinds
Definition RHIShaderParameters.h:375
void UnsetUAV(uint32 Index)
Definition RHIShaderParameters.h:391
Definition RHIShaderParameters.h:398
bool IsValid() const
Definition RHIShaderParameters.h:407
class FComputePipelineState * PipelineState
Definition RHIShaderParameters.h:400
FRHIComputeShader * Shader
Definition RHIShaderParameters.h:401
FRHIComputePipelineState * RHIPipeline
Definition RHIShaderParameters.h:403
TOptional< FRHIBatchedShaderParameters > Parameters
Definition RHIShaderParameters.h:404
FRHIWorkGraphShader * WorkGraphShader
Definition RHIShaderParameters.h:402
uint32 RecordIndex
Definition RHIShaderParameters.h:399
FUint32Vector4 Constants
Definition RHIShaderParameters.h:405
Definition RHIShaderParameters.h:428
class FGraphicsPipelineState * PipelineState
Definition RHIShaderParameters.h:430
TOptional< FRHIBatchedShaderParameters > Parameters_MSVS
Definition RHIShaderParameters.h:435
FGraphicsPipelineStateInitializer PipelineInitializer
Definition RHIShaderParameters.h:433
TOptional< FRHIBatchedShaderParameters > Parameters_PS
Definition RHIShaderParameters.h:436
FUint32Vector4 Constants
Definition RHIShaderParameters.h:438
bool IsValid() const
Definition RHIShaderParameters.h:440
uint32 RecordIndex
Definition RHIShaderParameters.h:429
FRHIGraphicsPipelineState * RHIPipeline
Definition RHIShaderParameters.h:431
Definition RHIShaderParameters.h:414
uint8 StencilRef
Definition RHIShaderParameters.h:424
float BlendFactor[4]
Definition RHIShaderParameters.h:420
float DepthMin
Definition RHIShaderParameters.h:417
float DepthMax
Definition RHIShaderParameters.h:418
EPrimitiveType PrimitiveType
Definition RHIShaderParameters.h:422
FIntRect ViewRect
Definition RHIShaderParameters.h:415
Definition RHIShaderParameters.h:32
FRHIShaderParameterResource(FRHISamplerState *InSamplerState, uint16 InIndex)
Definition RHIShaderParameters.h:62
FRHIResource * Resource
Definition RHIShaderParameters.h:82
FRHIShaderParameterResource(FRHIShaderResourceView *InView, uint16 InIndex)
Definition RHIShaderParameters.h:54
FRHIShaderParameterResource(FRHIResourceCollection *InResourceCollection, uint16 InIndex)
Definition RHIShaderParameters.h:70
FRHIShaderParameterResource(FRHIUniformBuffer *InUniformBuffer, uint16 InIndex)
Definition RHIShaderParameters.h:66
bool operator==(const FRHIShaderParameterResource &Other) const
Definition RHIShaderParameters.h:75
FRHIShaderParameterResource(FRHIUnorderedAccessView *InUAV, uint16 InIndex)
Definition RHIShaderParameters.h:58
FRHIShaderParameterResource(EType InType, FRHIResource *InResource, uint16 InIndex)
Definition RHIShaderParameters.h:44
FRHIShaderParameterResource(FRHITexture *InTexture, uint16 InIndex)
Definition RHIShaderParameters.h:50
EType Type
Definition RHIShaderParameters.h:84
EType
Definition RHIShaderParameters.h:34
Definition RHIShaderParameters.h:354
FRHIShaderParameterUnbind(EType InType, uint16 InIndex)
Definition RHIShaderParameters.h:362
FRHIShaderParameterUnbind()=default
EType
Definition RHIShaderParameters.h:356
EType Type
Definition RHIShaderParameters.h:369
Definition RHIShaderParameters.h:16
uint16 ByteOffset
Definition RHIShaderParameters.h:26
uint16 BufferIndex
Definition RHIShaderParameters.h:24
FRHIShaderParameter(uint16 InBufferIndex, uint16 InBaseIndex, uint16 InByteOffset, uint16 InByteSize)
Definition RHIShaderParameters.h:17
uint16 ByteSize
Definition RHIShaderParameters.h:27
uint16 BaseIndex
Definition RHIShaderParameters.h:25
Definition Optional.h:131