diff options
author | Brian Paul <[email protected]> | 2014-01-07 09:05:27 -0700 |
---|---|---|
committer | Brian Paul <[email protected]> | 2014-01-09 11:35:50 -0700 |
commit | d046fd731ab192dceee0916323dd718b78df5976 (patch) | |
tree | 01c0c328f46f0d0e6770b5351fbba7194fc52be5 /src | |
parent | 0fc8d7c66e08c295b701586afdc1f6d86eb8a514 (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 <[email protected]>
Reviewed-by: Matt Turner <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/main/get.c | 37 |
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; |