diff --git a/include/mbgl/mtl/render_pass.hpp b/include/mbgl/mtl/render_pass.hpp index d2ffc3e2b..a86788fcd 100644 --- a/include/mbgl/mtl/render_pass.hpp +++ b/include/mbgl/mtl/render_pass.hpp @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -56,6 +57,9 @@ public: void bindFragment(const BufferResource&, std::size_t offset, std::size_t index, std::size_t size = 0); void unbindFragment(std::size_t index); + void setCullMode(const MTL::CullMode); + void setFrontFacingWinding(const MTL::Winding); + private: void pushDebugGroup(const char* name) override; void popDebugGroup() override; @@ -80,6 +84,9 @@ private: std::array fragmentTextureBindings; std::array fragmentSamplerStates; + + MTL::CullMode currentCullMode = MTL::CullModeNone; + MTL::Winding currentWinding = MTL::WindingClockwise; }; } // namespace mtl diff --git a/src/mbgl/mtl/context.cpp b/src/mbgl/mtl/context.cpp index c2cb732bf..81f13ada1 100644 --- a/src/mbgl/mtl/context.cpp +++ b/src/mbgl/mtl/context.cpp @@ -408,7 +408,7 @@ bool Context::renderTileClippingMasks(gfx::RenderPass& renderPass, uboBuffer->update(tileUBOs.data(), bufferSize, /*offset=*/0); } - encoder->setCullMode(MTL::CullModeNone); + mtlRenderPass.setCullMode(MTL::CullModeNone); mtlRenderPass.bindVertex(vertexRes, /*offset=*/0, ShaderClass::attributes[0].index); diff --git a/src/mbgl/mtl/drawable.cpp b/src/mbgl/mtl/drawable.cpp index a4d2f8fc4..0472ed9af 100644 --- a/src/mbgl/mtl/drawable.cpp +++ b/src/mbgl/mtl/drawable.cpp @@ -212,8 +212,8 @@ void Drawable::draw(PaintParameters& parameters) const { } const auto& cullMode = getCullFaceMode(); - encoder->setCullMode(cullMode.enabled ? mapCullMode(cullMode.side) : MTL::CullModeNone); - encoder->setFrontFacingWinding(mapWindingMode(cullMode.winding)); + renderPass.setCullMode(cullMode.enabled ? mapCullMode(cullMode.side) : MTL::CullModeNone); + renderPass.setFrontFacingWinding(mapWindingMode(cullMode.winding)); if (!impl->pipelineState) { impl->pipelineState = shaderMTL.getRenderPipelineState( diff --git a/src/mbgl/mtl/render_pass.cpp b/src/mbgl/mtl/render_pass.cpp index dd3dd4aa6..4c8ac237a 100644 --- a/src/mbgl/mtl/render_pass.cpp +++ b/src/mbgl/mtl/render_pass.cpp @@ -62,14 +62,7 @@ void RenderPass::endEncoding() { encoder.reset(); } - currentDepthStencilState.reset(); - currentStencilReferenceValue = 0; - for (int i = 0; i < maxBinds; ++i) { - vertexBinds[i].reset(); - fragmentBinds[i].reset(); - fragmentTextureBindings[i].reset(); - fragmentSamplerStates[i].reset(); - } + resetState(); } void RenderPass::resetState() { @@ -81,6 +74,9 @@ void RenderPass::resetState() { fragmentTextureBindings[i].reset(); fragmentSamplerStates[i].reset(); } + + currentCullMode = MTL::CullModeNone; + currentWinding = MTL::WindingClockwise; } namespace { @@ -197,5 +193,19 @@ void RenderPass::setFragmentSamplerState(const MTLSamplerStatePtr& state, int32_ } } +void RenderPass::setCullMode(const MTL::CullMode mode) { + if (mode != currentCullMode) { + encoder->setCullMode(mode); + currentCullMode = mode; + } +} + +void RenderPass::setFrontFacingWinding(const MTL::Winding winding) { + if (winding != currentWinding) { + encoder->setFrontFacingWinding(winding); + currentWinding = winding; + } +} + } // namespace mtl } // namespace mbgl