diff options
| author | skallweitNV <64953474+skallweitNV@users.noreply.github.com> | 2024-06-10 18:12:01 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-10 18:12:01 +0200 |
| commit | 6857dd57549f01daa025f45221a693259e474958 (patch) | |
| tree | c6db90150ff093eea525e57c7e52c0cc1c970095 /tools/gfx/metal/metal-util.cpp | |
| parent | 0974463daf0982626cb2b8c8bb6f494f3e6c9e52 (diff) | |
[gfx] Metal graphics support (#4324)
* fix double semicolons
* fix another double semicolon
* wait for init data upload
* remove obsolete setData
* refactor swapchain to work on virtual back buffers
* buffer/texture use breakable device reference
* refactor input layout
* create render command encoder
* add todo
* refactor framebuffer layout
* refactor framebuffer
* refactor shader program
* translatePrimitiveType
* add more translate functions
* refactor framebuffer
* refactor render pass
* implement graphics pipeline state
* add depth stencil state
* initial render command encoder support
* comment
Diffstat (limited to 'tools/gfx/metal/metal-util.cpp')
| -rw-r--r-- | tools/gfx/metal/metal-util.cpp | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/tools/gfx/metal/metal-util.cpp b/tools/gfx/metal/metal-util.cpp index d7d2a793d..ed96eb487 100644 --- a/tools/gfx/metal/metal-util.cpp +++ b/tools/gfx/metal/metal-util.cpp @@ -176,6 +176,35 @@ MTL::VertexFormat MetalUtil::translateVertexFormat(Format format) } } +bool MetalUtil::isDepthFormat(MTL::PixelFormat format) +{ + switch (format) + { + case MTL::PixelFormatDepth16Unorm: + case MTL::PixelFormatDepth32Float: + case MTL::PixelFormatDepth24Unorm_Stencil8: + case MTL::PixelFormatDepth32Float_Stencil8: + return true; + default: + return false; + } +} + +bool MetalUtil::isStencilFormat(MTL::PixelFormat format) +{ + switch (format) + { + case MTL::PixelFormatStencil8: + case MTL::PixelFormatDepth24Unorm_Stencil8: + case MTL::PixelFormatDepth32Float_Stencil8: + case MTL::PixelFormatX32_Stencil8: + case MTL::PixelFormatX24_Stencil8: + return true; + default: + return false; + } +} + MTL::SamplerMinMagFilter MetalUtil::translateSamplerMinMagFilter(TextureFilteringMode mode) { switch (mode) @@ -246,6 +275,31 @@ MTL::CompareFunction MetalUtil::translateCompareFunction(ComparisonFunc func) } } +MTL::StencilOperation MetalUtil::translateStencilOperation(StencilOp op) +{ + switch (op) + { + case StencilOp::Keep: + return MTL::StencilOperationKeep; + case StencilOp::Zero: + return MTL::StencilOperationZero; + case StencilOp::Replace: + return MTL::StencilOperationReplace; + case StencilOp::IncrementSaturate: + return MTL::StencilOperationIncrementClamp; + case StencilOp::DecrementSaturate: + return MTL::StencilOperationDecrementClamp; + case StencilOp::Invert: + return MTL::StencilOperationInvert; + case StencilOp::IncrementWrap: + return MTL::StencilOperationIncrementWrap; + case StencilOp::DecrementWrap: + return MTL::StencilOperationDecrementWrap; + default: + return MTL::StencilOperation(0); + } +} + MTL::VertexStepFunction MetalUtil::translateVertexStepFunction(InputSlotClass slotClass) { switch (slotClass) @@ -259,4 +313,156 @@ MTL::VertexStepFunction MetalUtil::translateVertexStepFunction(InputSlotClass sl } } +MTL::PrimitiveType MetalUtil::translatePrimitiveType(PrimitiveTopology topology) +{ + switch (topology) + { + case PrimitiveTopology::TriangleList: + return MTL::PrimitiveTypeTriangle; + case PrimitiveTopology::TriangleStrip: + return MTL::PrimitiveTypeTriangleStrip; + case PrimitiveTopology::PointList: + return MTL::PrimitiveTypePoint; + case PrimitiveTopology::LineList: + return MTL::PrimitiveTypeLine; + case PrimitiveTopology::LineStrip: + return MTL::PrimitiveTypeLineStrip; + default: + return MTL::PrimitiveType(0); + } +} + +MTL::PrimitiveTopologyClass MetalUtil::translatePrimitiveTopologyClass(PrimitiveType type) +{ + switch (type) + { + case PrimitiveType::Point: + return MTL::PrimitiveTopologyClassPoint; + case PrimitiveType::Line: + return MTL::PrimitiveTopologyClassLine; + case PrimitiveType::Triangle: + return MTL::PrimitiveTopologyClassTriangle; + case PrimitiveType::Patch: + default: + return MTL::PrimitiveTopologyClassUnspecified; + } +} + +MTL::BlendFactor MetalUtil::translateBlendFactor(BlendFactor factor) +{ + switch (factor) + { + case BlendFactor::Zero: + return MTL::BlendFactorZero; + case BlendFactor::One: + return MTL::BlendFactorOne; + case BlendFactor::SrcColor: + return MTL::BlendFactorSourceColor; + case BlendFactor::InvSrcColor: + return MTL::BlendFactorOneMinusSourceColor; + case BlendFactor::SrcAlpha: + return MTL::BlendFactorSourceAlpha; + case BlendFactor::InvSrcAlpha: + return MTL::BlendFactorOneMinusSourceAlpha; + case BlendFactor::DestAlpha: + return MTL::BlendFactorDestinationAlpha; + case BlendFactor::InvDestAlpha: + return MTL::BlendFactorOneMinusDestinationAlpha; + case BlendFactor::DestColor: + return MTL::BlendFactorDestinationColor; + case BlendFactor::InvDestColor: + return MTL::BlendFactorOneMinusDestinationColor; + case BlendFactor::SrcAlphaSaturate: + return MTL::BlendFactorSourceAlphaSaturated; + case BlendFactor::BlendColor: + return MTL::BlendFactorBlendColor; + case BlendFactor::InvBlendColor: + return MTL::BlendFactorOneMinusBlendColor; + case BlendFactor::SecondarySrcColor: + return MTL::BlendFactorSource1Color; + case BlendFactor::InvSecondarySrcColor: + return MTL::BlendFactorOneMinusSource1Color; + case BlendFactor::SecondarySrcAlpha: + return MTL::BlendFactorSource1Alpha; + case BlendFactor::InvSecondarySrcAlpha: + return MTL::BlendFactorOneMinusSource1Alpha; + default: + return MTL::BlendFactor(0); + } +} + +MTL::BlendOperation MetalUtil::translateBlendOperation(BlendOp op) +{ + switch (op) + { + case BlendOp::Add: + return MTL::BlendOperationAdd; + case BlendOp::Subtract: + return MTL::BlendOperationSubtract; + case BlendOp::ReverseSubtract: + return MTL::BlendOperationReverseSubtract; + case BlendOp::Min: + return MTL::BlendOperationMin; + case BlendOp::Max: + return MTL::BlendOperationMax; + default: + return MTL::BlendOperation(0); + } +} + +MTL::ColorWriteMask MetalUtil::translateColorWriteMask(RenderTargetWriteMask::Type mask) +{ + MTL::ColorWriteMask result = MTL::ColorWriteMaskNone; + if (mask & RenderTargetWriteMask::EnableRed) + result |= MTL::ColorWriteMaskRed; + if (mask & RenderTargetWriteMask::EnableGreen) + result |= MTL::ColorWriteMaskGreen; + if (mask & RenderTargetWriteMask::EnableBlue) + result |= MTL::ColorWriteMaskBlue; + if (mask & RenderTargetWriteMask::EnableAlpha) + result |= MTL::ColorWriteMaskAlpha; + return result; +} + +MTL::Winding MetalUtil::translateWinding(FrontFaceMode mode) +{ + switch (mode) + { + case FrontFaceMode::CounterClockwise: + return MTL::WindingCounterClockwise; + case FrontFaceMode::Clockwise: + return MTL::WindingClockwise; + default: + return MTL::Winding(0); + } +} + +MTL::CullMode MetalUtil::translateCullMode(CullMode mode) +{ + switch (mode) + { + case CullMode::None: + return MTL::CullModeNone; + case CullMode::Front: + return MTL::CullModeFront; + case CullMode::Back: + return MTL::CullModeBack; + default: + return MTL::CullMode(0); + } +} + +MTL::TriangleFillMode MetalUtil::translateTriangleFillMode(FillMode mode) +{ + switch (mode) + { + case FillMode::Solid: + return MTL::TriangleFillModeFill; + case FillMode::Wireframe: + return MTL::TriangleFillModeLines; + default: + return MTL::TriangleFillMode(0); + } +} + } // namespace gfx |
