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; }