From cb92589452cf122eb1591d5fb573225d9063f2d8 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 14 Feb 2025 19:47:50 +0100 Subject: [PATCH] [dxvk] Add more convenience methods to track buffer barriers --- src/dxvk/dxvk_context.cpp | 75 +++++++++++++++++++++++++++++++++++---- src/dxvk/dxvk_context.h | 29 +++++++++++++++ 2 files changed, 97 insertions(+), 7 deletions(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index ec9fa0761..3b3aaa97e 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -936,13 +936,8 @@ namespace dxvk { m_queryManager.endQueries(m_cmd, VK_QUERY_TYPE_PIPELINE_STATISTICS); - accessBuffer(DxvkCmdBuffer::ExecBuffer, - *m_state.id.argBuffer.buffer(), - m_state.id.argBuffer.offset() + offset, - sizeof(VkDispatchIndirectCommand), - VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT, - VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT); - + accessDrawBuffer(offset, 1, 0, sizeof(VkDispatchIndirectCommand)); + this->trackDrawBuffer(); } } @@ -7659,6 +7654,18 @@ namespace dxvk { } + void DxvkContext::accessImage( + DxvkCmdBuffer cmdBuffer, + const DxvkImageView& imageView, + VkPipelineStageFlags2 srcStages, + VkAccessFlags2 srcAccess) { + accessImage(cmdBuffer, *imageView.image(), + imageView.imageSubresources(), + imageView.image()->info().layout, + srcStages, srcAccess); + } + + void DxvkContext::accessImage( DxvkCmdBuffer cmdBuffer, DxvkImage& image, @@ -7773,6 +7780,35 @@ namespace dxvk { } + void DxvkContext::accessBuffer( + DxvkCmdBuffer cmdBuffer, + const DxvkBufferSlice& bufferSlice, + VkPipelineStageFlags2 srcStages, + VkAccessFlags2 srcAccess) { + accessBuffer(cmdBuffer, + *bufferSlice.buffer(), + bufferSlice.offset(), + bufferSlice.length(), + srcStages, srcAccess); + } + + + void DxvkContext::accessBuffer( + DxvkCmdBuffer cmdBuffer, + const DxvkBufferSlice& bufferSlice, + VkPipelineStageFlags2 srcStages, + VkAccessFlags2 srcAccess, + VkPipelineStageFlags2 dstStages, + VkAccessFlags2 dstAccess) { + accessBuffer(cmdBuffer, + *bufferSlice.buffer(), + bufferSlice.offset(), + bufferSlice.length(), + srcStages, srcAccess, + dstStages, dstAccess); + } + + void DxvkContext::accessBuffer( DxvkCmdBuffer cmdBuffer, DxvkBufferView& bufferView, @@ -7802,6 +7838,31 @@ namespace dxvk { } + void DxvkContext::accessDrawBuffer( + VkDeviceSize offset, + uint32_t count, + uint32_t stride, + uint32_t size) { + uint32_t dataSize = count ? (count - 1u) * stride + size : 0u; + + accessBuffer(DxvkCmdBuffer::ExecBuffer, + *m_state.id.argBuffer.buffer(), + m_state.id.argBuffer.offset() + offset, dataSize, + VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT, + VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT_KHR); + } + + + void DxvkContext::accessDrawCountBuffer( + VkDeviceSize offset) { + accessBuffer(DxvkCmdBuffer::ExecBuffer, + *m_state.id.cntBuffer.buffer(), + m_state.id.cntBuffer.offset() + offset, sizeof(uint32_t), + VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT, + VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT_KHR); + } + + void DxvkContext::flushPendingAccesses( DxvkBuffer& buffer, VkDeviceSize offset, diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index b841549b5..24bcb1f0a 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -1878,6 +1878,12 @@ namespace dxvk { VkPipelineStageFlags2 srcStages, VkAccessFlags2 srcAccess); + void accessImage( + DxvkCmdBuffer cmdBuffer, + const DxvkImageView& imageView, + VkPipelineStageFlags2 srcStages, + VkAccessFlags2 srcAccess); + void accessImage( DxvkCmdBuffer cmdBuffer, DxvkImage& image, @@ -1907,6 +1913,20 @@ namespace dxvk { VkPipelineStageFlags2 dstStages, VkAccessFlags2 dstAccess); + void accessBuffer( + DxvkCmdBuffer cmdBuffer, + const DxvkBufferSlice& bufferSlice, + VkPipelineStageFlags2 srcStages, + VkAccessFlags2 srcAccess); + + void accessBuffer( + DxvkCmdBuffer cmdBuffer, + const DxvkBufferSlice& bufferSlice, + VkPipelineStageFlags2 srcStages, + VkAccessFlags2 srcAccess, + VkPipelineStageFlags2 dstStages, + VkAccessFlags2 dstAccess); + void accessBuffer( DxvkCmdBuffer cmdBuffer, DxvkBufferView& bufferView, @@ -1921,6 +1941,15 @@ namespace dxvk { VkPipelineStageFlags2 dstStages, VkAccessFlags2 dstAccess); + void accessDrawBuffer( + VkDeviceSize offset, + uint32_t count, + uint32_t stride, + uint32_t size); + + void accessDrawCountBuffer( + VkDeviceSize offset); + void flushPendingAccesses( DxvkBuffer& buffer, VkDeviceSize offset,