summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2014-01-07 09:05:27 -0700
committerBrian Paul <brianp@vmware.com>2014-01-09 11:35:50 -0700
commitd046fd731ab192dceee0916323dd718b78df5976 (patch)
tree01c0c328f46f0d0e6770b5351fbba7194fc52be5
parent0fc8d7c66e08c295b701586afdc1f6d86eb8a514 (diff)
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@lists.freedesktop.org> Reviewed-by: Matt Turner <mattst88@gmail.com>
-rw-r--r--src/mesa/main/get.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
index 6342fbefca4..6e55e995650 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;