diff options
author | Eric Anholt <eric@anholt.net> | 2010-05-24 12:50:12 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2010-06-10 00:40:15 -0700 |
commit | af9c81617243c6981eb8955b044bd6b4028517f2 (patch) | |
tree | 97e5b548454996e1b9cebdb033edad1e3644e53c | |
parent | f996e9a1ba123ce44cbe3fdc74def394cf7b76bc (diff) |
fbo-alpha: Test for supporting GL_ALPHA FBOs with ARB_fbo.
-rw-r--r-- | tests/all.tests | 1 | ||||
-rw-r--r-- | tests/fbo/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/fbo/fbo-alpha.c | 149 |
3 files changed, 151 insertions, 0 deletions
diff --git a/tests/all.tests b/tests/all.tests index 5a1204494..338eb747f 100644 --- a/tests/all.tests +++ b/tests/all.tests @@ -67,6 +67,7 @@ add_plain_test(mesa, 'crossbar') fbo = Group() add_plain_test(fbo, 'fbo-1d') add_plain_test(fbo, 'fbo-3d') +add_plain_test(fbo, 'fbo-alpha') add_plain_test(fbo, 'fbo-blit') add_plain_test(fbo, 'fbo-cubemap') add_plain_test(fbo, 'fbo-clearmipmap') diff --git a/tests/fbo/CMakeLists.txt b/tests/fbo/CMakeLists.txt index 24640a673..6a70ee152 100644 --- a/tests/fbo/CMakeLists.txt +++ b/tests/fbo/CMakeLists.txt @@ -23,6 +23,7 @@ link_libraries ( add_executable (fbo-1d fbo-1d.c) add_executable (fbo-3d fbo-3d.c) +add_executable (fbo-alpha fbo-alpha.c) add_executable (fbo-blit fbo-blit.c) add_executable (fbo-copypix fbo-copypix.c) add_executable (fbo-readdrawpix fbo-readdrawpix.c) diff --git a/tests/fbo/fbo-alpha.c b/tests/fbo/fbo-alpha.c new file mode 100644 index 000000000..479dabea4 --- /dev/null +++ b/tests/fbo/fbo-alpha.c @@ -0,0 +1,149 @@ +/* + * Copyright © 2010 Intel Corporation + * + * 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: + * Eric Anholt <eric@anholt.net> + * + */ + +/** @file fbo-alpha.c + * + * Tests that rendering to and blending on a GL_ALPHA FBO works with + * GL_ARB_framebuffer_object. + */ + +#include "piglit-util.h" + +int piglit_width = 128; +int piglit_height = 128; +int piglit_window_mode = GLUT_RGB | GLUT_ALPHA | GLUT_DOUBLE; + +enum piglit_result +piglit_display(void) +{ + GLboolean pass = GL_TRUE; + GLuint tex, fb; + GLenum status; + float fbo_white[] = {0.0, 0.0, 0.0, 1.0}; + float fbo_black[] = {0.0, 0.0, 0.0, 0.0}; + float fbo_gray[] = {0.0, 0.0, 0.0, 0.5}; + float white[] = {1.0, 1.0, 1.0, 1.0}; + float black[] = {0.0, 0.0, 0.0, 0.0}; + float gray[] = {0.5, 0.5, 0.5, 0.5}; + int fbo_width = 64; + int fbo_height = 64; + + glGenFramebuffersEXT(1, &fb); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb); + glViewport(0, 0, fbo_width, fbo_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, GL_ALPHA, + fbo_width, fbo_height, 0, + GL_ALPHA, GL_UNSIGNED_BYTE, NULL); + + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, + GL_COLOR_ATTACHMENT0_EXT, + GL_TEXTURE_2D, + tex, + 0); + assert(glGetError() == 0); + + status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { + fprintf(stderr, "fbo incomplete (status = 0x%04x)\n", status); + piglit_report_result(PIGLIT_SKIP); + } + + /* Clear to no alpha. */ + glClearColor(0.0, 0.0, 0.0, 0.0); + glClear(GL_COLOR_BUFFER_BIT); + + glColor4f(0.0, 0.0, 0.0, 0.0); + piglit_draw_rect(-1.0, -1.0, 0.5, 2.0); + + glColor4f(0.0, 0.0, 0.0, 1.0); + piglit_draw_rect(-0.5, -1.0, 0.5, 2.0); + + glColor4f(0.0, 0.0, 0.0, 0.5); + piglit_draw_rect(0.0, -1.0, 0.5, 2.0); + glEnable(GL_BLEND); + glBlendFunc(GL_DST_ALPHA, GL_ZERO); + glColor4f(0.0, 0.0, 0.0, 1.0); + piglit_draw_rect(0.0, -1.0, 0.5, 2.0); + glDisable(GL_BLEND); + + glColor4f(0.0, 0.0, 0.0, 0.5); + piglit_draw_rect(0.5, -1.0, 0.5, 2.0); + glEnable(GL_BLEND); + glBlendFunc(GL_ZERO, GL_SRC_ALPHA); + glColor4f(0.0, 0.0, 0.0, 1.0); + piglit_draw_rect(0.5, -1.0, 0.5, 2.0); + glDisable(GL_BLEND); + + printf("Testing FBO result.\n"); + pass = piglit_probe_pixel_rgba(fbo_width * 1 / 8, 0, fbo_black) && pass; + pass = piglit_probe_pixel_rgba(fbo_width * 3 / 8, 0, fbo_white) && pass; + pass = piglit_probe_pixel_rgba(fbo_width * 5 / 8, 0, fbo_gray) && pass; + pass = piglit_probe_pixel_rgba(fbo_width * 7 / 8, 0, fbo_gray) && pass; + + /* Draw the two textures to halves of the window. */ + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glViewport(0, 0, piglit_width, piglit_height); + + glEnable(GL_TEXTURE_2D); + 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); + glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_ALPHA); + glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE); + glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); + glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE); + + 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); + + printf("Testing window result.\n"); + pass = piglit_probe_pixel_rgba(piglit_width * 1 / 8, 0, black) && pass; + pass = piglit_probe_pixel_rgba(piglit_width * 3 / 8, 0, white) && pass; + pass = piglit_probe_pixel_rgba(piglit_width * 5 / 8, 0, gray) && pass; + pass = piglit_probe_pixel_rgba(piglit_width * 7 / 8, 0, gray) && pass; + + glutSwapBuffers(); + + return pass ? PIGLIT_SUCCESS : PIGLIT_FAILURE; +} + +void +piglit_init(int argc, char **argv) +{ + piglit_require_extension("GL_ARB_framebuffer_object"); + piglit_require_extension("GL_ARB_texture_env_combine"); +} |