xwayland/glx: Enable sRGB fbconfigs
We turn this on if the GL underneath us can enable GL_FRAMEBUFFER_SRGB. We do try to generate both capable and incapable configs, which is to keep llvmpipe working until the client side gets smarter about its srgb capabilities.
This commit is contained in:
parent
735dbde482
commit
6c1e6429bc
|
@ -138,7 +138,6 @@ egl_create_glx_drawable(ClientPtr client, __GLXscreen *screen,
|
|||
/*
|
||||
* TODO:
|
||||
*
|
||||
* - figure out sRGB
|
||||
* - bindToTextureTargets is suspicious
|
||||
* - better channel mask setup
|
||||
* - drawable type masks is suspicious
|
||||
|
@ -146,7 +145,8 @@ egl_create_glx_drawable(ClientPtr client, __GLXscreen *screen,
|
|||
static struct egl_config *
|
||||
translate_eglconfig(struct egl_screen *screen, EGLConfig hc,
|
||||
struct egl_config *chain, Bool direct_color,
|
||||
Bool double_buffer, Bool duplicate_for_composite)
|
||||
Bool double_buffer, Bool duplicate_for_composite,
|
||||
Bool srgb_only)
|
||||
{
|
||||
EGLint value;
|
||||
struct egl_config *c = calloc(1, sizeof *c);
|
||||
|
@ -167,7 +167,6 @@ translate_eglconfig(struct egl_screen *screen, EGLConfig hc,
|
|||
c->base.optimalPbufferHeight = 0;
|
||||
c->base.bindToMipmapTexture = 0;
|
||||
c->base.bindToTextureTargets = GLX_DONT_CARE;
|
||||
c->base.sRGBCapable = 0;
|
||||
c->base.swapMethod = GLX_SWAP_UNDEFINED_OML;
|
||||
|
||||
/* this is... suspect */
|
||||
|
@ -242,6 +241,19 @@ translate_eglconfig(struct egl_screen *screen, EGLConfig hc,
|
|||
/* else panic */
|
||||
}
|
||||
|
||||
/* derived state: sRGB. EGL doesn't put this in the fbconfig at all,
|
||||
* it's a property of the surface specified at creation time, so we have
|
||||
* to infer it from the GL's extensions. only makes sense at 8bpc though.
|
||||
*/
|
||||
if (srgb_only) {
|
||||
if (c->base.redBits == 8) {
|
||||
c->base.sRGBCapable = GL_TRUE;
|
||||
} else {
|
||||
free(c);
|
||||
return chain;
|
||||
}
|
||||
}
|
||||
|
||||
/* map to the backend's config */
|
||||
c->config = hc;
|
||||
|
||||
|
@ -314,6 +326,9 @@ egl_mirror_configs(ScreenPtr pScreen, struct egl_screen *screen)
|
|||
int i, j, k, nconfigs;
|
||||
struct egl_config *c = NULL;
|
||||
EGLConfig *host_configs = NULL;
|
||||
bool can_srgb = epoxy_has_gl_extension("GL_ARB_framebuffer_sRGB") ||
|
||||
epoxy_has_gl_extension("GL_EXT_framebuffer_sRGB") ||
|
||||
epoxy_has_gl_extension("GL_EXT_sRGB_write_control");
|
||||
|
||||
eglGetConfigs(screen->display, NULL, 0, &nconfigs);
|
||||
if (!(host_configs = calloc(nconfigs, sizeof *host_configs)))
|
||||
|
@ -326,11 +341,19 @@ egl_mirror_configs(ScreenPtr pScreen, struct egl_screen *screen)
|
|||
*/
|
||||
for (i = nconfigs - 1; i > 0; i--)
|
||||
for (j = 0; j < 3; j++) /* direct_color */
|
||||
for (k = 0; k < 2; k++) /* double_buffer */
|
||||
for (k = 0; k < 2; k++) /* double_buffer */ {
|
||||
c = translate_eglconfig(screen, host_configs[i], c,
|
||||
/* direct_color */ j == 1,
|
||||
/* double_buffer */ k > 0,
|
||||
/* duplicate_for_composite */ j == 0);
|
||||
/* duplicate_for_composite */ j == 0,
|
||||
/* srgb_only */ false);
|
||||
if (can_srgb)
|
||||
c = translate_eglconfig(screen, host_configs[i], c,
|
||||
/* direct_color */ j == 1,
|
||||
/* double_buffer */ k > 0,
|
||||
/* duplicate_for_composite */ j == 0,
|
||||
/* srgb_only */ true);
|
||||
}
|
||||
|
||||
screen->configs = host_configs;
|
||||
return c ? &c->base : NULL;
|
||||
|
|
Loading…
Reference in New Issue