+ vector<int> fb_attribs;
+
+ fb_attribs.push_back(GLX_DRAWABLE_TYPE);
+ fb_attribs.push_back(GLX_WINDOW_BIT);
+
+ fb_attribs.push_back(GLX_RENDER_TYPE);
+ fb_attribs.push_back(GLX_RGBA_BIT);
+
+ fb_attribs.push_back(GLX_DEPTH_SIZE);
+ fb_attribs.push_back(1);
+
+ if(opts.alpha)
+ {
+ fb_attribs.push_back(GLX_ALPHA_SIZE);
+ fb_attribs.push_back(1);
+ }
+
+ if(opts.stencil)
+ {
+ fb_attribs.push_back(GLX_STENCIL_SIZE);
+ fb_attribs.push_back(1);
+ }
+
+ fb_attribs.push_back(GLX_DOUBLEBUFFER);
+ fb_attribs.push_back(opts.doublebuffer);
+
+ if(opts.multisample>0)
+ {
+ fb_attribs.push_back(GLX_SAMPLE_BUFFERS_ARB);
+ fb_attribs.push_back(1);
+ fb_attribs.push_back(GLX_SAMPLES_ARB);
+ fb_attribs.push_back(opts.multisample);
+ }
+
+ fb_attribs.push_back(0);
+
+ int n_configs = 0;
+ GLXFBConfig *fb_configs = glXChooseFBConfig(dpy, DefaultScreen(dpy), &fb_attribs[0], &n_configs);
+ if(!fb_configs)
+ throw unsupported_gl_mode(opts);
+
+ XVisualInfo *vi = glXGetVisualFromFBConfig(dpy, fb_configs[0]);
+
+ XSetWindowAttributes attr;
+ attr.colormap = XCreateColormap(dpy, DefaultRootWindow(dpy), vi->visual, AllocNone);
+
+ priv = new Private;
+ priv->subwnd = XCreateWindow(dpy, window.get_private().window, 0, 0, window.get_width(), window.get_height(), 0, vi->depth, InputOutput, vi->visual, CWColormap, &attr);
+ XMapWindow(dpy, priv->subwnd);
+
+ priv->glxwnd = glXCreateWindow(dpy, fb_configs[0], priv->subwnd, 0);
+
+ if(opts.forward_compatible || opts.gl_version_major!=GLOptions::DEFAULT_VERSION)
+ {
+ if(!extensions.count("GLX_ARB_create_context") || !extensions.count("GLX_ARB_get_proc_address"))
+ throw unsupported_gl_mode(opts);
+
+ unsigned gl_version_major = opts.gl_version_major;
+ unsigned gl_version_minor = opts.gl_version_minor;
+ if(opts.gl_version_major==GLOptions::LATEST_VERSION)
+ {
+ ContextHandle probe_context = glXCreateNewContext(dpy, fb_configs[0], GLX_RGBA_TYPE, 0, true);
+ glXMakeContextCurrent(dpy, priv->glxwnd, priv->glxwnd, probe_context);
+
+ const char *gl_ver_ptr = reinterpret_cast<const char *>(glGetString(GL_VERSION));
+ if(!gl_ver_ptr)
+ throw unsupported_gl_mode(opts);
+
+ string gl_ver = gl_ver_ptr;
+ vector<string> parts = split(gl_ver.substr(0, gl_ver.find(' ')), '.');
+
+ gl_version_major = lexical_cast<unsigned>(parts[0]);
+ gl_version_minor = lexical_cast<unsigned>(parts[1]);
+
+ glXMakeContextCurrent(dpy, 0, 0, 0);
+ glXDestroyContext(dpy, probe_context);
+ }