add functionality to metal render pass to cache winding order and cull mode (#3566)
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user