• Sam Lantinga's avatar
    Fixed bug 1145 (GL Context creation fails for OpenGL 3.2 + Alpha buffer with X11 BadMatch) · 1a2a914b
    Sam Lantinga authored
     Matthias      2011-02-23 09:37:51 PST
    
    Please view the attached source file. Using this minimal program (as attached),
    it creates an OpenGL 2.0 context with a cleared color buffer. If I set the
    OpenGL version to 3.2, the function SDL_GL_CreateContext fails (or more
    specifically, glXMakeCurrent fails) with an X11 BadMatch error:
    
    
    X Error of failed request:  BadMatch (invalid parameter attributes)
      Major opcode of failed request:  128 (GLX)
      Minor opcode of failed request:  5 (X_GLXMakeCurrent)
      Serial number of failed request:  153
      Current serial number in output stream:  153
    
    
    Also note that if I do not specify the alpha buffer size, the program works for
    OpenGL 2.0 and OpenGL 3.2.
    
    After some further analysis, I believe I have found the problem. The specific
    issue is in:
    
    SDL_x11opengl.c::X11_GL_CreateContext.
    
    Note that for OpenGL 3.2 contexts, the GLXFBConfig to use is chosen as the best
    match from glXChooseFBConfig. However, opengl attributes originally set with
    SDL_GL_SetAttribute are not mapped to GLX attributes and then passed to the
    glXChooseFBConfig function. According to the GLX 1.4 specification, if the
    attributes are not specified, the function falls back to defaults (which, in
    this particular case, prefer alpha channel size == 0).
    
    For testing purposes, I modified the call to glXChooseFBConfig to look
    something like this:
    
    
    int glxAttribs[] =
    {
     GLX_RED_SIZE,8,
     GLX_GREEN_SIZE,8,
     GLX_BLUE_SIZE,8,
     GLX_ALPHA_SIZE,8,
     None
    };
    
    if (!glXChooseFBConfig ||
     !(framebuffer_config = glXChooseFBConfig(display, DefaultScreen(display),
    glxAttribs, &fbcount)))
    {
     ...
    }
    
    
    The best match GLXFBConfig then supports 8 bit alpha channel. The program then
    works as intended.
    
    
    Hope this helps!
    1a2a914b
Name
Last commit
Last update
VisualC Loading commit data...
VisualCE Loading commit data...
Xcode Loading commit data...
Xcode-iPhoneOS Loading commit data...
acinclude Loading commit data...
android-project Loading commit data...
build-scripts Loading commit data...
include Loading commit data...
src Loading commit data...
test Loading commit data...
.DISABLED-hgeol Loading commit data...
.hgignore Loading commit data...
.hgtags Loading commit data...
.indent.pro Loading commit data...
Android.mk Loading commit data...
BUGS Loading commit data...
Borland.html Loading commit data...
Borland.zip Loading commit data...
COPYING Loading commit data...
CREDITS Loading commit data...
INSTALL Loading commit data...
Makefile.ds Loading commit data...
Makefile.in Loading commit data...
Makefile.minimal Loading commit data...
Makefile.pandora Loading commit data...
Makefile.wiz Loading commit data...
NOTES Loading commit data...
README Loading commit data...
README-SDL.txt Loading commit data...
README.BeOS Loading commit data...
README.DirectFB Loading commit data...
README.HG Loading commit data...
README.MacOSX Loading commit data...
README.Platforms Loading commit data...
README.Porting Loading commit data...
README.Watcom Loading commit data...
README.WinCE Loading commit data...
README.android Loading commit data...
README.ds Loading commit data...
README.gesture Loading commit data...
README.iphoneos Loading commit data...
README.pandora Loading commit data...
README.touch Loading commit data...
SDL.spec.in Loading commit data...
TODO Loading commit data...
UNDER_CONSTRUCTION.txt Loading commit data...
VisualC.html Loading commit data...
Watcom-Win32.zip Loading commit data...
WhatsNew Loading commit data...
aclocal.m4 Loading commit data...
autogen.sh Loading commit data...
configure Loading commit data...
configure.in Loading commit data...
sdl-config.in Loading commit data...
sdl.m4 Loading commit data...
sdl.pc.in Loading commit data...