From 4328d099c41ca10f02e79db1c702e8892ce06071 Mon Sep 17 00:00:00 2001 From: lightningterror Date: Mon, 3 Dec 2018 18:04:18 +0100 Subject: [PATCH] GSdx-d3d: Add support to write in depth buffer. Add support for dss_write. Enable writing in depth buffer for dss_write, when depth conversion is active data will be writen in the depth buffer, if not then use the old method (don't write). --- plugins/GSdx/Renderers/DX11/GSDevice11.cpp | 27 +++++++++++++++++----- plugins/GSdx/Renderers/DX11/GSDevice11.h | 1 + 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/plugins/GSdx/Renderers/DX11/GSDevice11.cpp b/plugins/GSdx/Renderers/DX11/GSDevice11.cpp index 10d06e25c7..a99537e756 100644 --- a/plugins/GSdx/Renderers/DX11/GSDevice11.cpp +++ b/plugins/GSdx/Renderers/DX11/GSDevice11.cpp @@ -221,11 +221,14 @@ bool GSDevice11::Create(const std::shared_ptr &wnd) memset(&dsd, 0, sizeof(dsd)); - dsd.DepthEnable = false; - dsd.StencilEnable = false; - hr = m_dev->CreateDepthStencilState(&dsd, &m_convert.dss); + dsd.DepthEnable = true; + dsd.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; + dsd.DepthFunc = D3D11_COMPARISON_ALWAYS; + + hr = m_dev->CreateDepthStencilState(&dsd, &m_convert.dss_write); + memset(&bsd, 0, sizeof(bsd)); bsd.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; @@ -634,7 +637,7 @@ GSTexture* GSDevice11::CopyOffscreen(GSTexture* src, const GSVector4& sRect, int format = DXGI_FORMAT_R8G8B8A8_UNORM; } - if(format != DXGI_FORMAT_R8G8B8A8_UNORM && format != DXGI_FORMAT_R16_UINT) + if(format != DXGI_FORMAT_R8G8B8A8_UNORM && format != DXGI_FORMAT_R16_UINT && format != DXGI_FORMAT_R32_UINT) { ASSERT(0); @@ -696,15 +699,27 @@ void GSDevice11::StretchRect(GSTexture* sTex, const GSVector4& sRect, GSTexture* return; } + bool draw_in_depth = (ps == m_convert.ps[ShaderConvert_RGBA8_TO_FLOAT32] || ps == m_convert.ps[ShaderConvert_RGBA8_TO_FLOAT24] || + ps == m_convert.ps[ShaderConvert_RGBA8_TO_FLOAT16] || ps == m_convert.ps[ShaderConvert_RGB5A1_TO_FLOAT16]); + BeginScene(); GSVector2i ds = dTex->GetSize(); // om - OMSetDepthStencilState(m_convert.dss, 0); + + if (draw_in_depth) + OMSetDepthStencilState(m_convert.dss_write, 0); + else + OMSetDepthStencilState(m_convert.dss, 0); + OMSetBlendState(bs, 0); - OMSetRenderTargets(dTex, NULL); + + if (draw_in_depth) + OMSetRenderTargets(NULL, dTex); + else + OMSetRenderTargets(dTex, NULL); // ia diff --git a/plugins/GSdx/Renderers/DX11/GSDevice11.h b/plugins/GSdx/Renderers/DX11/GSDevice11.h index e6b1dd6d5e..9ae5ec47da 100644 --- a/plugins/GSdx/Renderers/DX11/GSDevice11.h +++ b/plugins/GSdx/Renderers/DX11/GSDevice11.h @@ -97,6 +97,7 @@ public: // TODO CComPtr ln; CComPtr pt; CComPtr dss; + CComPtr dss_write; CComPtr bs; } m_convert;