The custom rolled random number generation was replaced by one from stdlib. --- tests/all.py | 5 + tests/spec/CMakeLists.txt | 1 + .../spec/nv_texture_env_combine4/CMakeLists.gl.txt | 13 ++ tests/spec/nv_texture_env_combine4/CMakeLists.txt | 1 + tests/spec/nv_texture_env_combine4/combine.c | 256 +++++++++++++++++++++ 5 files changed, 276 insertions(+) create mode 100644 tests/spec/nv_texture_env_combine4/CMakeLists.gl.txt create mode 100644 tests/spec/nv_texture_env_combine4/CMakeLists.txt create mode 100644 tests/spec/nv_texture_env_combine4/combine.c
diff --git a/tests/all.py b/tests/all.py index 4ec6596..84ca8b2 100644 --- a/tests/all.py +++ b/tests/all.py @@ -3909,6 +3909,11 @@ with profile.test_list.group_manager( with profile.test_list.group_manager( PiglitGLTest, + grouptools.join('spec', 'nv_texture_env_combine4')) as g: + g(['nv_texture_env_combine4-combine']) + +with profile.test_list.group_manager( + PiglitGLTest, grouptools.join('spec', 'nv_conditional_render')) as g: g(['nv_conditional_render-begin-while-active'], 'begin-while-active') g(['nv_conditional_render-begin-zero'], 'begin-zero') diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt index 44659d5..99fa95f 100644 --- a/tests/spec/CMakeLists.txt +++ b/tests/spec/CMakeLists.txt @@ -98,6 +98,7 @@ add_subdirectory (nv_conditional_render) add_subdirectory (nv_fill_rectangle) add_subdirectory (nv_image_formats) add_subdirectory (nv_texture_barrier) +add_subdirectory (nv_texture_env_combine4) add_subdirectory (oes_compressed_etc1_rgb8_texture) add_subdirectory (oes_compressed_paletted_texture) add_subdirectory (oes_required_internalformat) diff --git a/tests/spec/nv_texture_env_combine4/CMakeLists.gl.txt b/tests/spec/nv_texture_env_combine4/CMakeLists.gl.txt new file mode 100644 index 0000000..d5ab5b2 --- /dev/null +++ b/tests/spec/nv_texture_env_combine4/CMakeLists.gl.txt @@ -0,0 +1,13 @@ +include_directories( + ${GLEXT_INCLUDE_DIR} + ${OPENGL_INCLUDE_PATH} +) + +link_libraries ( + piglitutil_${piglit_target_api} + ${OPENGL_gl_LIBRARY} +) + +piglit_add_executable (nv_texture_env_combine4-combine combine.c) + +# vim: ft=cmake: diff --git a/tests/spec/nv_texture_env_combine4/CMakeLists.txt b/tests/spec/nv_texture_env_combine4/CMakeLists.txt new file mode 100644 index 0000000..144a306 --- /dev/null +++ b/tests/spec/nv_texture_env_combine4/CMakeLists.txt @@ -0,0 +1 @@ +piglit_include_target_api() diff --git a/tests/spec/nv_texture_env_combine4/combine.c b/tests/spec/nv_texture_env_combine4/combine.c new file mode 100644 index 0000000..b76ce98 --- /dev/null +++ b/tests/spec/nv_texture_env_combine4/combine.c @@ -0,0 +1,256 @@ +/* + * Copyright (C) 1999 Allen Akin All Rights Reserved. + * + * 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 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 ALLEN AKIN 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 combine.c: Test GL_NV_texture_env_combine4 + * Author: Brian Paul (bri...@valinux.com) Januar 2009 + * + * Generate some random combiner state and colors, compute the expected + * color, then render with the combiner state and compare the results. + * Only one texture unit is tested and not all possible combiner terms + * are exercised. + */ + +#include "piglit-util-gl.h" + +PIGLIT_GL_TEST_CONFIG_BEGIN + + config.supports_gl_compat_version = 13; + config.window_visual = PIGLIT_GL_VISUAL_RGB; + config.khr_no_error_support = PIGLIT_NO_ERRORS; + +PIGLIT_GL_TEST_CONFIG_END + +#ifdef _WIN32 +#define SRAND(x) srand(x) +#define DRAND() ((float)rand() / RAND_MAX) +#else +#define SRAND(x) srand48(x) +#define DRAND() drand48() +#endif + +#define NUM_TESTS 200 + +struct combine_state { + GLenum combine_mode; + GLenum source[4]; + GLenum operand_rgb[4]; + GLenum operand_a[4]; + float primary_color[4]; + float constant_color[4]; + float texture_color[4]; +}; + +/* generate random combiner state */ +static void +generate_state(struct combine_state *state) +{ + if (DRAND() > 0.5f) + state->combine_mode = GL_ADD; + else + state->combine_mode = GL_ADD_SIGNED_EXT; + + for (int i = 0; i < 4; i++) { + int src = (int)(DRAND() * 4.0); + switch (src) { + case 0: + state->source[i] = GL_ZERO; + break; + case 1: + state->source[i] = GL_TEXTURE; + break; + case 2: + state->source[i] = GL_CONSTANT_EXT; + break; + default: + state->source[i] = GL_PRIMARY_COLOR_EXT; + break; + } + + if (DRAND() > 0.5f) { + state->operand_rgb[i] = GL_SRC_COLOR; + state->operand_a[i] = GL_SRC_ALPHA; + } else { + state->operand_rgb[i] = GL_ONE_MINUS_SRC_COLOR; + state->operand_a[i] = GL_ONE_MINUS_SRC_ALPHA; + } + } + + state->primary_color[0] = DRAND(); + state->primary_color[1] = DRAND(); + state->primary_color[2] = DRAND(); + state->primary_color[3] = DRAND(); + + state->constant_color[0] = DRAND(); + state->constant_color[1] = DRAND(); + state->constant_color[2] = DRAND(); + state->constant_color[3] = DRAND(); + + state->texture_color[0] = DRAND(); + state->texture_color[1] = DRAND(); + state->texture_color[2] = DRAND(); + state->texture_color[3] = DRAND(); +} + +/* compute expected final color */ +static void +evaluate_state(const struct combine_state state, float result[4]) +{ + float arg[4][4]; + + /* setup terms */ + for (int i = 0; i < 4; i++) { + switch (state.source[i]) { + case GL_ZERO: + arg[i][0] = arg[i][1] = arg[i][2] = arg[i][3] = 0.0f; + break; + case GL_PRIMARY_COLOR_EXT: + arg[i][0] = state.primary_color[0]; + arg[i][1] = state.primary_color[1]; + arg[i][2] = state.primary_color[2]; + arg[i][3] = state.primary_color[3]; + break; + case GL_CONSTANT_EXT: + arg[i][0] = state.constant_color[0]; + arg[i][1] = state.constant_color[1]; + arg[i][2] = state.constant_color[2]; + arg[i][3] = state.constant_color[3]; + break; + case GL_TEXTURE: + arg[i][0] = state.texture_color[0]; + arg[i][1] = state.texture_color[1]; + arg[i][2] = state.texture_color[2]; + arg[i][3] = state.texture_color[3]; + break; + default: + assert(0); + } + + switch (state.operand_rgb[i]) { + case GL_SRC_COLOR: + /* nop */ + break; + case GL_ONE_MINUS_SRC_COLOR: + arg[i][0] = 1.0f - arg[i][0]; + arg[i][1] = 1.0f - arg[i][1]; + arg[i][2] = 1.0f - arg[i][2]; + arg[i][3] = 1.0f - arg[i][3]; + break; + default: + assert(0); + } + } + + /* combine terms, loop over color channels */ + for (int i = 0; i < 4; i++) { + result[i] = arg[0][i] * arg[1][i] + arg[2][i] * arg[3][i]; + if (state.combine_mode == GL_ADD_SIGNED_EXT) + result[i] -= 0.5f; + if (result[i] < 0.0f) + result[i] = 0.0f; + else if (result[i] > 1.0f) + result[i] = 1.0f; + } +} + +/* render quad with given combiner state and compare resulting color + * return false if GL error is detected or comparison fails, true otherwise. + */ +static bool +render_state(const struct combine_state state, const float expected[4]) +{ + if (!piglit_check_gl_error(GL_NO_ERROR)) + return false; + + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV); + + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, state.combine_mode); + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, state.combine_mode); + + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, state.source[0]); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, state.source[0]); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, state.source[1]); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, state.source[1]); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, state.source[2]); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA, state.source[2]); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE3_RGB_NV, state.source[3]); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE3_ALPHA_NV, state.source[3]); + + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, state.operand_rgb[0]); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, state.operand_a[0]); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, state.operand_rgb[1]); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, state.operand_a[1]); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, state.operand_rgb[2]); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, state.operand_a[2]); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND3_RGB_NV, state.operand_rgb[3]); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND3_ALPHA_NV, state.operand_a[3]); + + glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, + state.constant_color); + + if (!piglit_check_gl_error(GL_NO_ERROR)) + return false; + + glEnable(GL_TEXTURE_2D); + 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_RGBA, 1, 1, 0, GL_RGBA, GL_FLOAT, + state.texture_color); + + glColor4fv(state.primary_color); + + glClear(GL_COLOR_BUFFER_BIT); + piglit_draw_rect_tex(-1, -1, 2, 2, 0, 0, 1, 1); + + return piglit_probe_pixel_rgb(piglit_width / 2, piglit_height / 2, + expected); +} + +enum piglit_result +piglit_display(void) +{ + for (int i = 0; i < NUM_TESTS; i++) { + struct combine_state state; + float expected[4]; + + generate_state(&state); + + evaluate_state(state, expected); + + if (!render_state(state, expected)) + return PIGLIT_FAIL; + } + + return PIGLIT_PASS; +} + +void +piglit_init(int argc, char **argv) +{ + SRAND(42); /* init random number generator */ +} -- 2.7.4 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/piglit