hw/xwin/glx: Make WGL -> GLX extension mapping table-driven

Signed-off-by: Jon Turney <jon.turney@dronecode.org.uk>
Reviewed-by: Colin Harrison <colin.harrison@virgin.net>
This commit is contained in:
Jon Turney 2016-07-15 14:02:10 +01:00
parent ad6b4113cd
commit 6be9681eb9
1 changed files with 32 additions and 22 deletions

View File

@ -572,47 +572,57 @@ glxWinScreenProbe(ScreenPtr pScreen)
// might have completely different capabilities. Of course, good luck getting
// those screens to be accelerated in XP and earlier...
{
int i;
const struct
{
const char *wglext;
const char *glxext;
Bool mandatory;
} extensionMap[] = {
{ "WGL_ARB_make_current_read", "GLX_SGI_make_current_read", 1 },
{ "WGL_EXT_swap_control", "GLX_SGI_swap_control", 0 },
{ "WGL_EXT_swap_control", "GLX_MESA_swap_control", 0 },
// { "WGL_ARB_render_texture", "GLX_EXT_texture_from_pixmap", 0 },
// Sufficiently different that it's not obvious if this can be done...
{ "WGL_ARB_pbuffer", "GLX_SGIX_pbuffer", 1 },
{ "WGL_ARB_multisample", "GLX_ARB_multisample", 1 },
{ "WGL_ARB_multisample", "GLX_SGIS_multisample", 0 },
};
//
// Based on the WGL extensions available, enable various GLX extensions
// XXX: make this table-driven ?
//
__glXInitExtensionEnableBits(screen->base.glx_enable_bits);
if (strstr(wgl_extensions, "WGL_ARB_make_current_read"))
screen->has_WGL_ARB_make_current_read = TRUE;
else
LogMessage(X_WARNING, "AIGLX: missing WGL_ARB_make_current_read\n");
for (i = 0; i < sizeof(extensionMap)/sizeof(extensionMap[0]); i++) {
if (strstr(wgl_extensions, extensionMap[i].wglext)) {
__glXEnableExtension(screen->base.glx_enable_bits, extensionMap[i].glxext);
LogMessage(X_INFO, "GLX: enabled %s\n", extensionMap[i].glxext);
}
else if (extensionMap[i].mandatory) {
LogMessage(X_ERROR, "required WGL extension %s is missing\n", extensionMap[i].wglext);
}
}
// Because it pre-dates WGL_EXT_extensions_string, GL_WIN_swap_hint might
// only be in GL_EXTENSIONS
if (strstr(gl_extensions, "GL_WIN_swap_hint")) {
__glXEnableExtension(screen->base.glx_enable_bits,
"GLX_MESA_copy_sub_buffer");
LogMessage(X_INFO, "AIGLX: enabled GLX_MESA_copy_sub_buffer\n");
}
if (strstr(wgl_extensions, "WGL_EXT_swap_control")) {
__glXEnableExtension(screen->base.glx_enable_bits,
"GLX_SGI_swap_control");
LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_swap_control\n");
}
/* // Hmm? screen->texOffset */
/* if (strstr(wgl_extensions, "WGL_ARB_render_texture")) */
/* { */
/* __glXEnableExtension(screen->base.glx_enable_bits, "GLX_EXT_texture_from_pixmap"); */
/* LogMessage(X_INFO, "AIGLX: GLX_EXT_texture_from_pixmap backed by buffer objects\n"); */
/* screen->has_WGL_ARB_render_texture = TRUE; */
/* } */
if (strstr(wgl_extensions, "WGL_ARB_make_current_read"))
screen->has_WGL_ARB_make_current_read = TRUE;
if (strstr(wgl_extensions, "WGL_ARB_pbuffer"))
screen->has_WGL_ARB_pbuffer = TRUE;
else
LogMessage(X_WARNING, "AIGLX: missing WGL_ARB_pbuffer\n");
if (strstr(wgl_extensions, "WGL_ARB_multisample"))
screen->has_WGL_ARB_multisample = TRUE;
else
LogMessage(X_WARNING, "AIGLX: missing WGL_ARB_multisample\n");
screen->base.destroy = glxWinScreenDestroy;
screen->base.createContext = glxWinCreateContext;