summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineD3D12
diff options
context:
space:
mode:
authorazhirnov <zh1dron@gmail.com>2020-08-31 12:04:27 +0000
committerazhirnov <zh1dron@gmail.com>2020-08-31 12:09:36 +0000
commitab1149384b1185eb1b22eab8344055f82f9e10cb (patch)
tree8221754353a7250d0a0b3ef84d229200c623f67b /Graphics/GraphicsEngineD3D12
parentremoved unused DXILUtils, fixed some Codacy issues (diff)
parentAdded C API for IReferenceCounters (diff)
downloadDiligentCore-ab1149384b1185eb1b22eab8344055f82f9e10cb.tar.gz
DiligentCore-ab1149384b1185eb1b22eab8344055f82f9e10cb.zip
Merge branch 'master' into mesh_shader
# Conflicts: # Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp
Diffstat (limited to 'Graphics/GraphicsEngineD3D12')
-rw-r--r--Graphics/GraphicsEngineD3D12/include/QueryD3D12Impl.hpp9
-rw-r--r--Graphics/GraphicsEngineD3D12/interface/QueryD3D12.h16
-rw-r--r--Graphics/GraphicsEngineD3D12/src/D3D12TypeConversions.cpp4
-rw-r--r--Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp9
-rw-r--r--Graphics/GraphicsEngineD3D12/src/QueryD3D12Impl.cpp71
-rw-r--r--Graphics/GraphicsEngineD3D12/src/QueryManagerD3D12.cpp8
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");