54 template<
typename DataContainer>
61 return lhs._firstIDX <= rhs._firstIDX && lhs._lastIDX >= rhs._lastIDX;
66 if ( crtRange.range() == 0u )
73 if ( prevRange.range() > 0u && prevRange != crtRange && !
Contains( crtRange, prevRange ) )
75 if ( prevRange._firstIDX < crtRange._firstIDX && prevRange._lastIDX > crtRange._lastIDX )
79 else if ( prevRange._firstIDX < crtRange._firstIDX )
84 else if ( prevRange._lastIDX > crtRange._lastIDX )
101 if ( target._firstIDX > source._firstIDX )
103 target._firstIDX = source._firstIDX;
106 if ( target._lastIDX < source._lastIDX )
108 target._lastIDX = source._lastIDX;
117 if ( range._bufferUpdateRange._firstIDX > idx )
119 range._bufferUpdateRange._firstIDX = idx;
121 if ( range._bufferUpdateRange._lastIDX < idx )
123 range._bufferUpdateRange._lastIDX = idx;
126 range._highWaterMark = std::max( range._highWaterMark, idx + 1u );
142 template<
typename DataContainer>
145 if ( target.
range() == 0u )
153 const size_t bufferPrimitiveSize = executorBuffer.
_gpuBuffer->getPrimitiveSize();
154 if ( bufferPrimitiveSize < bufferAlignmentRequirement )
168 if constexpr ( std::is_same<DataContainer, RenderPassExecutor::BufferIndirectionData>::value )
178 memCmdInOut.
_bufferLocks.push_back( executorBuffer.
_gpuBuffer->writeData( { target._firstIDX, target.range() }, data));
181 template<
typename DataContainer>
206 template<
typename DataContainer>
228 template<
typename DataContainer>
247 for (
U32 i = 0u; i < executorBuffer.
_gpuBuffer->queueLength() - 1u; ++i )
271 [[nodiscard]]
U32 BufferUpdateRange::range() const noexcept
273 return _lastIDX >= _firstIDX ? _lastIDX - _firstIDX + 1u : 0u;
276 void BufferUpdateRange::reset() noexcept
284 , _context( context )
335 state0.enabled(
true );
387 U8 selectionFlag = 0u;
442 rComp->occlusionCull() ? 1u : 0u
451 if ( 0u == transformIdx ||
479 const size_t count = infoContainer.size();
480 for (
size_t idx = 0u; idx < count; ++idx )
482 const auto [hash, _] = infoContainer[idx];
483 if ( hash == materialHash )
486 infoContainer[idx]._framesSinceLastUsed = 0u;
498 const size_t count = infoContainer.size();
499 for (
size_t idx = 0u; idx < count; ++idx )
501 const auto [hash, _] = infoContainer[idx];
502 if ( hash == materialHash )
505 infoContainer[idx]._framesSinceLastUsed = 0u;
512 for (
U16 idx = 0u; idx < count; ++idx )
514 const auto [hash, framesSinceLastUsed] = infoContainer[idx];
519 bestCandidate._index = idx;
520 bestCandidate._framesSinceLastUsed = g_maxMaterialFrameLifetime;
524 if ( framesSinceLastUsed >= std::max( g_maxMaterialFrameLifetime, bestCandidate._framesSinceLastUsed ) )
526 bestCandidate._index = idx;
527 bestCandidate._framesSinceLastUsed = framesSinceLastUsed;
532 DIVIDE_ASSERT( bestCandidate._index !=
g_invalidMaterialIndex,
"RenderPassExecutor::processVisibleNode error: too many concurrent materials! Increase Config::MAX_CONCURRENT_MATERIALS" );
534 infoContainer[bestCandidate._index] = { materialHash, 0u };
535 assert( bestCandidate._index <
_materialBuffer._data._gpuData.size() );
539 return bestCandidate._index;
548 U32 minIndirection =
U32_MAX, maxIndirection = 0u;
550 for (
U32 i = start; i < end; ++i )
558 [[maybe_unused]]
bool cacheHit =
false;
562 if ( idx < minMaterial)
566 if ( idx > maxMaterial)
575 if ( indirectionIDX < minIndirection )
577 minIndirection = indirectionIDX;
579 if ( indirectionIDX > maxIndirection )
581 maxIndirection = indirectionIDX;
590 [[nodiscard]]
constexpr size_t MIN_NODE_COUNT(
const size_t N,
const size_t L)
noexcept
592 return N == 0u ? L : N;
599 constexpr bool doMainPass =
true;
622 bool updateTaskDirty =
false;
633 const U32 queueSize =
to_U32( queue.size() );
634 if ( queueSize > g_nodesPerPrepareDrawPartition )
638 for (
U32 i = 0u; i < queueSize / 2; ++i )
645 for (
U32 i = queueSize / 2; i < queueSize; ++i )
650 updateTaskDirty =
true;
654 for (
U32 i = 0u; i < queueSize; ++i )
659 nodeCount += queueSize;
667 const U32 queueSize =
to_U32( queue.size() );
668 if ( queueSize > g_nodesPerPrepareDrawPartition )
670 const U32 midPoint = queueSize / 2;
679 updateTaskDirty =
true;
690 Start( *updateTask, pool );
691 Wait( *updateTask, pool );
696 const auto retrieveCommands = [&]()
758 auto cmd = GFX::EnqueueCommand<GFX::BindShaderResourcesCommand>( bufferInOut );
770 Set(binding.
_data,
_transformBuffer._gpuBuffer.get(), { 0u, MIN_NODE_COUNT(_transformBuffer._range._highWaterMark, Config::MAX_VISIBLE_NODES )});
778 Set( binding.
_data,
_materialBuffer._gpuBuffer.get(), { 0u, MIN_NODE_COUNT(_materialBuffer._range._highWaterMark, Config::MAX_CONCURRENT_MATERIALS )});
781 return queueTotalSize;
787 const bool hasInvalidNodes,
788 const bool doPrePass,
789 const bool doOITPass,
795 if ( hasInvalidNodes )
797 bool nodeRemoved =
true;
798 while ( nodeRemoved )
820 const auto cbk = [&](
const Task* ,
const U32 start,
const U32 end )
823 for (
U32 i = start; i < end; ++i )
834 memCmdInOut.
_bufferLocks.insert(memCmdInOut.
_bufferLocks.cend(), postDrawMemCmd._bufferLocks.cbegin(), postDrawMemCmd._bufferLocks.cend());
858 queueParams._filterByBinType =
false;
861 return buildDrawCommands( index, params, doPrePass, doOITPass, bufferInOut, memCmdInOut );
866 bool transparencyPass,
884 const auto cbk = [&](
const Task* ,
const U32 start,
const U32 end )
886 for (
U32 i = start; i < end; ++i )
890 if ( sgn->
getNode().renderState().drawState( stagePass ) )
900 memCmdInOut.
_bufferLocks.insert( memCmdInOut.
_bufferLocks.cend(), postDrawMemCmd._bufferLocks.cbegin(), postDrawMemCmd._bufferLocks.cend() );
903 if ( nodeCount > g_nodesPerPrepareDrawPartition * 2 )
916 cbk(
nullptr, 0u, nodeCount );
920 _renderQueue->sort( stagePass, targetBin, renderOrder );
931 queueParams._filterByBinType =
false;
949 auto cmd = GFX::EnqueueCommand<GFX::BeginDebugScopeCommand>( bufferInOut );
956 GFX::EnqueueCommand<GFX::EndDebugScopeCommand>( bufferInOut );
966 GFX::EnqueueCommand<GFX::BeginDebugScopeCommand>( bufferInOut )->_scopeName =
" - PrePass";
970 renderPassCmd.
_name =
"DO_PRE_PASS";
971 renderPassCmd._target = params.
_target;
975 GFX::EnqueueCommand<GFX::BeginRenderPassCommand>( bufferInOut, renderPassCmd );
980 GFX::EnqueueCommand<GFX::EndDebugScopeCommand>( bufferInOut );
985 [[maybe_unused]]
const size_t visibleNodeCount,
992 GFX::EnqueueCommand<GFX::BeginDebugScopeCommand>( bufferInOut )->_scopeName =
"HiZ Construct & Cull";
994 GFX::EnqueueCommand<GFX::MemoryBarrierCommand>( bufferInOut )->_bufferLocks.emplace_back(
BufferLock
1002 const auto [hizTexture, hizSampler] =
_context.
constructHIZ( sourceDepthBuffer, targetHiZBuffer, bufferInOut );
1011 GFX::EnqueueCommand<GFX::MemoryBarrierCommand>( bufferInOut )->_bufferLocks.emplace_back(
BufferLock
1018 GFX::EnqueueCommand<GFX::EndDebugScopeCommand>( bufferInOut );
1027 GFX::EnqueueCommand<GFX::BeginDebugScopeCommand>( bufferInOut )->_scopeName =
" - MainPass";
1033 renderPassCmd.
_name =
"DO_MAIN_PASS";
1034 renderPassCmd._target = params.
_target;
1038 GFX::EnqueueCommand<GFX::BeginRenderPassCommand>( bufferInOut, renderPassCmd );
1040 auto cmd = GFX::EnqueueCommand<GFX::BindShaderResourcesCommand>( bufferInOut );
1057 else if ( prePassExecuted )
1068 GFX::EnqueueCommand<GFX::EndDebugScopeCommand>( bufferInOut );
1077 GFX::EnqueueCommand<GFX::BeginDebugScopeCommand>( bufferInOut )->_scopeName =
" - W-OIT Pass";
1081 beginRenderPassOitCmd->
_name =
"OIT PASS 1";
1105 beginRenderPassCompCmd->
_name =
"OIT PASS 2";
1116 auto cmd = GFX::EnqueueCommand<GFX::BindShaderResourcesCommand>( bufferInOut );
1120 Set( binding.
_data, accumAtt->texture(), accumAtt->_descriptor._sampler );
1124 Set( binding.
_data, revAtt->texture(), revAtt->_descriptor._sampler );
1128 Set( binding.
_data, normalsAtt->texture(), normalsAtt->_descriptor._sampler );
1131 GFX::EnqueueCommand<GFX::DrawCommand>( bufferInOut )->_drawCommands.emplace_back();
1132 GFX::EnqueueCommand<GFX::EndRenderPassCommand>( bufferInOut );
1133 GFX::EnqueueCommand<GFX::EndDebugScopeCommand>( bufferInOut );
1144 beginRenderPassTransparentCmd.
_name =
"DO_TRANSPARENCY_PASS";
1145 beginRenderPassTransparentCmd._target = params.
_target;
1148 GFX::EnqueueCommand<GFX::BeginRenderPassCommand>( bufferInOut, beginRenderPassTransparentCmd );
1150 GFX::EnqueueCommand<GFX::EndRenderPassCommand>( bufferInOut );
1160 GFX::EnqueueCommand<GFX::BeginDebugScopeCommand>( bufferInOut )->_scopeName =
" - Resolve Screen Targets";
1166 beginRenderPassCommand->
_name =
"RESOLVE_MAIN_GBUFFER";
1173 auto cmd = GFX::EnqueueCommand<GFX::BindShaderResourcesCommand>( bufferInOut );
1178 GFX::EnqueueCommand<GFX::DrawCommand>( bufferInOut )->_drawCommands.emplace_back();
1179 GFX::EnqueueCommand<GFX::EndRenderPassCommand>( bufferInOut );
1181 GFX::EnqueueCommand<GFX::EndDebugScopeCommand>( bufferInOut );
1191 for (
I32 i = nodeCount - 1; i >= 0; i-- )
1270 constexpr bool doMainPass =
true;
1278 bool hasInvalidNodes =
false;
1296 else if ( drawTranslucents )
1307 if ( hasInvalidNodes )
1312 return node._node == nullptr || !node._materialReady;
1326 GFX::EnqueueCommand<GFX::SetClipPlanesCommand>( bufferInOut )->_clippingPlanes = params.
_clippingPlanes;
1330 const size_t visibleNodeCount =
prepareNodeData( playerIdx, params, camSnapshot, hasInvalidNodes, doPrePass, doOITPass, bufferInOut, memCmdInOut );
1332# pragma region PRE_PASS
1337 prePass( params, camSnapshot, bufferInOut, memCmdInOut );
1345 if ( doOcclusionPass )
1355# pragma region LIGHT_PASS
1359# pragma region MAIN_PASS
1366 if ( doMainPass ) [[likely]]
1369 mainPass( params, camSnapshot, *target, doPrePass, doOcclusionPass, bufferInOut, memCmdInOut );
1377# pragma region TRANSPARENCY_PASS
1378 if ( drawTranslucents )
1384 woitPass( params, camSnapshot, bufferInOut, memCmdInOut );
1394 GFX::EnqueueCommand<GFX::EndDebugScopeCommand>( bufferInOut );
1441 DIVIDE_ASSERT(
entry !=
U32_MAX,
"Insufficient space left in indirection buffer. Consider increasing available storage!" );
#define PROFILE_SCOPE_AUTO(CATEGORY)
#define PROFILE_SCOPE(NAME, CATEGORY)
AnimEvaluator::FrameIndex frameIndex() const noexcept
void playAnimations(const bool state) noexcept
static SceneRenderState & renderState(Divide::ProjectManager *mgr) noexcept
static void prepareLightData(Divide::ProjectManager *mgr, const RenderStage stage, const CameraSnapshot &cameraSnapshot, GFX::MemoryBarrierCommand &memCmdInOut)
static void cullScene(Divide::ProjectManager *mgr, const NodeCullParams &cullParams, const U16 cullFlags, VisibleNodeList<> &nodesOut)
static void initDefaultCullValues(Divide::ProjectManager *mgr, const RenderStage stage, NodeCullParams &cullParamsInOut) noexcept
static void findNode(Divide::ProjectManager *mgr, const vec3< F32 > &cameraEye, const I64 nodeGUID, VisibleNodeList<> &nodesOut)
static void getCommandBuffer(RenderingComponent *renderable, RenderPackage *const pkg, GFX::CommandBuffer &bufferInOut)
static void setIndirectionBufferEntry(RenderingComponent *renderable, const U32 indirectionBufferEntry) noexcept
static U32 getIndirectionBufferEntry(RenderingComponent *const renderable) noexcept
static void retrieveDrawCommands(RenderingComponent &renderable, const RenderStagePass stagePass, const U32 cmdOffset, DrawCommandContainer &cmdsInOut)
static bool hasDrawCommands(RenderingComponent &renderable) noexcept
static bool prepareDrawPackage(RenderingComponent &renderable, const CameraSnapshot &cameraSnapshot, const SceneRenderState &sceneRenderState, RenderStagePass renderStagePass, GFX::MemoryBarrierCommand &postDrawMemCmd, const bool refreshData)
static bool canDraw(const SceneGraphNode *node, const RenderStagePass &stagePass)
vec4< F32 > asVec4() const noexcept
const BoundingSphere & getBoundingSphere() const noexcept
static Camera * GetUtilityCamera(const UtilityCamera type)
const Frustum & getFrustum() const noexcept
Returns the most recent/up-to-date frustum.
const CameraSnapshot & snapshot() const noexcept
Returns the internal camera snapshot data (eye, orientation, etc)
bool updateLookAt()
Return true if the cached camera state wasn't up-to-date.
Rough around the edges Adapter pattern abstracting the actual rendering API and access to the GPU.
void occlusionCull(const RenderPass::PassData &passData, Handle< Texture > hizBuffer, SamplerDescriptor sampler, const CameraSnapshot &cameraSnapshot, bool countCulledNodes, GFX::CommandBuffer &bufferInOut)
ShaderBuffer_uptr newSB(const ShaderBufferDescriptor &descriptor)
GFXRTPool & renderTargetPool() noexcept
Renderer & getRenderer() const
Pipeline * newPipeline(const PipelineDescriptor &descriptor)
Create and return a new graphics pipeline. This is only used for caching and doesn't use the object a...
const GFXShaderData::PrevFrameData & previousFrameData(PlayerIndex player) const noexcept
std::pair< Handle< Texture >, SamplerDescriptor > constructHIZ(RenderTargetID depthBuffer, RenderTargetID HiZTarget, GFX::CommandBuffer &cmdBufferInOut)
RenderTarget * getRenderTarget(const RenderTargetID target) const
FORCE_INLINE I64 getGUID() const noexcept
Kernel & parent() noexcept
FORCE_INLINE PlatformContext & platformContext() noexcept
PlatformContext & context() noexcept
TaskPool & taskPool(const TaskPoolType type) noexcept
void prePass(PlayerIndex idx, const CameraSnapshot &cameraSnapshot, GFX::CommandBuffer &bufferInOut)
ProjectManager & parent() noexcept
Handle< Texture > texture() const
RTAttachmentDescriptor _descriptor
eastl::fixed_vector< RenderingComponent *, Config::MAX_VISIBLE_NODES, false > SortedQueue
static constexpr U8 MATERIAL_IDX
ExecutorBuffer< BufferIndirectionData > _indirectionBuffer
static constexpr U8 SELECTION_FLAG
static void OnRenderingComponentCreation(RenderingComponent *rComp)
bool validateNodesForStagePass(RenderStagePass stagePass)
static void OnRenderingComponentDestruction(RenderingComponent *rComp)
void woitPass(const RenderPassParams ¶ms, const CameraSnapshot &cameraSnapshot, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
static Mutex s_indirectionGlobalLock
RenderQueuePackages _renderQueuePackages
ExecutorBuffer< BufferMaterialData > _materialBuffer
U16 processVisibleNodeMaterial(RenderingComponent *rComp, bool &cacheHit)
void transparencyPass(const RenderPassParams ¶ms, const CameraSnapshot &cameraSnapshot, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
void postInit(Handle< ShaderProgram > OITCompositionShader, Handle< ShaderProgram > OITCompositionShaderMS, Handle< ShaderProgram > ResolveGBufferShaderMS)
static bool s_globalDataInit
static Pipeline * s_OITCompositionPipeline
ExecutorBuffer< BufferTransformData > _transformBuffer
static constexpr U16 g_invalidMaterialIndex
void processVisibleNodeTransform(PlayerIndex index, RenderingComponent *rComp)
static constexpr U32 MAX_INDIRECTION_ENTRIES
void mainPass(const RenderPassParams ¶ms, const CameraSnapshot &cameraSnapshot, RenderTarget &target, bool prePassExecuted, bool hasHiZ, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
static constexpr size_t INVALID_MAT_HASH
void occlusionPass(PlayerIndex idx, const CameraSnapshot &cameraSnapshot, size_t visibleNodeCount, const RenderTargetID &sourceDepthBuffer, const RenderTargetID &targetHiZBuffer, GFX::CommandBuffer &bufferInOut) const
static Pipeline * s_OITCompositionMSPipeline
size_t prepareNodeData(PlayerIndex index, const RenderPassParams ¶ms, const CameraSnapshot &cameraSnapshot, bool hasInvalidNodes, const bool doPrePass, const bool doOITPass, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
RenderPassManager & _parent
vec4< U32 > NodeIndirectionData
void resolveMainScreenTarget(const RenderPassParams ¶ms, GFX::CommandBuffer &bufferInOut) const
void doCustomPass(PlayerIndex idx, Camera *camera, RenderPassParams params, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
static void OnShutdown(const GFXDevice &gfx)
size_t buildDrawCommands(PlayerIndex index, const RenderPassParams ¶ms, bool doPrePass, bool doOITPass, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
U32 renderQueueSize() const
RenderQueue_uptr _renderQueue
ShaderBuffer_uptr _cmdBuffer
DrawCommandContainer _drawCommands
VisibleNodeList _visibleNodesCache
static constexpr U8 TRANSFORM_IDX
RenderPassExecutor(RenderPassManager &parent, GFXDevice &context, RenderStage stage)
RenderBin::SortedQueues _sortedQueues
void prePass(const RenderPassParams ¶ms, const CameraSnapshot &cameraSnapshot, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
void parseMaterialRange(RenderBin::SortedQueue &queue, U32 start, U32 end)
static Pipeline * s_ResolveGBufferPipeline
static std::array< bool, MAX_INDIRECTION_ENTRIES > s_indirectionFreeList
void prepareRenderQueues(const RenderPassParams ¶ms, const CameraSnapshot &cameraSnapshot, bool transparencyPass, RenderingOrder renderOrder, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
static void OnStartup(const GFXDevice &gfx)
PassData getPassData() const noexcept
const RenderPass & getPassForStage(RenderStage renderStage) const noexcept
bool usesAttachment(RTAttachmentType type, RTColourAttachmentSlot slot=RTColourAttachmentSlot::SLOT_0) const
RTAttachment * getAttachment(RTAttachmentType type, RTColourAttachmentSlot slot=RTColourAttachmentSlot::SLOT_0) const
U16 getWidth() const noexcept
U16 getHeight() const noexcept
void prepareLighting(RenderStage stage, const Rect< I32 > &viewport, const CameraSnapshot &cameraSnapshot, GFX::CommandBuffer &bufferInOut)
U8 getLoDLevel(RenderStage renderStage) const noexcept
void getMaterialData(NodeMaterialData &dataOut) const
bool HasComponents(ComponentType componentType) const
FORCE_INLINE T * get() const
Returns a pointer to a specific component. Returns null if the SGN does not have the component reques...
static size_t AlignmentRequirement(BufferUsageType usage) noexcept
T & element(U8 row, U8 column) noexcept
void setRow(I32 index, U value) noexcept
static mat4< T > Multiply(const mat4< T > &matrixA, const mat4< T > &matrixB) noexcept
ret = A * B
constexpr U16 MAX_VISIBLE_NODES
Estimated maximum number of visible objects per render pass (this includes debug primitives)
constexpr U8 MAX_FRAMES_IN_FLIGHT
Maximum number of active frames until we start waiting on a fence/sync.
FORCE_INLINE T * EnqueueCommand(CommandBuffer &buffer)
constexpr Optick::Category::Type Streaming
constexpr Optick::Category::Type Scene
constexpr Optick::Category::Type Graphics
const char * RenderStageToString(const RenderStage stage) noexcept
Str StringFormat(const char *fmt, Args &&...args)
U32 PACK_UNORM4x8(const vec4< F32_NORM > &value)
void UpdateBufferRange(RenderPassExecutor::ExecutorBufferRange &range, const U32 idx)
void WriteToGPUBufferInternal(ExecutorBuffer< DataContainer > &executorBuffer, BufferUpdateRange target, GFX::MemoryBarrierCommand &memCmdInOut)
bool Contains(const BufferUpdateRange &lhs, const BufferUpdateRange &rhs) noexcept
constexpr U32 g_nodesPerPrepareDrawPartition
BufferUpdateRange GetPrevRangeDiff(const BufferUpdateRange &crtRange, const BufferUpdateRange &prevRange) noexcept
bool NodeNeedsUpdate(ExecutorBuffer< DataContainer > &executorBuffer, const U32 indirectionIDX)
void WriteToGPUBuffer(ExecutorBuffer< DataContainer > &executorBuffer, GFX::MemoryBarrierCommand &memCmdInOut)
FORCE_INLINE bool MergeBufferUpdateRanges(BufferUpdateRange &target, const BufferUpdateRange &source) noexcept
FORCE_INLINE void UpdateBufferRangeLocked(RenderPassExecutor::ExecutorBufferRange &range, const U32 idx) noexcept
constexpr U16 g_maxMaterialFrameLifetime
void ExecutorBufferPostRender(ExecutorBuffer< DataContainer > &executorBuffer)
Handle console commands that start with a forward slash.
std::lock_guard< mutex > LockGuard
static constexpr bool IsDepthPass(const RenderStagePass stagePass) noexcept
constexpr U32 to_U32(const T value)
constexpr U16 to_U16(const T value)
void Wait(const Task &task, TaskPool &pool)
@ TRANSLUCENT
Translucent items use a [0.0...1.0] alpha value supplied via an opacity map or via the albedo's alpha...
U16 IndexForStage(RenderStagePass renderStagePass)
Task * CreateTask(Predicate &&threadedFunction, bool allowedInIdle=true)
constexpr F32 to_F32(const T value)
std::shared_lock< mutex > SharedLock
void Set(DescriptorSetBindingData &dataInOut, ShaderBuffer *buffer, const BufferRange range) noexcept
DescriptorSetBinding & AddBinding(DescriptorSet &setInOut, U8 slot, U16 stageVisibilityMask)
static constexpr U8 TotalPassCountForStage(const RenderStage renderStage)
static const vec4< F32 > VECTOR4_UNIT
constexpr RenderTargetID INVALID_RENDER_TARGET_ID
size_t HashMaterialData(const NodeMaterialData &dataIn)
void efficient_clear(eastl::fixed_vector< T, nodeCount, bEnableOverflow, OverflowAllocator > &fixed_vector)
constexpr U8 to_U8(const T value)
void Start(Task &task, TaskPool &pool, TaskPriority priority=TaskPriority::DONT_CARE, const DELEGATE< void > &onCompletionFunction={})
bool contains(eastl::vector< T, A > &vec, const T &val)
constexpr size_t MIN_NODE_COUNT(const size_t N, const size_t L) noexcept
void Parallel_For(TaskPool &pool, const ParallelForDescriptor &descriptor, const DELEGATE< void, const Task *, U32, U32 > &cbk)
constexpr I32 to_I32(const T value)
bool dvd_erase_if(eastl::vector< T, A > &vec, Predicate &&pred)
Project const SceneEntry & entry
static const vec4< F32 > VECTOR4_ZERO
constexpr auto to_base(const Type value) -> Type
BufferUpdateUsage _updateUsage
BufferUsageType _usageType
BufferUpdateFrequency _updateFrequency
size_t _elementSize
Buffer primitive size in bytes.
DescriptorSetBindingData _data
RTDrawDescriptor _descriptor
RTClearDescriptor _clearDescriptor
CameraSnapshot _cameraSnapshot
static constexpr RTColourAttachmentSlot ALBEDO
static constexpr RTColourAttachmentSlot NORMALS
static constexpr RTColourAttachmentSlot MODULATE
static constexpr RTColourAttachmentSlot VELOCITY
static constexpr RTColourAttachmentSlot ACCUMULATION
static constexpr RTColourAttachmentSlot REVEALAGE
mat4< F32 > _previousViewProjectionMatrix
FrustumClipPlanes _clippingPlanes
vec3< F32 > _cameraEyePos
U32 _partitionSize
How many elements should we process per async task.
bool _useCurrentThread
If true, we'll process a for partition on the calling thread.
TaskPriority _priority
Each async task will start with the same priority specified here.
U32 _iterCount
For loop iteration count.
PrimitiveTopology _primitiveTopology
Handle< ShaderProgram > _shaderProgramHandle
RTBlendStates _blendStates
RenderStateBlock _stateBlock
SamplerDescriptor _sampler
std::array< BlendingSettings, to_base(RTColourAttachmentSlot::COUNT)> _settings
bool _keepMSAADataAfterResolve
std::array< LookupInfo, Config::MAX_CONCURRENT_MATERIALS > LookupInfoContainer
U32 range() const noexcept
eastl::fixed_vector< U32, MAX_INDIRECTION_ENTRIES, false > _nodeProcessedThisFrame
SharedMutex _nodeProcessedLock
ExecutorBufferRange _range
ShaderBuffer_uptr _gpuBuffer
BufferUpdateRange _bufferUpdateRangePrev
vector< BufferUpdateRange > _bufferUpdateRangeHistory
BufferUpdateRange _bufferUpdateRange
RTClearDescriptor _clearDescriptorPrePass
const SceneGraphNode * _sourceNode
I64 _singleNodeRenderGUID
RTDrawDescriptor _targetDescriptorPrePass
RenderTargetID _targetOIT
RenderTargetID _targetHIZ
RTDrawDescriptor _targetDescriptorMainPass
RenderStagePass _stagePass
FeedBackContainer * _feedBackContainer
FrustumClipPlanes _clippingPlanes
RTClearDescriptor _clearDescriptorMainPass
RenderStagePass _stagePass
static RenderTargetID NORMALS_RESOLVED
static RenderTargetID SCREEN
BufferParams _bufferParams
void remove(const size_t idx)
bufferPtr data() const noexcept
size_t size() const noexcept
const T & node(const size_t idx) const noexcept