diff options
author | José Fonseca <jfonseca@vmware.com> | 2012-12-05 23:46:59 +0000 |
---|---|---|
committer | José Fonseca <jfonseca@vmware.com> | 2012-12-06 15:59:47 +0000 |
commit | 8c7e49c402025a3db3675954377478bd832189dd (patch) | |
tree | 0cea59f9c7c49add6b1e4a034863b2929058a7a1 /tests/fbo | |
parent | 70180a741a1ce158c1059b9133280e7ed7e891e7 (diff) |
fbo-blending-formats: Correct precision of signed normalized types.
Signed types have less precision due to the sign bit.
Without this it is impossible to devise an efficient way of lerping
signed normalized types that makes this test happy -- it would require
32bit float/int multiply and divides to get exact results.
Reviewed-by: Brian Paul <brianp@vmware.com>
Diffstat (limited to 'tests/fbo')
-rw-r--r-- | tests/fbo/fbo-blending-formats.c | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/tests/fbo/fbo-blending-formats.c b/tests/fbo/fbo-blending-formats.c index 3271429a..78002ab7 100644 --- a/tests/fbo/fbo-blending-formats.c +++ b/tests/fbo/fbo-blending-formats.c @@ -61,6 +61,23 @@ static void blend(const float *rect, const float *src, const float *dst, const f a >= 0.333 ? 0.333f : 0.0f) : \ (a)) +static int +get_texture_bits(GLenum target, GLenum size_enum, GLenum type_enum) +{ + GLint size = 0; + GLint type = GL_NONE; + glGetTexLevelParameteriv(target, 0, size_enum, &size); + if (!size) { + return size; + } + glGetTexLevelParameteriv(target, 0, type_enum, &type); + if (type == GL_SIGNED_NORMALIZED) { + /* One bit is lost for the sign */ + size -= 1; + } + return size; +} + static enum piglit_result test_format(const struct format_desc *format) { GLboolean pass = GL_TRUE; @@ -128,18 +145,24 @@ static enum piglit_result test_format(const struct format_desc *format) piglit_width, piglit_height, 0, GL_RGBA, GL_FLOAT, NULL); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, - GL_TEXTURE_LUMINANCE_SIZE, &l); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, - GL_TEXTURE_ALPHA_SIZE, &a); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, - GL_TEXTURE_INTENSITY_SIZE, &i); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, - GL_TEXTURE_RED_SIZE, &r); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, - GL_TEXTURE_GREEN_SIZE, &g); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, - GL_TEXTURE_BLUE_SIZE, &b); + l = get_texture_bits(GL_TEXTURE_2D, + GL_TEXTURE_LUMINANCE_SIZE, + GL_TEXTURE_LUMINANCE_TYPE); + a = get_texture_bits(GL_TEXTURE_2D, + GL_TEXTURE_ALPHA_SIZE, + GL_TEXTURE_ALPHA_TYPE); + i = get_texture_bits(GL_TEXTURE_2D, + GL_TEXTURE_INTENSITY_SIZE, + GL_TEXTURE_INTENSITY_TYPE); + r = get_texture_bits(GL_TEXTURE_2D, + GL_TEXTURE_RED_SIZE, + GL_TEXTURE_RED_TYPE); + g = get_texture_bits(GL_TEXTURE_2D, + GL_TEXTURE_GREEN_SIZE, + GL_TEXTURE_GREEN_TYPE); + b = get_texture_bits(GL_TEXTURE_2D, + GL_TEXTURE_BLUE_SIZE, + GL_TEXTURE_BLUE_TYPE); /* Compute expected result colors when reading back from a texture/FBO */ if (i) { |