[Piglit] [PATCH 07/12] Port texture env combine4 test from Glean to Piglit
Fabian Bieler
fabianbieler at fastmail.fm
Thu Nov 9 21:27:41 UTC 2017
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 (brianp at 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
More information about the Piglit
mailing list