GLXContext CL_OpenGLWindowProvider_GLX::create_context_glx_1_2(const CL_OpenGLWindowDescription &gl_desc, GLXContext shared_context) { if (gl_desc.get_allow_lower_versions() == false) throw CL_Exception("GLX 1.2 does not support opengl version selection."); GLXContext context; context = glx.glXCreateContext(x11_window.get_display(), opengl_visual_info, shared_context, GL_TRUE); if(context == NULL) throw CL_Exception("glXCreateContext failed"); return context; }
GLXContext CL_OpenGLWindowProvider_GLX::create_context_glx_1_3(const CL_OpenGLWindowDescription &gl_desc, GLXContext shared_context) { GLXContext context; context = glx.glXCreateNewContext(x11_window.get_display(), fbconfig, GLX_RGBA_TYPE, shared_context, True); if(context == NULL) throw CL_Exception("glXCreateContext failed"); ptr_glXCreateContextAttribs glXCreateContextAttribs = NULL; if (is_glx_extension_supported("GLX_ARB_create_context")) { if (glx.glXGetProcAddressARB) glXCreateContextAttribs = (ptr_glXCreateContextAttribs) glx.glXGetProcAddressARB((GLubyte*) "glXCreateContextAttribsARB"); if (glx.glXGetProcAddress) glXCreateContextAttribs = (ptr_glXCreateContextAttribs) glx.glXGetProcAddress((GLubyte*) "glXCreateContextAttribsARB"); } if (glXCreateContextAttribs) { // Install an X error handler so the application won't exit if GL 3.0 context allocation fails. // // Note this error handler is global. All display connections in all threads // of a process use the same error handler, so be sure to guard against other // threads issuing X commands while this code is running. int (*oldHandler)(Display*, XErrorEvent*) = XSetErrorHandler(&cl_ctxErrorHandler); GLXContext context_gl3 = 0; int gl_major = gl_desc.get_version_major(); int gl_minor = gl_desc.get_version_minor(); if (gl_desc.get_allow_lower_versions() == false) { context_gl3 = create_context_glx_1_3_helper(shared_context, gl_major, gl_minor, gl_desc, glXCreateContextAttribs); if (!context_gl3) throw CL_Exception(cl_format("This application requires OpenGL %1.%2 or above. Try updating your drivers, or upgrade to a newer graphics card.", gl_major, gl_minor)); } else { static const char opengl_version_list[] = { // Clanlib supported version pairs 4,1, 4,0, 3,3, 3,2, 3,1, 3,0, 0,0, // End of list }; const char *opengl_version_list_ptr = opengl_version_list; do { int major = *(opengl_version_list_ptr++); if (major == 0) break; int minor = *(opengl_version_list_ptr++); // Find the appropriate version in the list if (major > gl_major) continue; if (major == gl_major) { if (minor > gl_minor) continue; } context_gl3 = create_context_glx_1_3_helper(shared_context, gl_major, gl_minor, gl_desc, glXCreateContextAttribs); }while(!context_gl3); } // Restore the original error handler XSetErrorHandler( oldHandler ); if (context_gl3) { glx.glXDestroyContext(x11_window.get_display(), context); context = context_gl3; } } return context; }