[Piglit] [PATCH 01/63] shader_runner: add support for glGetProgram queries

Alejandro Piñeiro apinheiro at igalia.com
Sat Feb 23 23:44:49 UTC 2019


Similar to the already existing verify program_interface_query, but
with the glGetProgramiv queries.

Useful, for example, to verify the current number of active uniforms
(via GL_ACTIVE_UNIFORMS).

Note that now there are two ways to verify link success. With the
already existing "link succes" shader runner query, or using this one:

   vefiry program_query GL_LINK_STATUS GL_TRUE

Although internally they are checked in a different way. It is pending
to check if there are corner cases where they return a different
value.

v2: Add GL_LINE_STRIP and GL_TRIANGLE_STRIP as valid results for the
    query (Antia Puentes).

Signed-off-by: Alejandro Piñeiro <apinheiro at igalia.com>
Signed-off-by: Antia Puentes <apuentes at igalia.com>
---
 tests/shaders/shader_runner.c | 80 +++++++++++++++++++++++++++++++++++
 1 file changed, 80 insertions(+)

diff --git a/tests/shaders/shader_runner.c b/tests/shaders/shader_runner.c
index 6df8bd860..c1c757d1b 100644
--- a/tests/shaders/shader_runner.c
+++ b/tests/shaders/shader_runner.c
@@ -2659,6 +2659,84 @@ set_subroutine_uniform(const char *line)
 	return;
 }
 
+/**
+ * Query values from current program using glGetProgram.
+ *
+ * Format of the command:
+ *   verify program_query GL_PNAME_ENUM integer
+ *
+ * or
+ *
+ *   verify program_query GL_PNAME_ENUM <enum>
+ *
+ * Note: GL_COMPUTE_WORK_GROUP_SIZE is not supported, as is the only
+ * query that requires a params with more than one component, and we
+ * want to keep things simple.
+ *
+ */
+static void
+verify_program_query(const char *line)
+{
+	static const struct string_to_enum all_pnames[] = {
+		ENUM_STRING(GL_DELETE_STATUS),
+		ENUM_STRING(GL_LINK_STATUS),
+		ENUM_STRING(GL_VALIDATE_STATUS),
+		ENUM_STRING(GL_INFO_LOG_LENGTH),
+		ENUM_STRING(GL_ATTACHED_SHADERS),
+		ENUM_STRING(GL_ACTIVE_ATOMIC_COUNTER_BUFFERS),
+		ENUM_STRING(GL_ACTIVE_ATTRIBUTES),
+		ENUM_STRING(GL_ACTIVE_ATTRIBUTE_MAX_LENGTH),
+		ENUM_STRING(GL_ACTIVE_UNIFORMS),
+		ENUM_STRING(GL_ACTIVE_UNIFORM_BLOCKS),
+		ENUM_STRING(GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH),
+		ENUM_STRING(GL_ACTIVE_UNIFORM_MAX_LENGTH),
+		ENUM_STRING(GL_COMPUTE_WORK_GROUP_SIZE),
+		ENUM_STRING(GL_PROGRAM_BINARY_LENGTH),
+		ENUM_STRING(GL_TRANSFORM_FEEDBACK_BUFFER_MODE),
+		ENUM_STRING(GL_TRANSFORM_FEEDBACK_VARYINGS),
+		ENUM_STRING(GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH),
+		ENUM_STRING(GL_GEOMETRY_VERTICES_OUT),
+		ENUM_STRING(GL_GEOMETRY_INPUT_TYPE),
+		ENUM_STRING(GL_GEOMETRY_OUTPUT_TYPE),
+		{ NULL, 0 }
+	};
+
+	static const struct string_to_enum all_possible_param_enums[] = {
+		ENUM_STRING(GL_TRUE),
+		ENUM_STRING(GL_FALSE),
+		ENUM_STRING(GL_SEPARATE_ATTRIBS),
+		ENUM_STRING(GL_INTERLEAVED_ATTRIBS),
+		ENUM_STRING(GL_POINTS),
+		ENUM_STRING(GL_LINES),
+		ENUM_STRING(GL_LINES_ADJACENCY),
+		ENUM_STRING(GL_TRIANGLES),
+		ENUM_STRING(GL_TRIANGLES_ADJACENCY),
+		ENUM_STRING(GL_LINE_STRIP),
+		ENUM_STRING(GL_TRIANGLE_STRIP),
+		{ NULL, 0 }
+	};
+
+	unsigned pname;
+	int expected;
+	int value;
+
+	REQUIRE(parse_enum_tab(all_pnames, line,
+			       &pname, &line),
+		"Bad glGetProgram pname at: %s\n", line);
+
+	REQUIRE(parse_enum_tab(all_possible_param_enums, line, (unsigned *)&expected, &line) ||
+		parse_int(line, &expected, &line),
+		"Bad expected value at: %s\n", line);
+
+	glGetProgramiv(prog, pname, &value);
+
+	if (expected != value) {
+		fprintf(stderr, "glGetProgram(%s): expected %d, got %d\n",
+			piglit_get_gl_enum_name(pname), expected, value);
+		piglit_report_result(PIGLIT_FAIL);
+	}
+}
+
 /**
  * Query a uniform using glGetActiveUniformsiv
  *
@@ -4396,6 +4474,8 @@ piglit_display(void)
 			parse_ints(rest, &ubo_array_index, 1, NULL);
 		} else if (parse_str(line, "active uniform ", &rest)) {
 			active_uniform(rest);
+		} else if (parse_str(line, "verify program_query", &rest)) {
+                        verify_program_query(rest);
 		} else if (parse_str(line, "verify program_interface_query ", &rest)) {
 			active_program_interface(rest);
 		} else if (parse_str(line, "vertex attrib ", &rest)) {
-- 
2.19.1



More information about the Piglit mailing list