From 014798161ceed7919f5bf1b97604c9f419c9a975 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Mon, 18 Nov 2019 19:36:19 +0100 Subject: [PATCH] [dxvk] Avoid some unnecessary barriers around render target clears --- src/dxvk/dxvk_context.cpp | 16 +++++++++++++++- src/dxvk/dxvk_context.h | 4 +++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 388c45b6e..afe30c550 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -613,7 +613,7 @@ namespace dxvk { // If not, we need to create a temporary framebuffer. int32_t attachmentIndex = -1; - if (m_state.om.framebuffer->isFullSize(imageView)) + if (m_state.om.framebuffer->isFullSize(imageView) && this->checkFramebufferBarrier().isClear()) attachmentIndex = m_state.om.framebuffer->findAttachment(imageView); if (attachmentIndex < 0) { @@ -4727,6 +4727,20 @@ namespace dxvk { } + DxvkAccessFlags DxvkContext::checkFramebufferBarrier() { + DxvkAccessFlags access = 0; + + for (uint32_t i = 0; i < m_state.om.framebuffer->numAttachments(); i++) { + const auto& attachment = m_state.om.framebuffer->getAttachment(i); + + access.set(m_execBarriers.getImageAccess( + attachment.view->image(), + attachment.view->subresources())); + } + + return access; + } + void DxvkContext::emitMemoryBarrier( VkDependencyFlags flags, VkPipelineStageFlags srcStages, diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index c80da5cb0..70c730ca9 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -1130,7 +1130,7 @@ namespace dxvk { void resetRenderPassOps( const DxvkRenderTargets& renderTargets, DxvkRenderPassOps& renderPassOps); - + void startConditionalRendering(); void pauseConditionalRendering(); @@ -1196,6 +1196,8 @@ namespace dxvk { VkPipelineStageFlags stages, VkAccessFlags access); + DxvkAccessFlags checkFramebufferBarrier(); + void emitMemoryBarrier( VkDependencyFlags flags, VkPipelineStageFlags srcStages,