[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