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
}
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;
void VID_Shutdown(void)
{
- if (!ctx || !vidx11_display)
+ if (!vidx11_display)
return;
VID_SetMouse(false, false, false);
if (vid.softdepthpixels)
free(vid.softdepthpixels);
+ vid.softdepthpixels = NULL;
if (win)
XDestroyWindow(vidx11_display, win);
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;
++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)
{