Rework GL framebuffer config selection.
This commit is contained in:
parent
919ba9291f
commit
ed6c852102
@ -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<rk_display_t>(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<rk_display_t>(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) {
|
||||
|
Loading…
Reference in New Issue
Block a user