From 3dbd755075d091ff71e6c801796bb33ee5605272 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 16 Nov 2018 23:47:31 +0100 Subject: [PATCH] [dxvk] Implement method to signal GPU events --- src/dxvk/dxvk_cmdlist.cpp | 1 + src/dxvk/dxvk_cmdlist.h | 20 ++++++++++++++++++++ src/dxvk/dxvk_context.cpp | 13 +++++++++++++ src/dxvk/dxvk_context.h | 7 +++++++ 4 files changed, 41 insertions(+) diff --git a/src/dxvk/dxvk_cmdlist.cpp b/src/dxvk/dxvk_cmdlist.cpp index d8e9dadb..505eb476 100644 --- a/src/dxvk/dxvk_cmdlist.cpp +++ b/src/dxvk/dxvk_cmdlist.cpp @@ -124,6 +124,7 @@ namespace dxvk { void DxvkCommandList::reset() { m_statCounters.reset(); m_bufferTracker.reset(); + m_gpuEventTracker.reset(); m_eventTracker.reset(); m_queryTracker.reset(); m_stagingAlloc.reset(); diff --git a/src/dxvk/dxvk_cmdlist.h b/src/dxvk/dxvk_cmdlist.h index 9e3907d0..6b662bc4 100644 --- a/src/dxvk/dxvk_cmdlist.h +++ b/src/dxvk/dxvk_cmdlist.h @@ -6,6 +6,7 @@ #include "dxvk_buffer.h" #include "dxvk_descriptor.h" #include "dxvk_event.h" +#include "dxvk_gpu_event.h" #include "dxvk_lifetime.h" #include "dxvk_limits.h" #include "dxvk_pipelayout.h" @@ -164,6 +165,17 @@ namespace dxvk { m_descriptorPoolTracker.trackDescriptorPool(pool); } + /** + * \brief Tracks a GPU event + * + * The event will be returned to its event pool + * after the command buffer has finished executing. + * \param [in] handle Event handle + */ + void trackGpuEvent(DxvkGpuEventHandle handle) { + m_gpuEventTracker.trackEvent(handle); + } + /** * \brief Signals tracked events * @@ -592,6 +604,13 @@ namespace dxvk { depthBiasSlopeFactor); } + + void cmdSetEvent( + VkEvent event, + VkPipelineStageFlags stages) { + m_vkd->vkCmdSetEvent(m_execBuffer, event, stages); + } + void cmdSetScissor( uint32_t firstScissor, @@ -661,6 +680,7 @@ namespace dxvk { DxvkStagingAlloc m_stagingAlloc; DxvkQueryTracker m_queryTracker; DxvkEventTracker m_eventTracker; + DxvkGpuEventTracker m_gpuEventTracker; DxvkBufferTracker m_bufferTracker; DxvkStatCounters m_statCounters; diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 60d55e78..8dd47615 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -1762,6 +1762,19 @@ namespace dxvk { void DxvkContext::signalEvent(const DxvkEventRevision& event) { m_cmd->trackEvent(event); } + + + void DxvkContext::signalGpuEvent(const Rc& event) { + this->spillRenderPass(); + + DxvkGpuEventHandle handle = m_gpuEvents->allocEvent(); + + m_cmd->cmdSetEvent(handle.event, + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); + + m_cmd->trackGpuEvent(event->reset(handle)); + m_cmd->trackResource(event); + } void DxvkContext::writeTimestamp(const DxvkQueryRevision& query) { diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index 0b08d124..40c4da4b 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -773,6 +773,13 @@ namespace dxvk { void signalEvent( const DxvkEventRevision& event); + /** + * \brief Signals a GPU event + * \param [in] event The event + */ + void signalGpuEvent( + const Rc& event); + /** * \brief Writes to a timestamp query * \param [in] query The timestamp query