diff options
author | Marek Olšák <maraeo@gmail.com> | 2011-03-10 22:52:12 +0100 |
---|---|---|
committer | Marek Olšák <maraeo@gmail.com> | 2011-03-11 04:27:35 +0100 |
commit | 6db98203b0ab5cd44686561c900de1b7f8ad4c85 (patch) | |
tree | df97507c94c0fb8847bf1baae4b8fc998dafc37e | |
parent | 2feecc80a00a378f3bc695752c4024058a8c0032 (diff) |
blending-in-shader: new test for NV_texture_barrier
-rw-r--r-- | tests/spec/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/spec/nv_texture_barrier/CMakeLists.gl.txt | 17 | ||||
-rw-r--r-- | tests/spec/nv_texture_barrier/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/spec/nv_texture_barrier/blending-in-shader.c | 116 |
4 files changed, 135 insertions, 0 deletions
diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt index b32debff9..0762af720 100644 --- a/tests/spec/CMakeLists.txt +++ b/tests/spec/CMakeLists.txt @@ -4,3 +4,4 @@ add_subdirectory (arb_instanced_arrays) add_subdirectory (arb_shader_texture_lod) add_subdirectory (ati_envmap_bumpmap) add_subdirectory (ext_fog_coord) +add_subdirectory (nv_texture_barrier) diff --git a/tests/spec/nv_texture_barrier/CMakeLists.gl.txt b/tests/spec/nv_texture_barrier/CMakeLists.gl.txt new file mode 100644 index 000000000..95ab0f2c6 --- /dev/null +++ b/tests/spec/nv_texture_barrier/CMakeLists.gl.txt @@ -0,0 +1,17 @@ +include_directories( + ${OPENGL_INCLUDE_PATH} + ${GLUT_INCLUDE_DIR} + ${piglit_SOURCE_DIR}/tests/util +) + +link_libraries ( + piglitutil + ${OPENGL_gl_LIBRARY} + ${OPENGL_glu_LIBRARY} + ${GLUT_glut_LIBRARY} + ${TIFF_LIBRARY} +) + +add_executable (blending-in-shader blending-in-shader.c) + +# vim: ft=cmake: diff --git a/tests/spec/nv_texture_barrier/CMakeLists.txt b/tests/spec/nv_texture_barrier/CMakeLists.txt new file mode 100644 index 000000000..144a306f4 --- /dev/null +++ b/tests/spec/nv_texture_barrier/CMakeLists.txt @@ -0,0 +1 @@ +piglit_include_target_api() diff --git a/tests/spec/nv_texture_barrier/blending-in-shader.c b/tests/spec/nv_texture_barrier/blending-in-shader.c new file mode 100644 index 000000000..f2527685a --- /dev/null +++ b/tests/spec/nv_texture_barrier/blending-in-shader.c @@ -0,0 +1,116 @@ +/* + * Copyright © 2011 Marek Olšák + * + * 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. + * + */ + +/** @file blending-in-shader.c + * + * Test programmable blending with GL_NV_texture_barrier. + */ + +#include "piglit-util.h" + +int piglit_width = 128; +int piglit_height = 128; +int piglit_window_mode = GLUT_DOUBLE | GLUT_RGB | GLUT_ALPHA; + +static GLuint tex, fbo, prog, texloc; +static float tex_data[16*16*4], res_data[16*16*4]; + +static const char *fstext = { + "uniform sampler2D fb;" + "void main() {" + " gl_FragColor = sqrt(texture2D(fb, gl_FragCoord.xy / 16.0));" + "}" +}; + +#define PASSES 3 + +enum piglit_result piglit_display(void) +{ + GLboolean pass = GL_TRUE; + int i; + + glBindTexture(GL_TEXTURE_2D, tex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 16, 16, 0, GL_RGBA, GL_FLOAT, tex_data); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); + glViewport(0, 0, 16, 16); + + piglit_UseProgram(prog); + glUniform1i(texloc, 0); + + for (i = 0; i < PASSES; i++) { + if (i != 0) + glTextureBarrierNV(); + piglit_draw_rect_tex(-1, -1, 2, 2, 0, 0, 1, 1); + } + + pass = piglit_probe_image_rgba(0, 0, 16, 16, res_data); + + piglit_UseProgram(0); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glViewport(0, 0, piglit_width, piglit_height); + + piglit_draw_rect_tex(-1, -1, 2, 2, 0, 0, 1, 1); + + glutSwapBuffers(); + + return pass ? PIGLIT_SUCCESS : PIGLIT_FAILURE; +} + +void piglit_init(int argc, char **argv) +{ + unsigned int i, j, fs; + + piglit_require_extension("GL_EXT_framebuffer_object"); + piglit_require_extension("GL_NV_texture_barrier"); + piglit_require_GLSL(); + + srand(0); + for (i = 0; i < 16 * 16 * 4; ++i) { + tex_data[i] = (rand() % 256) / 255.f; + res_data[i] = tex_data[i]; + for (j = 0; j < PASSES; j++) + res_data[i] = sqrt(res_data[i]); + } + + glEnable(GL_TEXTURE_2D); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 16, 16, 0, GL_RGBA, GL_FLOAT, NULL); + + glGenFramebuffersEXT(1, &fbo); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); + assert(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT); + + fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fstext); + prog = piglit_link_simple_program(0, fs); + + texloc = piglit_GetUniformLocation(prog, "fb"); +} |