UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
InstanceCullingContext.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "MeshPassProcessor.h"
7#include "RHI.h"
9
11class FGPUScene;
14class FScene;
18
19
20DECLARE_UNIFORM_BUFFER_STRUCT(FSceneUniformParameters, RENDERER_API)
21
27
31
33 RDG_BUFFER_ACCESS(DrawIndirectArgsBuffer, ERHIAccess::IndirectArgs)
35 SHADER_PARAMETER(uint32, InstanceDataByteOffset) // offset into per-instance buffer
36 SHADER_PARAMETER(uint32, IndirectArgsByteOffset) // offset into indirect args buffer
38 SHADER_PARAMETER_RDG_UNIFORM_BUFFER(FSceneUniformParameters, Scene)
41
43
45{
46 Normal,
47 Stereo,
48};
49
51{
52 None = 0,
54};
56
57// Enumeration of the specialized command processing variants
59{
60 // Generic processing mode, handles all the features.
61 Generic,
62 // General work batches that need load balancing, either instance runs or primitive id ranges (auto instanced) but culling is disabled
63 // may have multi-view (but probably not used for that path)
65
66 Num,
67};
68
70
74{
75public:
76 enum class EInstanceFlags : uint8
77 {
78 None = 0,
80 ForceInstanceCulling = 1 << 1,
82 };
83
84 static constexpr uint32 UniformViewInstanceStride[2] =
85 { // One for each BatchProcessingMode
88 };
89
90 static constexpr uint32 IndirectArgsNumWords = 5;
91 static constexpr uint32 CompactionBlockNumInstances = 64;
94
96
97 UE_DEPRECATED(5.4, "Use constructor which provides pass name as first argument")
109
116 const TCHAR* PassName,
124 );
126
128
129 static bool IsGPUCullingEnabled();
130 static bool IsOcclusionCullingEnabled();
131
136
137 bool IsEnabled() const { return bIsEnabled; }
138
140
145 void AddInstancesToDrawCommand(uint32 IndirectArgsOffset, int32 InstanceDataOffset, uint32 RunOffset, uint32 NumInstances, EInstanceFlags InstanceFlags);
146 void AddInstancesToDrawCommand(uint32 IndirectArgsOffset, int32 InstanceDataOffset, uint32 RunOffset, uint32 NumInstances, EInstanceFlags InstanceFlags, uint32 MaxBatchSize);
147
152 void AddInstanceRunsToDrawCommand(uint32 IndirectArgsOffset, int32 InstanceDataOffset, const uint32* Runs, uint32 NumRuns, EInstanceFlags InstanceFlags, uint32 MaxBatchSize);
153
154 /*
155 * Allocate space for indirect draw call argumens for a given MeshDrawCommand and initialize with draw command data.
156 * TODO: support cached pre-allocated commands.
157 */
158 uint32 AllocateIndirectArgs(const FMeshDrawCommand* MeshDrawCommand);
159
160 /*
161 * Computes instance data byte offset for a next draw command taking into account platform specifics
162 */
165
167
175
179 void WaitForSetupTask();
180
184
189 FRDGBuilder& GraphBuilder,
190 const FGPUScene& GPUScene,
193 FInstanceCullingResult& Results);
194
202
206 bool HasCullingCommands() const;
207
209
216 FRDGBuilder& GraphBuilder,
217 const FGPUScene& GPUScene,
219
221
225 static void AddClearIndirectArgInstanceCountPass(FRDGBuilder& GraphBuilder, FGlobalShaderMap* ShaderMap, FRDGBufferRef DrawIndirectArgsBuffer, TFunction<int32()> NumIndirectArgsCallback = TFunction<int32()>());
226
230 const FScene *Scene,
231 // Stats
235
237 const FMeshCommandOneFrameArray& VisibleMeshDrawCommands,
238 const FGraphicsMinimalPipelineStateSet& GraphicsMinimalPipelineStateSet,
239 const FMeshDrawCommandOverrideArgs& OverrideArgs,
240 int32 StartIndex,
241 int32 NumMeshDrawCommands,
242 uint32 InstanceFactor,
243 FRHICommandList& RHICmdList) const;
244
249 bool bIsEnabled = false;
252
254
257
259public:
260
262 {
265 };
266
268
269 // Auxiliary info for each mesh draw command that needs submitting.
271 {
272 // flag to indicate if using indirect or not.
274 // stores either the offset (in bytes) to the indirect args or the number of instances
276 // offset into per-instance buffer
278 //
281 };
282
305
334
340
344
346 // Driver for collecting items using one mode of processing
348
349 // Set of specialized batches that collect items with different properties each context may have only a subset.
350 //TStaticArray<FBatchProcessor, EBatchProcessingMode::Num> Batches;
351
352 // Processing mode to use for single-instance primitives, default to skip culling, as this is already done on CPU.
354
355 // Static uniform buffer slot for InstanceCulling/BatchedPrimitive UB. Only valid for a mobile renderer, which needs to handle cases with a manualy merged render-passes
357 // Whether current platform uses 'Uniform Buffer View' path
359
360#if MESH_DRAW_COMMAND_STATS
361public:
362 // Optional pass stats
364#endif
365};
366
368
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
@ InPlace
Definition CoreMiscDefines.h:162
#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::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 ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
FMeshDrawCommandOverrideArgs GetMeshDrawCommandOverrideArgs(const FInstanceCullingDrawParams &InstanceCullingDrawParams)
Definition InstanceCullingContext.cpp:94
EInstanceCullingMode
Definition InstanceCullingContext.h:45
EBatchProcessingMode
Definition InstanceCullingContext.h:59
EInstanceCullingFlags
Definition InstanceCullingContext.h:51
ERHIAccess
Definition RHIAccess.h:11
uint8 FUniformBufferStaticSlot
Definition RHIDefinitions.h:722
EShaderPlatform
Definition RHIShaderPlatform.h:11
@ SP_NumPlatforms
Definition RHIShaderPlatform.h:55
#define SHADER_PARAMETER_RDG_BUFFER_SRV(ShaderType, MemberName)
Definition ShaderParameterMacros.h:1800
#define END_GLOBAL_SHADER_PARAMETER_STRUCT
Definition ShaderParameterMacros.h:1669
#define RDG_BUFFER_ACCESS(MemberName, Access)
Definition ShaderParameterMacros.h:1923
#define BEGIN_SHADER_PARAMETER_STRUCT(StructTypeName, DllStorage)
Definition ShaderParameterMacros.h:1482
#define BEGIN_GLOBAL_SHADER_PARAMETER_STRUCT
Definition ShaderParameterMacros.h:1663
#define SHADER_PARAMETER_RDG_UNIFORM_BUFFER(StructType, MemberName)
Definition ShaderParameterMacros.h:1823
#define END_SHADER_PARAMETER_STRUCT()
Definition ShaderParameterMacros.h:1485
#define SHADER_PARAMETER(MemberType, MemberName)
Definition ShaderParameterMacros.h:1684
#define DECLARE_UNIFORM_BUFFER_STRUCT(StructTypeName, PrefixKeywords)
Definition ShaderParameterStructDeclaration.h:10
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition GPUScene.h:80
Definition GPUScene.h:217
Definition GlobalShader.h:173
Definition InstanceCullingContext.h:74
TArray< FPayloadData, SceneRenderingAllocator > PayloadData
Definition InstanceCullingContext.h:338
EBatchProcessingMode SingleInstanceProcessingMode
Definition InstanceCullingContext.h:353
EInstanceCullingMode GetInstanceCullingMode() const
Definition InstanceCullingContext.h:208
FInstanceCullingContext()
Definition InstanceCullingContext.h:95
uint32 NumCompactionInstances
Definition InstanceCullingContext.h:343
void BuildRenderingCommands(FRDGBuilder &GraphBuilder, const FGPUScene &GPUScene, int32 InDynamicInstanceIdOffset, int32 InDynamicInstanceIdNum, FInstanceCullingResult &Results)
Definition InstanceCullingContext.cpp:674
static void SetDeferredContextCullingParams(const FInstanceCullingDeferredContext &DeferredContext, FInstanceCullingDrawParams &Parameters)
Definition InstanceCullingContext.cpp:1354
bool IsInstanceOrderPreservationEnabled() const
Definition InstanceCullingContext.cpp:244
void AddInstancesToDrawCommand(uint32 IndirectArgsOffset, int32 InstanceDataOffset, uint32 RunOffset, uint32 NumInstances, EInstanceFlags InstanceFlags)
Definition InstanceCullingContext.cpp:306
static constexpr uint32 IndirectArgsNumWords
Definition InstanceCullingContext.h:90
void ResetCommands(int32 MaxNumCommands)
Definition InstanceCullingContext.cpp:230
TArray< int32, TInlineAllocator< 6, SceneRenderingAllocator > > ViewIds
Definition InstanceCullingContext.h:247
EAsyncProcessingMode
Definition InstanceCullingContext.h:262
EInstanceCullingMode InstanceCullingMode
Definition InstanceCullingContext.h:250
SyncPrerequisitesFuncType SyncPrerequisitesFunc
Definition InstanceCullingContext.h:258
TArray< uint32, SceneRenderingAllocator > CompactionBlockDataIndices
Definition InstanceCullingContext.h:342
void BeginAsyncSetup(SyncPrerequisitesFuncType &&InSyncPrerequisitesFunc)
Definition InstanceCullingContext.cpp:280
void SetupDrawCommands(FMeshCommandOneFrameArray &VisibleMeshDrawCommandsInOut, bool bCompactIdenticalCommands, const FScene *Scene, int32 &MaxInstancesOut, int32 &VisibleMeshDrawCommandsNumOut, int32 &NewPassVisibleMeshDrawCommandsNumOut)
Definition InstanceCullingContext.cpp:1442
TArray< uint32, SceneRenderingAllocator > InstanceIdOffsets
Definition InstanceCullingContext.h:339
uint32 StepInstanceDataOffsetBytes(uint32 NumStepDraws) const
Definition InstanceCullingContext.cpp:148
TRefCountPtr< IPooledRenderTarget > PrevHZB
Definition InstanceCullingContext.h:248
EInstanceFlags
Definition InstanceCullingContext.h:77
void WaitForSetupTask()
Definition InstanceCullingContext.cpp:285
static FInstanceCullingDeferredContext * CreateDeferredContext(FRDGBuilder &GraphBuilder, const FGPUScene &GPUScene, FInstanceCullingManager &InstanceCullingManager)
Definition InstanceCullingContext.cpp:1034
EShaderPlatform ShaderPlatform
Definition InstanceCullingContext.h:246
int32 DynamicInstanceIdNum
Definition InstanceCullingContext.h:256
EInstanceCullingFlags Flags
Definition InstanceCullingContext.h:251
int32 DynamicInstanceIdOffset
Definition InstanceCullingContext.h:255
static void AddClearIndirectArgInstanceCountPass(FRDGBuilder &GraphBuilder, FGlobalShaderMap *ShaderMap, FRDGBufferRef DrawIndirectArgsBuffer, TFunction< int32()> NumIndirectArgsCallback=TFunction< int32()>())
Definition InstanceCullingContext.cpp:1393
TArray< FCompactionData, SceneRenderingAllocator > DrawCommandCompactionData
Definition InstanceCullingContext.h:341
FInstanceCullingManager * InstanceCullingManager
Definition InstanceCullingContext.h:245
LoadBalancerArray LoadBalancers
Definition InstanceCullingContext.h:347
void SetDynamicPrimitiveInstanceOffsets(int32 InDynamicInstanceIdOffset, int32 InDynamicInstanceIdNum)
Definition InstanceCullingContext.cpp:294
uint32 GetInstanceIdNumElements() const
Definition InstanceCullingContext.cpp:163
void AddInstanceRunsToDrawCommand(uint32 IndirectArgsOffset, int32 InstanceDataOffset, const uint32 *Runs, uint32 NumRuns, EInstanceFlags InstanceFlags, uint32 MaxBatchSize)
Definition InstanceCullingContext.cpp:390
static bool IsGPUCullingEnabled()
Definition InstanceCullingContext.cpp:209
TArray< FUintVector2, SceneRenderingAllocator > DrawCommandDescs
Definition InstanceCullingContext.h:337
uint32 AllocateIndirectArgs(const FMeshDrawCommand *MeshDrawCommand)
Definition InstanceCullingContext.cpp:250
static RENDERER_API FUniformBufferStaticSlot GetStaticUniformBufferSlot(EShaderPlatform ShaderPlatform)
Definition InstanceCullingContext.cpp:115
uint32 TotalInstances
Definition InstanceCullingContext.h:253
bool HasCullingCommands() const
Definition InstanceCullingContext.cpp:693
FUniformBufferStaticSlot InstanceCullingStaticSlot
Definition InstanceCullingContext.h:356
static constexpr uint32 UniformViewInstanceStride[2]
Definition InstanceCullingContext.h:84
bool IsEnabled() const
Definition InstanceCullingContext.h:137
bool bUsesUniformBufferView
Definition InstanceCullingContext.h:358
void BuildRenderingCommandsInternal(FRDGBuilder &GraphBuilder, const FGPUScene &GPUScene, EAsyncProcessingMode AsyncProcessingMode, FInstanceCullingDrawParams *InstanceCullingDrawParams)
Definition InstanceCullingContext.cpp:698
TStaticArray< FInstanceProcessingGPULoadBalancer *, static_cast< uint32 >(EBatchProcessingMode::Num)> LoadBalancerArray
Definition InstanceCullingContext.h:345
static bool IsOcclusionCullingEnabled()
Definition InstanceCullingContext.cpp:214
bool bIsEnabled
Definition InstanceCullingContext.h:249
RENDERER_API ~FInstanceCullingContext()
Definition InstanceCullingContext.cpp:219
static constexpr uint32 CompactionBlockNumInstances
Definition InstanceCullingContext.h:91
TArray< FMeshDrawCommandInfo, SceneRenderingAllocator > MeshDrawCommandInfos
Definition InstanceCullingContext.h:335
static RENDERER_API uint32 GetInstanceIdBufferStride(EShaderPlatform ShaderPlatform)
Definition InstanceCullingContext.cpp:136
void SubmitDrawCommands(const FMeshCommandOneFrameArray &VisibleMeshDrawCommands, const FGraphicsMinimalPipelineStateSet &GraphicsMinimalPipelineStateSet, const FMeshDrawCommandOverrideArgs &OverrideArgs, int32 StartIndex, int32 NumMeshDrawCommands, uint32 InstanceFactor, FRHICommandList &RHICmdList) const
Definition InstanceCullingContext.cpp:1673
static RENDERER_API const TRDGUniformBufferRef< FInstanceCullingGlobalUniforms > CreateDummyInstanceCullingUniformBuffer(FRDGBuilder &GraphBuilder)
Definition InstanceCullingContext.cpp:609
TArray< FRHIDrawIndexedIndirectParameters, SceneRenderingAllocator > IndirectArgs
Definition InstanceCullingContext.h:336
Definition InstanceCullingContext.cpp:621
Definition InstanceCullingManager.h:45
Definition InstanceCullingManager.h:22
Definition MeshPassProcessor.h:1223
Definition RenderGraphResources.h:1321
Definition RenderGraphBuilder.h:49
Definition RHICommandList.h:3819
Definition ScenePrivate.h:2875
Definition ArrayView.h:139
Definition RenderGraphResources.h:251
Definition RefCounting.h:454
Definition InstanceCullingContext.h:307
static const uint32 NumViewBits
Definition InstanceCullingContext.h:308
uint32 NumInstances_NumViews
Definition InstanceCullingContext.h:310
FCompactionData(uint32 InNumInstances, uint32 InNumViews, uint32 InBlockOffset, uint32 InIndirectArgsIndex, uint32 InSrcInstanceIdOffset, uint32 InDestInstanceIdOffset)
Definition InstanceCullingContext.h:317
uint32 BlockOffset
Definition InstanceCullingContext.h:311
uint32 DestInstanceIdOffset
Definition InstanceCullingContext.h:314
uint32 IndirectArgsIndex
Definition InstanceCullingContext.h:312
uint32 SrcInstanceIdOffset
Definition InstanceCullingContext.h:313
Definition InstanceCullingContext.h:271
uint32 BatchDataStride
Definition InstanceCullingContext.h:280
uint32 NumBatches
Definition InstanceCullingContext.h:279
uint32 bUseIndirect
Definition InstanceCullingContext.h:273
uint32 InstanceDataByteOffset
Definition InstanceCullingContext.h:277
uint32 IndirectArgsOffsetOrNumInstances
Definition InstanceCullingContext.h:275
Definition InstanceCullingContext.h:284
uint32 CompactionDataIndex
Definition InstanceCullingContext.h:288
uint32 InstanceDataOffset
Definition InstanceCullingContext.h:286
uint32 bDynamicInstanceDataOffset_IndirectArgsIndex
Definition InstanceCullingContext.h:285
FPayloadData(bool bInDynamicInstanceDataOffset, uint32 InIndirectArgsIndex, uint32 InInstanceDataOffset, uint32 InRunInstanceOffset, uint32 InCompactionDataIndex)
Definition InstanceCullingContext.h:291
uint32 RunInstanceOffset
Definition InstanceCullingContext.h:287
Definition InstanceCullingManager.h:30
Definition MeshPassProcessor.h:1176
Definition RendererInterface.h:494