UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
GPUScene.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 "RendererInterface.h"
9#include "SpanAllocator.h"
12#include "MeshBatch.h"
13#include "LightSceneData.h"
14#include "SceneUniformBuffer.h"
15#include "UnifiedBuffer.h"
17#include "GPUSceneWriter.h"
19
21class FRHICommandList;
22class FScene;
23class FViewInfo;
25class FGPUScene;
34
36{
37 class IShadowInvalidatingInstances;
38}
39
41
42#if !ENABLE_SCENE_DATA_DX11_UB_ERROR_WORKAROUND
43// Note: this is declared in GPUSceneWriter.h (a public header) until such a time as the UB path works.
44// Parameter sub struct that is common to all parameter use-cases
51
52#endif
53
62
63//Non-RDG parameters, untracked, use with care (or preferably, don't)
72
74
80{
81public:
85
91 virtual void Add(
94 uint32 NumInstances,
97
103 RENDERER_API void Commit();
104
109 {
110 check(bCommitted || UploadData == nullptr);
111 return PrimitiveIdRange;
112 }
113
115 {
116 check(bCommitted || UploadData == nullptr);
117
118 return UploadData != nullptr ? UploadData->InstanceSceneDataOffset : 0;
119 }
120
122 {
123 check(bCommitted || UploadData == nullptr);
124
125 return UploadData != nullptr ? UploadData->InstancePayloadDataOffset : 0;
126 }
127
128 int32 Num() const { return UploadData != nullptr ? UploadData->PrimitiveData.Num() : 0; }
129 int32 NumInstances() const { return UploadData != nullptr ? UploadData->TotalInstanceCount : 0; }
130 int32 NumPayloadDataSlots() const { return UploadData != nullptr ? UploadData->InstancePayloadDataFloat4Count : 0; }
131 const FPrimitiveUniformShaderParameters* GetPrimitiveShaderParameters(int32 PrimitiveId) const;
132
133#if DO_CHECK
137 void CheckPrimitiveProcessed(uint32 PrimitiveIndex, const FGPUScene& GPUScene) const;
138#endif // DO_CHECK
139
140private:
141
142 friend class FGPUScene;
145
146 struct FPrimitiveData
147 {
149 const FPrimitiveUniformShaderParameters* ShaderParams = nullptr;
150 uint32 NumInstances = 0;
151 uint32 LocalInstanceSceneDataOffset = INDEX_NONE;
152 uint32 LocalPayloadDataOffset = INDEX_NONE;
153 };
154
155 struct FUploadData
156 {
158 TArray<uint32> GPUWritePrimitives;
159
160 uint32 InstanceSceneDataOffset = INDEX_NONE;
161 uint32 TotalInstanceCount = 0;
162 uint32 InstancePayloadDataOffset = INDEX_NONE;
163 uint32 InstancePayloadDataFloat4Count = 0;
164 bool bIsUploaded = false;
165 };
166
167 FUploadData* AllocateUploadData();
168
172 TRange<int32> PrimitiveIdRange = TRange<int32>::Empty();
173 FUploadData* UploadData = nullptr; // Owned by FGPUSceneDynamicContext
174 bool bCommitted = false;
175 FGPUSceneDynamicContext* GPUSceneDynamicContext = nullptr;
176};
177
178// TODO: move to own header
180
186{
187public:
190
191 void Release();
192
193private:
194 friend class FGPUScene;
196
197 FGPUScenePrimitiveCollector::FUploadData* AllocateDynamicPrimitiveData();
198 UE::FMutex DymamicPrimitiveUploadDataMutex;
200 FGPUScene& GPUScene;
201};
202
215
217{
218public:
220 ~FGPUScene();
221
222 using FUpdateFromComputeCommands = FScenePrimitiveUpdates::TPayloadRangeView<FUpdateInstanceFromComputeCommand>;
223
225 bool IsEnabled() const { return bIsEnabled; }
231 void BeginRender(FRDGBuilder& GraphBuilder, FGPUSceneDynamicContext &GPUSceneDynamicContext);
232 inline bool IsRendering() const { return bInBeginEndBlock; }
233 void EndRender();
234
235 ERHIFeatureLevel::Type GetFeatureLevel() const { return FeatureLevel; }
237
243 int32 AllocateInstanceSceneDataSlots(FPersistentPrimitiveIndex PersistentPrimitiveIndex, int32 NumInstanceSceneDataEntries);
244
248 void FreeInstanceSceneDataSlots(int32 InstanceSceneDataOffset, int32 NumInstanceSceneDataEntries);
249
252
256 void UploadDynamicPrimitiveShaderDataForView(FRDGBuilder& GraphBuilder, FViewInfo& View, bool bRayTracing = false, UE::Renderer::Private::IShadowInvalidatingInstances *ShadowInvalidatingInstances = nullptr);
257
262
267
273
275 {
276 if (!PrimitiveDirtyState.IsValidIndex(PersistentPrimitiveIndex.Index))
277 {
279 }
280 return PrimitiveDirtyState[PersistentPrimitiveIndex.Index];
281 }
282
283 uint32 GetSceneFrameNumber() const { return SceneFrameNumber; }
284
285 int32 GetNumInstances() const { return InstanceSceneDataAllocator.GetMaxSize(); }
286 int32 GetNumPrimitives() const { return DynamicPrimitivesOffset; }
287 int32 GetMaxLightId() const { return NumGPULights; }
289 FGPUSceneDynamicContext* GetCurrentDynamicContext() const { return CurrentDynamicContext; }
295
296 const FSpanAllocator& GetInstanceSceneDataAllocator() const { return InstanceSceneDataAllocator; }
297
302
307 void DebugRender(FRDGBuilder& GraphBuilder, FSceneUniformBuffer& SceneUniformBuffer, FViewInfo& View);
308
313
318
320 bool HasPendingGPUWrite(uint32 PrimitiveId) const;
321
326
331
335
337
341
345
349
354
357
358 inline const FScene &GetScene() const { return Scene; }
359
360 SIZE_T GetAllocatedSize() const;
361
363
364private:
369
370 // set to true if the requested (cvar) tile size is >0, otherwise the tile size is re-derived from the instance count
371 bool bUseTiledInstanceDataLayout = true;
372
373 // log2(TileSize) in number of instances, thus the tile-size in memory is #float4s per instance * tilesize
374 int32 InstanceDataTileSizeLog2 = -1;
375
376 uint32 GetInstanceDataTileSizeLog2() const { return InstanceDataTileSizeLog2; }
377 uint32 GetInstanceDataTileSize() const { return 1u << InstanceDataTileSizeLog2; }
378 uint32 GetInstanceDataTileSizeMask() const;
379 uint32 GetInstanceDataTileStride() const;
380
381 static constexpr int32 InitialBufferSize = 256;
382
384 int32 NumGPULights = 0;
385 UE::Tasks::FTask LightDataSetupTask;
386
387#if DO_CHECK
389#endif
390
391 FGPUSceneCommonParameters CommonParameters;
392
393 FGPUSceneCommonParameters GetCommonParameters() const;
394
395
396 // Buffers used by GPU-Scene, since they can be resized during updates AND the render passes must retain the
397 // right copy (this is chiefly because the init of shadow views after pre-pass means we need to be able to set
398 // up GPU-Scene before pre-pass, but then may discover new primitives etc. As there is no way to know how many
399 // dynamic primitives will turn up after Pre-pass, we can't guarantee a resize won't happen).
400 struct FRegisteredBuffers
401 {
402 bool IsValid() const { return PrimitiveBuffer != nullptr; }
403
404 FRDGBuffer* PrimitiveBuffer = nullptr;
405 FRDGBuffer* InstanceSceneDataBuffer = nullptr;
406 FRDGBuffer* InstancePayloadDataBuffer = nullptr;
407 FRDGBuffer* LightmapDataBuffer = nullptr;
408 FRDGBuffer* LightDataBuffer = nullptr;
409 };
410
411
412
413 FScene &Scene;
414 FSpanAllocator InstanceSceneDataAllocator;
415
416 FORCEINLINE void ResizeDirtyState(int32 NewSizeIn)
417 {
418 if (IsEnabled() && NewSizeIn > PrimitiveDirtyState.Num())
419 {
420 const int32 NewSize = Align(NewSizeIn, 64);
421 static_assert(static_cast<uint32>(EPrimitiveDirtyState::None) == 0U, "Using AddZeroed to ensure efficent add, requires None == 0");
422 PrimitiveDirtyState.AddZeroed(NewSize - PrimitiveDirtyState.Num());
423 }
424 }
425
427 TArray<FPersistentPrimitiveIndex> PrimitivesToUpdate;
428
429 FRegisteredBuffers CachedRegisteredBuffers;
430
431 TArray<EPrimitiveDirtyState> PrimitiveDirtyState;
432
433 TArray<FInstanceRange> InstanceRangesToClear;
434
435 struct FDeferredGPUWrite
436 {
437 FGPUSceneWriteDelegateRef DataWriterGPU;
438 int32 ViewId = INDEX_NONE;
439 uint32 PrimitiveId = INDEX_NONE;
440 uint32 InstanceSceneDataOffset = INDEX_NONE;
441 uint32 NumCustomDataFloats = INDEX_NONE;
442 uint32 PackedInstanceSceneDataFlags = 0u;
443 };
444
445 static constexpr uint32 NumDeferredGPUWritePasses = uint32(EGPUSceneGPUWritePass::Num);
446 TArray<FDeferredGPUWrite> DeferredGPUWritePassDelegates[NumDeferredGPUWritePasses];
447 EGPUSceneGPUWritePass LastDeferredGPUWritePass = EGPUSceneGPUWritePass::None;
448
450
451
453
458 uint32 SceneFrameNumber = 0xFFFFFFFF;
459
460 int32 DynamicPrimitivesOffset = 0;
461
462 int32 PrevDynamicPrimitivesMaxSize = 0;
463 int32 PrevDynamicPrimitivePayloadMaxSize = 0;
464 int32 PrevDynamicPrimitiveInstanceMaxSize = 0;
465
466 bool bIsEnabled = false;
467 bool bInBeginEndBlock = false;
468 FGPUSceneDynamicContext* CurrentDynamicContext = nullptr;
469
470 ERHIFeatureLevel::Type FeatureLevel;
471
472 FRegisteredBuffers UpdateBufferAllocations(FRDGBuilder& GraphBuilder, FSceneUniformBuffer& SceneUB);
473
477 FRegisteredBuffers RegisterBuffers(FRDGBuilder& GraphBuilder) const;
478
483 template<typename FUploadDataSourceAdapter>
484 void UploadGeneral(FRDGBuilder& GraphBuilder, const FRegisteredBuffers& BufferState, FRDGExternalAccessQueue* ExternalAccessQueue, const FUploadDataSourceAdapter& UploadDataSourceAdapter, const UE::Tasks::FTask& PrerequisiteTask);
485
489 void UpdateGPULights(FRDGBuilder& GraphBuilder, const UE::Tasks::FTask& PrerequisiteTask, const FLightSceneChangeSet& LightsPostUpdateData);
490
491 static void InitLightData(const FLightSceneInfoCompact& LightInfoCompact, bool bAllowStaticLighting, uint32 LightShaderParameterFlags, FLightSceneData& DataOut);
492
493 void UploadDynamicPrimitiveShaderDataForViewInternal(FRDGBuilder& GraphBuilder, FViewInfo& View, bool bRayTracing, UE::Renderer::Private::IShadowInvalidatingInstances *ShadowInvalidatingInstances);
494
496
497 void AddUpdatePrimitiveIdsPass(FRDGBuilder& GraphBuilder, FInstanceGPULoadBalancer& IdOnlyUpdateItems);
498
499 void AddClearInstancesPass(FRDGBuilder& GraphBuilder, FInstanceCullingOcclusionQueryRenderer* OcclusionQueryRenderer = nullptr);
500
501
502#if !UE_BUILD_SHIPPING
503 FDelegateHandle ScreenMessageDelegate;
504 bool bLoggedInstanceOverflow = false;
505 uint32 MaxInstancesDuringPrevUpdate = 0;
506 bool bLoggedLightOverflow = false;
507 int32 MaxLightsDuringPrevUpdate = 0;
508 bool bLoggedPayloadBufferOverflow = false;
509#endif // UE_BUILD_SHIPPING
510 uint64 InstancePayloadDataSizeReserveUnclamped = 0;
511};
512
514{
515public:
517 GPUScene(InGPUScene)
518 {
519 GPUScene.BeginRender(GraphBuilder, GPUSceneDynamicContext);
520 }
521
523 {
524 GPUScene.EndRender();
525 }
526
527private:
530 FGPUScene& GPUScene;
531};
532
constexpr T Align(T Val, uint64 Alignment)
Definition AlignmentTemplates.h:18
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define check(expr)
Definition AssertionMacros.h:314
@ NoInit
Definition CoreMiscDefines.h:158
@ INDEX_NONE
Definition CoreMiscDefines.h:150
@ InPlace
Definition CoreMiscDefines.h:162
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
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
EGPUSceneGPUWritePass
Definition MeshBatch.h:61
UE_FORCEINLINE_HINT bool IsValid(const UObject *Test)
Definition Object.h:1875
EPrimitiveDirtyState
Definition PrimitiveDirtyState.h:9
FPrimitiveUniformShaderParameters GetIdentityPrimitiveParameters()
Definition PrimitiveUniformShaderParameters.cpp:236
#define GShaderPlatformForFeatureLevel
Definition RHIGlobals.h:915
EShaderPlatform
Definition RHIShaderPlatform.h:11
#define DECLARE_GPU_STAT_NAMED_EXTERN(StatName, NameString)
Definition RealtimeGPUProfiler.h:260
#define DECLARE_SCENE_UB_STRUCT(StructType, FieldName, PrefixKeywords)
Definition SceneUniformBuffer.h:87
#define SHADER_PARAMETER_RDG_BUFFER_SRV(ShaderType, MemberName)
Definition ShaderParameterMacros.h:1800
#define SHADER_PARAMETER_SRV(ShaderType, MemberName)
Definition ShaderParameterMacros.h:1720
#define BEGIN_SHADER_PARAMETER_STRUCT(StructTypeName, DllStorage)
Definition ShaderParameterMacros.h:1482
#define SHADER_PARAMETER_STRUCT_INCLUDE(StructType, MemberName)
Definition ShaderParameterMacros.h:1895
#define END_SHADER_PARAMETER_STRUCT()
Definition ShaderParameterMacros.h:1485
#define SHADER_PARAMETER(MemberType, MemberName)
Definition ShaderParameterMacros.h:1684
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition IDelegateInstance.h:14
Definition GPUScene.h:186
FGPUSceneDynamicContext(FGPUScene &InGPUScene)
Definition GPUScene.h:188
void Release()
Definition GPUScene.cpp:2398
~FGPUSceneDynamicContext()
Definition GPUScene.cpp:2393
Definition GPUScene.h:80
int32 NumInstances() const
Definition GPUScene.h:129
FORCEINLINE const TRange< int32 > & GetPrimitiveIdRange() const
Definition GPUScene.h:108
FORCEINLINE int32 GetInstancePayloadDataOffset() const
Definition GPUScene.h:121
FGPUScenePrimitiveCollector(FGPUSceneDynamicContext *InGPUSceneDynamicContext=nullptr)
Definition GPUScene.h:82
int32 NumPayloadDataSlots() const
Definition GPUScene.h:130
FORCEINLINE int32 GetInstanceSceneDataOffset() const
Definition GPUScene.h:114
int32 Num() const
Definition GPUScene.h:128
Definition GPUScene.h:514
FGPUSceneScopeBeginEndHelper(FRDGBuilder &GraphBuilder, FGPUScene &InGPUScene, FGPUSceneDynamicContext &GPUSceneDynamicContext)
Definition GPUScene.h:516
~FGPUSceneScopeBeginEndHelper()
Definition GPUScene.h:522
Definition MeshBatch.h:44
Definition GPUScene.h:217
EShaderPlatform GetShaderPlatform() const
Definition GPUScene.h:236
FGPUSceneResourceParameters GetShaderParameters(FRDGBuilder &GraphBuilder) const
Definition GPUScene.cpp:1930
TRefCountPtr< FRDGPooledBuffer > LightmapDataBuffer
Definition GPUScene.h:352
FScenePrimitiveUpdates::TPayloadRangeView< FUpdateInstanceFromComputeCommand > FUpdateFromComputeCommands
Definition GPUScene.h:222
void EndRender()
Definition GPUScene.cpp:746
int32 AllocateInstanceSceneDataSlots(FPersistentPrimitiveIndex PersistentPrimitiveIndex, int32 NumInstanceSceneDataEntries)
Definition GPUScene.cpp:2019
uint32 GetSceneFrameNumber() const
Definition GPUScene.h:283
bool HasPendingGPUWrite(uint32 PrimitiveId) const
Definition GPUScene.cpp:2327
void DebugRender(FRDGBuilder &GraphBuilder, FSceneUniformBuffer &SceneUniformBuffer, FViewInfo &View)
Definition GPUScene.cpp:2140
FSpanAllocator LightmapDataAllocator
Definition GPUScene.h:351
bool IsRendering() const
Definition GPUScene.h:232
FGPUSceneDynamicContext * GetCurrentDynamicContext() const
Definition GPUScene.h:289
void BeginRender(FRDGBuilder &GraphBuilder, FGPUSceneDynamicContext &GPUSceneDynamicContext)
Definition GPUScene.cpp:726
void UploadDynamicPrimitiveShaderDataForView(FRDGBuilder &GraphBuilder, FViewInfo &View, bool bRayTracing=false, UE::Renderer::Private::IShadowInvalidatingInstances *ShadowInvalidatingInstances=nullptr)
Definition GPUScene.cpp:1993
~FGPUScene()
Definition GPUScene.cpp:719
void SetEnabled(ERHIFeatureLevel::Type InFeatureLevel)
Definition GPUScene.cpp:651
void RENDERER_API AddPrimitiveToUpdate(FPersistentPrimitiveIndex PersistentPrimitiveIndex, EPrimitiveDirtyState DirtyState=EPrimitiveDirtyState::ChangedAll)
Definition GPUScene.cpp:1951
FRDGAsyncScatterUploadBuffer InstanceSceneUploadBuffer
Definition GPUScene.h:344
TRefCountPtr< FRDGPooledBuffer > InstanceSceneDataBuffer
Definition GPUScene.h:343
TRefCountPtr< FRDGPooledBuffer > InstancePayloadDataBuffer
Definition GPUScene.h:347
bool ExecuteDeferredGPUWritePass(FRDGBuilder &GraphBuilder, TArray< FViewInfo > &Views, EGPUSceneGPUWritePass Pass)
Definition GPUScene.cpp:2278
bool bUpdateAllPrimitives
Definition GPUScene.h:336
int32 GetNumInstances() const
Definition GPUScene.h:285
void FreeInstanceSceneDataSlots(int32 InstanceSceneDataOffset, int32 NumInstanceSceneDataEntries)
Definition GPUScene.cpp:2040
void OnPreSceneUpdate(FRDGBuilder &GraphBuilder, const FScenePreUpdateChangeSet &ScenePreUpdateData)
Definition GPUScene.cpp:2344
int32 GetNumPrimitives() const
Definition GPUScene.h:286
TRefCountPtr< FRDGPooledBuffer > PrimitiveBuffer
Definition GPUScene.h:339
int32 AllocateInstancePayloadDataSlots(int32 NumInstancePayloadFloat4Entries)
Definition GPUScene.cpp:2054
void FreeInstancePayloadDataSlots(int32 InstancePayloadDataOffset, int32 NumInstancePayloadFloat4Entries)
Definition GPUScene.cpp:2069
void OnPostSceneUpdate(FRDGBuilder &GraphBuilder, const FScenePostUpdateChangeSet &ScenePostUpdateData)
Definition GPUScene.cpp:2353
FRDGAsyncScatterUploadBuffer InstancePayloadUploadBuffer
Definition GPUScene.h:348
void OnPostLightSceneInfoUpdate(FRDGBuilder &OnPostLightSceneInfoUpdate, const FLightSceneChangeSet &LightsPostUpdateData)
Definition GPUScene.cpp:2361
const FScene & GetScene() const
Definition GPUScene.h:358
ERHIFeatureLevel::Type GetFeatureLevel() const
Definition GPUScene.h:235
FRDGAsyncScatterUploadBuffer PrimitiveUploadBuffer
Definition GPUScene.h:340
FGPUSceneResourceParametersRHI GetShaderParametersRHI() const
Definition GPUScene.cpp:2374
FRDGAsyncScatterUploadBuffer LightmapUploadBuffer
Definition GPUScene.h:353
FSpanAllocator InstancePayloadDataAllocator
Definition GPUScene.h:346
bool IsEnabled() const
Definition GPUScene.h:225
int32 GetMaxLightId() const
Definition GPUScene.h:287
void ConsolidateInstanceDataAllocations()
Definition GPUScene.cpp:2249
int32 GetNumLightmapDataItems() const
Definition GPUScene.h:288
const FSpanAllocator & GetInstanceSceneDataAllocator() const
Definition GPUScene.h:296
bool FillSceneUniformBuffer(FRDGBuilder &GraphBuilder, FSceneUniformBuffer &SceneUB) const
Definition GPUScene.cpp:1912
FORCEINLINE EPrimitiveDirtyState GetPrimitiveDirtyState(FPersistentPrimitiveIndex PersistentPrimitiveIndex) const
Definition GPUScene.h:274
uint32 GetInstanceIdUpperBoundGPU() const
Definition GPUScene.cpp:2079
SIZE_T GetAllocatedSize() const
Definition GPUScene.cpp:2366
Definition InstanceCullingOcclusionQuery.h:21
Definition InstanceCullingManager.h:22
Definition LightSceneInfo.h:36
Definition PrimitiveSceneProxy.h:296
Definition UnifiedBuffer.h:371
Definition RenderGraphResources.h:1321
Definition RenderGraphBuilder.h:49
Definition RenderGraphUtils.h:1272
Definition RHICommandList.h:3819
Definition ScenePrimitiveUpdates.h:129
Definition ScenePrimitiveUpdates.h:116
Definition SceneUniformBuffer.h:137
Definition ScenePrivate.h:2875
Definition SpanAllocator.h:15
int32 GetMaxSize() const
Definition SpanAllocator.h:80
Definition SceneRendering.h:1132
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT bool IsValidIndex(SizeType Index) const
Definition Array.h:1122
SizeType AddZeroed()
Definition Array.h:2755
Definition RenderGraphResources.h:251
Definition Range.h:50
static UE_FORCEINLINE_HINT TRange Empty()
Definition Range.h:671
Definition RefCounting.h:454
Definition StaticArray.h:26
Definition Mutex.h:18
Definition SceneRendererInterface.h:24
Type
Definition RHIFeatureLevel.h:20
Definition SceneView.h:41
Definition GPUScene.h:534
TStaticArray< FVector4f, DataStrideInFloat4s > Data
Definition GPUScene.h:537
static const uint32 DataStrideInFloat4s
Definition GPUScene.h:535
static void Emplace(FBatchedPrimitiveShaderData *Dest, const FPrimitiveUniformShaderParameters &ShaderParams)
Definition GPUScene.cpp:2538
FBatchedPrimitiveShaderData()
Definition GPUScene.h:539
FBatchedPrimitiveShaderData(const FPrimitiveUniformShaderParameters &PrimitiveUniformShaderParameters)
Definition GPUScene.h:545
Definition GPUScene.h:204
FGPUSceneInstanceRange(FPersistentPrimitiveIndex InPrimitive, uint32 InInstanceSceneDataOffset, uint32 InNumInstanceSceneDataEntries)
Definition GPUScene.h:205
uint32 InstanceSceneDataOffset
Definition GPUScene.h:212
uint32 NumInstanceSceneDataEntries
Definition GPUScene.h:213
FPersistentPrimitiveIndex Primitive
Definition GPUScene.h:211
Definition ScenePrivate.h:2850
Definition MeshBatch.h:124
Definition MeshPassProcessor.h:1559
int32 Index
Definition MeshPassProcessor.h:1561
Definition GPUScene.cpp:1643