From 0a5b427ded6e4de61e7eded4473fccd4d63cb356 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sun, 13 Oct 2019 02:00:10 +0200 Subject: [PATCH] [dxvk] Add function to insert framebuffer read-back barriers Required for some D3D9 content. --- src/dxvk/dxvk_context.cpp | 11 +++++++++++ src/dxvk/dxvk_context.h | 8 ++++++++ src/dxvk/dxvk_renderpass.cpp | 12 ++++++++++++ 3 files changed, 31 insertions(+) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 253a8bc4..8039f77b 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -1586,6 +1586,17 @@ namespace dxvk { } + void DxvkContext::emitRenderTargetReadbackBarrier() { + if (m_flags.test(DxvkContextFlag::GpRenderPassBound)) { + emitMemoryBarrier(VK_DEPENDENCY_BY_REGION_BIT, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_ACCESS_SHADER_READ_BIT); + } + } + + void DxvkContext::initImage( const Rc& image, const VkImageSubresourceRange& subresources, diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index a26c4e5c..8e6c246e 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -608,6 +608,14 @@ namespace dxvk { uint32_t counterDivisor, uint32_t counterBias); + /** + * \brief Emits barrier for render target readback + * + * Use between draw calls if the fragment shader + * reads one of the currently bound render targets. + */ + void emitRenderTargetReadbackBarrier(); + /** * \brief Generates mip maps * diff --git a/src/dxvk/dxvk_renderpass.cpp b/src/dxvk/dxvk_renderpass.cpp index 8c5f5a55..fd4baa43 100644 --- a/src/dxvk/dxvk_renderpass.cpp +++ b/src/dxvk/dxvk_renderpass.cpp @@ -151,6 +151,18 @@ namespace dxvk { VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT, 0 }; } + if (ops.barrier.srcStages & ( + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT)) { + subpassDeps[subpassDepCount++] = { 0, 0, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + VK_ACCESS_SHADER_READ_BIT, + VK_DEPENDENCY_BY_REGION_BIT }; + } + if (ops.barrier.srcStages && ops.barrier.dstStages) { subpassDeps[subpassDepCount++] = { 0, VK_SUBPASS_EXTERNAL,