diff options
author | Marek Olšák <maraeo@gmail.com> | 2012-09-14 03:23:37 +0200 |
---|---|---|
committer | Marek Olšák <maraeo@gmail.com> | 2012-09-18 15:52:39 +0200 |
commit | 2495e56e02e95252bd6fc7153691b90d93615a0d (patch) | |
tree | 2017759e99cdb199ca1a9e0fb8ffc30ebaac0f81 /tests/fbo | |
parent | fb14b0eb21c3fc0c688c5ba0085065740819a33e (diff) |
fbo-colormask-formats: test glColorMask with all formats
Reviewed-by: Brian Paul <brianp@vmware.com>
Diffstat (limited to 'tests/fbo')
-rw-r--r-- | tests/fbo/CMakeLists.gl.txt | 1 | ||||
-rw-r--r-- | tests/fbo/fbo-colormask-formats.c | 227 |
2 files changed, 228 insertions, 0 deletions
diff --git a/tests/fbo/CMakeLists.gl.txt b/tests/fbo/CMakeLists.gl.txt index ed2f5688..d3e4bc99 100644 --- a/tests/fbo/CMakeLists.gl.txt +++ b/tests/fbo/CMakeLists.gl.txt @@ -34,6 +34,7 @@ piglit_add_executable (fbo-blit fbo-blit.c) piglit_add_executable (fbo-blit-d24s8 fbo-blit-d24s8.c) piglit_add_executable (fbo-blit-stretch fbo-blit-stretch.cpp) piglit_add_executable (fbo-blending-formats fbo-blending-formats.c) +piglit_add_executable (fbo-colormask-formats fbo-colormask-formats.c) piglit_add_executable (fbo-copypix fbo-copypix.c) piglit_add_executable (fbo-readdrawpix fbo-readdrawpix.c) piglit_add_executable (fbo-clearmipmap fbo-clearmipmap.c) diff --git a/tests/fbo/fbo-colormask-formats.c b/tests/fbo/fbo-colormask-formats.c new file mode 100644 index 00000000..a55e2169 --- /dev/null +++ b/tests/fbo/fbo-colormask-formats.c @@ -0,0 +1,227 @@ +/* + * Copyright © 2010 Intel Corporation + * Copyright © 2012 Marek Olšák <maraeo@gmail.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Marek Olšák <maraeo@gmail.com> + * + */ + +#include "piglit-util-gl-common.h" +#include "fbo-formats.h" + +PIGLIT_GL_TEST_MAIN( + 512 /*window_width*/, + 32 /*window_height*/, + GLUT_RGB | GLUT_ALPHA | GLUT_DOUBLE) + +/** + * Draw a quad with colormask + */ +static void colormask(const float *rect, unsigned mask) +{ + glColorMask(!!(mask & 1), !!(mask & 2), !!(mask & 4), !!(mask & 8)); + piglit_draw_rect(rect[0], rect[1], rect[2], rect[3]); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); +} + +static enum piglit_result test_format(const struct format_desc *format) +{ + GLboolean pass = GL_TRUE; + GLuint tex, fb; + GLenum status; + int r, g, b, l, a, i; + unsigned mask, k; + float defaults[] = {-1, -1, -1, -1}; + + if (format->base_internal_format == GL_DEPTH_COMPONENT || + format->base_internal_format == GL_DEPTH_STENCIL) + return PIGLIT_SKIP; + + glGenFramebuffersEXT(1, &fb); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb); + glViewport(0, 0, piglit_width, piglit_height); + + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, format->internalformat, + 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); + + /* Set up expected defaults. + * We're using glReadPixels from the texture. + */ + if (i) { + /* GL_INTENSITY texture: result = (I,0,0,1) */ + defaults[3] = 1; + defaults[2] = defaults[1] = 0; + } else if (l) { + /* GL_LUMINANCE texture: result = (L,0,0,A) */ + defaults[2] = defaults[1] = 0; + if (!a) { + defaults[3] = 1; + } + } else { + /* other format */ + if (!r) { + defaults[0] = 0; + } + if (!g) { + defaults[1] = 0; + } + if (!b) { + defaults[2] = 0; + } + if (!a) { + defaults[3] = 1; + } + } + + /* Clamp the bits for the framebuffer, except we aren't checking + * the actual framebuffer bits. + */ + if (l > 8) + l = 8; + if (i > 8) + i = 8; + if (r > 8) + r = 8; + if (g > 8) + g = 8; + if (b > 8) + b = 8; + if (a > 8) + a = 8; + + if (i) { + piglit_set_tolerance_for_bits(i, i, i, i); + } else if (l) { + piglit_set_tolerance_for_bits(l, l, l, a); + } else { + piglit_set_tolerance_for_bits(r, g, b, a); + } + + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, + GL_COLOR_ATTACHMENT0_EXT, + GL_TEXTURE_2D, + tex, + 0); + assert(glGetError() == 0); + + status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + printf("Testing %s", format->name); + if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { + printf(" - fbo incomplete (status = 0x%04x)\n", status); + return PIGLIT_SKIP; + } + printf("\n"); + + glClearColor(0.0, 0.0, 0.0, 0.0); + glClear(GL_COLOR_BUFFER_BIT); + + for (mask = 0; mask <= 15; mask++) { + float rect[4]; + rect[0] = -1 + (mask / 8.0); + rect[1] = -1; + rect[2] = 2 / 16.0; + rect[3] = 2; + + colormask(rect, mask); + } + + for (mask = 0; mask <= 15; mask++) { + float color[4], out[4]; + + for (k = 0; k < 4; k++) { + if (defaults[k] >= 0) + color[k] = defaults[k]; + else + color[k] = (mask & (1 << k)) ? 1 : 0; + } + + if (!piglit_probe_pixel_rgba_silent(piglit_width * mask / 16, 0, + color, out)) { + printf("glColorMask(%i, %i, %i, %i)\n", + !!(mask & 1), !!(mask & 2), + !!(mask & 4), !!(mask & 8)); + printf(" Expected: %f %f %f %f\n", + color[0], color[1], color[2], color[3]); + printf(" Observed: %f %f %f %f\n", + out[0], out[1], out[2], out[3]); + pass = GL_FALSE; + } + } + + /* + * Display the texture. + */ + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glViewport(0, 0, piglit_width, piglit_height); + + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); + + glColor4f(1, 1, 1, 1); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, tex); + piglit_draw_rect_tex(-1, -1, 2, 2, + 0, 0, 1, 1); + + glDisable(GL_TEXTURE_2D); + glDeleteTextures(1, &tex); + glDeleteFramebuffersEXT(1, &fb); + + if (!pass) { + piglit_present_results(); + return PIGLIT_FAIL; + } + + piglit_present_results(); + + return pass ? PIGLIT_PASS : PIGLIT_FAIL; +} + +enum piglit_result piglit_display(void) +{ + return fbo_formats_display(test_format); +} + +void piglit_init(int argc, char **argv) +{ + fbo_formats_init(argc, argv, GL_TRUE); +} |