Mesa (master): mesa: check bits per channel for GL_RGBA_SIGNED_COMPONENTS_EXT query

Brian Paul brianp at kemper.freedesktop.org
Thu Jan 9 18:37:00 UTC 2014


Module: Mesa
Branch: master
Commit: d046fd731ab192dceee0916323dd718b78df5976
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=d046fd731ab192dceee0916323dd718b78df5976

Author: Brian Paul <brianp at vmware.com>
Date:   Tue Jan  7 09:05:27 2014 -0700

mesa: check bits per channel for GL_RGBA_SIGNED_COMPONENTS_EXT query

If a channel has zero bits it's not signed.

v2: also check for luminance and intensity format bits.  Bruce
Merry's proposed piglit test hits the luminance case.

Bugzilla: http://bugs.freedesktop.org/show_bug.cgi?id=73096
Cc: 10.0 <mesa-stable at lists.freedesktop.org>
Reviewed-by: Matt Turner <mattst88 at gmail.com>

---

 src/mesa/main/get.c |   37 ++++++++++++++++++++++++++++++-------
 1 file changed, 30 insertions(+), 7 deletions(-)

diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
index 6342fbe..6e55e99 100644
--- a/src/mesa/main/get.c
+++ b/src/mesa/main/get.c
@@ -769,13 +769,36 @@ find_custom_value(struct gl_context *ctx, const struct value_desc *d, union valu
          /* Note: we only check the 0th color attachment. */
          const struct gl_renderbuffer *rb =
             ctx->DrawBuffer->_ColorDrawBuffers[0];
-         const GLboolean is_signed =
-            rb ? _mesa_is_format_signed(rb->Format) : GL_FALSE;
-         /* At this time, all color channels have same signedness */
-         v->value_int_4[0] =
-         v->value_int_4[1] =
-         v->value_int_4[2] =
-         v->value_int_4[3] = is_signed;
+         if (rb && _mesa_is_format_signed(rb->Format)) {
+            /* Issue 17 of GL_EXT_packed_float:  If a component (such as
+             * alpha) has zero bits, the component should not be considered
+             * signed and so the bit for the respective component should be
+             * zeroed.
+             */
+            GLint r_bits =
+               _mesa_get_format_bits(rb->Format, GL_RED_BITS);
+            GLint g_bits =
+               _mesa_get_format_bits(rb->Format, GL_GREEN_BITS);
+            GLint b_bits =
+               _mesa_get_format_bits(rb->Format, GL_BLUE_BITS);
+            GLint a_bits =
+               _mesa_get_format_bits(rb->Format, GL_ALPHA_BITS);
+            GLint l_bits =
+               _mesa_get_format_bits(rb->Format, GL_TEXTURE_LUMINANCE_SIZE);
+            GLint i_bits =
+               _mesa_get_format_bits(rb->Format, GL_TEXTURE_INTENSITY_SIZE);
+
+            v->value_int_4[0] = r_bits + l_bits + i_bits > 0;
+            v->value_int_4[1] = g_bits + l_bits + i_bits > 0;
+            v->value_int_4[2] = b_bits + l_bits + i_bits > 0;
+            v->value_int_4[3] = a_bits + i_bits > 0;
+         }
+         else {
+            v->value_int_4[0] =
+            v->value_int_4[1] =
+            v->value_int_4[2] =
+            v->value_int_4[3] = 0;
+         }
       }
       break;
 




More information about the mesa-commit mailing list