From 6cbd6111902e9ea630618a31489644ca5f6e2a57 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sun, 2 Jun 2019 16:34:33 +0200 Subject: [PATCH] [d3d11] Don't clear DSV aspects that are marked as read-only Saint's Row 4 appears to be doing this. Ref #24. --- src/d3d11/d3d11_context.cpp | 13 +++++++------ src/d3d11/d3d11_view_dsv.h | 7 +++++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index 4af284fef..d10e0eedc 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -883,10 +883,8 @@ namespace dxvk { if (!dsv) return; - // Figure out which aspects to clear based - // on the image format and the clear flags. - const Rc view = dsv->GetImageView(); - + // Figure out which aspects to clear based on + // the image view properties and clear flags. VkImageAspectFlags aspectMask = 0; if (ClearFlags & D3D11_CLEAR_DEPTH) @@ -895,7 +893,10 @@ namespace dxvk { if (ClearFlags & D3D11_CLEAR_STENCIL) aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; - aspectMask &= imageFormatInfo(view->info().format)->aspectMask; + aspectMask &= dsv->GetWritableAspectMask(); + + if (!aspectMask) + return; VkClearValue clearValue; clearValue.depthStencil.depth = Depth; @@ -904,7 +905,7 @@ namespace dxvk { EmitCs([ cClearValue = clearValue, cAspectMask = aspectMask, - cImageView = view + cImageView = dsv->GetImageView() ] (DxvkContext* ctx) { ctx->clearRenderTarget( cImageView, diff --git a/src/d3d11/d3d11_view_dsv.h b/src/d3d11/d3d11_view_dsv.h index ac8516063..d0e57f69c 100644 --- a/src/d3d11/d3d11_view_dsv.h +++ b/src/d3d11/d3d11_view_dsv.h @@ -63,6 +63,13 @@ namespace dxvk { } } + VkImageAspectFlags GetWritableAspectMask() const { + VkImageAspectFlags mask = m_view->formatInfo()->aspectMask; + if (m_desc.Flags & D3D11_DSV_READ_ONLY_DEPTH) mask &= ~VK_IMAGE_ASPECT_DEPTH_BIT; + if (m_desc.Flags & D3D11_DSV_READ_ONLY_STENCIL) mask &= ~VK_IMAGE_ASPECT_STENCIL_BIT; + return mask; + } + D3D10DepthStencilView* GetD3D10Iface() { return &m_d3d10; }