Add support for glXSwapIntervalEXT.

This commit is contained in:
Brandon Wright 2011-01-09 03:32:38 -06:00
parent f362195fb4
commit 583f2a7ef8
2 changed files with 42 additions and 18 deletions

View File

@ -736,6 +736,8 @@ S9xOpenGLDisplayDriver::resize_window (int width, int height)
glXMakeCurrent (display, xwindow, glx_context);
swap_control (config->sync_to_vblank);
return;
}
@ -866,30 +868,49 @@ S9xOpenGLDisplayDriver::init (void)
void
S9xOpenGLDisplayDriver::swap_control (int enable)
{
glSwapIntervalProc glSwapInterval = NULL;
const char *ext_str;
static glSwapIntervalProc glSwapInterval = NULL;
static glXSwapIntervalEXTProc glXSwapIntervalEXT = NULL;
static int queried = FALSE;
const char *ext_str;
ext_str = glXQueryExtensionsString (display, DefaultScreen (display));
enable = enable ? 1 : 0;
/* We try to set this with both extensions since some cards pretend
* to support both, but ignore one. */
if (strstr (ext_str, "GLX_MESA_swap_control"))
if (!queried)
{
glSwapInterval = (glSwapIntervalProc)
glGetProcAddress ((GLubyte *) "glXSwapIntervalMESA");
if (glSwapInterval)
glSwapInterval (enable ? 1 : 0);
ext_str = glXQueryExtensionsString (display, DefaultScreen (display));
/* We try to set this with both extensions since some cards pretend
* to support both, but ignore one. */
if (strstr (ext_str, "GLX_MESA_swap_control"))
{
glSwapInterval = (glSwapIntervalProc)
glGetProcAddress ((GLubyte *) "glXSwapIntervalMESA");
}
if (strstr (ext_str, "GLX_SGI_swap_control"))
{
glSwapInterval = (glSwapIntervalProc)
glGetProcAddress ((GLubyte *) "glXSwapIntervalSGI");
}
if (strstr (ext_str, "GLX_EXT_swap_control"))
{
glXSwapIntervalEXT = (glXSwapIntervalEXTProc)
glGetProcAddress ((GLubyte *) "glXSwapIntervalEXT");
}
queried = TRUE;
}
else if (strstr (ext_str, "GLX_SGI_swap_control"))
if (glSwapInterval)
{
glSwapInterval = (glSwapIntervalProc)
glGetProcAddress ((GLubyte *) "glXSwapIntervalSGI");
if (glSwapInterval)
{
glSwapInterval (enable ? 1 : 0);
}
glSwapInterval (enable);
}
if (glXSwapIntervalEXT)
{
glXSwapIntervalEXT (display, xwindow, enable);
}
return;

View File

@ -35,6 +35,9 @@ typedef void (*gl_proc) (void);
typedef gl_proc (*getProcAddressProc) (const GLubyte *name);
typedef GLint (*glSwapIntervalProc) (GLint interval);
typedef void (*glXSwapIntervalEXTProc) (Display *dpy,
GLXDrawable drawable,
int interval);
/* Procedures for pixel buffer objects */
typedef void (*glGenBuffersProc) (GLsizei n, GLuint *buffers);
typedef void (*glDeleteBuffersProc) (GLsizei n, const GLuint *buffers);