Go to the documentation of this file.
48 template <
class TBase,
typename CommandQueueType>
56 CommandQueueType** Queues,
57 Uint32 NumDeferredContexts) :
58 TBase{pRefCounters, RawMemAllocator, pEngineFactory, NumDeferredContexts},
63 new (
m_CommandQueues + q) CommandQueue(RefCntAutoPtr<CommandQueueType>(Queues[q]), this->m_RawMemAllocator);
97 template <typename ObjectType, typename = typename std::enable_if<std::is_object<ObjectType>::value>::type>
100 VERIFY(
m_CommandQueues !=
nullptr,
"Command queues have been destroyed. Are you releasing an object from the render device destructor?");
104 VERIFY(QueueMask != 0,
"At least one bit should be set in the command queue mask");
108 Atomics::Long NumReferences = PlatformMisc::CountOneBits(QueueMask);
111 while (QueueMask != 0)
113 auto QueueIndex = PlatformMisc::GetLSB(QueueMask);
118 Queue.ReleaseQueue.SafeReleaseResource(Wrapper, Queue.NextCmdBufferNumber.load());
124 Wrapper.GiveUpOwnership();
148 Queue.ReleaseQueue.Purge(CompletedFenceValue);
156 Uint64 CmdBufferNumber = 0;
159 std::lock_guard<std::mutex> Lock{Queue.Mtx};
161 if (ReleaseResources)
166 CmdBufferNumber = Queue.NextCmdBufferNumber.fetch_add(1);
170 FenceValue = Queue.CmdQueue->WaitForIdle();
173 if (ReleaseResources)
175 Queue.ReleaseQueue.DiscardStaleResources(CmdBufferNumber, FenceValue);
176 Queue.ReleaseQueue.Purge(Queue.CmdQueue->GetCompletedFenceValue());
191 template <
typename... SubmitDataType>
194 SubmittedCommandBufferInfo CmdBuffInfo;
199 std::lock_guard<std::mutex> Lock{Queue.Mtx};
204 CmdBuffInfo.CmdBufferNumber = Queue.NextCmdBufferNumber.fetch_add(1);
207 CmdBuffInfo.FenceValue = Queue.CmdQueue->Submit(SubmitData...);
210 if (DiscardStaleResources)
224 Queue.ReleaseQueue.DiscardStaleResources(CmdBuffInfo.CmdBufferNumber, CmdBuffInfo.FenceValue);
257 template <
typename TAction>
262 std::lock_guard<std::mutex> Lock{Queue.Mtx};
263 Action(Queue.CmdQueue);
271 return Queue.CmdQueue;
289 DEV_CHECK_ERR(Queue.ReleaseQueue.GetStaleResourceCount() == 0,
"All stale resources must be released before destroying a command queue");
290 DEV_CHECK_ERR(Queue.ReleaseQueue.GetPendingReleaseResourceCount() == 0,
"All resources must be released before destroying a command queue");
291 Queue.~CommandQueue();
Uint64 GetCommandQueueMask() const
Definition: RenderDeviceNextGenBase.hpp:132
Base interface for a reference counter object that stores the number of strong and weak references an...
Definition: ReferenceCounters.h:44
ResourceReleaseQueue< DynamicStaleResourceWrapper > & GetReleaseQueue(Uint32 QueueIndex)
Definition: RenderDeviceNextGenBase.hpp:230
ResourceReleaseQueue< DynamicStaleResourceWrapper > ReleaseQueue
Definition: RenderDeviceNextGenBase.hpp:317
long Long
Definition: BasicAtomics.hpp:34
size_t GetCommandQueueCount() const
Definition: RenderDeviceNextGenBase.hpp:127
virtual Bool IsFenceSignaled(Uint32 QueueIndex, Uint64 FenceValue) override final
Definition: RenderDeviceNextGenBase.hpp:252
RefCntAutoPtr< CommandQueueType > CmdQueue
Definition: RenderDeviceNextGenBase.hpp:316
uint64_t Uint64
64-bit unsigned integer
Definition: BasicTypes.h:50
void LockCmdQueueAndRun(Uint32 QueueIndex, TAction Action)
Definition: RenderDeviceNextGenBase.hpp:258
Uint64 CmdBufferNumber
Definition: RenderDeviceNextGenBase.hpp:188
CommandQueue(RefCntAutoPtr< CommandQueueType > _CmdQueue, IMemoryAllocator &Allocator) noexcept
Definition: RenderDeviceNextGenBase.hpp:300
Definition: RenderDeviceNextGenBase.hpp:186
void IdleAllCommandQueues(bool ReleaseResources)
Definition: RenderDeviceNextGenBase.hpp:180
void IdleCommandQueue(size_t QueueIdx, bool ReleaseResources)
Definition: RenderDeviceNextGenBase.hpp:151
RenderDeviceNextGenBase(IReferenceCounters *pRefCounters, IMemoryAllocator &RawMemAllocator, IEngineFactory *pEngineFactory, size_t CmdQueueCount, CommandQueueType **Queues, Uint32 NumDeferredContexts)
Definition: RenderDeviceNextGenBase.hpp:52
#define DEV_CHECK_ERR(...)
Definition: DebugUtilities.hpp:90
SubmittedCommandBufferInfo SubmitCommandBuffer(Uint32 QueueIndex, bool DiscardStaleResources, const SubmitDataType &... SubmitData)
Definition: RenderDeviceNextGenBase.hpp:192
Vector3< T > max(const Vector3< T > &a, const Vector3< T > &b)
Definition: BasicMath.hpp:1660
Facilitates safe resource destruction in D3D12 and Vulkan.
Definition: ResourceReleaseQueue.hpp:221
Base implementation of the render device for next-generation backends.
Definition: RenderDeviceNextGenBase.hpp:49
Definition: RenderDeviceNextGenBase.hpp:298
CommandQueue & operator=(const CommandQueue &)=delete
virtual Uint64 GetNextFenceValue(Uint32 QueueIndex) override final
Definition: RenderDeviceNextGenBase.hpp:247
void SafeReleaseDeviceObject(ObjectType &&Object, Uint64 QueueMask)
Definition: RenderDeviceNextGenBase.hpp:98
const size_t m_CmdQueueCount
Definition: RenderDeviceNextGenBase.hpp:319
void PurgeReleaseQueues(bool ForceRelease=false)
Definition: RenderDeviceNextGenBase.hpp:137
#define DILIGENT_CALL_TYPE
Definition: CommonDefinitions.h:45
virtual Uint64 GetCompletedFenceValue(Uint32 QueueIndex) override final
Definition: RenderDeviceNextGenBase.hpp:242
CommandQueueType * LockCommandQueue(Uint32 QueueIndex)
Definition: RenderDeviceNextGenBase.hpp:266
uint32_t Uint32
32-bit unsigned integer
Definition: BasicTypes.h:51
std::mutex Mtx
Definition: RenderDeviceNextGenBase.hpp:314
bool Bool
Boolean.
Definition: BasicTypes.h:59
std::atomic_uint64_t NextCmdBufferNumber
Definition: RenderDeviceNextGenBase.hpp:315
void DestroyCommandQueues()
Definition: RenderDeviceNextGenBase.hpp:282
Base interface for a raw memory allocator.
Definition: MemoryAllocator.h:41
void UnlockCommandQueue(Uint32 QueueIndex)
Definition: RenderDeviceNextGenBase.hpp:274
const CommandQueueType & GetCommandQueue(Uint32 QueueIndex) const
Definition: RenderDeviceNextGenBase.hpp:236
#define VERIFY_EXPR(...)
Definition: DebugUtilities.hpp:79
#define VERIFY(...)
Definition: DebugUtilities.hpp:76
CommandQueue * m_CommandQueues
Definition: RenderDeviceNextGenBase.hpp:320
#define ALLOCATE(Allocator, Desc, Type, Count)
Definition: EngineMemory.h:47
Engine factory base interface.
Definition: EngineFactory.h:60
static DynamicStaleResourceWrapper Create(ResourceType &&Resource, Atomics::Long NumReferences)
Definition: ResourceReleaseQueue.hpp:68
Uint64 FenceValue
Definition: RenderDeviceNextGenBase.hpp:189
void PurgeReleaseQueue(Uint32 QueueIndex, bool ForceRelease=false)
Definition: RenderDeviceNextGenBase.hpp:143
The library uses Direct3D-style math:
Definition: AdvancedMath.hpp:37
~RenderDeviceNextGenBase()
Definition: RenderDeviceNextGenBase.hpp:66