2016-09-13 31 views
1

有没有办法获得与窗口关联的GLXContext,而无需致电glXGetCurrentContext()如何获取SDL中的GLXContext

+2

这听起来像一个XY问题,因为'glXGetCurrentContext'的全部要点是获取当前的上下文。 –

回答

2

​​:

SDL_GLContext 
X11_GL_CreateContext(_THIS, SDL_Window * window) 
{ 
    SDL_WindowData *data = (SDL_WindowData *) window->driverdata; 
    Display *display = data->videodata->display; 
    int screen = 
     ((SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata)->screen; 
    XWindowAttributes xattr; 
    XVisualInfo v, *vinfo; 
    int n; 
    GLXContext context = NULL, share_context; 

    if (_this->gl_config.share_with_current_context) { 
     share_context = (GLXContext)SDL_GL_GetCurrentContext(); 
    } else { 
     share_context = NULL; 
    } 

    /* We do this to create a clean separation between X and GLX errors. */ 
    X11_XSync(display, False); 
    errorHandlerOperation = "create GL context"; 
    errorBase = _this->gl_data->errorBase; 
    errorCode = Success; 
    handler = X11_XSetErrorHandler(X11_GL_ErrorHandler); 
    X11_XGetWindowAttributes(display, data->xwindow, &xattr); 
    v.screen = screen; 
    v.visualid = X11_XVisualIDFromVisual(xattr.visual); 
    vinfo = X11_XGetVisualInfo(display, VisualScreenMask | VisualIDMask, &v, &n); 
    if (vinfo) { 
     if (_this->gl_config.major_version < 3 && 
      _this->gl_config.profile_mask == 0 && 
      _this->gl_config.flags == 0) { 
      /* Create legacy context */ 
      context = 
       _this->gl_data->glXCreateContext(display, vinfo, share_context, True); 
     } else { 
      /* max 10 attributes plus terminator */ 
      int attribs[11] = { 
       GLX_CONTEXT_MAJOR_VERSION_ARB, 
       _this->gl_config.major_version, 
       GLX_CONTEXT_MINOR_VERSION_ARB, 
       _this->gl_config.minor_version, 
       0 
      }; 
      int iattr = 4; 

      /* SDL profile bits match GLX profile bits */ 
      if(_this->gl_config.profile_mask != 0) { 
       attribs[iattr++] = GLX_CONTEXT_PROFILE_MASK_ARB; 
       attribs[iattr++] = _this->gl_config.profile_mask; 
      } 

      /* SDL flags match GLX flags */ 
      if(_this->gl_config.flags != 0) { 
       attribs[iattr++] = GLX_CONTEXT_FLAGS_ARB; 
       attribs[iattr++] = _this->gl_config.flags; 
      } 

      /* only set if glx extension is available */ 
      if(_this->gl_data->HAS_GLX_ARB_context_flush_control) { 
       attribs[iattr++] = GLX_CONTEXT_RELEASE_BEHAVIOR_ARB; 
       attribs[iattr++] = 
        _this->gl_config.release_behavior ? 
        GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB : 
        GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB; 
      } 

      attribs[iattr++] = 0; 

      /* Get a pointer to the context creation function for GL 3.0 */ 
      if (!_this->gl_data->glXCreateContextAttribsARB) { 
       SDL_SetError("OpenGL 3.0 and later are not supported by this system"); 
      } else { 
       int glxAttribs[64]; 

       /* Create a GL 3.x context */ 
       GLXFBConfig *framebuffer_config = NULL; 
       int fbcount = 0; 

       X11_GL_GetAttributes(_this,display,screen,glxAttribs,64,SDL_TRUE); 

       if (!_this->gl_data->glXChooseFBConfig 
        || !(framebuffer_config = 
         _this->gl_data->glXChooseFBConfig(display, 
              DefaultScreen(display), glxAttribs, 
              &fbcount))) { 
        SDL_SetError("No good framebuffers found. OpenGL 3.0 and later unavailable"); 
       } else { 
        context = _this->gl_data->glXCreateContextAttribsARB(display, 
                framebuffer_config[0], 
                share_context, True, attribs); 
       } 
      } 
     } 
     X11_XFree(vinfo); 
    } 
    X11_XSync(display, False); 
    X11_XSetErrorHandler(handler); 

    if (!context) { 
     if (errorCode == Success) { 
      SDL_SetError("Could not create GL context"); 
     } 
     return NULL; 
    } 

    if (X11_GL_MakeCurrent(_this, window, context) < 0) { 
     X11_GL_DeleteContext(_this, context); 
     return NULL; 
    } 

    return context; 
} 

SDL2否则不存储上下文的任何地方。