<br><div class="gmail_quote">2012/11/26 Ian Romanick <span dir="ltr"><<a href="mailto:idr@freedesktop.org" target="_blank">idr@freedesktop.org</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On 11/22/2012 07:08 AM, Tomasz Lis wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
From: Tomasz Lis <<a href="mailto:tomasz.lis@intel.com" target="_blank">tomasz.lis@intel.com</a>><br>
<br>
Changes to correctly initialize the sRGB capability attribute and transfer it between XServer and the client.<br>
Modifications include extension string, transferring visual config attribs and fbconfig attribs.<br>
Also, attribute is initialized in the modules which do not really use it (xquartz and xwin).<br>
</blockquote>
<br></div>
Please word-wrap commit messages to 72 characters.<div></div></blockquote><div> </div><div>Tomasz: <br>Ok. will do that.<br></div><div> </div>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Signed-off-by: Tomasz Lis <<a href="mailto:tomasz.lis@intel.com" target="_blank">tomasz.lis@intel.com</a>><br>
---<br>
  glx/extension_string.c        |    1 +<br>
  glx/extension_string.h        |    1 +<br>
  glx/glxcmds.c                 |    7 +++++--<br>
  glx/glxdri2.c                 |    7 +++++++<br>
  glx/glxdricommon.c            |    4 +++-<br>
  glx/glxscreens.c              |    2 ++<br>
  glx/glxscreens.h              |    3 +++<br>
  hw/xquartz/GL/visualConfigs.c |    3 +++<br>
  hw/xwin/glx/indirect.c        |    2 ++<br>
  9 files changed, 27 insertions(+), 3 deletions(-)<br>
<br>
diff --git a/glx/extension_string.c b/glx/extension_string.c<br>
index 544ca1f..47a9746 100644<br>
--- a/glx/extension_string.c<br>
+++ b/glx/extension_string.c<br>
@@ -74,6 +74,7 @@ static const struct extension_info known_glx_extensions[] = {<br>
      { GLX(ARB_multisample),             VER(1,4), Y, },<br>
<br>
      { GLX(EXT_create_context_es2_<u></u>profile), VER(0,0), N, },<br>
+    { GLX(EXT_framebuffer_sRGB),        VER(1,1), N, },<br>
</blockquote>
<br></div>
Also advertise the ARB string.<div><div class="h5"><br></div></div></blockquote><div>Tomasz:<br>Agreed. Will change. <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div class="h5">
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
      { GLX(EXT_import_context),          VER(0,0), Y, },<br>
      { GLX(EXT_texture_from_pixmap),     VER(0,0), Y, },<br>
      { GLX(EXT_visual_info),             VER(0,0), Y, },<br>
diff --git a/glx/extension_string.h b/glx/extension_string.h<br>
index 7a4a8b1..a91385f 100644<br>
--- a/glx/extension_string.h<br>
+++ b/glx/extension_string.h<br>
@@ -41,6 +41,7 @@ enum {<br>
      ARB_create_context_robustness_<u></u>bit,<br>
      ARB_multisample_bit,<br>
      EXT_create_context_es2_<u></u>profile_bit,<br>
+    EXT_framebuffer_sRGB_bit,<br>
      EXT_import_context_bit,<br>
      EXT_texture_from_pixmap_bit,<br>
      EXT_visual_info_bit,<br>
diff --git a/glx/glxcmds.c b/glx/glxcmds.c<br>
index c1f4e22..720a1a8 100644<br>
--- a/glx/glxcmds.c<br>
+++ b/glx/glxcmds.c<br>
@@ -913,7 +913,7 @@ __glXDisp_CopyContext(__<u></u>GLXclientState * cl, GLbyte * pc)<br>
<br>
  enum {<br>
      GLX_VIS_CONFIG_UNPAIRED = 18,<br>
-    GLX_VIS_CONFIG_PAIRED = 20<br>
+    GLX_VIS_CONFIG_PAIRED = 22<br>
  };<br>
<br>
  enum {<br>
@@ -1005,6 +1005,8 @@ __glXDisp_GetVisualConfigs(__<u></u>GLXclientState * cl, GLbyte * pc)<br>
          buf[p++] = modes->samples;<br>
          buf[p++] = GLX_SAMPLE_BUFFERS_SGIS;<br>
          buf[p++] = modes->sampleBuffers;<br>
+        buf[p++] = GLX_FRAMEBUFFER_SRGB_CAPABLE_<u></u>EXT;<br>
+        buf[p++] = modes->sRGBCapable;<br>
          buf[p++] = 0;           /* copy over visualSelectGroup (GLX_VISUAL_SELECT_GROUP_SGIX)<u></u>? */<br>
          buf[p++] = 0;<br>
<br>
@@ -1017,7 +1019,7 @@ __glXDisp_GetVisualConfigs(__<u></u>GLXclientState * cl, GLbyte * pc)<br>
      return Success;<br>
  }<br>
<br>
-#define __GLX_TOTAL_FBCONFIG_ATTRIBS (36)<br>
+#define __GLX_TOTAL_FBCONFIG_ATTRIBS (37)<br>
  #define __GLX_FBCONFIG_ATTRIBS_LENGTH (__GLX_TOTAL_FBCONFIG_ATTRIBS * 2)<br>
  /**<br>
   * Send the set of GLXFBConfigs to the client.  There is not currently<br>
@@ -1109,6 +1111,7 @@ DoGetFBConfigs(__<u></u>GLXclientState * cl, unsigned screen)<br>
          WRITE_PAIR(GLX_BIND_TO_MIPMAP_<u></u>TEXTURE_EXT, modes->bindToMipmapTexture);<br>
          WRITE_PAIR(GLX_BIND_TO_<u></u>TEXTURE_TARGETS_EXT,<br>
                     modes->bindToTextureTargets);<br>
+        WRITE_PAIR(GLX_FRAMEBUFFER_<u></u>SRGB_CAPABLE_EXT, modes->sRGBCapable);<br>
</blockquote>
<br></div></div>
I believe that sRGB visuals and fbconfigs should only be sent to the client if the client has said that it supports one of the sRGB extensions.  Otherwise the client doesn't know what GLX_FRAMEBUFFER_SRGB_CAPABLE_<u></u>ARB means.  It will either drop the visuals or treat the sRGB and non-sRGB visuals the same.<br>

<br></blockquote><div>Tomasz:<br>The most popular client - MESA - ignores unknown attributes (in __glXInitializeVisualConfigFromTags). This well suits the nature of this specific attribute - GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB/EXT informs of a capability, and it's up to client to either use this capability, or ignore it completely.<br>
This capability can be safely ignored by the client who does not care about it. To use this capability, GLX client would have to call glEnable().<br><br>XServer interface documentation should contain information regarding how clients ought to react to unknown attributes. Also, fbconfigs and specific attributes shouldn't be filtered by the server - it is up to client to filter them. But this issue does not concern the sRGB capability, and should be discussed separately.<br>
Please let me know how you'd like this patch to be changed.<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Also, please use the _ARB enums instead.<div><div class="h5"><br></div></div></blockquote><div>Tomasz:<br>Please note that GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB is not defined in glxtokens.h, only in glxext.h which requires glx.h - which is quite hard to include due to name conflicts with xserver.<br>
Also, ARB and EXT defines are identical and will always be identical. I can't see any superiority of ARB define over EXT. Most of the other defines used in that file are not ARBs - but EXTs.<br>Do you really think it is necessary to do such change? If you do, we need to discuss the correct way to #include a header with the definition of ARB.<br>
Maybe we should define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB in another xserver header, or patch MESA before making such change to XServer?<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div class="h5">
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
          if (client->swapped) {<br>
              __GLX_SWAP_INT_ARRAY(buf, __GLX_FBCONFIG_ATTRIBS_LENGTH)<u></u>;<br>
diff --git a/glx/glxdri2.c b/glx/glxdri2.c<br>
index bce1bfa..ef7afb4 100644<br>
--- a/glx/glxdri2.c<br>
+++ b/glx/glxdri2.c<br>
@@ -882,6 +882,13 @@ initializeExtensions(__<u></u>GLXDRIscreen * screen)<br>
                     "AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control\n");<br>
      }<br>
<br>
+    /* enable EXT_framebuffer_sRGB extension (even if there are no sRGB capable fbconfigs) */<br>
+    {<br>
+        __glXEnableExtension(screen-><u></u>glx_enable_bits,<br>
+                 "GLX_EXT_framebuffer_sRGB");<br>
+        LogMessage(X_INFO, "AIGLX: enabled GLX_EXT_framebuffer_sRGB\n");<br>
+    }<br>
+<br>
      for (i = 0; extensions[i]; i++) {<br>
  #ifdef __DRI_READ_DRAWABLE<br>
          if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {<br>
diff --git a/glx/glxdricommon.c b/glx/glxdricommon.c<br>
index c90f380..b027f24 100644<br>
--- a/glx/glxdricommon.c<br>
+++ b/glx/glxdricommon.c<br>
@@ -105,7 +105,9 @@ __ATTRIB(__DRI_ATTRIB_BUFFER_<u></u>SIZE, rgbBits),<br>
          __ATTRIB(__DRI_ATTRIB_BIND_TO_<u></u>TEXTURE_RGB, bindToTextureRgb),<br>
          __ATTRIB(__DRI_ATTRIB_BIND_TO_<u></u>TEXTURE_RGBA, bindToTextureRgba),<br>
          __ATTRIB(__DRI_ATTRIB_BIND_TO_<u></u>MIPMAP_TEXTURE, bindToMipmapTexture),<br>
-        __ATTRIB(__DRI_ATTRIB_<u></u>YINVERTED, yInverted),};<br>
+        __ATTRIB(__DRI_ATTRIB_<u></u>YINVERTED, yInverted),<br>
+        __ATTRIB(__DRI_ATTRIB_<u></u>FRAMEBUFFER_SRGB_CAPABLE, sRGBCapable),<br>
+        };<br>
<br>
  static void<br>
  setScalar(__GLXconfig * config, unsigned int attrib, unsigned int value)<br>
diff --git a/glx/glxscreens.c b/glx/glxscreens.c<br>
index 61d590c..e87256d 100644<br>
--- a/glx/glxscreens.c<br>
+++ b/glx/glxscreens.c<br>
@@ -164,7 +164,9 @@ static char GLXServerVendorName[] = "SGI";<br>
  unsigned glxMajorVersion = SERVER_GLX_MAJOR_VERSION;<br>
  unsigned glxMinorVersion = SERVER_GLX_MINOR_VERSION;<br>
  static char GLXServerExtensions[] =<br>
+    "GLX_ARB_framebuffer_sRGB "<br>
      "GLX_ARB_multisample "<br>
+    "GLX_EXT_framebuffer_sRGB "<br>
      "GLX_EXT_visual_info "<br>
      "GLX_EXT_visual_rating "<br>
      "GLX_EXT_import_context "<br>
diff --git a/glx/glxscreens.h b/glx/glxscreens.h<br>
index b29df58..0a7b604 100644<br>
--- a/glx/glxscreens.h<br>
+++ b/glx/glxscreens.h<br>
@@ -102,6 +102,9 @@ struct __GLXconfig {<br>
      GLint bindToMipmapTexture;<br>
      GLint bindToTextureTargets;<br>
      GLint yInverted;<br>
+<br>
+    /* ARB_framebuffer_sRGB */<br>
+    GLint sRGBCapable;<br>
  };<br>
<br>
  GLint glxConvertToXVisualType(int visualType);<br>
diff --git a/hw/xquartz/GL/visualConfigs.<u></u>c b/hw/xquartz/GL/visualConfigs.<u></u>c<br>
index e37eefb..18518af 100644<br>
--- a/hw/xquartz/GL/visualConfigs.<u></u>c<br>
+++ b/hw/xquartz/GL/visualConfigs.<u></u>c<br>
@@ -326,6 +326,9 @@ __glXAquaCreateVisualConfigs(<u></u>int *numConfigsPtr, int screenNumber)<br>
                                          c->bindToTextureTargets = 0;<br>
                                          c->yInverted = 0;<br>
<br>
+                                        /* EXT_framebuffer_sRGB */<br>
+                                        c->sRGBCapable = GL_DONT_CARE;<br>
</blockquote>
<br></div></div>
This is wrong.  sRGBCapable should be either True or False. GL_DONT_CARE (~0) is not a valid value.<div class="HOEnZb"><div class="h5"><br></div></div></blockquote><div class="h5">I can do that change, the xquartz and xwin are not really my area of expertise.<br>
Still, please consider the following scenario:<br>The client asks xserver for configs, then compares them with its own configs. Only configs which match on client and server are accepted.<br>Attribute comparison function checks if the attributes are exact match, or if one of them is GLX_DONT_CARE.<br>
This means that if we'll advertise sRGBCapable = false, then all sRGB-capable configs will be dropped.<br>But if we'll advertise sRGBCapable = GLX_DONT_CARE, then both sRGB capable and non-capable configs will be accepted.<br>
As we don't really support sRGB in the xquartz and xwin, this may be desired effect.<br><br>Now, MESA works in the exact way described above - it compares the two sets of attributes and select matches using such comparison.<br>
I'm not sure if the situation I described is related to xquartz and xwin, so please confirm if the attributes should be set to GL_FALSE.<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
                                          c = c->next;<br>
                                      }<br>
                                  }<br>
diff --git a/hw/xwin/glx/indirect.c b/hw/xwin/glx/indirect.c<br>
index c0069a2..5b339af 100644<br>
--- a/hw/xwin/glx/indirect.c<br>
+++ b/hw/xwin/glx/indirect.c<br>
@@ -2017,6 +2017,7 @@ glxWinCreateConfigs(HDC hdc, glxWinScreen * screen)<br>
          c->base.bindToMipmapTexture = -1;<br>
          c->base.bindToTextureTargets = -1;<br>
          c->base.yInverted = -1;<br>
+        c->base.sRGBCapable = -1;<br>
<br>
          n++;<br>
<br>
@@ -2411,6 +2412,7 @@ glxWinCreateConfigsExt(HDC hdc, glxWinScreen * screen)<br>
              GLX_TEXTURE_1D_BIT_EXT | GLX_TEXTURE_2D_BIT_EXT |<br>
              GLX_TEXTURE_RECTANGLE_BIT_EXT;<br>
          c->base.yInverted = -1;<br>
+        c->base.sRGBCapable = -1;<br>
<br>
          n++;<br>
<br>
<br>
</blockquote>
<br>
</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"></div></blockquote></div><br>