From 4a18629e63f9d1ff8ea291edd2e15ea51efff745 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 24 Jul 2022 15:56:06 +0200 Subject: [PATCH] thin3d: Remove dual sided stencil, not supported by all backends anyway --- Common/GPU/D3D11/thin3d_d3d11.cpp | 6 ++--- Common/GPU/D3D9/thin3d_d3d9.cpp | 12 +++++----- Common/GPU/OpenGL/thin3d_gl.cpp | 12 +++++----- Common/GPU/Vulkan/thin3d_vulkan.cpp | 6 ++--- Common/GPU/thin3d.h | 5 ++--- UI/GPUDriverTestScreen.cpp | 34 ++++++++++++----------------- 6 files changed, 34 insertions(+), 41 deletions(-) diff --git a/Common/GPU/D3D11/thin3d_d3d11.cpp b/Common/GPU/D3D11/thin3d_d3d11.cpp index 52192fce74..98ec454c71 100644 --- a/Common/GPU/D3D11/thin3d_d3d11.cpp +++ b/Common/GPU/D3D11/thin3d_d3d11.cpp @@ -487,7 +487,7 @@ static D3D11_PRIMITIVE_TOPOLOGY primToD3D11[] = { D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ, }; -inline void CopyStencilSide(D3D11_DEPTH_STENCILOP_DESC &side, const StencilSide &input) { +inline void CopyStencilSide(D3D11_DEPTH_STENCILOP_DESC &side, const StencilSetup &input) { side.StencilFunc = compareToD3D11[(int)input.compareOp]; side.StencilDepthFailOp = stencilOpToD3D11[(int)input.depthFailOp]; side.StencilFailOp = stencilOpToD3D11[(int)input.failOp]; @@ -501,8 +501,8 @@ DepthStencilState *D3D11DrawContext::CreateDepthStencilState(const DepthStencilS d3ddesc.DepthWriteMask = desc.depthWriteEnabled ? D3D11_DEPTH_WRITE_MASK_ALL : D3D11_DEPTH_WRITE_MASK_ZERO; d3ddesc.DepthFunc = compareToD3D11[(int)desc.depthCompare]; d3ddesc.StencilEnable = desc.stencilEnabled; - CopyStencilSide(d3ddesc.FrontFace, desc.front); - CopyStencilSide(d3ddesc.BackFace, desc.back); + CopyStencilSide(d3ddesc.FrontFace, desc.stencil); + CopyStencilSide(d3ddesc.BackFace, desc.stencil); if (SUCCEEDED(device_->CreateDepthStencilState(&d3ddesc, &ds->dss))) return ds; delete ds; diff --git a/Common/GPU/D3D9/thin3d_d3d9.cpp b/Common/GPU/D3D9/thin3d_d3d9.cpp index e0242645c9..65286ae805 100644 --- a/Common/GPU/D3D9/thin3d_d3d9.cpp +++ b/Common/GPU/D3D9/thin3d_d3d9.cpp @@ -730,12 +730,12 @@ DepthStencilState *D3D9Context::CreateDepthStencilState(const DepthStencilStateD ds->depthWriteEnabled = desc.depthWriteEnabled; ds->depthCompare = compareToD3D9[(int)desc.depthCompare]; ds->stencilEnabled = desc.stencilEnabled; - ds->stencilCompareOp = compareToD3D9[(int)desc.front.compareOp]; - ds->stencilPass = stencilOpToD3D9[(int)desc.front.passOp]; - ds->stencilFail = stencilOpToD3D9[(int)desc.front.failOp]; - ds->stencilZFail = stencilOpToD3D9[(int)desc.front.depthFailOp]; - ds->stencilWriteMask = desc.front.writeMask; - ds->stencilCompareMask = desc.front.compareMask; + ds->stencilCompareOp = compareToD3D9[(int)desc.stencil.compareOp]; + ds->stencilPass = stencilOpToD3D9[(int)desc.stencil.passOp]; + ds->stencilFail = stencilOpToD3D9[(int)desc.stencil.failOp]; + ds->stencilZFail = stencilOpToD3D9[(int)desc.stencil.depthFailOp]; + ds->stencilWriteMask = desc.stencil.writeMask; + ds->stencilCompareMask = desc.stencil.compareMask; return ds; } diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index acc73051c7..8302696922 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -936,12 +936,12 @@ DepthStencilState *OpenGLContext::CreateDepthStencilState(const DepthStencilStat ds->depthWriteEnabled = desc.depthWriteEnabled; ds->depthComp = compToGL[(int)desc.depthCompare]; ds->stencilEnabled = desc.stencilEnabled; - ds->stencilCompareOp = compToGL[(int)desc.front.compareOp]; - ds->stencilPass = stencilOpToGL[(int)desc.front.passOp]; - ds->stencilFail = stencilOpToGL[(int)desc.front.failOp]; - ds->stencilZFail = stencilOpToGL[(int)desc.front.depthFailOp]; - ds->stencilWriteMask = desc.front.writeMask; - ds->stencilCompareMask = desc.front.compareMask; + ds->stencilCompareOp = compToGL[(int)desc.stencil.compareOp]; + ds->stencilPass = stencilOpToGL[(int)desc.stencil.passOp]; + ds->stencilFail = stencilOpToGL[(int)desc.stencil.failOp]; + ds->stencilZFail = stencilOpToGL[(int)desc.stencil.depthFailOp]; + ds->stencilWriteMask = desc.stencil.writeMask; + ds->stencilCompareMask = desc.stencil.compareMask; return ds; } diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index 7f18daba4e..8cb2e4e0d3 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -1207,7 +1207,7 @@ Texture *VKContext::CreateTexture(const TextureDesc &desc) { } } -static inline void CopySide(VkStencilOpState &dest, const StencilSide &src) { +static inline void CopySide(VkStencilOpState &dest, const StencilSetup &src) { dest.compareMask = src.compareMask; dest.writeMask = src.writeMask; dest.compareOp = compToVK[(int)src.compareOp]; @@ -1224,8 +1224,8 @@ DepthStencilState *VKContext::CreateDepthStencilState(const DepthStencilStateDes ds->info.stencilTestEnable = desc.stencilEnabled; ds->info.depthBoundsTestEnable = false; if (ds->info.stencilTestEnable) { - CopySide(ds->info.front, desc.front); - CopySide(ds->info.back, desc.back); + CopySide(ds->info.front, desc.stencil); + CopySide(ds->info.back, desc.stencil); } return ds; } diff --git a/Common/GPU/thin3d.h b/Common/GPU/thin3d.h index 7cccf0fd55..004d6dc3e2 100644 --- a/Common/GPU/thin3d.h +++ b/Common/GPU/thin3d.h @@ -453,7 +453,7 @@ public: class RasterState : public RefCountedObject {}; -struct StencilSide { +struct StencilSetup { StencilOp failOp; StencilOp passOp; StencilOp depthFailOp; @@ -467,8 +467,7 @@ struct DepthStencilStateDesc { bool depthWriteEnabled; Comparison depthCompare; bool stencilEnabled; - StencilSide front; - StencilSide back; + StencilSetup stencil; }; struct BlendStateDesc { diff --git a/UI/GPUDriverTestScreen.cpp b/UI/GPUDriverTestScreen.cpp index 10a6640520..811e7c02a4 100644 --- a/UI/GPUDriverTestScreen.cpp +++ b/UI/GPUDriverTestScreen.cpp @@ -329,13 +329,12 @@ void GPUDriverTestScreen::DiscardTest() { dsDesc.depthWriteEnabled = true; dsDesc.depthCompare = Comparison::ALWAYS; dsDesc.stencilEnabled = true; - dsDesc.front.compareMask = 0xFF; - dsDesc.front.compareOp = Comparison::ALWAYS; - dsDesc.front.passOp = StencilOp::REPLACE; - dsDesc.front.failOp = StencilOp::REPLACE; // These two shouldn't matter, because the test that fails is discard, not stencil. - dsDesc.front.depthFailOp = StencilOp::REPLACE; - dsDesc.front.writeMask = 0xFF; - dsDesc.back = dsDesc.front; + dsDesc.stencil.compareMask = 0xFF; + dsDesc.stencil.compareOp = Comparison::ALWAYS; + dsDesc.stencil.passOp = StencilOp::REPLACE; + dsDesc.stencil.failOp = StencilOp::REPLACE; // These two shouldn't matter, because the test that fails is discard, not stencil. + dsDesc.stencil.depthFailOp = StencilOp::REPLACE; + dsDesc.stencil.writeMask = 0xFF; DepthStencilState *depthStencilWrite = draw->CreateDepthStencilState(dsDesc); // Write only depth. @@ -353,33 +352,28 @@ void GPUDriverTestScreen::DiscardTest() { dsDesc.depthTestEnabled = true; dsDesc.stencilEnabled = true; dsDesc.depthCompare = Comparison::ALWAYS; - dsDesc.front.compareOp = Comparison::EQUAL; - dsDesc.front.failOp = StencilOp::KEEP; - dsDesc.front.depthFailOp = StencilOp::KEEP; - dsDesc.front.writeMask = 0x0; - dsDesc.back = dsDesc.front; + dsDesc.stencil.compareOp = Comparison::EQUAL; + dsDesc.stencil.failOp = StencilOp::KEEP; + dsDesc.stencil.depthFailOp = StencilOp::KEEP; + dsDesc.stencil.writeMask = 0x0; DepthStencilState *stencilEqualDepthAlways = draw->CreateDepthStencilState(dsDesc); dsDesc.depthTestEnabled = false; - dsDesc.front.compareOp = Comparison::EQUAL; - dsDesc.back = dsDesc.front; + dsDesc.stencil.compareOp = Comparison::EQUAL; DepthStencilState *stencilEqual = draw->CreateDepthStencilState(dsDesc); dsDesc.depthTestEnabled = true; dsDesc.depthCompare = Comparison::ALWAYS; - dsDesc.front.compareOp = Comparison::NOT_EQUAL; - dsDesc.back = dsDesc.front; + dsDesc.stencil.compareOp = Comparison::NOT_EQUAL; DepthStencilState *stenciNotEqualDepthAlways = draw->CreateDepthStencilState(dsDesc); dsDesc.depthTestEnabled = false; - dsDesc.front.compareOp = Comparison::NOT_EQUAL; - dsDesc.back = dsDesc.front; + dsDesc.stencil.compareOp = Comparison::NOT_EQUAL; DepthStencilState *stencilNotEqual = draw->CreateDepthStencilState(dsDesc); dsDesc.stencilEnabled = true; dsDesc.depthTestEnabled = true; - dsDesc.front.compareOp = Comparison::ALWAYS; - dsDesc.back = dsDesc.front; + dsDesc.stencil.compareOp = Comparison::ALWAYS; dsDesc.depthCompare = Comparison::LESS_EQUAL; DepthStencilState *stencilAlwaysDepthTestLessEqual = draw->CreateDepthStencilState(dsDesc); dsDesc.depthCompare = Comparison::GREATER;