Skip to content

Commit 4453a2b

Browse files
author
Jonah Williams
authored
[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.
1 parent 8c736f4 commit 4453a2b

File tree

1 file changed

+33
-19
lines changed

1 file changed

+33
-19
lines changed

engine/src/flutter/impeller/renderer/backend/gles/render_pass_gles.cc

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,10 @@ void RenderPassGLES::ResetGLState(const ProcTableGLES& gl) {
309309
}
310310
}
311311

312+
CullMode current_cull_mode = CullMode::kNone;
313+
WindingOrder current_winding_order = WindingOrder::kClockwise;
314+
gl.FrontFace(GL_CW);
315+
312316
for (const auto& command : commands) {
313317
#ifdef IMPELLER_DEBUG
314318
fml::ScopedCleanupClosure pop_cmd_debug_marker(
@@ -391,29 +395,39 @@ void RenderPassGLES::ResetGLState(const ProcTableGLES& gl) {
391395
//--------------------------------------------------------------------------
392396
/// Setup culling.
393397
///
394-
switch (pipeline.GetDescriptor().GetCullMode()) {
395-
case CullMode::kNone:
396-
gl.Disable(GL_CULL_FACE);
397-
break;
398-
case CullMode::kFrontFace:
399-
gl.Enable(GL_CULL_FACE);
400-
gl.CullFace(GL_FRONT);
401-
break;
402-
case CullMode::kBackFace:
403-
gl.Enable(GL_CULL_FACE);
404-
gl.CullFace(GL_BACK);
405-
break;
398+
CullMode pipeline_cull_mode = pipeline.GetDescriptor().GetCullMode();
399+
if (current_cull_mode != pipeline_cull_mode) {
400+
switch (pipeline_cull_mode) {
401+
case CullMode::kNone:
402+
gl.Disable(GL_CULL_FACE);
403+
break;
404+
case CullMode::kFrontFace:
405+
gl.Enable(GL_CULL_FACE);
406+
gl.CullFace(GL_FRONT);
407+
break;
408+
case CullMode::kBackFace:
409+
gl.Enable(GL_CULL_FACE);
410+
gl.CullFace(GL_BACK);
411+
break;
412+
}
413+
current_cull_mode = pipeline_cull_mode;
406414
}
415+
407416
//--------------------------------------------------------------------------
408417
/// Setup winding order.
409418
///
410-
switch (pipeline.GetDescriptor().GetWindingOrder()) {
411-
case WindingOrder::kClockwise:
412-
gl.FrontFace(GL_CW);
413-
break;
414-
case WindingOrder::kCounterClockwise:
415-
gl.FrontFace(GL_CCW);
416-
break;
419+
WindingOrder pipeline_winding_order =
420+
pipeline.GetDescriptor().GetWindingOrder();
421+
if (current_winding_order != pipeline_winding_order) {
422+
switch (pipeline.GetDescriptor().GetWindingOrder()) {
423+
case WindingOrder::kClockwise:
424+
gl.FrontFace(GL_CW);
425+
break;
426+
case WindingOrder::kCounterClockwise:
427+
gl.FrontFace(GL_CCW);
428+
break;
429+
}
430+
current_winding_order = pipeline_winding_order;
417431
}
418432

419433
BufferBindingsGLES* vertex_desc_gles = pipeline.GetBufferBindings();

0 commit comments

Comments
 (0)