[client] opengl: added back double buffering and vsync support

This adds back in double buffering and vsync support. This has been
carefully implemented so that the render function blocks until the video
card reports that it has advanced a frame, this ensures that the OpenGL
pipeline never buffers frames.
This commit is contained in:
Geoffrey McRae 2017-12-15 16:21:38 +11:00
parent 0d8b2449cf
commit 9c03327701

View file

@ -47,6 +47,7 @@ struct LGR_OpenGL
{ {
LG_RendererParams params; LG_RendererParams params;
bool configured; bool configured;
SDL_Window * sdlWindow;
SDL_GLContext glContext; SDL_GLContext glContext;
bool doneInfo; bool doneInfo;
@ -131,7 +132,7 @@ bool lgr_opengl_initialize(void ** opaque, const LG_RendererParams params, Uint3
} }
*sdlFlags = SDL_WINDOW_OPENGL; *sdlFlags = SDL_WINDOW_OPENGL;
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 0); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
return true; return true;
} }
@ -147,6 +148,7 @@ bool lgr_opengl_configure(void * opaque, SDL_Window *window, const LG_RendererFo
return false; return false;
} }
this->sdlWindow = window;
this->glContext = SDL_GL_CreateContext(window); this->glContext = SDL_GL_CreateContext(window);
if (!this->glContext) if (!this->glContext)
{ {
@ -168,7 +170,7 @@ bool lgr_opengl_configure(void * opaque, SDL_Window *window, const LG_RendererFo
return false; return false;
} }
SDL_GL_SetSwapInterval(0); SDL_GL_SetSwapInterval(this->params.vsync ? 1 : 0);
// check if the GPU supports GL_ARB_buffer_storage first // check if the GPU supports GL_ARB_buffer_storage first
// there is no advantage to this renderer if it is not present. // there is no advantage to this renderer if it is not present.
@ -706,10 +708,6 @@ bool lgr_opengl_render(void * opaque)
return true; return true;
} }
// wait for vsync
unsigned int count;
glXWaitVideoSyncSGI(1, 0, &count);
glDisable(GL_SCISSOR_TEST); glDisable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_SCISSOR_TEST); glEnable(GL_SCISSOR_TEST);
@ -718,7 +716,15 @@ bool lgr_opengl_render(void * opaque)
lgr_opengl_draw_mouse(this); lgr_opengl_draw_mouse(this);
if (this->fpsTexture) if (this->fpsTexture)
glCallList(this->fpsList); glCallList(this->fpsList);
glFlush();
unsigned int before, after;
glXGetVideoSyncSGI(&before);
SDL_GL_SwapWindow(this->sdlWindow);
// wait for the swap to happen to ensure we dont buffer frames
glXGetVideoSyncSGI(&after);
if (before == after)
glXWaitVideoSyncSGI(1, 0, &before);
++this->frameCount; ++this->frameCount;
const uint64_t t = nanotime(); const uint64_t t = nanotime();