]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - vid_glx.c
shells are too stupid to understand precedence of && and ||, so let's group explicitly
[xonotic/darkplaces.git] / vid_glx.c
index c0a7efc82bca7865aea6d9e99edeab660d8866ed..293fdd459029f125da653b046079d4415aff6a40 100644 (file)
--- a/vid_glx.c
+++ b/vid_glx.c
@@ -89,7 +89,7 @@ static Window win, root;
 static GLXContext ctx = NULL;
 static GC vidx11_gc = NULL;
 static XImage *vidx11_ximage[2] = { NULL, NULL };
-static int vidx11_ximage_pos;
+static int vidx11_ximage_pos = 0;
 static XShmSegmentInfo vidx11_shminfo[2];
 static int vidx11_shmevent = -1;
 static int vidx11_shmwait = 0; // number of frames outstanding
@@ -518,7 +518,7 @@ static qboolean BuildXImages(int w, int h)
        }
        else
        {
-               for(i = 0; i < 2; ++i)
+               for(i = 0; i < 1; ++i) // we only need one buffer if we don't use Xshm
                {
                        char *p = calloc(4, w * h);
                        vidx11_shminfo[i].shmid = -1;
@@ -829,7 +829,7 @@ void *GL_GetProcAddress(const char *name)
 
 void VID_Shutdown(void)
 {
-       if (!ctx || !vidx11_display)
+       if (!vidx11_display)
                return;
 
        VID_SetMouse(false, false, false);
@@ -849,6 +849,7 @@ void VID_Shutdown(void)
 
        if (vid.softdepthpixels)
                free(vid.softdepthpixels);
+       vid.softdepthpixels = NULL;
 
        if (win)
                XDestroyWindow(vidx11_display, win);
@@ -894,11 +895,11 @@ void VID_Finish (void)
        switch(vid.renderpath)
        {
                case RENDERPATH_SOFT:
-                       vidx11_ximage_pos = !vidx11_ximage_pos;
-                       vid.softpixels = (unsigned int *) vidx11_ximage[vidx11_ximage_pos]->data;
-                       DPSOFTRAST_SetRenderTargets(vid.width, vid.height, vid.softdepthpixels, vid.softpixels, NULL, NULL, NULL);
-
                        if(vidx11_shmevent >= 0) {
+                               vidx11_ximage_pos = !vidx11_ximage_pos;
+                               vid.softpixels = (unsigned int *) vidx11_ximage[vidx11_ximage_pos]->data;
+                               DPSOFTRAST_SetRenderTargets(vid.width, vid.height, vid.softdepthpixels, vid.softpixels, NULL, NULL, NULL);
+
                                // save mouse motion so we can deal with it later
                                in_mouse_x = 0;
                                in_mouse_y = 0;
@@ -912,13 +913,16 @@ void VID_Finish (void)
                                ++vidx11_shmwait;
                                XShmPutImage(vidx11_display, win, vidx11_gc, vidx11_ximage[!vidx11_ximage_pos], 0, 0, 0, 0, vid.width, vid.height, True);
                        } else {
-                               XPutImage(vidx11_display, win, vidx11_gc, vidx11_ximage[!vidx11_ximage_pos], 0, 0, 0, 0, vid.width, vid.height);
+                               // no buffer switching here, we just flush the renderer
+                               DPSOFTRAST_Finish();
+                               XPutImage(vidx11_display, win, vidx11_gc, vidx11_ximage[vidx11_ximage_pos], 0, 0, 0, 0, vid.width, vid.height);
                        }
                        break;
 
                case RENDERPATH_GL11:
                case RENDERPATH_GL13:
                case RENDERPATH_GL20:
+               case RENDERPATH_GLES1:
                case RENDERPATH_GLES2:
                        if (vid_usingvsync != vid_usevsync)
                        {