[Piglit] [PATCH 2/6] arb_vertex_program: Test matrix property bindings.
Fabian Bieler
fabianbieler at fastmail.fm
Sat Dec 2 20:49:16 UTC 2017
Test accessing the GL matrix state from ARB_vertex_program using property
bindings.
---
tests/all.py | 1 +
tests/spec/arb_vertex_program/CMakeLists.gl.txt | 1 +
.../arb_vertex_program/matrix-property-bindings.c | 251 +++++++++++++++++++++
3 files changed, 253 insertions(+)
create mode 100644 tests/spec/arb_vertex_program/matrix-property-bindings.c
diff --git a/tests/all.py b/tests/all.py
index 9a44984..5301146 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -2871,6 +2871,7 @@ with profile.test_list.group_manager(
g(['arb_vertex_program-getlocal4-errors'], 'getlocal4-errors')
g(['clip-plane-transformation', 'arb'],
'clip-plane-transformation arb')
+ g(['arb_vertex_program-matrix-property-bindings'])
g(['arb_vertex_program-minmax'], 'minmax')
g(['arb_vertex_program-property-bindings'])
g(['fdo24066'], run_concurrent=False)
diff --git a/tests/spec/arb_vertex_program/CMakeLists.gl.txt b/tests/spec/arb_vertex_program/CMakeLists.gl.txt
index 656efff..537bd35 100644
--- a/tests/spec/arb_vertex_program/CMakeLists.gl.txt
+++ b/tests/spec/arb_vertex_program/CMakeLists.gl.txt
@@ -12,6 +12,7 @@ piglit_add_executable (arb_vertex_program-getenv4d-with-error getenv4d-with-erro
piglit_add_executable (arb_vertex_program-getlocal4d-with-error getlocal4d-with-error.c)
piglit_add_executable (arb_vertex_program-getlocal4f-max getlocal4f-max.c)
piglit_add_executable (arb_vertex_program-getlocal4-errors getlocal4-errors.c)
+piglit_add_executable (arb_vertex_program-matrix-property-bindings matrix-property-bindings.c)
piglit_add_executable (arb_vertex_program-minmax minmax.c)
piglit_add_executable (arb_vertex_program-property-bindings property-bindings.c)
diff --git a/tests/spec/arb_vertex_program/matrix-property-bindings.c b/tests/spec/arb_vertex_program/matrix-property-bindings.c
new file mode 100644
index 0000000..c47a464
--- /dev/null
+++ b/tests/spec/arb_vertex_program/matrix-property-bindings.c
@@ -0,0 +1,251 @@
+/*
+ * Copyright © 2017 Fabian Bieler
+ *
+ * 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 matrix-property-bindings.c:
+ * Access GL transformation state in ARB_vertex_program.
+ *
+ * Set matrix property bindings with the OpenGL glLoadMatrix API and access it
+ * in ARB vertex programs.
+ */
+
+#include "piglit-util-gl.h"
+#include "piglit-matrix.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
+
+/*
+ * This vertex program compares test_param[i] against expectedi using epsilon
+ * as tolerance for all i from 0 to 3 inclusive.
+ * On match result.color is set to green, red otherwise.
+ */
+static const char *vp_template =
+ "!!ARBvp1.0\n"
+ "PARAM epsilon = 0.00390625;\n"
+ "PARAM expected0 = {%f, %f, %f, %f};\n"
+ "PARAM expected1 = {%f, %f, %f, %f};\n"
+ "PARAM expected2 = {%f, %f, %f, %f};\n"
+ "PARAM expected3 = {%f, %f, %f, %f};\n"
+ "PARAM test_param[4] = { %s };\n"
+ "TEMP tmp1;\n"
+ "TEMP tmp2;\n"
+
+ "SUB tmp1, expected0, test_param[0];\n"
+ "ABS tmp1, tmp1;\n"
+ "SLT tmp1, tmp1, epsilon;\n"
+ "DP4 tmp2.x, tmp1, tmp1;\n" /* tmp2.x = 4 */
+
+ "SUB tmp1, expected1, test_param[1];\n"
+ "ABS tmp1, tmp1;\n"
+ "SLT tmp1, tmp1, epsilon;\n"
+ "DP4 tmp2.y, tmp1, tmp1;\n" /* tmp2.y = 4 */
+
+ "SUB tmp1, expected2, test_param[2];\n"
+ "ABS tmp1, tmp1;\n"
+ "SLT tmp1, tmp1, epsilon;\n"
+ "DP4 tmp2.z, tmp1, tmp1;\n" /* tmp2.z = 4 */
+
+ "SUB tmp1, expected3, test_param[3];\n"
+ "ABS tmp1, tmp1;\n"
+ "SLT tmp1, tmp1, epsilon;\n"
+ "DP4 tmp2.w, tmp1, tmp1;\n" /* tmp2.w = 4 */
+
+ "DP4 tmp2.x, tmp2, tmp2;\n" /* tmp2.x = 64 */
+
+ "SLT tmp1.x, tmp2.x, 64;\n" /* tmp1.x = 0 */
+ "SGE tmp1.y, tmp2.x, 64;\n" /* tmp1.y = 1 */
+ "SWZ result.color, tmp1, x, y, 0, 1;\n"
+
+ "MOV result.position, vertex.position;\n"
+ "END";
+
+/**
+ * Check that the constant parameter \name is equal to \m.
+ *
+ * Since we also test for derived state involving floating point computation
+ * don't test for strict equality but rather only check if the parameter's
+ * components are within and epsilon of their expected values.
+ */
+static bool
+check_prg_param_(const float *m, const char *name)
+{
+ char *vp_text;
+ const float green[3] = {0.0, 1.0, 0.0};
+
+ asprintf(&vp_text, vp_template, m[0], m[4], m[8], m[12], m[1], m[5],
+ m[9], m[13], m[2], m[6], m[10], m[14], m[3], m[7], m[11],
+ m[15], name);
+ GLuint prog = piglit_compile_program(GL_VERTEX_PROGRAM_ARB, vp_text);
+ free(vp_text);
+ glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prog);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+ piglit_draw_rect(-1, -1, 2, 2);
+
+ glDeleteProgramsARB(1, &prog);
+
+ if (piglit_probe_pixel_rgb_silent(piglit_width / 2, piglit_height / 2,
+ green, NULL))
+ return true;
+ printf("Failed parameter: '%s'.\n", name);
+ return false;
+}
+
+/**
+ * printf-like version of function above.
+ */
+static bool
+check_prg_param(const float *m, const char *format, ...) PRINTFLIKE(2, 3);
+static bool
+check_prg_param(const float *m, const char *format, ...)
+{
+ char *name;
+ va_list ap;
+
+ va_start(ap, format);
+ vasprintf(&name, format, ap);
+ va_end(ap);
+
+ const bool r = check_prg_param_(m, name);
+ free(name);
+ return r;
+}
+
+/**
+ * Load random 16 floats between 0 and 1 into matrix \pname
+ * and return them in \m.
+ */
+static void
+load_matrix(float m[16], const GLenum pname)
+{
+ glMatrixMode(pname);
+ for (int i = 0; i < 16; ++i)
+ m[i] = DRAND();
+ glLoadMatrixf(m);
+}
+
+/**
+ * Check that matrix \pname contains the values \m.
+ * if \idx is positive add it as and index to the matrix array.
+ * if \idx is zero check both indexed and non-indexed variants.
+ * if \idx is negative check non-indexed matrix.
+ * Also check the matrix' transpose, inverse and transpose inverse.
+ */
+static bool
+check_matrix_variants(const char *prefix, const float m[16], const int idx)
+{
+ bool pass = true;
+ float m_T[16], m_inv[16], m_inv_T[16];
+
+ piglit_matrix_transpose(m_T, m);
+ piglit_matrix_inverse(m_inv, m);
+ piglit_matrix_transpose(m_inv_T, m_inv);
+
+ if (idx >= 0) {
+ pass = check_prg_param(m, "state.matrix.%s[%d]", prefix,
+ idx) && pass;
+ pass = check_prg_param(m_T, "state.matrix.%s[%d].transpose",
+ prefix, idx) && pass;
+ pass = check_prg_param(m_inv, "state.matrix.%s[%d].inverse",
+ prefix, idx) && pass;
+ pass = check_prg_param(m_inv_T,
+ "state.matrix.%s[%d].invtrans", prefix,
+ idx) && pass;
+ }
+ if (idx <= 0) {
+ pass = check_prg_param(m, "state.matrix.%s", prefix) && pass;
+ pass = check_prg_param(m_T, "state.matrix.%s.transpose",
+ prefix) && pass;
+ pass = check_prg_param(m_inv, "state.matrix.%s.inverse",
+ prefix) && pass;
+ pass = check_prg_param(m_inv_T, "state.matrix.%s.invtrans",
+ prefix) && pass;
+ }
+
+ return pass;
+}
+
+/**
+ * Load random data in matrix \pname and check it by it's shader name \name
+ * with (optional) index \idx.
+ */
+static bool
+load_and_test_matrix(const char *name, const GLenum pname, const int idx)
+{
+ float mat[16];
+
+ load_matrix(mat, pname);
+ return check_matrix_variants(name, mat, idx);
+}
+
+enum piglit_result
+piglit_display(void)
+{
+ bool pass = true;
+
+ /* Test modelview and projection matrices. */
+ pass = load_and_test_matrix("modelview", GL_MODELVIEW, -1) && pass;
+
+ pass = load_and_test_matrix("projection", GL_PROJECTION, -1) && pass;
+
+ /* Test modelview-projection matrix. */
+ float mvp[16], proj[16], mview[16];
+ load_matrix(mview, GL_MODELVIEW);
+ load_matrix(proj, GL_PROJECTION);
+ piglit_matrix_mul_matrix(mvp, proj, mview);
+ pass = check_matrix_variants("mvp", mvp, -1) && pass;
+
+ /* Test texture matrices. */
+ int max_texture_coords;
+ glGetIntegerv(GL_MAX_TEXTURE_COORDS, &max_texture_coords);
+ for (int t = 0; t < max_texture_coords; ++t) {
+ glActiveTexture(GL_TEXTURE0 + t);
+ pass = load_and_test_matrix("texture", GL_TEXTURE, t) && pass;
+ }
+
+ return pass ? PIGLIT_PASS : PIGLIT_FAIL;
+}
+
+void
+piglit_init(int argc, char **argv)
+{
+ piglit_require_extension("GL_ARB_vertex_program");
+
+ glEnable(GL_VERTEX_PROGRAM_ARB);
+
+ SRAND(17);
+}
--
2.7.4
More information about the Piglit
mailing list