From 4453a2b85b945d4c73e2de5bb8626be5cd0b12eb Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Wed, 4 Dec 2024 19:26:05 -0800 Subject: [PATCH] [Impeller] avoid re-binding winding order and cull mode. (flutter/engine#56943) Winding order and cull mode almost never change, so avoid re-binding them over and over again. Minor performance improvement. --- .../renderer/backend/gles/render_pass_gles.cc | 52 ++++++++++++------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/engine/src/flutter/impeller/renderer/backend/gles/render_pass_gles.cc b/engine/src/flutter/impeller/renderer/backend/gles/render_pass_gles.cc index 65518a90d4..7c273d74ed 100644 --- a/engine/src/flutter/impeller/renderer/backend/gles/render_pass_gles.cc +++ b/engine/src/flutter/impeller/renderer/backend/gles/render_pass_gles.cc @@ -309,6 +309,10 @@ void RenderPassGLES::ResetGLState(const ProcTableGLES& gl) { } } + CullMode current_cull_mode = CullMode::kNone; + WindingOrder current_winding_order = WindingOrder::kClockwise; + gl.FrontFace(GL_CW); + for (const auto& command : commands) { #ifdef IMPELLER_DEBUG fml::ScopedCleanupClosure pop_cmd_debug_marker( @@ -391,29 +395,39 @@ void RenderPassGLES::ResetGLState(const ProcTableGLES& gl) { //-------------------------------------------------------------------------- /// Setup culling. /// - switch (pipeline.GetDescriptor().GetCullMode()) { - case CullMode::kNone: - gl.Disable(GL_CULL_FACE); - break; - case CullMode::kFrontFace: - gl.Enable(GL_CULL_FACE); - gl.CullFace(GL_FRONT); - break; - case CullMode::kBackFace: - gl.Enable(GL_CULL_FACE); - gl.CullFace(GL_BACK); - break; + CullMode pipeline_cull_mode = pipeline.GetDescriptor().GetCullMode(); + if (current_cull_mode != pipeline_cull_mode) { + switch (pipeline_cull_mode) { + case CullMode::kNone: + gl.Disable(GL_CULL_FACE); + break; + case CullMode::kFrontFace: + gl.Enable(GL_CULL_FACE); + gl.CullFace(GL_FRONT); + break; + case CullMode::kBackFace: + gl.Enable(GL_CULL_FACE); + gl.CullFace(GL_BACK); + break; + } + current_cull_mode = pipeline_cull_mode; } + //-------------------------------------------------------------------------- /// Setup winding order. /// - switch (pipeline.GetDescriptor().GetWindingOrder()) { - case WindingOrder::kClockwise: - gl.FrontFace(GL_CW); - break; - case WindingOrder::kCounterClockwise: - gl.FrontFace(GL_CCW); - break; + WindingOrder pipeline_winding_order = + pipeline.GetDescriptor().GetWindingOrder(); + if (current_winding_order != pipeline_winding_order) { + switch (pipeline.GetDescriptor().GetWindingOrder()) { + case WindingOrder::kClockwise: + gl.FrontFace(GL_CW); + break; + case WindingOrder::kCounterClockwise: + gl.FrontFace(GL_CCW); + break; + } + current_winding_order = pipeline_winding_order; } BufferBindingsGLES* vertex_desc_gles = pipeline.GetBufferBindings();