diff --git a/src/backend/d3d12/D3D12Backend.cpp b/src/backend/d3d12/D3D12Backend.cpp index 9186746f31..ea00d2f835 100644 --- a/src/backend/d3d12/D3D12Backend.cpp +++ b/src/backend/d3d12/D3D12Backend.cpp @@ -20,10 +20,10 @@ #include "backend/d3d12/CommandAllocatorManager.h" #include "backend/d3d12/CommandBufferD3D12.h" #include "backend/d3d12/ComputePipelineD3D12.h" +#include "backend/d3d12/DepthStencilStateD3D12.h" #include "backend/d3d12/DescriptorHeapAllocator.h" #include "backend/d3d12/FramebufferD3D12.h" #include "backend/d3d12/InputStateD3D12.h" -#include "backend/d3d12/DepthStencilStateD3D12.h" #include "backend/d3d12/PipelineLayoutD3D12.h" #include "backend/d3d12/QueueD3D12.h" #include "backend/d3d12/RenderPipelineD3D12.h" diff --git a/src/backend/d3d12/DepthStencilStateD3D12.cpp b/src/backend/d3d12/DepthStencilStateD3D12.cpp index 1e414b3a2e..9ace5381f4 100644 --- a/src/backend/d3d12/DepthStencilStateD3D12.cpp +++ b/src/backend/d3d12/DepthStencilStateD3D12.cpp @@ -19,83 +19,83 @@ namespace backend { namespace d3d12 { - static D3D12_STENCIL_OP StencilOp(nxt::StencilOperation op) { - switch (op) { - case nxt::StencilOperation::Keep: - return D3D12_STENCIL_OP_KEEP; - case nxt::StencilOperation::Zero: - return D3D12_STENCIL_OP_ZERO; - case nxt::StencilOperation::Replace: - return D3D12_STENCIL_OP_REPLACE; - case nxt::StencilOperation::IncrementClamp: - return D3D12_STENCIL_OP_INCR_SAT; - case nxt::StencilOperation::DecrementClamp: - return D3D12_STENCIL_OP_DECR_SAT; - case nxt::StencilOperation::Invert: - return D3D12_STENCIL_OP_INVERT; - case nxt::StencilOperation::IncrementWrap: - return D3D12_STENCIL_OP_INCR; - case nxt::StencilOperation::DecrementWrap: - return D3D12_STENCIL_OP_DECR; - default: - UNREACHABLE(); - } + static D3D12_STENCIL_OP StencilOp(nxt::StencilOperation op) { + switch (op) { + case nxt::StencilOperation::Keep: + return D3D12_STENCIL_OP_KEEP; + case nxt::StencilOperation::Zero: + return D3D12_STENCIL_OP_ZERO; + case nxt::StencilOperation::Replace: + return D3D12_STENCIL_OP_REPLACE; + case nxt::StencilOperation::IncrementClamp: + return D3D12_STENCIL_OP_INCR_SAT; + case nxt::StencilOperation::DecrementClamp: + return D3D12_STENCIL_OP_DECR_SAT; + case nxt::StencilOperation::Invert: + return D3D12_STENCIL_OP_INVERT; + case nxt::StencilOperation::IncrementWrap: + return D3D12_STENCIL_OP_INCR; + case nxt::StencilOperation::DecrementWrap: + return D3D12_STENCIL_OP_DECR; + default: + UNREACHABLE(); + } + } + + static D3D12_COMPARISON_FUNC ComparisonFunc(nxt::CompareFunction func) { + switch (func) + { + case nxt::CompareFunction::Always: + return D3D12_COMPARISON_FUNC_ALWAYS; + case nxt::CompareFunction::Equal: + return D3D12_COMPARISON_FUNC_EQUAL; + case nxt::CompareFunction::Greater: + return D3D12_COMPARISON_FUNC_GREATER; + case nxt::CompareFunction::GreaterEqual: + return D3D12_COMPARISON_FUNC_GREATER_EQUAL; + case nxt::CompareFunction::Less: + return D3D12_COMPARISON_FUNC_LESS; + case nxt::CompareFunction::LessEqual: + return D3D12_COMPARISON_FUNC_LESS_EQUAL; + case nxt::CompareFunction::Never: + return D3D12_COMPARISON_FUNC_NEVER; + case nxt::CompareFunction::NotEqual: + return D3D12_COMPARISON_FUNC_NOT_EQUAL; + default: + UNREACHABLE(); + } + } + + static D3D12_DEPTH_STENCILOP_DESC StencilOpDesc(backend::DepthStencilStateBase::StencilFaceInfo faceInfo) { + D3D12_DEPTH_STENCILOP_DESC desc; + + desc.StencilFailOp = StencilOp(faceInfo.stencilFail); + desc.StencilDepthFailOp = StencilOp(faceInfo.depthFail); + desc.StencilPassOp = StencilOp(faceInfo.depthStencilPass); + desc.StencilFunc = ComparisonFunc(faceInfo.compareFunction); + + return desc; + } + + DepthStencilState::DepthStencilState(Device* device, DepthStencilStateBuilder* builder) + : DepthStencilStateBase(builder), device(device) { + + // If you have anything other than Never, then enable depth testing + depthStencilDescriptor.DepthEnable = TRUE; + depthStencilDescriptor.DepthWriteMask = GetDepth().depthWriteEnabled ? D3D12_DEPTH_WRITE_MASK_ALL : D3D12_DEPTH_WRITE_MASK_ZERO; + depthStencilDescriptor.DepthFunc = ComparisonFunc(GetDepth().compareFunction); + + depthStencilDescriptor.StencilEnable = StencilTestEnabled() ? TRUE : FALSE; + depthStencilDescriptor.StencilReadMask = static_cast(GetStencil().readMask); + depthStencilDescriptor.StencilWriteMask = static_cast(GetStencil().writeMask); + + depthStencilDescriptor.FrontFace = StencilOpDesc(GetStencil().front); + depthStencilDescriptor.BackFace = StencilOpDesc(GetStencil().back); } - static D3D12_COMPARISON_FUNC ComparisonFunc(nxt::CompareFunction func) { - switch (func) - { - case nxt::CompareFunction::Always: - return D3D12_COMPARISON_FUNC_ALWAYS; - case nxt::CompareFunction::Equal: - return D3D12_COMPARISON_FUNC_EQUAL; - case nxt::CompareFunction::Greater: - return D3D12_COMPARISON_FUNC_GREATER; - case nxt::CompareFunction::GreaterEqual: - return D3D12_COMPARISON_FUNC_GREATER_EQUAL; - case nxt::CompareFunction::Less: - return D3D12_COMPARISON_FUNC_LESS; - case nxt::CompareFunction::LessEqual: - return D3D12_COMPARISON_FUNC_LESS_EQUAL; - case nxt::CompareFunction::Never: - return D3D12_COMPARISON_FUNC_NEVER; - case nxt::CompareFunction::NotEqual: - return D3D12_COMPARISON_FUNC_NOT_EQUAL; - default: - UNREACHABLE(); - } - } - - static D3D12_DEPTH_STENCILOP_DESC StencilOpDesc(backend::DepthStencilStateBase::StencilFaceInfo faceInfo) { - D3D12_DEPTH_STENCILOP_DESC desc; - - desc.StencilFailOp = StencilOp(faceInfo.stencilFail); - desc.StencilDepthFailOp = StencilOp(faceInfo.depthFail); - desc.StencilPassOp = StencilOp(faceInfo.depthStencilPass); - desc.StencilFunc = ComparisonFunc(faceInfo.compareFunction); - - return desc; - } - - DepthStencilState::DepthStencilState(Device* device, DepthStencilStateBuilder* builder) - : DepthStencilStateBase(builder), device(device) { - - // If you have anything other than Never, then enable depth testing - depthStencilDescriptor.DepthEnable = TRUE; // (GetDepth().compareFunction == nxt::CompareFunction::Never) ? FALSE : TRUE; - depthStencilDescriptor.DepthWriteMask = GetDepth().depthWriteEnabled ? D3D12_DEPTH_WRITE_MASK_ALL : D3D12_DEPTH_WRITE_MASK_ZERO; - depthStencilDescriptor.DepthFunc = ComparisonFunc(GetDepth().compareFunction); - - depthStencilDescriptor.StencilEnable = StencilTestEnabled() ? TRUE : FALSE; - depthStencilDescriptor.StencilReadMask = (UINT8)GetStencil().readMask; - depthStencilDescriptor.StencilWriteMask = (UINT8)GetStencil().writeMask; - - depthStencilDescriptor.FrontFace = StencilOpDesc(GetStencil().front); - depthStencilDescriptor.BackFace = StencilOpDesc(GetStencil().back); - } - - const D3D12_DEPTH_STENCIL_DESC& DepthStencilState::GetD3D12DepthStencilDescriptor() const { - return depthStencilDescriptor; - } + const D3D12_DEPTH_STENCIL_DESC& DepthStencilState::GetD3D12DepthStencilDescriptor() const { + return depthStencilDescriptor; + } } } diff --git a/src/backend/d3d12/DepthStencilStateD3D12.h b/src/backend/d3d12/DepthStencilStateD3D12.h index 76c6c5afd2..ca040b6f7d 100644 --- a/src/backend/d3d12/DepthStencilStateD3D12.h +++ b/src/backend/d3d12/DepthStencilStateD3D12.h @@ -28,12 +28,12 @@ namespace d3d12 { public: DepthStencilState(Device* device, DepthStencilStateBuilder* builder); - const D3D12_DEPTH_STENCIL_DESC& GetD3D12DepthStencilDescriptor() const; + const D3D12_DEPTH_STENCIL_DESC& GetD3D12DepthStencilDescriptor() const; private: Device* device; - D3D12_DEPTH_STENCIL_DESC depthStencilDescriptor; - }; + D3D12_DEPTH_STENCIL_DESC depthStencilDescriptor; + }; } } diff --git a/src/backend/d3d12/GeneratedCodeIncludes.h b/src/backend/d3d12/GeneratedCodeIncludes.h index ed72d6831e..210993953a 100644 --- a/src/backend/d3d12/GeneratedCodeIncludes.h +++ b/src/backend/d3d12/GeneratedCodeIncludes.h @@ -18,9 +18,9 @@ #include "backend/d3d12/BufferD3D12.h" #include "backend/d3d12/CommandBufferD3D12.h" #include "backend/d3d12/ComputePipelineD3D12.h" +#include "backend/d3d12/DepthStencilStateD3D12.h" #include "backend/d3d12/FramebufferD3D12.h" #include "backend/d3d12/InputStateD3D12.h" -#include "backend/d3d12/DepthStencilStateD3D12.h" #include "backend/d3d12/PipelineLayoutD3D12.h" #include "backend/d3d12/QueueD3D12.h" #include "backend/d3d12/RenderPipelineD3D12.h" diff --git a/src/backend/d3d12/RenderPipelineD3D12.cpp b/src/backend/d3d12/RenderPipelineD3D12.cpp index c5f8191b60..e5af97deca 100644 --- a/src/backend/d3d12/RenderPipelineD3D12.cpp +++ b/src/backend/d3d12/RenderPipelineD3D12.cpp @@ -15,8 +15,8 @@ #include "backend/d3d12/RenderPipelineD3D12.h" #include "backend/d3d12/D3D12Backend.h" -#include "backend/d3d12/InputStateD3D12.h" #include "backend/d3d12/DepthStencilStateD3D12.h" +#include "backend/d3d12/InputStateD3D12.h" #include "backend/d3d12/ShaderModuleD3D12.h" #include "backend/d3d12/PipelineLayoutD3D12.h" #include "common/Assert.h" @@ -155,8 +155,8 @@ namespace d3d12 { descriptor.BlendState.RenderTarget[0].LogicOp = D3D12_LOGIC_OP_NOOP; descriptor.BlendState.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL; - DepthStencilState* depthStencilState = ToBackend(GetDepthStencilState()); - descriptor.DepthStencilState = depthStencilState->GetD3D12DepthStencilDescriptor(); + DepthStencilState* depthStencilState = ToBackend(GetDepthStencilState()); + descriptor.DepthStencilState = depthStencilState->GetD3D12DepthStencilDescriptor(); descriptor.SampleMask = UINT_MAX; descriptor.PrimitiveTopologyType = D3D12PrimitiveTopologyType(GetPrimitiveTopology()); diff --git a/src/tests/end2end/DepthStencilStateTests.cpp b/src/tests/end2end/DepthStencilStateTests.cpp index 55bce41076..a67b82f0cd 100644 --- a/src/tests/end2end/DepthStencilStateTests.cpp +++ b/src/tests/end2end/DepthStencilStateTests.cpp @@ -522,4 +522,4 @@ TEST_P(DepthStencilStateTest, StencilDepthPass) { 2); // Replace the stencil on stencil pass, depth pass, so it should be 2 } -NXT_INSTANTIATE_TEST(DepthStencilStateTest, MetalBackend, OpenGLBackend, D3D12Backend) +NXT_INSTANTIATE_TEST(DepthStencilStateTest, D3D12Backend, MetalBackend, OpenGLBackend)