// Copyright 2017 The NXT 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 "backend/metal/BlendStateMTL.h" #include "backend/metal/MetalBackend.h" namespace backend { namespace metal { namespace { MTLBlendFactor MetalBlendFactor(nxt::BlendFactor factor, bool alpha) { switch(factor) { case nxt::BlendFactor::Zero: return MTLBlendFactorZero; case nxt::BlendFactor::One: return MTLBlendFactorOne; case nxt::BlendFactor::SrcColor: return MTLBlendFactorSourceColor; case nxt::BlendFactor::OneMinusSrcColor: return MTLBlendFactorOneMinusSourceColor; case nxt::BlendFactor::SrcAlpha: return MTLBlendFactorSourceAlpha; case nxt::BlendFactor::OneMinusSrcAlpha: return MTLBlendFactorOneMinusSourceAlpha; case nxt::BlendFactor::DstColor: return MTLBlendFactorDestinationColor; case nxt::BlendFactor::OneMinusDstColor: return MTLBlendFactorOneMinusDestinationColor; case nxt::BlendFactor::DstAlpha: return MTLBlendFactorDestinationAlpha; case nxt::BlendFactor::OneMinusDstAlpha: return MTLBlendFactorOneMinusDestinationAlpha; case nxt::BlendFactor::SrcAlphaSaturated: return MTLBlendFactorSourceAlphaSaturated; case nxt::BlendFactor::BlendColor: return alpha ? MTLBlendFactorBlendAlpha : MTLBlendFactorBlendColor; case nxt::BlendFactor::OneMinusBlendColor: return alpha ? MTLBlendFactorOneMinusBlendAlpha : MTLBlendFactorOneMinusBlendColor; } } MTLBlendOperation MetalBlendOperation(nxt::BlendOperation operation) { switch(operation) { case nxt::BlendOperation::Add: return MTLBlendOperationAdd; case nxt::BlendOperation::Subtract: return MTLBlendOperationSubtract; case nxt::BlendOperation::ReverseSubtract: return MTLBlendOperationReverseSubtract; case nxt::BlendOperation::Min: return MTLBlendOperationMin; case nxt::BlendOperation::Max: return MTLBlendOperationMax; } } MTLColorWriteMask MetalColorWriteMask(nxt::ColorWriteMask colorWriteMask) { return ( ((colorWriteMask & nxt::ColorWriteMask::Red) != nxt::ColorWriteMask::None ? MTLColorWriteMaskRed : MTLColorWriteMaskNone) | ((colorWriteMask & nxt::ColorWriteMask::Green) != nxt::ColorWriteMask::None ? MTLColorWriteMaskGreen : MTLColorWriteMaskNone) | ((colorWriteMask & nxt::ColorWriteMask::Blue) != nxt::ColorWriteMask::None ? MTLColorWriteMaskBlue : MTLColorWriteMaskNone) | ((colorWriteMask & nxt::ColorWriteMask::Alpha) != nxt::ColorWriteMask::None ? MTLColorWriteMaskAlpha : MTLColorWriteMaskNone) ); } } BlendState::BlendState(BlendStateBuilder* builder) : BlendStateBase(builder) { } void BlendState::ApplyBlendState(MTLRenderPipelineColorAttachmentDescriptor* descriptor) const { auto& info = GetBlendInfo(); descriptor.blendingEnabled = info.blendEnabled; descriptor.sourceRGBBlendFactor = MetalBlendFactor(info.colorBlend.srcFactor, false); descriptor.destinationRGBBlendFactor = MetalBlendFactor(info.colorBlend.dstFactor, false); descriptor.rgbBlendOperation = MetalBlendOperation(info.colorBlend.operation); descriptor.sourceAlphaBlendFactor = MetalBlendFactor(info.alphaBlend.srcFactor, true); descriptor.destinationAlphaBlendFactor = MetalBlendFactor(info.alphaBlend.dstFactor, true); descriptor.alphaBlendOperation = MetalBlendOperation(info.alphaBlend.operation); descriptor.writeMask = MetalColorWriteMask(info.colorWriteMask); } } }