• 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
SDL_x11opengl.c 18.3 KB