From f88239719cbdf89b7442c08437dca7abf1b28993 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sun, 21 Aug 2022 20:44:57 +0200 Subject: [PATCH] [dxvk] Explicitly mark execution command buffer as used We can omit the execution command buffer in some circumstances, and for the sparse resource changes we need to track this in order to be able to merge consecutive sparse binding calls. We only need to do this on action commands with observable side effects as long as the backend still properly resets those command buffers. All draw commands are implcitly covered by cmdBeginRendering. --- src/dxvk/dxvk_cmdlist.cpp | 11 ------- src/dxvk/dxvk_cmdlist.h | 65 +++++++++++++++++++++++++++++---------- 2 files changed, 49 insertions(+), 27 deletions(-) diff --git a/src/dxvk/dxvk_cmdlist.cpp b/src/dxvk/dxvk_cmdlist.cpp index 0d63dd5c6..50ea433cc 100644 --- a/src/dxvk/dxvk_cmdlist.cpp +++ b/src/dxvk/dxvk_cmdlist.cpp @@ -226,15 +226,4 @@ namespace dxvk { return m_vkd->vkQueueSubmit2(queue, 1, &submitInfo, VK_NULL_HANDLE); } - void DxvkCommandList::cmdBeginDebugUtilsLabel(VkDebugUtilsLabelEXT *pLabelInfo) { - m_vki->vkCmdBeginDebugUtilsLabelEXT(m_execBuffer, pLabelInfo); - } - - void DxvkCommandList::cmdEndDebugUtilsLabel() { - m_vki->vkCmdEndDebugUtilsLabelEXT(m_execBuffer); - } - - void DxvkCommandList::cmdInsertDebugUtilsLabel(VkDebugUtilsLabelEXT *pLabelInfo) { - m_vki->vkCmdInsertDebugUtilsLabelEXT(m_execBuffer, pLabelInfo); - } } diff --git a/src/dxvk/dxvk_cmdlist.h b/src/dxvk/dxvk_cmdlist.h index ca04d13f1..6f5d6a8f7 100644 --- a/src/dxvk/dxvk_cmdlist.h +++ b/src/dxvk/dxvk_cmdlist.h @@ -260,23 +260,12 @@ namespace dxvk { } - void cmdBeginConditionalRendering( - const VkConditionalRenderingBeginInfoEXT* pConditionalRenderingBegin) { - m_vkd->vkCmdBeginConditionalRenderingEXT( - m_execBuffer, pConditionalRenderingBegin); - } - - - void cmdEndConditionalRendering() { - m_vkd->vkCmdEndConditionalRenderingEXT(m_execBuffer); - } - - - void cmdBeginQuery( VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags) { + m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); + m_vkd->vkCmdBeginQuery(m_execBuffer, queryPool, query, flags); } @@ -287,6 +276,8 @@ namespace dxvk { uint32_t query, VkQueryControlFlags flags, uint32_t index) { + m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); + m_vkd->vkCmdBeginQueryIndexedEXT( m_execBuffer, queryPool, query, flags, index); } @@ -294,6 +285,8 @@ namespace dxvk { void cmdBeginRendering( const VkRenderingInfo* pRenderingInfo) { + m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); + m_vkd->vkCmdBeginRendering(m_execBuffer, pRenderingInfo); } @@ -375,11 +368,16 @@ namespace dxvk { } void cmdLaunchCuKernel(VkCuLaunchInfoNVX launchInfo) { + m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); + m_vkd->vkCmdCuLaunchKernelNVX(m_execBuffer, &launchInfo); } + void cmdBlitImage( const VkBlitImageInfo2* pBlitInfo) { + m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); + m_vkd->vkCmdBlitImage2(m_execBuffer, pBlitInfo); } @@ -401,6 +399,8 @@ namespace dxvk { const VkClearColorValue* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges) { + m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); + m_vkd->vkCmdClearColorImage(m_execBuffer, image, imageLayout, pColor, rangeCount, pRanges); @@ -413,6 +413,8 @@ namespace dxvk { const VkClearDepthStencilValue* pDepthStencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges) { + m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); + m_vkd->vkCmdClearDepthStencilImage(m_execBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges); @@ -463,6 +465,8 @@ namespace dxvk { VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) { + m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); + m_vkd->vkCmdCopyQueryPoolResults(m_execBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags); @@ -473,6 +477,8 @@ namespace dxvk { uint32_t x, uint32_t y, uint32_t z) { + m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); + m_vkd->vkCmdDispatch(m_execBuffer, x, y, z); } @@ -480,6 +486,8 @@ namespace dxvk { void cmdDispatchIndirect( VkBuffer buffer, VkDeviceSize offset) { + m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); + m_vkd->vkCmdDispatchIndirect( m_execBuffer, buffer, offset); } @@ -632,6 +640,8 @@ namespace dxvk { void cmdResolveImage( const VkResolveImageInfo2* resolveInfo) { + m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); + m_vkd->vkCmdResolveImage2(m_execBuffer, resolveInfo); } @@ -705,6 +715,8 @@ namespace dxvk { void cmdSetEvent( VkEvent event, const VkDependencyInfo* dependencyInfo) { + m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); + m_vkd->vkCmdSetEvent2(m_execBuffer, event, dependencyInfo); } @@ -781,15 +793,35 @@ namespace dxvk { VkPipelineStageFlagBits2 pipelineStage, VkQueryPool queryPool, uint32_t query) { + m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); + m_vkd->vkCmdWriteTimestamp2(m_execBuffer, pipelineStage, queryPool, query); } - void cmdBeginDebugUtilsLabel(VkDebugUtilsLabelEXT *pLabelInfo); - void cmdEndDebugUtilsLabel(); + void cmdBeginDebugUtilsLabel( + VkDebugUtilsLabelEXT* pLabelInfo) { + m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); + + m_vki->vkCmdBeginDebugUtilsLabelEXT(m_execBuffer, pLabelInfo); + } + + + void cmdEndDebugUtilsLabel() { + m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); + + m_vki->vkCmdEndDebugUtilsLabelEXT(m_execBuffer); + } + + + void cmdInsertDebugUtilsLabel( + VkDebugUtilsLabelEXT* pLabelInfo) { + m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); + + m_vki->vkCmdInsertDebugUtilsLabelEXT(m_execBuffer, pLabelInfo); + } - void cmdInsertDebugUtilsLabel(VkDebugUtilsLabelEXT *pLabelInfo); void resetQuery( VkQueryPool queryPool, @@ -798,6 +830,7 @@ namespace dxvk { m_vkd->device(), queryPool, queryId, 1); } + void trackDescriptorPool( const Rc& pool, const Rc& manager) {