]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_backend.c
added gl_delayfinish cvar (default off, used to always be on)
[xonotic/darkplaces.git] / gl_backend.c
index d61fcef75ea7d261bdb4f1f8cf9591e5c27560d4..2d2ddc6a9500c1b6e9d7de0defccea1e6ba659a0 100644 (file)
@@ -5,6 +5,7 @@
 cvar_t gl_mesh_maxverts = {0, "gl_mesh_maxverts", "1024"};
 cvar_t gl_mesh_floatcolors = {0, "gl_mesh_floatcolors", "1"};
 cvar_t gl_mesh_drawrangeelements = {0, "gl_mesh_drawrangeelements", "1"};
+cvar_t gl_delayfinish = {CVAR_SAVE, "gl_delayfinish", "0"};
 
 cvar_t r_render = {0, "r_render", "1"};
 cvar_t gl_dither = {CVAR_SAVE, "gl_dither", "1"}; // whether or not to use dithering
@@ -51,7 +52,7 @@ void GL_PrintError(int errornumber, char *filename, int linenumber)
                break;
 #endif
 #ifdef GL_TABLE_TOO_LARGE
-    case GL_TABLE_TOO_LARGE:
+       case GL_TABLE_TOO_LARGE:
                Con_Printf("GL_TABLE_TOO_LARGE at %s:%i\n", filename, linenumber);
                break;
 #endif
@@ -202,6 +203,7 @@ void gl_backend_init(void)
        Cvar_RegisterVariable(&r_render);
        Cvar_RegisterVariable(&gl_dither);
        Cvar_RegisterVariable(&gl_lockarrays);
+       Cvar_RegisterVariable(&gl_delayfinish);
 #ifdef NORENDER
        Cvar_SetValue("r_render", 0);
 #endif
@@ -249,6 +251,7 @@ void GL_SetupView_Mode_Perspective (double fovx, double fovy, double zNear, doub
 
        // set up viewpoint
        qglMatrixMode(GL_PROJECTION);CHECKGLERROR
+       qglLoadIdentity();CHECKGLERROR
        // pyramid slopes
        xmax = zNear * tan(fovx * M_PI / 360.0);
        ymax = zNear * tan(fovy * M_PI / 360.0);
@@ -267,6 +270,7 @@ void GL_SetupView_Mode_PerspectiveInfiniteFarClip (double fovx, double fovy, dou
 
        // set up viewpoint
        qglMatrixMode(GL_PROJECTION);CHECKGLERROR
+       qglLoadIdentity();CHECKGLERROR
        // set view pyramid
        nudge = 1.0 - 1.0 / (1<<23);
        m[ 0] = 1.0 / tan(fovx * M_PI / 360.0);
@@ -313,6 +317,7 @@ void GL_SetupView_Mode_Ortho (double x1, double y1, double x2, double y2, double
 
        // set up viewpoint
        qglMatrixMode(GL_PROJECTION);CHECKGLERROR
+       qglLoadIdentity();CHECKGLERROR
        qglOrtho(x1, x2, y2, y1, zNear, zFar);
        qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
        GL_SetupView_Orientation_Identity();
@@ -839,7 +844,7 @@ void R_Mesh_State(const rmeshstate_t *m)
 qboolean SCR_ScreenShot(char *filename, int x, int y, int width, int height)
 {
        qboolean ret;
-       int i;
+       int i, j;
        qbyte *buffer;
 
        if (!r_render.integer)
@@ -851,8 +856,13 @@ qboolean SCR_ScreenShot(char *filename, int x, int y, int width, int height)
 
        // LordHavoc: compensate for v_overbrightbits when using hardware gamma
        if (v_hwgamma.integer)
+       {
                for (i = 0;i < width * height * 3;i++)
-                       buffer[i] <<= v_overbrightbits.integer;
+               {
+                       j = buffer[i] << v_overbrightbits.integer;
+                       buffer[i] = (qbyte) (bound(0, j, 255));
+               }
+       }
 
        ret = Image_WriteTGARGB_preflipped(filename, width, height, buffer);
 
@@ -900,9 +910,12 @@ text to the screen.
 */
 void SCR_UpdateScreen (void)
 {
-       VID_Finish ();
+       if (gl_delayfinish.integer)
+       {
+               VID_Finish ();
 
-       R_TimeReport("finish");
+               R_TimeReport("finish");
+       }
 
        if (r_textureunits.integer > gl_textureunits)
                Cvar_SetValueQuick(&r_textureunits, gl_textureunits);
@@ -932,8 +945,17 @@ void SCR_UpdateScreen (void)
        // draw 2D stuff
        R_DrawQueue();
 
-       // tell driver to commit it's partially full geometry queue to the rendering queue
-       // (this doesn't wait for the commands themselves to complete)
-       qglFlush();
+       if (gl_delayfinish.integer)
+       {
+               // tell driver to commit it's partially full geometry queue to the rendering queue
+               // (this doesn't wait for the commands themselves to complete)
+               qglFlush();
+       }
+       else
+       {
+               VID_Finish ();
+
+               R_TimeReport("finish");
+       }
 }