Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion Graphics/GraphicsEngineVulkan/include/QueryManagerVk.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,11 @@ class QueryManagerVk
return m_CounterFrequency;
}

Uint32 GetTimestampValidBits() const
{
return m_TimestampValidBits;
}

Uint32 ResetStaleQueries(const VulkanUtilities::LogicalDevice& LogicalDevice,
VulkanUtilities::CommandBuffer& CmdBuff);

Expand Down Expand Up @@ -139,7 +144,8 @@ class QueryManagerVk

std::array<QueryPoolInfo, QUERY_TYPE_NUM_TYPES> m_Pools;

Uint64 m_CounterFrequency = 0;
Uint64 m_CounterFrequency = 0;
Uint32 m_TimestampValidBits = 0;
};

} // namespace Diligent
2 changes: 2 additions & 0 deletions Graphics/GraphicsEngineVulkan/src/QueryManagerVk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,8 @@ QueryManagerVk::QueryManagerVk(RenderDeviceVkImpl* pRenderDeviceVk,
const bool IsTransferQueue = (QueueFlags & (VK_QUEUE_COMPUTE_BIT | VK_QUEUE_GRAPHICS_BIT)) == 0;
const bool QueueSupportsTimestamp = PhysicalDevice.GetQueueProperties()[QueueFamilyIndex].timestampValidBits > 0;

m_TimestampValidBits = PhysicalDevice.GetQueueProperties()[QueueFamilyIndex].timestampValidBits;

for (Uint32 query_type = QUERY_TYPE_UNDEFINED + 1; query_type < QUERY_TYPE_NUM_TYPES; ++query_type)
{
const QUERY_TYPE QueryType = static_cast<QUERY_TYPE>(query_type);
Expand Down
7 changes: 4 additions & 3 deletions Graphics/GraphicsEngineVulkan/src/QueryVkImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ inline bool GetDurationQueryData(const VulkanUtilities::LogicalDevice& LogicalDe
VkQueryPool vkQueryPool,
const std::array<Uint32, 2>& QueryIdx,
Uint64 CounterFrequency,
Uint32 TimestampValidBits,
void* pData,
Uint32 DataSize)
{
Expand All @@ -263,8 +264,8 @@ inline bool GetDurationQueryData(const VulkanUtilities::LogicalDevice& LogicalDe
{
QueryDataDuration& QueryData = *reinterpret_cast<QueryDataDuration*>(pData);
VERIFY_EXPR(DataSize == sizeof(QueryData));
VERIFY_EXPR(EndCounter >= StartCounter);
QueryData.Duration = EndCounter - StartCounter;
DEV_CHECK_WARN(EndCounter >= StartCounter, "GPU time overflowed");
QueryData.Duration = (EndCounter - StartCounter) & ((1ull << TimestampValidBits) - 1ull);
QueryData.Frequency = CounterFrequency;
}

Expand Down Expand Up @@ -355,7 +356,7 @@ bool QueryVkImpl::GetData(void* pData, Uint32 DataSize, bool AutoInvalidate)
break;

case QUERY_TYPE_DURATION:
DataAvailable = GetDurationQueryData(LogicalDevice, vkQueryPool, m_QueryPoolIndex, m_pQueryMgr->GetCounterFrequency(), pData, DataSize);
DataAvailable = GetDurationQueryData(LogicalDevice, vkQueryPool, m_QueryPoolIndex, m_pQueryMgr->GetCounterFrequency(), m_pQueryMgr->GetTimestampValidBits(), pData, DataSize);
break;

default:
Expand Down
Loading