Full support of sRGB capable fbconfigs.
Changes to correctly initialize the sRGB capability attribute and transfer it between XServer and the client. Modifications include extension string, transferring visual config attribs and fbconfig attribs. Also, attribute is initialized in the modules which do not really use it (xquartz and xwin). This version advertises both ARB and EXT strings, and initializes the capability to default value of FALSE. It has corrected required GLX version and does not influence swrast. The sRGB capable attribute is attached only to those configs which do have this capability. Both ARB and EXT versions share the same GLX extension enabling bit. Signed-off-by: Tomasz Lis <tomasz.lis@intel.com> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
parent
679ccecd8b
commit
cf89aa5374
|
@ -71,9 +71,11 @@ static const struct extension_info known_glx_extensions[] = {
|
||||||
{ GLX(ARB_create_context), VER(0,0), N, },
|
{ GLX(ARB_create_context), VER(0,0), N, },
|
||||||
{ GLX(ARB_create_context_profile), VER(0,0), N, },
|
{ GLX(ARB_create_context_profile), VER(0,0), N, },
|
||||||
{ GLX(ARB_create_context_robustness), VER(0,0), N, },
|
{ GLX(ARB_create_context_robustness), VER(0,0), N, },
|
||||||
|
{ GLX(ARB_framebuffer_sRGB), VER(0,0), N, },
|
||||||
{ GLX(ARB_multisample), VER(1,4), Y, },
|
{ GLX(ARB_multisample), VER(1,4), Y, },
|
||||||
|
|
||||||
{ GLX(EXT_create_context_es2_profile), VER(0,0), N, },
|
{ GLX(EXT_create_context_es2_profile), VER(0,0), N, },
|
||||||
|
{ GLX(EXT_framebuffer_sRGB), VER(0,0), N, },
|
||||||
{ GLX(EXT_import_context), VER(0,0), Y, },
|
{ GLX(EXT_import_context), VER(0,0), Y, },
|
||||||
{ GLX(EXT_texture_from_pixmap), VER(0,0), Y, },
|
{ GLX(EXT_texture_from_pixmap), VER(0,0), Y, },
|
||||||
{ GLX(EXT_visual_info), VER(0,0), Y, },
|
{ GLX(EXT_visual_info), VER(0,0), Y, },
|
||||||
|
|
|
@ -39,6 +39,7 @@ enum {
|
||||||
ARB_create_context_bit = 0,
|
ARB_create_context_bit = 0,
|
||||||
ARB_create_context_profile_bit,
|
ARB_create_context_profile_bit,
|
||||||
ARB_create_context_robustness_bit,
|
ARB_create_context_robustness_bit,
|
||||||
|
ARB_framebuffer_sRGB_bit,
|
||||||
ARB_multisample_bit,
|
ARB_multisample_bit,
|
||||||
EXT_create_context_es2_profile_bit,
|
EXT_create_context_es2_profile_bit,
|
||||||
EXT_import_context_bit,
|
EXT_import_context_bit,
|
||||||
|
@ -58,6 +59,10 @@ enum {
|
||||||
__NUM_GLX_EXTS,
|
__NUM_GLX_EXTS,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* For extensions which have identical ARB and EXT implementation
|
||||||
|
* in GLX area, use one enabling bit for both. */
|
||||||
|
#define EXT_framebuffer_sRGB_bit ARB_framebuffer_sRGB_bit
|
||||||
|
|
||||||
#define __GLX_EXT_BYTES ((__NUM_GLX_EXTS + 7) / 8)
|
#define __GLX_EXT_BYTES ((__NUM_GLX_EXTS + 7) / 8)
|
||||||
|
|
||||||
extern int __glXGetExtensionString(const unsigned char *enable_bits,
|
extern int __glXGetExtensionString(const unsigned char *enable_bits,
|
||||||
|
|
|
@ -913,7 +913,7 @@ __glXDisp_CopyContext(__GLXclientState * cl, GLbyte * pc)
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
GLX_VIS_CONFIG_UNPAIRED = 18,
|
GLX_VIS_CONFIG_UNPAIRED = 18,
|
||||||
GLX_VIS_CONFIG_PAIRED = 20
|
GLX_VIS_CONFIG_PAIRED = 22
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -1005,8 +1005,17 @@ __glXDisp_GetVisualConfigs(__GLXclientState * cl, GLbyte * pc)
|
||||||
buf[p++] = modes->samples;
|
buf[p++] = modes->samples;
|
||||||
buf[p++] = GLX_SAMPLE_BUFFERS_SGIS;
|
buf[p++] = GLX_SAMPLE_BUFFERS_SGIS;
|
||||||
buf[p++] = modes->sampleBuffers;
|
buf[p++] = modes->sampleBuffers;
|
||||||
buf[p++] = 0; /* copy over visualSelectGroup (GLX_VISUAL_SELECT_GROUP_SGIX)? */
|
/* Add attribute only if its value is not default. */
|
||||||
|
if (modes->sRGBCapable != GL_FALSE) {
|
||||||
|
buf[p++] = GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT;
|
||||||
|
buf[p++] = modes->sRGBCapable;
|
||||||
|
}
|
||||||
|
/* Don't add visualSelectGroup (GLX_VISUAL_SELECT_GROUP_SGIX)?
|
||||||
|
* Pad the remaining place with zeroes, so that attributes count is constant. */
|
||||||
|
while (p < GLX_VIS_CONFIG_TOTAL) {
|
||||||
buf[p++] = 0;
|
buf[p++] = 0;
|
||||||
|
buf[p++] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
assert(p == GLX_VIS_CONFIG_TOTAL);
|
assert(p == GLX_VIS_CONFIG_TOTAL);
|
||||||
if (client->swapped) {
|
if (client->swapped) {
|
||||||
|
@ -1017,7 +1026,7 @@ __glXDisp_GetVisualConfigs(__GLXclientState * cl, GLbyte * pc)
|
||||||
return Success;
|
return Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __GLX_TOTAL_FBCONFIG_ATTRIBS (36)
|
#define __GLX_TOTAL_FBCONFIG_ATTRIBS (37)
|
||||||
#define __GLX_FBCONFIG_ATTRIBS_LENGTH (__GLX_TOTAL_FBCONFIG_ATTRIBS * 2)
|
#define __GLX_FBCONFIG_ATTRIBS_LENGTH (__GLX_TOTAL_FBCONFIG_ATTRIBS * 2)
|
||||||
/**
|
/**
|
||||||
* Send the set of GLXFBConfigs to the client. There is not currently
|
* Send the set of GLXFBConfigs to the client. There is not currently
|
||||||
|
@ -1109,6 +1118,15 @@ DoGetFBConfigs(__GLXclientState * cl, unsigned screen)
|
||||||
WRITE_PAIR(GLX_BIND_TO_MIPMAP_TEXTURE_EXT, modes->bindToMipmapTexture);
|
WRITE_PAIR(GLX_BIND_TO_MIPMAP_TEXTURE_EXT, modes->bindToMipmapTexture);
|
||||||
WRITE_PAIR(GLX_BIND_TO_TEXTURE_TARGETS_EXT,
|
WRITE_PAIR(GLX_BIND_TO_TEXTURE_TARGETS_EXT,
|
||||||
modes->bindToTextureTargets);
|
modes->bindToTextureTargets);
|
||||||
|
/* Add attribute only if its value is not default. */
|
||||||
|
if (modes->sRGBCapable != GL_FALSE) {
|
||||||
|
WRITE_PAIR(GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT, modes->sRGBCapable);
|
||||||
|
}
|
||||||
|
/* Pad the remaining place with zeroes, so that attributes count is constant. */
|
||||||
|
while (p < __GLX_FBCONFIG_ATTRIBS_LENGTH) {
|
||||||
|
WRITE_PAIR(0, 0);
|
||||||
|
}
|
||||||
|
assert(p == __GLX_FBCONFIG_ATTRIBS_LENGTH);
|
||||||
|
|
||||||
if (client->swapped) {
|
if (client->swapped) {
|
||||||
__GLX_SWAP_INT_ARRAY(buf, __GLX_FBCONFIG_ATTRIBS_LENGTH);
|
__GLX_SWAP_INT_ARRAY(buf, __GLX_FBCONFIG_ATTRIBS_LENGTH);
|
||||||
|
|
|
@ -882,6 +882,13 @@ initializeExtensions(__GLXDRIscreen * screen)
|
||||||
"AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control\n");
|
"AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* enable EXT_framebuffer_sRGB extension (even if there are no sRGB capable fbconfigs) */
|
||||||
|
{
|
||||||
|
__glXEnableExtension(screen->glx_enable_bits,
|
||||||
|
"GLX_EXT_framebuffer_sRGB");
|
||||||
|
LogMessage(X_INFO, "AIGLX: enabled GLX_EXT_framebuffer_sRGB\n");
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; extensions[i]; i++) {
|
for (i = 0; extensions[i]; i++) {
|
||||||
#ifdef __DRI_READ_DRAWABLE
|
#ifdef __DRI_READ_DRAWABLE
|
||||||
if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
|
if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
|
||||||
|
|
|
@ -105,7 +105,9 @@ __ATTRIB(__DRI_ATTRIB_BUFFER_SIZE, rgbBits),
|
||||||
__ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGB, bindToTextureRgb),
|
__ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGB, bindToTextureRgb),
|
||||||
__ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGBA, bindToTextureRgba),
|
__ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGBA, bindToTextureRgba),
|
||||||
__ATTRIB(__DRI_ATTRIB_BIND_TO_MIPMAP_TEXTURE, bindToMipmapTexture),
|
__ATTRIB(__DRI_ATTRIB_BIND_TO_MIPMAP_TEXTURE, bindToMipmapTexture),
|
||||||
__ATTRIB(__DRI_ATTRIB_YINVERTED, yInverted),};
|
__ATTRIB(__DRI_ATTRIB_YINVERTED, yInverted),
|
||||||
|
__ATTRIB(__DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE, sRGBCapable),
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
setScalar(__GLXconfig * config, unsigned int attrib, unsigned int value)
|
setScalar(__GLXconfig * config, unsigned int attrib, unsigned int value)
|
||||||
|
|
|
@ -102,6 +102,9 @@ struct __GLXconfig {
|
||||||
GLint bindToMipmapTexture;
|
GLint bindToMipmapTexture;
|
||||||
GLint bindToTextureTargets;
|
GLint bindToTextureTargets;
|
||||||
GLint yInverted;
|
GLint yInverted;
|
||||||
|
|
||||||
|
/* ARB_framebuffer_sRGB */
|
||||||
|
GLint sRGBCapable;
|
||||||
};
|
};
|
||||||
|
|
||||||
GLint glxConvertToXVisualType(int visualType);
|
GLint glxConvertToXVisualType(int visualType);
|
||||||
|
|
|
@ -262,6 +262,9 @@ __GLXconfig *__glXAquaCreateVisualConfigs(int *numConfigsPtr, int screenNumber)
|
||||||
c->bindToTextureTargets = 0;
|
c->bindToTextureTargets = 0;
|
||||||
c->yInverted = 0;
|
c->yInverted = 0;
|
||||||
|
|
||||||
|
/* EXT_framebuffer_sRGB */
|
||||||
|
c->sRGBCapable = GL_FALSE;
|
||||||
|
|
||||||
c = c->next;
|
c = c->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2025,6 +2025,7 @@ glxWinCreateConfigs(HDC hdc, glxWinScreen * screen)
|
||||||
c->base.bindToMipmapTexture = -1;
|
c->base.bindToMipmapTexture = -1;
|
||||||
c->base.bindToTextureTargets = -1;
|
c->base.bindToTextureTargets = -1;
|
||||||
c->base.yInverted = -1;
|
c->base.yInverted = -1;
|
||||||
|
c->base.sRGBCapable = 0;
|
||||||
|
|
||||||
n++;
|
n++;
|
||||||
|
|
||||||
|
@ -2419,6 +2420,7 @@ glxWinCreateConfigsExt(HDC hdc, glxWinScreen * screen)
|
||||||
GLX_TEXTURE_1D_BIT_EXT | GLX_TEXTURE_2D_BIT_EXT |
|
GLX_TEXTURE_1D_BIT_EXT | GLX_TEXTURE_2D_BIT_EXT |
|
||||||
GLX_TEXTURE_RECTANGLE_BIT_EXT;
|
GLX_TEXTURE_RECTANGLE_BIT_EXT;
|
||||||
c->base.yInverted = -1;
|
c->base.yInverted = -1;
|
||||||
|
c->base.sRGBCapable = 0;
|
||||||
|
|
||||||
n++;
|
n++;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue