If a channel has zero bits it's not signed. --- src/mesa/main/get.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-)
diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c index c45a8d1..bb138c8 100644 --- a/src/mesa/main/get.c +++ b/src/mesa/main/get.c @@ -769,13 +769,27 @@ 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. + */ + v->value_int_4[0] = + _mesa_get_format_bits(rb->Format, GL_RED_BITS) > 0; + v->value_int_4[1] = + _mesa_get_format_bits(rb->Format, GL_GREEN_BITS) > 0; + v->value_int_4[2] = + _mesa_get_format_bits(rb->Format, GL_BLUE_BITS) > 0; + v->value_int_4[3] = + _mesa_get_format_bits(rb->Format, GL_ALPHA_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; -- 1.7.10.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev