From eb553256406ad90d2b4989c562af879756494a94 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sun, 7 Oct 2018 17:51:44 +0200 Subject: [PATCH] [dxvk] Fix missing buffer tracking for indirect draw calls This is optimized to allow a large number of indirect draws to be submitted if they all access the same argument buffer, as is the case in Assassin's Creed Syndicate and Odyssey. --- src/dxvk/dxvk_context.cpp | 17 +++++++++++++++++ src/dxvk/dxvk_context.h | 6 ++++++ 2 files changed, 23 insertions(+) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index f436f3b30..d3424509c 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -52,6 +52,7 @@ namespace dxvk { Rc DxvkContext::endRecording() { this->spillRenderPass(); + this->trackDrawBuffer(DxvkBufferSlice(), VK_NULL_HANDLE); m_queries.trackQueryPools(m_cmd); @@ -946,6 +947,8 @@ namespace dxvk { descriptor.buffer.buffer, descriptor.buffer.offset, count, stride); + + this->trackDrawBuffer(buffer, descriptor.buffer.buffer); } m_cmd->addStatCtr(DxvkStatCounter::CmdDrawCalls, 1); @@ -984,6 +987,8 @@ namespace dxvk { descriptor.buffer.buffer, descriptor.buffer.offset, count, stride); + + this->trackDrawBuffer(buffer, descriptor.buffer.buffer); } m_cmd->addStatCtr(DxvkStatCounter::CmdDrawCalls, 1); @@ -2833,5 +2838,17 @@ namespace dxvk { } } } + + + void DxvkContext::trackDrawBuffer( + const DxvkBufferSlice& buffer, + VkBuffer handle) { + if (m_lastIndirectDrawBuffer != handle) { + m_lastIndirectDrawBuffer = handle; + + if (handle != VK_NULL_HANDLE) + m_cmd->trackResource(buffer.resource()); + } + } } \ No newline at end of file diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index a46f3bb50..8c7b46721 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -703,6 +703,8 @@ namespace dxvk { VkDescriptorSet m_gpSet = VK_NULL_HANDLE; VkDescriptorSet m_cpSet = VK_NULL_HANDLE; + + VkBuffer m_lastIndirectDrawBuffer = VK_NULL_HANDLE; std::array m_rc; std::array m_descInfos; @@ -809,6 +811,10 @@ namespace dxvk { void commitComputeInitBarriers(); void commitComputePostBarriers(); + + void trackDrawBuffer( + const DxvkBufferSlice& buffer, + VkBuffer handle); };