Skip to content

Commit 9fb0a3b

Browse files
committed
UPBGE: Avoid redundant state call to GL_CULL_FACE.
The function SetCullFace now use a state from RAS_Rasterizer to skip unecessary opengl calls. Also the rendering of plane to screen is now using the function SetFrontFace instead disabling and renabling the face culling.
1 parent 2fdcf10 commit 9fb0a3b

File tree

4 files changed

+15
-13
lines changed

4 files changed

+15
-13
lines changed

source/gameengine/Ketsji/KX_WorldInfo.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,14 +215,13 @@ void KX_WorldInfo::RenderBackground(RAS_Rasterizer *rasty)
215215
GPU_material_bind(gpumat, m_scene->lay, 1.0f, false, rasty->GetViewMatrix().Data(),
216216
rasty->GetViewInvMatrix().Data(), texcofac, false);
217217

218-
rasty->Disable(RAS_Rasterizer::RAS_CULL_FACE);
218+
rasty->SetFrontFace(true);
219219
rasty->Enable(RAS_Rasterizer::RAS_DEPTH_TEST);
220220
rasty->SetDepthFunc(RAS_Rasterizer::RAS_ALWAYS);
221221

222222
rasty->DrawOverlayPlane();
223223

224224
rasty->SetDepthFunc(RAS_Rasterizer::RAS_LEQUAL);
225-
rasty->Enable(RAS_Rasterizer::RAS_CULL_FACE);
226225

227226
GPU_material_unbind(gpumat);
228227
}

source/gameengine/Rasterizer/RAS_2DFilterManager.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ RAS_OffScreen *RAS_2DFilterManager::RenderFilters(RAS_Rasterizer *rasty, RAS_ICa
8888
return inputofs;
8989
}
9090

91-
rasty->Disable(RAS_Rasterizer::RAS_CULL_FACE);
9291
rasty->Disable(RAS_Rasterizer::RAS_DEPTH_TEST);
9392
rasty->SetDepthMask(RAS_Rasterizer::RAS_DEPTHMASK_DISABLED);
9493
rasty->Disable(RAS_Rasterizer::RAS_BLEND);
@@ -147,7 +146,6 @@ RAS_OffScreen *RAS_2DFilterManager::RenderFilters(RAS_Rasterizer *rasty, RAS_ICa
147146

148147
rasty->Enable(RAS_Rasterizer::RAS_DEPTH_TEST);
149148
rasty->SetDepthMask(RAS_Rasterizer::RAS_DEPTHMASK_ENABLED);
150-
rasty->Enable(RAS_Rasterizer::RAS_CULL_FACE);
151149

152150
return targetofs;
153151
}

source/gameengine/Rasterizer/RAS_Rasterizer.cpp

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,8 @@ RAS_Rasterizer::RAS_Rasterizer()
221221

222222
InitOverrideShadersInterface();
223223

224-
m_state.frontFace = true;
224+
m_state.frontFace = -1;
225+
m_state.cullFace = -1;
225226
m_state.polyOffset[0] = -1.0f;
226227
m_state.polyOffset[1] = -1.0f;
227228
}
@@ -283,7 +284,7 @@ void RAS_Rasterizer::Init()
283284

284285
void RAS_Rasterizer::Exit()
285286
{
286-
Enable(RAS_CULL_FACE);
287+
SetCullFace(true);
287288
Enable(RAS_DEPTH_TEST);
288289

289290
SetClearDepth(1.0f);
@@ -313,7 +314,7 @@ void RAS_Rasterizer::BeginFrame(double time)
313314
m_state.polyOffset[0] = -1.0f;
314315
m_state.polyOffset[1] = -1.0f;
315316

316-
Enable(RAS_CULL_FACE);
317+
SetCullFace(true);
317318
Enable(RAS_DEPTH_TEST);
318319

319320
Disable(RAS_BLEND);
@@ -444,14 +445,13 @@ void RAS_Rasterizer::DrawOffScreen(RAS_ICanvas *canvas, RAS_OffScreen *offScreen
444445
SetViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
445446
SetScissor(viewport[0], viewport[1], viewport[2], viewport[3]);
446447

447-
Disable(RAS_CULL_FACE);
448+
SetFrontFace(true);
448449
SetDepthFunc(RAS_ALWAYS);
449450

450451
RAS_OffScreen::RestoreScreen();
451452
DrawOffScreen(offScreen, nullptr);
452453

453454
SetDepthFunc(RAS_LEQUAL);
454-
Enable(RAS_CULL_FACE);
455455
}
456456

457457
void RAS_Rasterizer::DrawStereoOffScreen(RAS_ICanvas *canvas, RAS_OffScreen *leftOffScreen, RAS_OffScreen *rightOffScreen,
@@ -471,7 +471,7 @@ void RAS_Rasterizer::DrawStereoOffScreen(RAS_ICanvas *canvas, RAS_OffScreen *lef
471471
SetViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
472472
SetScissor(viewport[0], viewport[1], viewport[2], viewport[3]);
473473

474-
Disable(RAS_CULL_FACE);
474+
SetFrontFace(true);
475475
SetDepthFunc(RAS_ALWAYS);
476476

477477
RAS_OffScreen::RestoreScreen();
@@ -517,7 +517,6 @@ void RAS_Rasterizer::DrawStereoOffScreen(RAS_ICanvas *canvas, RAS_OffScreen *lef
517517
}
518518

519519
SetDepthFunc(RAS_LEQUAL);
520-
Enable(RAS_CULL_FACE);
521520
}
522521

523522
RAS_Rect RAS_Rasterizer::GetRenderArea(RAS_ICanvas *canvas, StereoMode stereoMode, StereoEye eye)
@@ -863,6 +862,11 @@ bool RAS_Rasterizer::GetCameraOrtho()
863862

864863
void RAS_Rasterizer::SetCullFace(bool enable)
865864
{
865+
if (enable == m_state.cullFace) {
866+
return;
867+
}
868+
m_state.cullFace = enable;
869+
866870
if (enable) {
867871
Enable(RAS_CULL_FACE);
868872
}
@@ -1386,7 +1390,7 @@ void RAS_Rasterizer::DisableForText()
13861390
SetAlphaBlend(GPU_BLEND_ALPHA);
13871391
SetLines(false); /* needed for texture fonts otherwise they render as wireframe */
13881392

1389-
Enable(RAS_CULL_FACE);
1393+
SetCullFace(true);
13901394

13911395
DisableLights();
13921396

source/gameengine/Rasterizer/RAS_Rasterizer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,8 @@ class RAS_Rasterizer : public mt::SimdClassAllocator
319319

320320
/// States to reduce OpenGL calls.
321321
struct {
322-
bool frontFace;
322+
char frontFace;
323+
char cullFace;
323324
float polyOffset[2];
324325
} m_state;
325326

0 commit comments

Comments
 (0)