GLDisplayOptions::GLDisplayOptions():
alpha(false),
+ stencil(false),
doublebuffer(true),
multisample(0)
{ }
GLWindow::~GLWindow()
{
- glXMakeCurrent(display, 0, 0);
+ glXMakeContextCurrent(display, 0, 0, 0);
+ glXDestroyWindow(display, glx_wnd);
glXDestroyContext(display, context);
}
void GLWindow::swap_buffers()
{
- glXSwapBuffers(display, window);
+ glXSwapBuffers(display, glx_wnd);
}
void GLWindow::init()
prepare();
vector<int> attribs;
- attribs.push_back(GLX_RGBA);
- attribs.push_back(GLX_BUFFER_SIZE);
- attribs.push_back(24);
+
+ attribs.push_back(GLX_RENDER_TYPE);
+ attribs.push_back(GLX_RGBA_BIT);
+
+ attribs.push_back(GLX_DRAWABLE_TYPE);
+ attribs.push_back(GLX_WINDOW_BIT);
+
+ attribs.push_back(GLX_DEPTH_SIZE);
+ attribs.push_back(1);
+
if(gl_options.alpha)
{
attribs.push_back(GLX_ALPHA_SIZE);
attribs.push_back(1);
}
+
+ if(gl_options.stencil)
+ {
+ attribs.push_back(GLX_STENCIL_SIZE);
+ attribs.push_back(1);
+ }
+
if(gl_options.doublebuffer)
+ {
attribs.push_back(GLX_DOUBLEBUFFER);
+ attribs.push_back(true);
+ }
+
if(gl_options.multisample>0)
{
attribs.push_back(GLX_SAMPLE_BUFFERS_ARB);
attribs.push_back(gl_options.multisample);
}
- attribs.push_back(0);
+
+ attribs.push_back(None);
- XVisualInfo *visual=glXChooseVisual(display, DefaultScreen(display), &attribs.front());
- if(!visual)
- throw Exception("Couldn't get a matching GLX visual");
+ int count;
+ GLXFBConfig *config=glXChooseFBConfig(display, DefaultScreen(display), &attribs.front(), &count);
+ if(!config)
+ throw Exception("Couldn't get a GLX framebuffer configuration");
- context=glXCreateContext(display, visual, 0, true);
+ context=glXCreateNewContext(display, config[0], GLX_RGBA_TYPE, 0, true);
if(!context)
throw Exception("Couldn't create a GLX context");
- create();
+ XVisualInfo *vi=glXGetVisualFromFBConfig(display, config[0]);
+ Handle root=RootWindow(display, vi->screen);
+
+ Colormap cmap=XCreateColormap(display, root, vi->visual, AllocNone);
+ XSetWindowAttributes attr;
+ attr.colormap=cmap;
+
+ Handle wnd=XCreateWindow(display, root, 0, 0, options.width, options.height, 0, vi->depth, InputOutput, vi->visual, CWColormap, &attr);
+ set_window(wnd);
+
+ glx_wnd=glXCreateWindow(display, config[0], wnd, 0);
+
+ glXMakeContextCurrent(display, glx_wnd, glx_wnd, context);
- glXMakeCurrent(display, window, context);
+ XFree(config);
}
-void GLWindow::on_resize()
+void GLWindow::on_event(const XEvent &event)
{
- glViewport(0, 0, options.width, options.height);
+ if(event.type==ConfigureNotify)
+ glViewport(0, 0, options.width, options.height);
}
} // namespace Msp