diff options
| author | azhirnov <zh1dron@gmail.com> | 2020-08-31 12:04:27 +0000 |
|---|---|---|
| committer | azhirnov <zh1dron@gmail.com> | 2020-08-31 12:09:36 +0000 |
| commit | ab1149384b1185eb1b22eab8344055f82f9e10cb (patch) | |
| tree | 8221754353a7250d0a0b3ef84d229200c623f67b /Graphics/GraphicsEngineD3D12 | |
| parent | removed unused DXILUtils, fixed some Codacy issues (diff) | |
| parent | Added C API for IReferenceCounters (diff) | |
| download | DiligentCore-ab1149384b1185eb1b22eab8344055f82f9e10cb.tar.gz DiligentCore-ab1149384b1185eb1b22eab8344055f82f9e10cb.zip | |
Merge branch 'master' into mesh_shader
# Conflicts:
# Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp
Diffstat (limited to 'Graphics/GraphicsEngineD3D12')
6 files changed, 87 insertions, 30 deletions
diff --git a/Graphics/GraphicsEngineD3D12/include/QueryD3D12Impl.hpp b/Graphics/GraphicsEngineD3D12/include/QueryD3D12Impl.hpp index 18c01547..ab31743f 100644 --- a/Graphics/GraphicsEngineD3D12/include/QueryD3D12Impl.hpp +++ b/Graphics/GraphicsEngineD3D12/include/QueryD3D12Impl.hpp @@ -30,6 +30,7 @@ /// \file /// Declaration of Diligent::QueryD3D12Impl class +#include <array> #include "QueryD3D12.h" #include "QueryBase.hpp" #include "RenderDeviceD3D12Impl.hpp" @@ -64,15 +65,17 @@ public: } /// Implementation of IQueryD3D12::GetQueryHeapIndex(). - virtual Uint32 DILIGENT_CALL_TYPE GetQueryHeapIndex() const override final + virtual Uint32 DILIGENT_CALL_TYPE GetQueryHeapIndex(Uint32 QueryId) const override final { - return m_QueryHeapIndex; + VERIFY_EXPR(QueryId == 0 || m_Desc.Type == QUERY_TYPE_DURATION && QueryId == 1); + return m_QueryHeapIndex[QueryId]; } bool OnEndQuery(IDeviceContext* pContext); private: - Uint32 m_QueryHeapIndex = static_cast<Uint32>(-1); + std::array<Uint32, 2> m_QueryHeapIndex = {QueryManagerD3D12::InvalidIndex, QueryManagerD3D12::InvalidIndex}; + Uint64 m_QueryEndFenceValue = 0; }; diff --git a/Graphics/GraphicsEngineD3D12/interface/QueryD3D12.h b/Graphics/GraphicsEngineD3D12/interface/QueryD3D12.h index 34b5b660..d49f067b 100644 --- a/Graphics/GraphicsEngineD3D12/interface/QueryD3D12.h +++ b/Graphics/GraphicsEngineD3D12/interface/QueryD3D12.h @@ -45,6 +45,8 @@ static const INTERFACE_ID IID_QueryD3D12 = IQueryInclusiveMethods; \ IQueryD3D12Methods QueryD3D12 +// clang-format off + /// Exposes Direct3D12-specific functionality of a Query object. DILIGENT_BEGIN_INTERFACE(IQueryD3D12, IQuery) { @@ -52,16 +54,24 @@ DILIGENT_BEGIN_INTERFACE(IQueryD3D12, IQuery) VIRTUAL ID3D12QueryHeap* METHOD(GetD3D12QueryHeap)(THIS) PURE; /// Returns the index of a query object in Direct3D12 query heap. - VIRTUAL Uint32 METHOD(GetQueryHeapIndex)(THIS) CONST PURE; + + /// \param [in] QueryId - Query Id. For most query types this must be 0. An exception is + /// QUERY_TYPE_DURATION, in which case allowed values are 0 for the + /// beginning timestamp query, and 1 for the ending query. + /// \return the index of a query object in Direct3D12 query heap + VIRTUAL Uint32 METHOD(GetQueryHeapIndex)(THIS_ + Uint32 QueryId) CONST PURE; }; DILIGENT_END_INTERFACE +// clang-format on + #include "../../../Primitives/interface/UndefInterfaceHelperMacros.h" #if DILIGENT_C_INTERFACE -# define IQueryD3D12_GetD3D12QueryHeap(This) CALL_IFACE_METHOD(QueryD3D12, GetD3D12QueryHeap, This) -# define IQueryD3D12_GetQueryHeapIndex(This) CALL_IFACE_METHOD(QueryD3D12, GetQueryHeapIndex, This) +# define IQueryD3D12_GetD3D12QueryHeap(This) CALL_IFACE_METHOD(QueryD3D12, GetD3D12QueryHeap, This) +# define IQueryD3D12_GetQueryHeapIndex(This, ...) CALL_IFACE_METHOD(QueryD3D12, GetQueryHeapIndex, This, __VA_ARGS__) #endif diff --git a/Graphics/GraphicsEngineD3D12/src/D3D12TypeConversions.cpp b/Graphics/GraphicsEngineD3D12/src/D3D12TypeConversions.cpp index 1759663f..23652519 100644 --- a/Graphics/GraphicsEngineD3D12/src/D3D12TypeConversions.cpp +++ b/Graphics/GraphicsEngineD3D12/src/D3D12TypeConversions.cpp @@ -477,7 +477,9 @@ D3D12_QUERY_TYPE QueryTypeToD3D12QueryType(QUERY_TYPE QueryType) case QUERY_TYPE_BINARY_OCCLUSION: return D3D12_QUERY_TYPE_BINARY_OCCLUSION; case QUERY_TYPE_TIMESTAMP: return D3D12_QUERY_TYPE_TIMESTAMP; case QUERY_TYPE_PIPELINE_STATISTICS: return D3D12_QUERY_TYPE_PIPELINE_STATISTICS; + case QUERY_TYPE_DURATION: return D3D12_QUERY_TYPE_TIMESTAMP; + static_assert(QUERY_TYPE_NUM_TYPES == 6, "Not all QUERY_TYPE enum values are handled"); default: UNEXPECTED("Unexpected query type"); return static_cast<D3D12_QUERY_TYPE>(-1); @@ -494,7 +496,9 @@ D3D12_QUERY_HEAP_TYPE QueryTypeToD3D12QueryHeapType(QUERY_TYPE QueryType) case QUERY_TYPE_BINARY_OCCLUSION: return D3D12_QUERY_HEAP_TYPE_OCCLUSION; case QUERY_TYPE_TIMESTAMP: return D3D12_QUERY_HEAP_TYPE_TIMESTAMP; case QUERY_TYPE_PIPELINE_STATISTICS: return D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS; + case QUERY_TYPE_DURATION: return D3D12_QUERY_HEAP_TYPE_TIMESTAMP; + static_assert(QUERY_TYPE_NUM_TYPES == 6, "Not all QUERY_TYPE enum values are handled"); default: UNEXPECTED("Unexpected query type"); return static_cast<D3D12_QUERY_HEAP_TYPE>(-1); diff --git a/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp index a644155d..7d8dd348 100644 --- a/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp +++ b/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp @@ -2045,8 +2045,11 @@ void DeviceContextD3D12Impl::BeginQuery(IQuery* pQuery) auto& QueryMgr = m_pDevice->GetQueryManager(); auto& Ctx = GetCmdContext(); - auto Idx = pQueryD3D12Impl->GetQueryHeapIndex(); - QueryMgr.BeginQuery(Ctx, QueryType, Idx); + auto Idx = pQueryD3D12Impl->GetQueryHeapIndex(0); + if (QueryType != QUERY_TYPE_DURATION) + QueryMgr.BeginQuery(Ctx, QueryType, Idx); + else + QueryMgr.EndQuery(Ctx, QueryType, Idx); } void DeviceContextD3D12Impl::EndQuery(IQuery* pQuery) @@ -2064,7 +2067,7 @@ void DeviceContextD3D12Impl::EndQuery(IQuery* pQuery) auto& QueryMgr = m_pDevice->GetQueryManager(); auto& Ctx = GetCmdContext(); - auto Idx = pQueryD3D12Impl->GetQueryHeapIndex(); + auto Idx = pQueryD3D12Impl->GetQueryHeapIndex(QueryType == QUERY_TYPE_DURATION ? 1 : 0); QueryMgr.EndQuery(Ctx, QueryType, Idx); } diff --git a/Graphics/GraphicsEngineD3D12/src/QueryD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/QueryD3D12Impl.cpp index e7b5c1ee..30c9c4c4 100644 --- a/Graphics/GraphicsEngineD3D12/src/QueryD3D12Impl.cpp +++ b/Graphics/GraphicsEngineD3D12/src/QueryD3D12Impl.cpp @@ -41,19 +41,32 @@ QueryD3D12Impl::QueryD3D12Impl(IReferenceCounters* pRefCounters, const QueryDesc& Desc) : TQueryBase{pRefCounters, pDevice, Desc} { - auto& QueryMgr = pDevice->GetQueryManager(); - m_QueryHeapIndex = QueryMgr.AllocateQuery(m_Desc.Type); - if (m_QueryHeapIndex == QueryManagerD3D12::InvalidIndex) + auto& QueryMgr = pDevice->GetQueryManager(); + for (Uint32 i = 0; i < (m_Desc.Type == QUERY_TYPE_DURATION ? Uint32{2} : Uint32{1}); ++i) { - LOG_ERROR_AND_THROW("Failed to allocate D3D12 query for type ", GetQueryTypeString(m_Desc.Type), - ". Increase the query pool size in EngineD3D12CreateInfo."); + m_QueryHeapIndex[i] = QueryMgr.AllocateQuery(m_Desc.Type); + if (m_QueryHeapIndex[i] == QueryManagerD3D12::InvalidIndex) + { + for (Uint32 j = 0; j < i; ++j) + { + QueryMgr.ReleaseQuery(m_Desc.Type, m_QueryHeapIndex[j]); + } + LOG_ERROR_AND_THROW("Failed to allocate D3D12 query for type ", GetQueryTypeString(m_Desc.Type), + ". Increase the query pool size in EngineD3D12CreateInfo."); + } } } QueryD3D12Impl::~QueryD3D12Impl() { auto& QueryMgr = m_pDevice->GetQueryManager(); - QueryMgr.ReleaseQuery(m_Desc.Type, m_QueryHeapIndex); + for (auto HeapIdx : m_QueryHeapIndex) + { + if (HeapIdx != QueryManagerD3D12::InvalidIndex) + { + QueryMgr.ReleaseQuery(m_Desc.Type, HeapIdx); + } + } } bool QueryD3D12Impl::OnEndQuery(IDeviceContext* pContext) @@ -75,12 +88,23 @@ bool QueryD3D12Impl::GetData(void* pData, Uint32 DataSize, bool AutoInvalidate) { auto& QueryMgr = m_pDevice->GetQueryManager(); + auto GetTimestampFrequency = [this](Uint32 CmdQueueId) // + { + const auto& CmdQueue = m_pDevice->GetCommandQueue(CmdQueueId); + auto* pd3d12Queue = const_cast<ICommandQueueD3D12&>(CmdQueue).GetD3D12CommandQueue(); + + // https://microsoft.github.io/DirectX-Specs/d3d/CountersAndQueries.html#timestamp-frequency + UINT64 TimestampFrequency = 0; + pd3d12Queue->GetTimestampFrequency(&TimestampFrequency); + return TimestampFrequency; + }; + switch (m_Desc.Type) { case QUERY_TYPE_OCCLUSION: { UINT64 NumSamples; - QueryMgr.ReadQueryData(m_Desc.Type, m_QueryHeapIndex, &NumSamples, sizeof(NumSamples)); + QueryMgr.ReadQueryData(m_Desc.Type, m_QueryHeapIndex[0], &NumSamples, sizeof(NumSamples)); if (pData != nullptr) { auto& QueryData = *reinterpret_cast<QueryDataOcclusion*>(pData); @@ -92,7 +116,7 @@ bool QueryD3D12Impl::GetData(void* pData, Uint32 DataSize, bool AutoInvalidate) case QUERY_TYPE_BINARY_OCCLUSION: { UINT64 AnySamplePassed; - QueryMgr.ReadQueryData(m_Desc.Type, m_QueryHeapIndex, &AnySamplePassed, sizeof(AnySamplePassed)); + QueryMgr.ReadQueryData(m_Desc.Type, m_QueryHeapIndex[0], &AnySamplePassed, sizeof(AnySamplePassed)); if (pData != nullptr) { auto& QueryData = *reinterpret_cast<QueryDataBinaryOcclusion*>(pData); @@ -106,19 +130,12 @@ bool QueryD3D12Impl::GetData(void* pData, Uint32 DataSize, bool AutoInvalidate) case QUERY_TYPE_TIMESTAMP: { UINT64 Counter; - QueryMgr.ReadQueryData(m_Desc.Type, m_QueryHeapIndex, &Counter, sizeof(Counter)); + QueryMgr.ReadQueryData(m_Desc.Type, m_QueryHeapIndex[0], &Counter, sizeof(Counter)); if (pData != nullptr) { - auto& QueryData = *reinterpret_cast<QueryDataTimestamp*>(pData); - QueryData.Counter = Counter; - - const auto& CmdQueue = m_pDevice->GetCommandQueue(CmdQueueId); - auto* pd3d12Queue = const_cast<ICommandQueueD3D12&>(CmdQueue).GetD3D12CommandQueue(); - - // https://microsoft.github.io/DirectX-Specs/d3d/CountersAndQueries.html#timestamp-frequency - UINT64 TimestampFrequency = 0; - pd3d12Queue->GetTimestampFrequency(&TimestampFrequency); - QueryData.Frequency = TimestampFrequency; + auto& QueryData = *reinterpret_cast<QueryDataTimestamp*>(pData); + QueryData.Counter = Counter; + QueryData.Frequency = GetTimestampFrequency(CmdQueueId); } } break; @@ -126,7 +143,7 @@ bool QueryD3D12Impl::GetData(void* pData, Uint32 DataSize, bool AutoInvalidate) case QUERY_TYPE_PIPELINE_STATISTICS: { D3D12_QUERY_DATA_PIPELINE_STATISTICS d3d12QueryData; - QueryMgr.ReadQueryData(m_Desc.Type, m_QueryHeapIndex, &d3d12QueryData, sizeof(d3d12QueryData)); + QueryMgr.ReadQueryData(m_Desc.Type, m_QueryHeapIndex[0], &d3d12QueryData, sizeof(d3d12QueryData)); if (pData != nullptr) { auto& QueryData = *reinterpret_cast<QueryDataPipelineStatistics*>(pData); @@ -146,6 +163,20 @@ bool QueryD3D12Impl::GetData(void* pData, Uint32 DataSize, bool AutoInvalidate) } break; + case QUERY_TYPE_DURATION: + { + UINT64 StartCounter, EndCounter; + QueryMgr.ReadQueryData(m_Desc.Type, m_QueryHeapIndex[0], &StartCounter, sizeof(StartCounter)); + QueryMgr.ReadQueryData(m_Desc.Type, m_QueryHeapIndex[1], &EndCounter, sizeof(EndCounter)); + if (pData != nullptr) + { + auto& QueryData = *reinterpret_cast<QueryDataDuration*>(pData); + QueryData.Duration = EndCounter - StartCounter; + QueryData.Frequency = GetTimestampFrequency(CmdQueueId); + } + } + break; + default: UNEXPECTED("Unexpected query type"); } diff --git a/Graphics/GraphicsEngineD3D12/src/QueryManagerD3D12.cpp b/Graphics/GraphicsEngineD3D12/src/QueryManagerD3D12.cpp index 2391e2a6..6e122832 100644 --- a/Graphics/GraphicsEngineD3D12/src/QueryManagerD3D12.cpp +++ b/Graphics/GraphicsEngineD3D12/src/QueryManagerD3D12.cpp @@ -45,6 +45,7 @@ static Uint32 GetQueryDataSize(QUERY_TYPE QueryType) case QUERY_TYPE_OCCLUSION: case QUERY_TYPE_BINARY_OCCLUSION: case QUERY_TYPE_TIMESTAMP: + case QUERY_TYPE_DURATION: return sizeof(Uint64); break; @@ -52,6 +53,8 @@ static Uint32 GetQueryDataSize(QUERY_TYPE QueryType) return sizeof(D3D12_QUERY_DATA_PIPELINE_STATISTICS); break; + static_assert(QUERY_TYPE_NUM_TYPES == 6, "Not all QUERY_TYPE enum values are tested"); + default: UNEXPECTED("Unexpected query type"); return 0; @@ -70,7 +73,8 @@ QueryManagerD3D12::QueryManagerD3D12(ID3D12Device* pd3d12Device, static_assert(QUERY_TYPE_BINARY_OCCLUSION == 2, "Unexpected value of QUERY_TYPE_BINARY_OCCLUSION. EngineD3D12CreateInfo::QueryPoolSizes must be updated"); static_assert(QUERY_TYPE_TIMESTAMP == 3, "Unexpected value of QUERY_TYPE_TIMESTAMP. EngineD3D12CreateInfo::QueryPoolSizes must be updated"); static_assert(QUERY_TYPE_PIPELINE_STATISTICS== 4, "Unexpected value of QUERY_TYPE_PIPELINE_STATISTICS. EngineD3D12CreateInfo::QueryPoolSizes must be updated"); - static_assert(QUERY_TYPE_NUM_TYPES == 5, "Unexpected value of QUERY_TYPE_NUM_TYPES. EngineD3D12CreateInfo::QueryPoolSizes must be updated"); + static_assert(QUERY_TYPE_DURATION == 5, "Unexpected value of QUERY_TYPE_DURATION. EngineD3D12CreateInfo::QueryPoolSizes must be updated"); + static_assert(QUERY_TYPE_NUM_TYPES == 6, "Unexpected value of QUERY_TYPE_NUM_TYPES. EngineD3D12CreateInfo::QueryPoolSizes must be updated"); // clang-format on auto& HeapInfo = m_Heaps[QueryType]; @@ -79,6 +83,8 @@ QueryManagerD3D12::QueryManagerD3D12(ID3D12Device* pd3d12Device, HeapInfo.HeapSize = QueryHeapSizes[QueryType]; d3d12HeapDesc.Type = QueryTypeToD3D12QueryHeapType(static_cast<QUERY_TYPE>(QueryType)); d3d12HeapDesc.Count = HeapInfo.HeapSize; + if (QueryType == QUERY_TYPE_DURATION) + d3d12HeapDesc.Count *= 2; auto hr = pd3d12Device->CreateQueryHeap(&d3d12HeapDesc, __uuidof(HeapInfo.pd3d12QueryHeap), reinterpret_cast<void**>(&HeapInfo.pd3d12QueryHeap)); CHECK_D3D_RESULT_THROW(hr, "Failed to create D3D12 query heap of type"); |
