diff --git a/src/dxvk/dxvk_cmdlist.h b/src/dxvk/dxvk_cmdlist.h index a2c6a057..beefe94b 100644 --- a/src/dxvk/dxvk_cmdlist.h +++ b/src/dxvk/dxvk_cmdlist.h @@ -546,16 +546,21 @@ namespace dxvk { VkQueryPool queryPool, uint32_t queryId, VkEvent event) { - m_cmdBuffersUsed.set(DxvkCmdBufferFlag::InitBuffer); + if (event == VK_NULL_HANDLE) { + m_vkd->vkResetQueryPoolEXT( + m_vkd->device(), queryPool, queryId, 1); + } else { + m_cmdBuffersUsed.set(DxvkCmdBufferFlag::InitBuffer); - m_vkd->vkResetEvent( - m_vkd->device(), event); - - m_vkd->vkCmdResetQueryPool( - m_initBuffer, queryPool, queryId, 1); - - m_vkd->vkCmdSetEvent(m_initBuffer, - event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); + m_vkd->vkResetEvent( + m_vkd->device(), event); + + m_vkd->vkCmdResetQueryPool( + m_initBuffer, queryPool, queryId, 1); + + m_vkd->vkCmdSetEvent(m_initBuffer, + event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); + } } diff --git a/src/dxvk/dxvk_device.cpp b/src/dxvk/dxvk_device.cpp index 3076d0f4..482ca97a 100644 --- a/src/dxvk/dxvk_device.cpp +++ b/src/dxvk/dxvk_device.cpp @@ -20,7 +20,7 @@ namespace dxvk { m_renderPassPool (new DxvkRenderPassPool (vkd)), m_pipelineManager (new DxvkPipelineManager (this, m_renderPassPool.ptr())), m_gpuEventPool (new DxvkGpuEventPool (vkd)), - m_gpuQueryPool (new DxvkGpuQueryPool (vkd)), + m_gpuQueryPool (new DxvkGpuQueryPool (this)), m_metaClearObjects (new DxvkMetaClearObjects (vkd)), m_metaCopyObjects (new DxvkMetaCopyObjects (vkd)), m_metaMipGenObjects (new DxvkMetaMipGenObjects (vkd)), diff --git a/src/dxvk/dxvk_gpu_query.cpp b/src/dxvk/dxvk_gpu_query.cpp index 17d9c678..9f0b2938 100644 --- a/src/dxvk/dxvk_gpu_query.cpp +++ b/src/dxvk/dxvk_gpu_query.cpp @@ -1,6 +1,7 @@ #include #include "dxvk_cmdlist.h" +#include "dxvk_device.h" #include "dxvk_gpu_query.h" namespace dxvk { @@ -90,13 +91,17 @@ namespace dxvk { DxvkQueryData tmpData; // Wait for the query to be reset first - VkResult result = m_vkd->vkGetEventStatus( - m_vkd->device(), handle.resetEvent); + VkResult result; - if (result == VK_EVENT_RESET) - return DxvkGpuQueryStatus::Pending; - else if (result != VK_EVENT_SET) - return DxvkGpuQueryStatus::Failed; + if (handle.resetEvent) { + result = m_vkd->vkGetEventStatus( + m_vkd->device(), handle.resetEvent); + + if (result == VK_EVENT_RESET) + return DxvkGpuQueryStatus::Pending; + else if (result != VK_EVENT_SET) + return DxvkGpuQueryStatus::Failed; + } // Try to copy query data to temporary structure result = m_vkd->vkGetQueryPoolResults(m_vkd->device(), @@ -150,10 +155,11 @@ namespace dxvk { DxvkGpuQueryAllocator::DxvkGpuQueryAllocator( - const Rc& vkd, + const Rc& device, VkQueryType queryType, uint32_t queryPoolSize) - : m_vkd (vkd), + : m_device (device), + m_vkd (device->vkd()), m_queryType (queryType), m_queryPoolSize (queryPoolSize) { @@ -235,7 +241,8 @@ namespace dxvk { for (uint32_t i = 0; i < m_queryPoolSize; i++) { VkEvent event = VK_NULL_HANDLE; - if (m_vkd->vkCreateEvent(m_vkd->device(), &eventInfo, nullptr, &event)) { + if (!m_device->features().extHostQueryReset.hostQueryReset + && m_vkd->vkCreateEvent(m_vkd->device(), &eventInfo, nullptr, &event) != VK_SUCCESS) { Logger::err("DXVK: Failed to create query reset event"); return; } @@ -247,11 +254,11 @@ namespace dxvk { - DxvkGpuQueryPool::DxvkGpuQueryPool(const Rc& vkd) - : m_occlusion(vkd, VK_QUERY_TYPE_OCCLUSION, 256), - m_statistic(vkd, VK_QUERY_TYPE_PIPELINE_STATISTICS, 64), - m_timestamp(vkd, VK_QUERY_TYPE_TIMESTAMP, 64), - m_xfbStream(vkd, VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT, 64) { + DxvkGpuQueryPool::DxvkGpuQueryPool(const Rc& device) + : m_occlusion(device, VK_QUERY_TYPE_OCCLUSION, 256), + m_statistic(device, VK_QUERY_TYPE_PIPELINE_STATISTICS, 64), + m_timestamp(device, VK_QUERY_TYPE_TIMESTAMP, 64), + m_xfbStream(device, VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT, 64) { } diff --git a/src/dxvk/dxvk_gpu_query.h b/src/dxvk/dxvk_gpu_query.h index 2fd1a3e9..fccfeaf4 100644 --- a/src/dxvk/dxvk_gpu_query.h +++ b/src/dxvk/dxvk_gpu_query.h @@ -247,7 +247,7 @@ namespace dxvk { public: DxvkGpuQueryAllocator( - const Rc& vkd, + const Rc& device, VkQueryType queryType, uint32_t queryPoolSize); @@ -275,6 +275,7 @@ namespace dxvk { private: + Rc m_device; Rc m_vkd; VkQueryType m_queryType; uint32_t m_queryPoolSize; @@ -299,7 +300,7 @@ namespace dxvk { public: DxvkGpuQueryPool( - const Rc& vkd); + const Rc& device); ~DxvkGpuQueryPool();