From ed6c852102d2318f44257221d0d82b518989174e Mon Sep 17 00:00:00 2001 From: Roz K Date: Thu, 29 Dec 2022 16:24:37 +0100 Subject: [PATCH] Rework GL framebuffer config selection. --- cpp/display/display_glx.cpp | 56 ++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/cpp/display/display_glx.cpp b/cpp/display/display_glx.cpp index 2a79cc9..eb7112f 100644 --- a/cpp/display/display_glx.cpp +++ b/cpp/display/display_glx.cpp @@ -28,6 +28,7 @@ static bool rk_error_occured = false; typedef GLXContext (*rk_CreateContextAttribsFunc)(Display *, GLXFBConfig, GLXContext, Bool, int const *); static int const rk_visual_attribs[] = { + GLX_CONFIG_CAVEAT, GLX_NONE, GLX_X_RENDERABLE, True, GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, GLX_RENDER_TYPE, GLX_RGBA_BIT, @@ -140,42 +141,33 @@ rk_display_t rk_create_display( return nullptr; } - int fbcount; - GLXFBConfig * const fbc = glXChooseFBConfig( - display->display, DefaultScreen(display->display), rk_visual_attribs, &fbcount); - if (!fbc) { + int fb_count = 0; + GLXFBConfig * const fb_configs = glXChooseFBConfig( + display->display, DefaultScreen(display->display), rk_visual_attribs, &fb_count); + printf("[GLX] Found %d framebuffer configs.\n", fb_count); + if (!fb_configs || !fb_count) { rk_glx_printf("Failed to retrieve framebuffer configs."); rk_destroy_display(reinterpret_cast(display)); return nullptr; } - printf("[GLX] Found %d framebuffer configs.\n", fbcount); + GLXFBConfig const fb_config = fb_configs[0]; + XFree(fb_configs); + int red_size = 0; + glXGetFBConfigAttrib(display->display, fb_config, GLX_RED_SIZE, &red_size); + int green_size = 0; + glXGetFBConfigAttrib(display->display, fb_config, GLX_GREEN_SIZE, &green_size); + int blue_size = 0; + glXGetFBConfigAttrib(display->display, fb_config, GLX_BLUE_SIZE, &blue_size); + int alpha_size = 0; + glXGetFBConfigAttrib(display->display, fb_config, GLX_ALPHA_SIZE, &alpha_size); + int depth_size = 0; + glXGetFBConfigAttrib(display->display, fb_config, GLX_DEPTH_SIZE, &depth_size); + int stencil_size = 0; + glXGetFBConfigAttrib(display->display, fb_config, GLX_STENCIL_SIZE, &stencil_size); + printf("[GLX] Select framebuffer config R%dG%dB%dA%d D%dS%d.\n", + red_size, green_size, blue_size, alpha_size, depth_size, stencil_size); - int best_fbc = -1; - int best_num_samp = -1; - for (int i = 0; i < fbcount; ++i) { - XVisualInfo * const vi = glXGetVisualFromFBConfig(display->display, fbc[i]); - if (vi) { - int samp_buf, samples; - glXGetFBConfigAttrib(display->display, fbc[i], GLX_SAMPLE_BUFFERS, &samp_buf); - glXGetFBConfigAttrib(display->display, fbc[i], GLX_SAMPLES, &samples); - if (best_fbc < 0 || (samp_buf && samples > best_num_samp)) { - best_fbc = i; - best_num_samp = samples; - } - XFree(vi); - } - } - if (best_fbc == -1) { - XFree(fbc); - rk_glx_printf("Failed to find a suitable framebuffer config."); - rk_destroy_display(reinterpret_cast(display)); - return nullptr; - } - GLXFBConfig const bestFbc = fbc[best_fbc]; - XFree(fbc); - printf("[GLX] Select framebuffer config with %d samples.\n", best_num_samp); - - XVisualInfo * const vi = glXGetVisualFromFBConfig(display->display, bestFbc); + XVisualInfo * const vi = glXGetVisualFromFBConfig(display->display, fb_config); display->colormap = XCreateColormap( display->display, RootWindow(display->display, vi->screen), vi->visual, AllocNone); XSetWindowAttributes swa; @@ -194,7 +186,7 @@ rk_display_t rk_create_display( rk_error_occured = false; int (*oldHandler)(Display *, XErrorEvent *) = XSetErrorHandler(&rk_error_handler); - display->context = glXCreateContextAttribs(display->display, bestFbc, 0, True, rk_context_attribs); + display->context = glXCreateContextAttribs(display->display, fb_config, 0, True, rk_context_attribs); XSync(display->display, False); XSetErrorHandler(oldHandler); if (rk_error_occured || !display->context) {