Skip to content
Open
Show file tree
Hide file tree
Changes from 2 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;
Comment on lines 265 to 269
}

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