add functionality to metal render pass to cache winding order and cull mode (#3566)

This commit is contained in:
yousifd
2025-06-24 16:38:27 +03:00
committed by GitHub
parent 282735772b
commit 3e62496d80
4 changed files with 28 additions and 11 deletions

View File

@@ -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);

View File

@@ -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(

View File

@@ -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