UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
RendererPrivateUtils.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "RenderResource.h"
6#include "RHI.h"
7#include "RHICommandList.h"
8#include "RenderGraphUtils.h"
9
13bool ShouldSkipNaniteLPIs(EShaderPlatform ShaderPlatform);
14
15
17{
18public:
23
24 virtual void InitRHI(FRHICommandListBase& RHICmdList) override
25 {
26 const FRHIBufferCreateDesc CreateDesc =
27 FRHIBufferCreateDesc::CreateVertex<FVector2f>(TEXT("FTileTexCoordVertexBuffer"), 4 * NumTileQuadsInBuffer)
31
32 TRHIBufferInitializer<FVector2f> Vertices = RHICmdList.CreateBufferInitializer(CreateDesc);
33
35 {
36 Vertices[SpriteIndex * 4 + 0] = FVector2f(0.0f, 0.0f);
37 Vertices[SpriteIndex * 4 + 1] = FVector2f(0.0f, 1.0f);
38 Vertices[SpriteIndex * 4 + 2] = FVector2f(1.0f, 1.0f);
39 Vertices[SpriteIndex * 4 + 3] = FVector2f(1.0f, 0.0f);
40 }
41
42 VertexBufferRHI = Vertices.Finalize();
43 }
44
46};
47
49{
50public:
55
57 void InitRHI(FRHICommandListBase& RHICmdList) override
58 {
59 const FRHIBufferCreateDesc CreateDesc =
60 FRHIBufferCreateDesc::CreateIndex<uint16>(TEXT("FTileIndexBuffer"), 6 * NumTileQuadsInBuffer)
64
65 TRHIBufferInitializer<uint16> Indices = RHICmdList.CreateBufferInitializer(CreateDesc);
66
68 {
69 Indices[SpriteIndex * 6 + 0] = SpriteIndex * 4 + 0;
70 Indices[SpriteIndex * 6 + 1] = SpriteIndex * 4 + 1;
71 Indices[SpriteIndex * 6 + 2] = SpriteIndex * 4 + 2;
72 Indices[SpriteIndex * 6 + 3] = SpriteIndex * 4 + 0;
73 Indices[SpriteIndex * 6 + 4] = SpriteIndex * 4 + 2;
74 Indices[SpriteIndex * 6 + 5] = SpriteIndex * 4 + 3;
75 }
76
77 IndexBufferRHI = Indices.Finalize();
78 }
79
81};
82
87
88template <typename ReadbackProcessingLambdaType>
90{
91 FRHIBuffer* SourceBufferRHI = SourceBuffer->GetRHI();
92 GraphBuilder.AddPass(
93 RDG_EVENT_NAME("BufferLockReadbackPass"),
96 {
97 const void *GPUData = (uint32*)RHICmdList.LockBuffer(SourceBufferRHI, 0, NumBytes, RLM_ReadOnly);
99 RHICmdList.UnlockBuffer(SourceBufferRHI);
100 });
101}
102
104{
105public:
106 // Used to capture GPU scatter buffer and num, to use for example to chain a compute shader doing some per-updated-thing work
112
113 RENDERER_API void UploadTo(FRDGBuilder& GraphBuilder, FRDGBuffer *DestBuffer, FRDGBuffer *ScatterOffsets, FRDGBuffer *Values, uint32 NumScatters, uint32 NumBytesPerElement, int32 NumValuesPerScatter);
114 RENDERER_API void UploadTo(FRDGBuilder& GraphBuilder, FRDGBuffer* DestBuffer, FRDGBuffer* ScatterOffsets, FRDGBuffer* Values, TFunction<uint64()>&& GetNumScatters, uint32 NumBytesPerElement, int32 NumValuesPerScatter);
115};
116
118{
119
143
145{
146 template <typename ElementType, typename AllocatorType>
147 static FRDGBuffer *CreateUploadBuffer(FRDGBuilder& GraphBuilder, const TCHAR* Name, const TArray<ElementType, AllocatorType> &InitialData)
148 {
149 return CreateStructuredUploadBuffer(GraphBuilder, Name, InitialData, ERDGInitialDataFlags::NoCopy);
150 }
151
152 static FRDGBufferDesc CreateDesc(uint32 BytesPerElement, uint32 NumElements)
153 {
154 return FRDGBufferDesc::CreateStructuredDesc(BytesPerElement, NumElements);
155 }
156
157 static constexpr bool bAutoValuesPerScatter = false;
158};
159
161{
162 template <typename ElementType, typename AllocatorType>
163 static FRDGBuffer *CreateUploadBuffer(FRDGBuilder& GraphBuilder, const TCHAR* Name, const TArray<ElementType, AllocatorType> &InitialData)
164 {
165 return CreateByteAddressUploadBuffer(GraphBuilder, Name, InitialData, ERDGInitialDataFlags::NoCopy);
166 }
167
168 template <typename GetArrayRefCallback>
170 {
171 return CreateByteAddressUploadBuffer(GraphBuilder, Name, MoveTemp(ArrayCallback));
172 }
173
174 static FRDGBufferDesc CreateDesc(uint32 BytesPerElement, uint32 NumElements)
175 {
176 uint32 NumBytes = BytesPerElement * NumElements;
177 // Needs to be aligned to 16 bytes to MemcpyResource to work correctly (otherwise it skips last unaligned elements of the buffer during resize)
178 check((NumBytes & 15) == 0);
180 }
181
182 static constexpr bool bAutoValuesPerScatter = true;
183};
184
185
189template <typename InValueType, typename InBufferTraits>
191{
192public:
195
196 static constexpr uint32 BytesPerElement = sizeof(ValueType);
197
202
208
214
215 template <typename ValueCheckFuncType>
217 {
218#if DO_CHECK
220
221 if (!HostValues.IsEmpty())
222 {
223 // TODO: should perhaps copy the host values? A lot of overhead but very useful to be sure they are alive...
224 AddBufferLockReadbackPass(GraphBuilder, PooledBuffer, uint32(HostValues.GetTypeSize() * HostValues.Num()), [ValueCheckFunc=MoveTemp(ValueCheckFunc), HostValues](const void *LockedData)
225 {
226 const ValueType *GPUValuePtr = reinterpret_cast<const ValueType*>(LockedData);
227 for (int32 Index = 0; Index < HostValues.Num(); ++Index)
228 {
230 }
231 });
232 }
233#endif
234 }
235
238};
239
240template <typename InValueType, typename InBufferTraits, int32 InNumValuesPerScatter = 1>
242{
243public:
246 static constexpr int32 BytesPerElement = sizeof(ValueType);
248
249 static_assert((BytesPerElement % 4) == 0, "The struct used must be 4-byte aligned");
250
255 {
256 Reserve(NumScatters);
257 }
258
259 virtual ~TBufferScatterUploader() = default;
260
264 void Reserve(int32 NumScatters)
265 {
266 check(UploadDataProxy == nullptr);
267
269 UploadData.ScatterOffsets.Reserve(NumScatters);
270 }
271
275 void Add(const ValueType &Value, int32 ScatterOffset)
276 {
278 check(UploadDataProxy == nullptr);
279
281 UploadData.ScatterOffsets.Add(ScatterOffset);
282 }
283
288 void Add(const TConstArrayView<ValueType> &InValues, int32 ScatterOffset)
289 {
291 check(UploadDataProxy == nullptr);
292
294 UploadData.ScatterOffsets.Add(ScatterOffset);
295 }
296
312
318 {
319 check(NumValues % NumValuesPerScatter == 0);
320 check(UploadDataProxy == nullptr);
321
322 int32 SrcOffset = UploadData.Values.Num();
324 for (int32 Index = 0; Index < NumValues / NumValuesPerScatter; ++Index)
325 {
327 }
328
329 return MakeArrayView(&UploadData.Values[SrcOffset], NumValues);
330 }
331
333
339 {
340 check(UploadDataProxy == nullptr);
341
342 FRDGBuffer *DestBufferRDG = DestDataBuffer.ResizeBufferIfNeeded(GraphBuilder, DestDataMinimumSize);
343
345 OutScatterInfo.ScatterOffsetsRDG = nullptr;
346 if (OutScatterInfo.NumScatters != 0u)
347 {
348 // Move the data arrays to a proxy object owned by RDG to guarantee life-times for upload.
350
351 // upload the values & offsets
352 OutScatterInfo.ScatterOffsetsRDG = BufferTraits::CreateUploadBuffer(GraphBuilder, TEXT("ScatterUploader.Offsets"), UploadDataProxy->ScatterOffsets);
353 FRDGBuffer *ValuesRDG = BufferTraits::CreateUploadBuffer(GraphBuilder, TEXT("ScatterUploader.Values"), UploadDataProxy->Values);
354
355 uint32 ElementSize = sizeof(ValueType);
357 if (BufferTraits::bAutoValuesPerScatter)
358 {
359 // Let the implementation determine the optimal way to divide up the scatter
360 ElementSize *= ElementsPerScatter;
362 }
363 FBufferScatterUploader::UploadTo(GraphBuilder, DestBufferRDG, OutScatterInfo.ScatterOffsetsRDG, ValuesRDG, OutScatterInfo.NumScatters, ElementSize, ElementsPerScatter);
364 }
365
366 return DestBufferRDG;
367 }
368
374
375protected:
383};
384
385template <typename InValueType, typename InBufferTraits, int32 InNumValuesPerScatter = 1>
386class TAsyncBufferScatterUploader : public TBufferScatterUploader<InValueType, InBufferTraits, InNumValuesPerScatter>
387{
389
390public:
391
395 static TAsyncBufferScatterUploader* Allocate(FRDGBuilder& GraphBuilder, int32 NumScatters = 0)
396 {
397 return GraphBuilder.AllocObject<TAsyncBufferScatterUploader>(NumScatters);
398 }
399
405 {
406 check(Base::UploadDataProxy == nullptr);
407
408 FRDGBuffer* DestBufferRDG = DestDataBuffer.ResizeBufferIfNeeded(GraphBuilder, DestDataMinimumSize);
409
410 // upload the values & offsets
411 FRDGBufferRef ScatterOffsetsRDG = Base::BufferTraits::CreateUploadBuffer(GraphBuilder, TEXT("ScatterUploader.Offsets"), [&]() -> auto& { return Base::UploadData.ScatterOffsets; });
412 FRDGBufferRef ValuesRDG = Base::BufferTraits::CreateUploadBuffer(GraphBuilder, TEXT("ScatterUploader.Values"), [&]() -> auto& { return Base::UploadData.Values; });
413
414 uint32 ElementSize = sizeof(typename Base::ValueType);
416 if (Base::BufferTraits::bAutoValuesPerScatter)
417 {
418 // Let the implementation determine the optimal way to divide up the scatter
419 ElementSize *= ElementsPerScatter;
421 }
422 FBufferScatterUploader::UploadTo(GraphBuilder, DestBufferRDG, ScatterOffsetsRDG, ValuesRDG, [&]() -> int64 { return Base::UploadData.ScatterOffsets.Num(); }, ElementSize, ElementsPerScatter);
423
424 return DestBufferRDG;
425 }
426
427private:
428
435 TAsyncBufferScatterUploader(int32 NumScatters = 0) : Base(NumScatters)
436 {
437 }
438
439 friend class FRDGAllocator;
441};
442
443}
444
445template <typename InValueType>
447
448template <typename InValueType, int32 InNumValuesPerScatter = 1>
450
451template <typename InValueType>
453
454template <typename InValueType, int32 InNumValuesPerScatter = 1>
456
457template <typename InValueType, int32 InNumValuesPerScatter = 1>
459
466
478
483{
484 return CreateAndClearIndirectDispatchArgs(GraphBuilder, FeatureLevel, Name, FIntVector3(0,1,1), 1u, sizeof(FRHIDispatchIndirectParameters) / 4u);
485}
constexpr auto MakeArrayView(OtherRangeType &&Other)
Definition ArrayView.h:873
#define check(expr)
Definition AssertionMacros.h:314
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::Math::TVector2< float > FVector2f
Definition MathFwd.h:74
UE::Math::TIntVector3< int32 > FIntVector3
Definition MathFwd.h:92
@ VertexOrIndexBuffer
@ RLM_ReadOnly
Definition RHIDefinitions.h:786
EShaderPlatform
Definition RHIShaderPlatform.h:11
#define RDG_EVENT_NAME(...)
Definition RenderGraphEvent.h:529
FRDGBufferRef CreateByteAddressUploadBuffer(FRDGBuilder &GraphBuilder, const TCHAR *Name, const TArray< ElementType, AllocatorType > &InitialData, ERDGInitialDataFlags InitialDataFlags=ERDGInitialDataFlags::None)
Definition RenderGraphUtils.h:1161
FRDGBufferRef CreateStructuredUploadBuffer(FRDGBuilder &GraphBuilder, const TCHAR *Name, const TArray< ElementType, AllocatorType > &InitialData, ERDGInitialDataFlags InitialDataFlags=ERDGInitialDataFlags::None)
Definition RenderGraphUtils.h:1145
void AddClearIndirectDispatchArgsPass(FRDGBuilder &GraphBuilder, ERHIFeatureLevel::Type FeatureLevel, FRDGBufferRef IndirectArgsRDG, const FIntVector3 &DimClearValue, uint32 NumIndirectArgs, uint32 IndirectArgStride)
Definition RendererUtils.cpp:360
RENDERER_API FBufferRHIRef & GetOneTileQuadVertexBuffer()
Definition RendererUtils.cpp:336
void AddBufferLockReadbackPass(FRDGBuilder &GraphBuilder, TRefCountPtr< FRDGPooledBuffer > SourceBuffer, uint32 NumBytes, ReadbackProcessingLambdaType &&ReadbackProcessingLambda)
Definition RendererPrivateUtils.h:89
FRDGBufferRef CreateAndClearIndirectDispatchArgs(FRDGBuilder &GraphBuilder, ERHIFeatureLevel::Type FeatureLevel, const TCHAR *Name, const FIntVector3 &DimClearValue, uint32 NumIndirectArgs, uint32 IndirectArgStride)
Definition RendererUtils.cpp:382
bool ShouldSkipNaniteLPIs(EShaderPlatform ShaderPlatform)
Definition RendererUtils.cpp:31
void AddClearIndirectDispatchArgs1DPass(FRDGBuilder &GraphBuilder, ERHIFeatureLevel::Type FeatureLevel, FRDGBufferRef IndirectArgsRDG, uint32 NumIndirectArgs, uint32 IndirectArgStride)
Definition RendererPrivateUtils.h:470
FRDGBufferRef CreateAndClearIndirectDispatchArgs1D(FRDGBuilder &GraphBuilder, ERHIFeatureLevel::Type FeatureLevel, const TCHAR *Name)
Definition RendererPrivateUtils.h:482
RENDERER_API FBufferRHIRef & GetOneTileQuadIndexBuffer()
Definition RendererUtils.cpp:341
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition RendererPrivateUtils.h:104
RENDERER_API void UploadTo(FRDGBuilder &GraphBuilder, FRDGBuffer *DestBuffer, FRDGBuffer *ScatterOffsets, FRDGBuffer *Values, uint32 NumScatters, uint32 NumBytesPerElement, int32 NumValuesPerScatter)
Definition RendererUtils.cpp:283
Definition RenderResource.h:509
FBufferRHIRef IndexBufferRHI
Definition RenderResource.h:524
Definition RenderGraphAllocator.h:34
Definition RenderGraphAllocator.h:24
Definition RenderGraphResources.h:1321
Definition RenderGraphBuilder.h:49
ObjectType * AllocObject(TArgs &&... Args)
Definition RenderGraphBuilder.inl:158
FRDGPassRef AddPass(FRDGEventName &&Name, const ParameterStructType *ParameterStruct, ERDGPassFlags Flags, ExecuteLambdaType &&ExecuteLambda)
const FRDGBufferDesc Desc
Definition RenderGraphResources.h:1214
Definition RHIResources.h:1581
Definition RHICommandList.h:455
void * LockBuffer(FRHIBuffer *Buffer, uint32 Offset, uint32 SizeRHI, EResourceLockMode LockMode)
Definition RHICommandList.h:747
void UnlockBuffer(FRHIBuffer *Buffer)
Definition RHICommandList.h:755
FRHIBufferInitializer CreateBufferInitializer(const FRHIBufferCreateDesc &CreateDesc)
Definition RHICommandList.h:792
Definition RHICommandList.h:4626
Definition RendererPrivateUtils.h:49
FTileIndexBuffer(int32 InNumTileQuadsInBuffer)
Definition RendererPrivateUtils.h:51
const uint32 NumTileQuadsInBuffer
Definition RendererPrivateUtils.h:80
void InitRHI(FRHICommandListBase &RHICmdList) override
Definition RendererPrivateUtils.h:57
Definition RendererPrivateUtils.h:17
FTileTexCoordVertexBuffer(int32 InNumTileQuadsInBuffer)
Definition RendererPrivateUtils.h:19
const uint32 NumTileQuadsInBuffer
Definition RendererPrivateUtils.h:45
virtual void InitRHI(FRHICommandListBase &RHICmdList) override
Definition RendererPrivateUtils.h:24
Definition RenderResource.h:474
FBufferRHIRef VertexBufferRHI
Definition RenderResource.h:489
Definition ArrayView.h:139
Definition Array.h:670
UE_FORCEINLINE_HINT SizeType AddUninitialized()
Definition Array.h:1664
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
void Append(const TArray< OtherElementType, OtherAllocatorType > &Source)
Definition Array.h:2412
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition AndroidPlatformMisc.h:14
UE_FORCEINLINE_HINT bool IsValid() const
Definition RefCounting.h:594
RENDERER_API void Empty()
Definition RendererUtils.cpp:310
bool bRoundUpToPOT
Definition RendererPrivateUtils.h:140
int32 MinimumNumElementsReserved
Definition RendererPrivateUtils.h:138
RENDERER_API FRDGBuffer * ResizeBufferIfNeeded(FRDGBuilder &GraphBuilder, const FRDGBufferDesc &BufferDesc)
Definition RendererUtils.cpp:315
TRefCountPtr< FRDGPooledBuffer > PooledBuffer
Definition RendererPrivateUtils.h:141
const TCHAR * Name
Definition RendererPrivateUtils.h:139
RENDERER_API FRDGBuffer * ResizeAndClearBufferIfNeeded(FRDGBuilder &GraphBuilder, const FRDGBufferDesc &BufferDesc)
Definition RendererUtils.cpp:320
static TAsyncBufferScatterUploader * Allocate(FRDGBuilder &GraphBuilder, int32 NumScatters=0)
Definition RendererPrivateUtils.h:395
FRDGBuffer * ResizeAndUploadToAsync(FRDGBuilder &GraphBuilder, TPersistentBuffer< InValueType, InBufferTraits > &DestDataBuffer, int32 DestDataMinimumSize)
Definition RendererPrivateUtils.h:404
static constexpr int32 NumValuesPerScatter
Definition RendererPrivateUtils.h:247
void Reserve(int32 NumScatters)
Definition RendererPrivateUtils.h:264
void Add(const TConstArrayView< ValueType > &InValues, int32 ScatterOffset)
Definition RendererPrivateUtils.h:288
static constexpr int32 BytesPerElement
Definition RendererPrivateUtils.h:246
InBufferTraits BufferTraits
Definition RendererPrivateUtils.h:244
TBufferScatterUploader(int32 NumScatters=0)
Definition RendererPrivateUtils.h:254
void AddMultiple(const TConstArrayView< ValueType > &InValues, int32 FirstScatterOffset)
Definition RendererPrivateUtils.h:301
FUploadData * UploadDataProxy
Definition RendererPrivateUtils.h:381
TArrayView< ValueType > AddMultiple_GetRef(int32 FirstScatterOffset, int32 NumValues)
Definition RendererPrivateUtils.h:317
FUploadData UploadData
Definition RendererPrivateUtils.h:382
InValueType ValueType
Definition RendererPrivateUtils.h:245
void Add(const ValueType &Value, int32 ScatterOffset)
Definition RendererPrivateUtils.h:275
int32 GetNumScatters() const
Definition RendererPrivateUtils.h:332
FRDGBuffer * ResizeAndUploadTo(FRDGBuilder &GraphBuilder, TPersistentBuffer< ValueType, BufferTraits > &DestDataBuffer, int32 DestDataMinimumSize, FScatterInfo &OutScatterInfo)
Definition RendererPrivateUtils.h:338
FRDGBuffer * ResizeAndUploadTo(FRDGBuilder &GraphBuilder, TPersistentBuffer< ValueType, BufferTraits > &DestDataBuffer, int32 DestDataMinimumSize)
Definition RendererPrivateUtils.h:369
InBufferTraits BufferTraits
Definition RendererPrivateUtils.h:194
void ValidateGPUData(FRDGBuilder &GraphBuilder, TConstArrayView< ValueType > HostValues, ValueCheckFuncType &&ValueCheckFunc)
Definition RendererPrivateUtils.h:216
FRDGBuffer * ResizeAndClearBufferIfNeeded(FRDGBuilder &GraphBuilder, int32 InNewMinNumElements)
Definition RendererPrivateUtils.h:209
const TRefCountPtr< FRDGPooledBuffer > & GetPooledBuffer() const
Definition RendererPrivateUtils.h:237
TPersistentBuffer(int32 InMinimumNumElementsReserved, const TCHAR *InName, bool bInRoundUpToPOT=true)
Definition RendererPrivateUtils.h:198
InValueType ValueType
Definition RendererPrivateUtils.h:193
TRefCountPtr< FRDGPooledBuffer > & GetPooledBuffer()
Definition RendererPrivateUtils.h:236
FRDGBuffer * ResizeBufferIfNeeded(FRDGBuilder &GraphBuilder, int32 InNewMinNumElements)
Definition RendererPrivateUtils.h:203
static constexpr uint32 BytesPerElement
Definition RendererPrivateUtils.h:196
Type
Definition RHIFeatureLevel.h:20
Definition RendererPrivateUtils.h:118
U16 Index
Definition radfft.cpp:71
Definition RendererPrivateUtils.h:108
FRDGBuffer * ScatterOffsetsRDG
Definition RendererPrivateUtils.h:109
int32 NumScatters
Definition RendererPrivateUtils.h:110
Definition RenderGraphResources.h:940
static FRDGBufferDesc CreateByteAddressDesc(uint32 NumBytes)
Definition RenderGraphResources.h:941
uint32 NumElements
Definition RenderGraphResources.h:1111
static FRDGBufferDesc CreateStructuredDesc(uint32 BytesPerElement, uint32 NumElements)
Definition RenderGraphResources.h:993
Definition RHIResources.h:1417
FRHIBufferCreateDesc & SetInitActionInitializer()
Definition RHIResources.h:1542
FRHIBufferCreateDesc & SetInitialState(ERHIAccess InInitialState)
Definition RHIResources.h:1528
FRHIBufferCreateDesc & AddUsage(EBufferUsageFlags InUsage)
Definition RHIResources.h:1524
RHI_API FBufferRHIRef Finalize()
Definition RHIBufferInitializer.cpp:17
Definition RHI.h:560
Definition RHIBufferInitializer.h:110
static FRDGBuffer * CreateUploadBuffer(FRDGBuilder &GraphBuilder, const TCHAR *Name, GetArrayRefCallback &&ArrayCallback)
Definition RendererPrivateUtils.h:169
static FRDGBuffer * CreateUploadBuffer(FRDGBuilder &GraphBuilder, const TCHAR *Name, const TArray< ElementType, AllocatorType > &InitialData)
Definition RendererPrivateUtils.h:163
static constexpr bool bAutoValuesPerScatter
Definition RendererPrivateUtils.h:182
static FRDGBufferDesc CreateDesc(uint32 BytesPerElement, uint32 NumElements)
Definition RendererPrivateUtils.h:174
static constexpr bool bAutoValuesPerScatter
Definition RendererPrivateUtils.h:157
static FRDGBuffer * CreateUploadBuffer(FRDGBuilder &GraphBuilder, const TCHAR *Name, const TArray< ElementType, AllocatorType > &InitialData)
Definition RendererPrivateUtils.h:147
static FRDGBufferDesc CreateDesc(uint32 BytesPerElement, uint32 NumElements)
Definition RendererPrivateUtils.h:152
TArray< ValueType > Values
Definition RendererPrivateUtils.h:378
TArray< uint32 > ScatterOffsets
Definition RendererPrivateUtils.h:379