From ea99f2f2c5fa822d1b511b1065cb30be649b0076 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 14 Feb 2025 20:02:57 +0100 Subject: [PATCH] [dxvk] Track transform feedback buffer access --- src/dxvk/dxvk_context.cpp | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index b775b9531..0934c0562 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -5530,8 +5530,14 @@ namespace dxvk { ctrBuffers[i] = physSlice.handle; ctrOffsets[i] = physSlice.offset; - if (physSlice.handle != VK_NULL_HANDLE) - m_cmd->track(m_state.xfb.activeCounters[i].buffer(), DxvkAccess::Read); + if (physSlice.handle) { + accessBuffer(DxvkCmdBuffer::ExecBuffer, m_state.xfb.activeCounters[i], + VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT, + VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT | + VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT); + + m_cmd->track(m_state.xfb.activeCounters[i].buffer(), DxvkAccess::Write); + } } m_cmd->cmdBeginTransformFeedback( @@ -5556,9 +5562,6 @@ namespace dxvk { ctrBuffers[i] = physSlice.handle; ctrOffsets[i] = physSlice.offset; - if (physSlice.handle != VK_NULL_HANDLE) - m_cmd->track(m_state.xfb.activeCounters[i].buffer(), DxvkAccess::Write); - m_state.xfb.activeCounters[i] = DxvkBufferSlice(); } @@ -6407,14 +6410,18 @@ namespace dxvk { xfbOffsets[i] = physSlice.offset; xfbLengths[i] = physSlice.length; - if (physSlice.handle == VK_NULL_HANDLE) + if (!physSlice.handle) xfbBuffers[i] = m_common->dummyResources().bufferHandle(); - - if (physSlice.handle != VK_NULL_HANDLE) { - const Rc& buffer = m_state.xfb.buffers[i].buffer(); + + if (physSlice.handle) { + Rc buffer = m_state.xfb.buffers[i].buffer(); buffer->setXfbVertexStride(gsInfo.xfbStrides[i]); - - m_cmd->track(buffer, DxvkAccess::Write); + + accessBuffer(DxvkCmdBuffer::ExecBuffer, m_state.xfb.buffers[i], + VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT, + VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT); + + m_cmd->track(std::move(buffer), DxvkAccess::Write); } }