summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Turney <jon.turney@dronecode.org.uk>2016-07-15 14:02:10 +0100
committerJon Turney <jon.turney@dronecode.org.uk>2018-05-13 18:21:59 +0100
commitc690bf12483376c5b8a30faa8309171e8a90776c (patch)
tree67c35e27af6066b38bff68b1bb030d2fec576deb
parentbefc03eb6cc1bfffef73215afa8950215471c0c7 (diff)
hw/xwin/glx: Make WGL -> GLX extension mapping table-driven
-rw-r--r--hw/xwin/glx/indirect.c54
1 files changed, 32 insertions, 22 deletions
diff --git a/hw/xwin/glx/indirect.c b/hw/xwin/glx/indirect.c
index 9ba6ab263..7be515020 100644
--- a/hw/xwin/glx/indirect.c
+++ b/hw/xwin/glx/indirect.c
@@ -677,47 +677,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;