From c50902f030ab528d7c75b992ab1a72b6abc3d92a Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 27 Mar 2017 11:43:24 +0100 Subject: [PATCH] For depth-only textures allow a depth-read-only DSV to be bound with SRV * We were only allowing depth-stencil textures to be bound with depth read-only DSVs, which doesn't cover all cases. --- renderdoc/driver/d3d11/d3d11_renderstate.cpp | 14 +++++++- renderdoc/driver/d3d11/d3d11_renderstate.h | 38 +++++++++++--------- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/renderdoc/driver/d3d11/d3d11_renderstate.cpp b/renderdoc/driver/d3d11/d3d11_renderstate.cpp index 0c4417a90..3e09fb867 100644 --- a/renderdoc/driver/d3d11/d3d11_renderstate.cpp +++ b/renderdoc/driver/d3d11/d3d11_renderstate.cpp @@ -1179,10 +1179,22 @@ void D3D11RenderState::UnbindIUnknownForRead(const ResourceRange &range, bool al { readStencilOnly = true; } - if(fmt == DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS || fmt == DXGI_FORMAT_R24_UNORM_X8_TYPELESS) + else if(fmt == DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS || + fmt == DXGI_FORMAT_R24_UNORM_X8_TYPELESS) { readDepthOnly = true; } + else + { + fmt = GetTypelessFormat(fmt); + + // any format that could be depth-only, treat it as reading depth only. + // this only applies for conflicts detected with the depth target. + if(fmt == DXGI_FORMAT_R32_TYPELESS || fmt == DXGI_FORMAT_R16_TYPELESS) + { + readDepthOnly = true; + } + } SAFE_RELEASE(res); } diff --git a/renderdoc/driver/d3d11/d3d11_renderstate.h b/renderdoc/driver/d3d11/d3d11_renderstate.h index 0b3c821d7..5909b8a3f 100644 --- a/renderdoc/driver/d3d11/d3d11_renderstate.h +++ b/renderdoc/driver/d3d11/d3d11_renderstate.h @@ -237,6 +237,8 @@ struct D3D11RenderState D3D11_RESOURCE_DIMENSION dim; res->GetType(&dim); + DXGI_FORMAT fmt = DXGI_FORMAT_UNKNOWN; + if(dim == D3D11_RESOURCE_DIMENSION_TEXTURE1D) { D3D11_TEXTURE1D_DESC d; @@ -247,16 +249,7 @@ struct D3D11RenderState d.Format = srvd.Format; } - if(d.Format == DXGI_FORMAT_X32_TYPELESS_G8X24_UINT || - d.Format == DXGI_FORMAT_X24_TYPELESS_G8_UINT) - { - readStencilOnly = true; - } - if(d.Format == DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS || - d.Format == DXGI_FORMAT_R24_UNORM_X8_TYPELESS) - { - readDepthOnly = true; - } + fmt = d.Format; } else if(dim == D3D11_RESOURCE_DIMENSION_TEXTURE2D) { @@ -268,13 +261,24 @@ struct D3D11RenderState d.Format = srvd.Format; } - if(d.Format == DXGI_FORMAT_X32_TYPELESS_G8X24_UINT || - d.Format == DXGI_FORMAT_X24_TYPELESS_G8_UINT) - { - readStencilOnly = true; - } - if(d.Format == DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS || - d.Format == DXGI_FORMAT_R24_UNORM_X8_TYPELESS) + fmt = d.Format; + } + + if(fmt == DXGI_FORMAT_X32_TYPELESS_G8X24_UINT || fmt == DXGI_FORMAT_X24_TYPELESS_G8_UINT) + { + readStencilOnly = true; + } + else if(fmt == DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS || fmt == DXGI_FORMAT_R24_UNORM_X8_TYPELESS) + { + readDepthOnly = true; + } + else + { + fmt = GetTypelessFormat(fmt); + + // any format that could be depth-only, treat it as reading depth only. + // this only applies for conflicts detected with the depth target. + if(fmt == DXGI_FORMAT_R32_TYPELESS || fmt == DXGI_FORMAT_R16_TYPELESS) { readDepthOnly = true; }