This seems to be fairly universal these days, and if it doesn't exist the only thing you break is separate drawable and readable, which is a fairly rare feature to use. So pretend it's always there and just throw an error on MakeCurrent if it doesn't.
As a result we can enable GLX 1.4 unconditionally. Signed-off-by: Adam Jackson <[email protected]> --- hw/xwin/glx/indirect.c | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/hw/xwin/glx/indirect.c b/hw/xwin/glx/indirect.c index 626238f..220ad7e 100644 --- a/hw/xwin/glx/indirect.c +++ b/hw/xwin/glx/indirect.c @@ -143,6 +143,7 @@ struct __GLXWinScreen { Bool has_WGL_ARB_pixel_format; Bool has_WGL_ARB_pbuffer; Bool has_WGL_ARB_render_texture; + Bool has_WGL_ARB_make_current_read; /* wrapped screen functions */ RealizeWindowProcPtr RealizeWindow; @@ -627,8 +628,6 @@ glxWinScreenProbe(ScreenPtr pScreen) // those screens to be accelerated in XP and earlier... { - Bool glx_sgi_make_current_read = FALSE; - // // Based on the WGL extensions available, enable various GLX extensions // XXX: make this table-driven ? @@ -640,6 +639,7 @@ glxWinScreenProbe(ScreenPtr pScreen) __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_import_context"); __glXEnableExtension(screen->glx_enable_bits, "GLX_OML_swap_method"); __glXEnableExtension(screen->glx_enable_bits, "GLX_SGIX_fbconfig"); + __glXEnableExtension(screen->glx_enable_bits, "GLX_SGI_make_current_read"); // GLX_ARB_multisample is always enabled, even if no configs support it if (strstr(wgl_extensions, "WGL_ARB_multisample")) @@ -649,12 +649,9 @@ glxWinScreenProbe(ScreenPtr pScreen) if (strstr(wgl_extensions, "WGL_ARB_pbuffer")) screen->has_WGL_ARB_pbuffer = TRUE; - if (strstr(wgl_extensions, "WGL_ARB_make_current_read")) { - __glXEnableExtension(screen->glx_enable_bits, - "GLX_SGI_make_current_read"); - LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_make_current_read\n"); - glx_sgi_make_current_read = TRUE; - } + // GLX_SGI_make_current_read is effectively mandatory + if (strstr(wgl_extensions, "WGL_ARB_make_current_read")) + screen->has_WGL_ARB_make_current_read = TRUE; if (strstr(gl_extensions, "GL_WIN_swap_hint")) { __glXEnableExtension(screen->glx_enable_bits, @@ -731,17 +728,8 @@ glxWinScreenProbe(ScreenPtr pScreen) } } - // - // Override the GLX version (__glXScreenInit() sets it to "1.2") - // if we have all the needed extensions to operate as a higher version - // - // SGIX_fbconfig && SGIX_pbuffer && SGI_make_current_read -> 1.3 - // ARB_multisample -> 1.4 - // - if (glx_sgi_make_current_read) { - screen->base.GLXmajor = 1; - screen->base.GLXminor = 4; - } + screen->base.GLXmajor = 1; + screen->base.GLXminor = 4; } LogMessage(X_INFO, "AIGLX: Set GLX version to %d.%d\n", screen->base.GLXmajor, screen->base.GLXminor); @@ -1408,6 +1396,7 @@ static int glxWinContextMakeCurrent(__GLXcontext * base) { __GLXWinContext *gc = (__GLXWinContext *) base; + __GLXWinScreen *scr = (__GLXWinScreen *) base->pGlxScreen; BOOL ret; HDC drawDC; HDC readDC = NULL; @@ -1440,7 +1429,14 @@ glxWinContextMakeCurrent(__GLXcontext * base) } if ((gc->base.readPriv != NULL) && (gc->base.readPriv != gc->base.drawPriv)) { - // XXX: should only occur with WGL_ARB_make_current_read + /* + * We enable this unconditionally, but the renderer _might_ not support + * it. It's fairly rare to use this feature so just error out if it + * can't work. + */ + if (!scr->has_WGL_ARB_make_current_read) + return False; + /* If there is a separate read drawable, create a separate read DC, and use the wglMakeContextCurrent extension to make the context current drawing -- 2.5.0 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel
