From 70ef749ff431f4df3695af94ebfd3a438ddcfda4 Mon Sep 17 00:00:00 2001 From: Kp Date: Sun, 4 Apr 2021 22:01:25 +0000 Subject: [PATCH] Consolidate stereo GL calls Reorder the logic to unify the common calls at the bottom of the function, and skip computing anything if called in no-stereo mode. --- similar/arch/ogl/ogl.cpp | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/similar/arch/ogl/ogl.cpp b/similar/arch/ogl/ogl.cpp index d9e7d4c00..cb175d8ba 100644 --- a/similar/arch/ogl/ogl.cpp +++ b/similar/arch/ogl/ogl.cpp @@ -1290,16 +1290,18 @@ void ogl_start_frame(grs_canvas &canvas) void ogl_stereo_frame(const int xeye, const int xoff) { - float dxoff = xoff * 2.0f / grd_curscreen->sc_canvas.cv_bitmap.bm_w; + if (!xeye) + return; + const float dxoff = xoff * 2.0f / grd_curscreen->sc_canvas.cv_bitmap.bm_w; + float stereo_transform_dxoff; // query if stereo quad buffering available? glGetBooleanv(GL_STEREO, &ogl_stereo_enabled); - if (xeye < 0) { + const auto left_eye = xeye < 0; + if (left_eye) { // left eye view - if (ogl_stereo_enabled) - glDrawBuffer(GL_BACK_LEFT); - else if (VR_stereo == STEREO_SIDE_BY_SIDE2) + if (!ogl_stereo_enabled && VR_stereo == STEREO_SIDE_BY_SIDE2) { std::array ogl_stereo_viewport; glGetIntegerv(GL_VIEWPORT, ogl_stereo_viewport.data()); @@ -1308,17 +1310,13 @@ void ogl_stereo_frame(const int xeye, const int xoff) glViewport(ogl_stereo_viewport[0], ogl_stereo_viewport[1], ogl_stereo_viewport[2], ogl_stereo_viewport[3]); } // rightward image shift adjustment for left eye offset - glMatrixMode(GL_PROJECTION); - glGetFloatv(GL_PROJECTION_MATRIX, ogl_stereo_transform.data()); - ogl_stereo_transform[8] -= dxoff; // xoff < 0 - glLoadMatrixf(ogl_stereo_transform.data()); - glMatrixMode(GL_MODELVIEW); + stereo_transform_dxoff = -dxoff; // xoff < 0 } - else if (xeye > 0) { + else + { // right eye view - if (ogl_stereo_enabled) - glDrawBuffer(GL_BACK_RIGHT); - else { + if (!ogl_stereo_enabled) + { std::array ogl_stereo_viewport; glGetIntegerv(GL_VIEWPORT, ogl_stereo_viewport.data()); switch (VR_stereo) { @@ -1338,12 +1336,15 @@ void ogl_stereo_frame(const int xeye, const int xoff) glViewport(ogl_stereo_viewport[0], ogl_stereo_viewport[1], ogl_stereo_viewport[2], ogl_stereo_viewport[3]); } // leftward image shift adjustment for right eye offset - glMatrixMode(GL_PROJECTION); - glGetFloatv(GL_PROJECTION_MATRIX, ogl_stereo_transform.data()); - ogl_stereo_transform[8] += dxoff; // xoff < 0 - glLoadMatrixf(ogl_stereo_transform.data()); - glMatrixMode(GL_MODELVIEW); + stereo_transform_dxoff = dxoff; // xoff < 0 } + if (ogl_stereo_enabled) + glDrawBuffer(left_eye ? GL_BACK_LEFT : GL_BACK_RIGHT); + glMatrixMode(GL_PROJECTION); + glGetFloatv(GL_PROJECTION_MATRIX, ogl_stereo_transform.data()); + ogl_stereo_transform[8] += stereo_transform_dxoff; + glLoadMatrixf(ogl_stereo_transform.data()); + glMatrixMode(GL_MODELVIEW); } void ogl_end_frame(void){