| // Copyright 2017 The Dawn Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include "dawn_native/metal/DepthStencilStateMTL.h" |
| |
| #include "dawn_native/metal/DeviceMTL.h" |
| |
| namespace dawn_native { namespace metal { |
| |
| namespace { |
| MTLCompareFunction MetalDepthStencilCompareFunction(dawn::CompareFunction compareFunction) { |
| switch (compareFunction) { |
| case dawn::CompareFunction::Never: |
| return MTLCompareFunctionNever; |
| case dawn::CompareFunction::Less: |
| return MTLCompareFunctionLess; |
| case dawn::CompareFunction::LessEqual: |
| return MTLCompareFunctionLessEqual; |
| case dawn::CompareFunction::Greater: |
| return MTLCompareFunctionGreater; |
| case dawn::CompareFunction::GreaterEqual: |
| return MTLCompareFunctionGreaterEqual; |
| case dawn::CompareFunction::NotEqual: |
| return MTLCompareFunctionNotEqual; |
| case dawn::CompareFunction::Equal: |
| return MTLCompareFunctionEqual; |
| case dawn::CompareFunction::Always: |
| return MTLCompareFunctionAlways; |
| } |
| } |
| |
| MTLStencilOperation MetalStencilOperation(dawn::StencilOperation stencilOperation) { |
| switch (stencilOperation) { |
| case dawn::StencilOperation::Keep: |
| return MTLStencilOperationKeep; |
| case dawn::StencilOperation::Zero: |
| return MTLStencilOperationZero; |
| case dawn::StencilOperation::Replace: |
| return MTLStencilOperationReplace; |
| case dawn::StencilOperation::Invert: |
| return MTLStencilOperationInvert; |
| case dawn::StencilOperation::IncrementClamp: |
| return MTLStencilOperationIncrementClamp; |
| case dawn::StencilOperation::DecrementClamp: |
| return MTLStencilOperationDecrementClamp; |
| case dawn::StencilOperation::IncrementWrap: |
| return MTLStencilOperationIncrementWrap; |
| case dawn::StencilOperation::DecrementWrap: |
| return MTLStencilOperationDecrementWrap; |
| } |
| } |
| } |
| |
| DepthStencilState::DepthStencilState(DepthStencilStateBuilder* builder) |
| : DepthStencilStateBase(builder) { |
| MTLDepthStencilDescriptor* mtlDepthStencilDescriptor = [MTLDepthStencilDescriptor new]; |
| |
| auto& depth = GetDepth(); |
| mtlDepthStencilDescriptor.depthCompareFunction = |
| MetalDepthStencilCompareFunction(depth.compareFunction); |
| mtlDepthStencilDescriptor.depthWriteEnabled = depth.depthWriteEnabled; |
| |
| auto& stencil = GetStencil(); |
| if (StencilTestEnabled()) { |
| MTLStencilDescriptor* backFaceStencil = [MTLStencilDescriptor new]; |
| MTLStencilDescriptor* frontFaceStencil = [MTLStencilDescriptor new]; |
| |
| backFaceStencil.stencilCompareFunction = |
| MetalDepthStencilCompareFunction(stencil.back.compareFunction); |
| backFaceStencil.stencilFailureOperation = |
| MetalStencilOperation(stencil.back.stencilFail); |
| backFaceStencil.depthFailureOperation = MetalStencilOperation(stencil.back.depthFail); |
| backFaceStencil.depthStencilPassOperation = |
| MetalStencilOperation(stencil.back.depthStencilPass); |
| backFaceStencil.readMask = stencil.readMask; |
| backFaceStencil.writeMask = stencil.writeMask; |
| |
| frontFaceStencil.stencilCompareFunction = |
| MetalDepthStencilCompareFunction(stencil.front.compareFunction); |
| frontFaceStencil.stencilFailureOperation = |
| MetalStencilOperation(stencil.front.stencilFail); |
| frontFaceStencil.depthFailureOperation = MetalStencilOperation(stencil.front.depthFail); |
| frontFaceStencil.depthStencilPassOperation = |
| MetalStencilOperation(stencil.front.depthStencilPass); |
| frontFaceStencil.readMask = stencil.readMask; |
| frontFaceStencil.writeMask = stencil.writeMask; |
| |
| mtlDepthStencilDescriptor.backFaceStencil = backFaceStencil; |
| mtlDepthStencilDescriptor.frontFaceStencil = frontFaceStencil; |
| [backFaceStencil release]; |
| [frontFaceStencil release]; |
| } |
| |
| auto mtlDevice = ToBackend(builder->GetDevice())->GetMTLDevice(); |
| mMtlDepthStencilState = |
| [mtlDevice newDepthStencilStateWithDescriptor:mtlDepthStencilDescriptor]; |
| [mtlDepthStencilDescriptor release]; |
| } |
| |
| DepthStencilState::~DepthStencilState() { |
| [mMtlDepthStencilState release]; |
| mMtlDepthStencilState = nil; |
| } |
| |
| id<MTLDepthStencilState> DepthStencilState::GetMTLDepthStencilState() { |
| return mMtlDepthStencilState; |
| } |
| |
| }} // namespace dawn_native::metal |