From: Antia Puentes <[email protected]>

---
 tests/shaders/shader_runner.c | 372 ++++++++++++++++++++++++++--------
 1 file changed, 283 insertions(+), 89 deletions(-)

diff --git a/tests/shaders/shader_runner.c b/tests/shaders/shader_runner.c
index 7d24c50bc..97cb89079 100644
--- a/tests/shaders/shader_runner.c
+++ b/tests/shaders/shader_runner.c
@@ -3049,100 +3049,15 @@ confirm_program_resource(GLenum interface_type, GLuint 
resource_index,
        return true;
 }
 
-/**
- * Query an active resource using ARB_program_interface_query functions
- *
- * Format of the command:
- *
- *  verify program_interface_query GL_INTERFACE_TYPE_ENUM name GL_PNAME_ENUM 
integer
- *
- * or
- *
- *  verify program_interface_query GL_INTERFACE_TYPE_ENUM name GL_PNAME_ENUM 
GL_TYPE_ENUM
- */
 static void
-active_program_interface(const char *line, struct block_info block_data)
+query_resource_by_name(unsigned interface_type, const char *name, unsigned 
prop,
+                      int expected, const char *query_str,
+                      struct block_info block_data)
 {
-       static const struct string_to_enum all_props[] = {
-               ENUM_STRING(GL_TYPE),
-               ENUM_STRING(GL_ARRAY_SIZE),
-               ENUM_STRING(GL_NAME_LENGTH),
-               ENUM_STRING(GL_BLOCK_INDEX),
-               ENUM_STRING(GL_OFFSET),
-               ENUM_STRING(GL_ARRAY_STRIDE),
-               ENUM_STRING(GL_MATRIX_STRIDE),
-               ENUM_STRING(GL_IS_ROW_MAJOR),
-               ENUM_STRING(GL_ATOMIC_COUNTER_BUFFER_INDEX),
-               ENUM_STRING(GL_BUFFER_BINDING),
-               ENUM_STRING(GL_BUFFER_DATA_SIZE),
-               ENUM_STRING(GL_NUM_ACTIVE_VARIABLES),
-               ENUM_STRING(GL_REFERENCED_BY_VERTEX_SHADER),
-               ENUM_STRING(GL_REFERENCED_BY_TESS_CONTROL_SHADER),
-               ENUM_STRING(GL_REFERENCED_BY_TESS_EVALUATION_SHADER),
-               ENUM_STRING(GL_REFERENCED_BY_GEOMETRY_SHADER),
-               ENUM_STRING(GL_REFERENCED_BY_FRAGMENT_SHADER),
-               ENUM_STRING(GL_REFERENCED_BY_COMPUTE_SHADER),
-               ENUM_STRING(GL_TOP_LEVEL_ARRAY_SIZE),
-               ENUM_STRING(GL_TOP_LEVEL_ARRAY_STRIDE),
-               ENUM_STRING(GL_LOCATION),
-               ENUM_STRING(GL_LOCATION_INDEX),
-               ENUM_STRING(GL_LOCATION_COMPONENT),
-               ENUM_STRING(GL_IS_PER_PATCH),
-               ENUM_STRING(GL_NUM_COMPATIBLE_SUBROUTINES),
-               ENUM_STRING(GL_COMPATIBLE_SUBROUTINES),
-               { NULL, 0 }
-       };
-
-       static const struct string_to_enum all_program_interface[] = {
-               ENUM_STRING(GL_UNIFORM),
-               ENUM_STRING(GL_UNIFORM_BLOCK),
-               ENUM_STRING(GL_PROGRAM_INPUT),
-               ENUM_STRING(GL_PROGRAM_OUTPUT),
-               ENUM_STRING(GL_BUFFER_VARIABLE),
-               ENUM_STRING(GL_SHADER_STORAGE_BLOCK),
-               ENUM_STRING(GL_ATOMIC_COUNTER_BUFFER),
-               ENUM_STRING(GL_VERTEX_SUBROUTINE),
-               ENUM_STRING(GL_TESS_CONTROL_SUBROUTINE),
-               ENUM_STRING(GL_TESS_EVALUATION_SUBROUTINE),
-               ENUM_STRING(GL_GEOMETRY_SUBROUTINE),
-               ENUM_STRING(GL_FRAGMENT_SUBROUTINE),
-               ENUM_STRING(GL_COMPUTE_SUBROUTINE),
-               ENUM_STRING(GL_VERTEX_SUBROUTINE_UNIFORM),
-               ENUM_STRING(GL_TESS_CONTROL_SUBROUTINE_UNIFORM),
-               ENUM_STRING(GL_TESS_EVALUATION_SUBROUTINE_UNIFORM),
-               ENUM_STRING(GL_GEOMETRY_SUBROUTINE_UNIFORM),
-               ENUM_STRING(GL_FRAGMENT_SUBROUTINE_UNIFORM),
-               ENUM_STRING(GL_COMPUTE_SUBROUTINE_UNIFORM),
-               ENUM_STRING(GL_TRANSFORM_FEEDBACK_VARYING),
-               { NULL, 0 }
-       };
-
-       char name[512];
        char name_buf[512];
-       unsigned prop, interface_type;
-       int expected;
        int i;
        int num_active_buffers;
 
-       if (!piglit_is_extension_supported("GL_ARB_program_interface_query") &&
-           piglit_get_gl_version() < 43) {
-               fprintf(stderr,
-                       "GL_ARB_program_interface_query not supported or "
-                       "OpenGL version < 4.3\n");
-               return;
-       }
-
-       REQUIRE(parse_enum_tab(all_program_interface, line,
-                              &interface_type, &line),
-               "Bad program interface at: %s\n", line);
-       REQUIRE(parse_word_copy(line, name, sizeof(name), &line),
-               "Bad program resource name at: %s\n", line);
-       REQUIRE(parse_enum_tab(all_props, line, &prop, &line),
-               "Bad glGetProgramResourceiv pname at: %s\n", line);
-       REQUIRE(parse_enum_tab(all_types, line, (unsigned *)&expected, &line) ||
-               parse_int(line, &expected, &line),
-               "Bad expected value at: %s\n", line);
-
        glGetProgramInterfaceiv(prog, interface_type,
                                GL_ACTIVE_RESOURCES, &num_active_buffers);
        for (i = 0; i < num_active_buffers; i++) {
@@ -3193,6 +3108,285 @@ active_program_interface(const char *line, struct 
block_info block_data)
        return;
 }
 
+enum program_interface_queries {
+       /* Query a property of an interface in a program using
+        * glGetProgramInterfaceiv().
+        */
+       QUERY_INTERFACE = 0,
+
+       /* Query a property of an active resource using
+        * glGetProgramResourceiv(). We will search first for the resource
+        * to get its resource index, needed to do the query, using the data
+        * passed to the shader_runner command, data which will vary depending
+        * on the interface.
+        *
+        * This is useful for shaders coming from SPIR-V binaries where
+        * name-reflection information is not mandatory (ARB_gl_spirv).
+        */
+       QUERY_RESOURCE_BY_DATA,
+
+       /* Query a property of an active resource using
+        * glGetProgramResourceiv(). We will search first for the resource
+        * to get its resource index, needed to do the query, using the
+        * resource name passed to the shader_runner command.
+        */
+       QUERY_RESOURCE_BY_NAME,
+
+       /* Query the index of a resource within a program
+        * using glGetProgramResourceIndex().
+        */
+       QUERY_RESOURCE_INDEX,
+
+       /* Query the location of a resource within a program
+        * using glGetProgramResourceLocation().
+        */
+       QUERY_RESOURCE_LOCATION,
+
+       /* Query the fragment color index of a variable within
+        * a program using glGetProgramResourceLocationIndex().
+        */
+       QUERY_RESOURCE_LOCATION_INDEX,
+
+       /* Query an active resource's name and length using
+        * glGetProgramResourceName(). We will search first for the resource
+        * to get its resource index, needed to do the query, using the data
+        * passed to the shader_runner command, data which will vary depending
+        * on the interface.
+        */
+       QUERY_RESOURCE_NAME,
+};
+
+/**
+ * Query properties of interfaces and resources used by a program
+ * using ARB_program_interface_query queries.
+ *
+ * A) Correspondence between the program_interface_queries enum and the OpenGL
+ * query commands:
+ *
+ *  program_interface_queries            OpenGL command
+ *            enum
+ * ---------------------------        -------------------------
+ * - QUERY_INTERFACE               -> glGetProgramInterfaceiv()
+ * - QUERY_RESOURCE_BY_DATA        -> glGetProgramResourceiv()
+ * - QUERY_RESOURCE_BY_NAME        -> glGetProgramResourceiv()
+ * - QUERY_RESOURCE_INDEX          -> glGetProgramResourceIndex()
+ * - QUERY_RESOURCE_LOCATION       -> glGetProgramResourceLocation()
+ * - QUERY_RESOURCE_LOCATION_INDEX -> glGetProgramResourceLocationIndex()
+ * - QUERY_RESOURCE_NAME           -> glGetProgramResourceName()
+ *
+ * See the comments in the program_interface_queries enum declaration for more
+ * details.
+ *
+ * B) Format of the command:
+ *   verify program_interface_query <query> <params> <expected values>
+ *
+ * 1) The allowed values for <query> are:
+ *
+ *   command string            program_interface_queries
+ *                                       enum
+ * -------------------------   --------------------------
+ * - "interface"             -> QUERY_INTERFACE
+ * - "resourceByData"        -> QUERY_RESOURCE_BY_DATA
+ * - ""                      -> QUERY_RESOURCE_BY_NAME
+ * - "resourceIndex"         -> QUERY_RESOURCE_INDEX
+ * - "resourceLocation"      -> QUERY_RESOURCE_LOCATION
+ * - "resourceLocationIndex" -> QUERY_RESOURCE_LOCATION_INDEX
+ * - "resourceName"          -> QUERY_RESOURCE_NAME
+ *
+ * if no <query> is specified, QUERY_RESOURCE_BY_NAME is assummed.
+ *
+ * 2) The allowed values for <params> and <expected values> for each of the
+ * queries, in the order they should be specified, are:
+ *
+ * Note: some of the queries accept a <resource data> parameter, which goes
+ * between parenthesis and serves to identify the resource without using its
+ * name. Its usage is detailed in 3).
+ *
+ * - QUERY_INTERFACE:
+ *    - Params: <programInterface> <pname> <expected>
+ *    - Command: verify program_interface_query interface GL_INTERFACE_ENUM
+ *               GL_PNAME_ENUM int
+ *
+ * - QUERY_RESOURCE_BY_DATA:
+ *    - Params: <programInterface> (<resource data>) <pname> <expected>
+ *    - Command: verify program_interface_query resourceByData 
GL_INTERFACE_ENUM
+ *               (RESOURCE_DATA) GL_PNAME_ENUM {int/GL_TYPE_ENUM}
+ *
+ * - QUERY_RESOURCE_BY_NAME:
+ *    - Params: <programInterface> <name> <pname> <expected>
+ *    - Command: verify program_interface_query GL_INTERFACE_ENUM string
+ *               GL_PNAME_ENUM {int/GL_TYPE_ENUM}
+ *
+ * - QUERY_RESOURCE_NAME:
+ *    - Params: <programInterface> (<resource data>) <expected_length>
+ *               <expected_name>
+ *    - Command: verify program_interface_query resourceName GL_INTERFACE_ENUM
+ *               (RESOURCE_DATA) int string
+ *
+ * - QUERY_RESOURCE_INDEX:
+ *    - Params: <programInterface> <name> <expected>
+ *    - Command: verify program_interface_query resourceIndex GL_INTERFACE_ENUM
+ *               string {uint/GL_INVALID_INDEX}
+ *
+ * - QUERY_RESOURCE_LOCATION:
+ *    - Params: <programInterface> <name> <expected>
+ *    - Command: verify program_interface_query resourceLocation
+ *               GL_INTERFACE_ENUM string int
+ *
+ * - QUERY_RESOURCE_LOCATION_INDEX:
+ *    - Params: <programInterface> <name> <expected>
+ *    - Command: verify program_interface_query resourceLocationIndex
+ *               GL_INTERFACE_ENUM string int
+ *
+ * 3) The info accepted in <resource data> depends on which interface is going
+ * to be queried, being:
+ *
+ * - <location> <component> for GL_PROGRAM_INPUT and GL_PROGRAM_OUTPUT.
+ *    - int int
+ * - <binding> for GL_UNIFORM_BLOCK, GL_SHADER_STORAGE_BLOCK and
+ *   GL_ATOMIC_COUNTER_BUFFER.
+ *    - int
+ * - <binding> <offset> for GL_UNIFORM inside an UBO and GL_BUFFER_VARIABLE.
+ *    - int int
+ * - "atomic" <binding> <offset> for GL_UNIFORM atomic counters.
+ *    - atomic int int
+ * - "var" <location> for GL_UNIFORM variables.
+ *    - var int
+ * Other interfaces are not supported.
+ */
+static void
+verify_program_interface_query(const char *line,
+                              struct block_info block_data)
+{
+       static const struct string_to_enum all_program_interface[] = {
+               ENUM_STRING(GL_UNIFORM),
+               ENUM_STRING(GL_UNIFORM_BLOCK),
+               ENUM_STRING(GL_PROGRAM_INPUT),
+               ENUM_STRING(GL_PROGRAM_OUTPUT),
+               ENUM_STRING(GL_BUFFER_VARIABLE),
+               ENUM_STRING(GL_SHADER_STORAGE_BLOCK),
+               ENUM_STRING(GL_ATOMIC_COUNTER_BUFFER),
+               ENUM_STRING(GL_VERTEX_SUBROUTINE),
+               ENUM_STRING(GL_TESS_CONTROL_SUBROUTINE),
+               ENUM_STRING(GL_TESS_EVALUATION_SUBROUTINE),
+               ENUM_STRING(GL_GEOMETRY_SUBROUTINE),
+               ENUM_STRING(GL_FRAGMENT_SUBROUTINE),
+               ENUM_STRING(GL_COMPUTE_SUBROUTINE),
+               ENUM_STRING(GL_VERTEX_SUBROUTINE_UNIFORM),
+               ENUM_STRING(GL_TESS_CONTROL_SUBROUTINE_UNIFORM),
+               ENUM_STRING(GL_TESS_EVALUATION_SUBROUTINE_UNIFORM),
+               ENUM_STRING(GL_GEOMETRY_SUBROUTINE_UNIFORM),
+               ENUM_STRING(GL_FRAGMENT_SUBROUTINE_UNIFORM),
+               ENUM_STRING(GL_COMPUTE_SUBROUTINE_UNIFORM),
+               ENUM_STRING(GL_TRANSFORM_FEEDBACK_VARYING),
+               { NULL, 0 }
+       };
+
+       enum program_interface_queries query;
+       unsigned interface_type;
+       char query_str[640];
+
+       if (!piglit_is_extension_supported("GL_ARB_program_interface_query") &&
+           piglit_get_gl_version() < 43) {
+               fprintf(stderr,
+                       "GL_ARB_program_interface_query not supported or "
+                       "OpenGL version < 4.3\n");
+               return;
+       }
+
+       if (parse_str(line,"interface", &line)) {
+               query = QUERY_INTERFACE;
+       } else if (parse_str(line,"resourceName", &line)) {
+               query = QUERY_RESOURCE_NAME;
+       } else if (parse_str(line,"resourceIndex", &line)) {
+               query = QUERY_RESOURCE_INDEX;
+       } else if (parse_str(line,"resourceLocationIndex", &line)) {
+               query = QUERY_RESOURCE_LOCATION_INDEX;
+       } else if (parse_str(line,"resourceLocation", &line)) {
+               query = QUERY_RESOURCE_LOCATION;
+       } else if (parse_str(line,"resourceByData", &line)) {
+               query = QUERY_RESOURCE_BY_DATA;
+       } else {
+               query = QUERY_RESOURCE_BY_NAME;
+       }
+
+       REQUIRE(parse_enum_tab(all_program_interface, line,
+                              &interface_type, &line),
+               "Bad program interface at: %s\n", line);
+
+       switch (query) {
+       case QUERY_RESOURCE_BY_NAME: {
+               static const struct string_to_enum all_props[] = {
+                       ENUM_STRING(GL_TYPE),
+                       ENUM_STRING(GL_ARRAY_SIZE),
+                       ENUM_STRING(GL_NAME_LENGTH),
+                       ENUM_STRING(GL_BLOCK_INDEX),
+                       ENUM_STRING(GL_OFFSET),
+                       ENUM_STRING(GL_ARRAY_STRIDE),
+                       ENUM_STRING(GL_MATRIX_STRIDE),
+                       ENUM_STRING(GL_IS_ROW_MAJOR),
+                       ENUM_STRING(GL_ATOMIC_COUNTER_BUFFER_INDEX),
+                       ENUM_STRING(GL_BUFFER_BINDING),
+                       ENUM_STRING(GL_BUFFER_DATA_SIZE),
+                       ENUM_STRING(GL_NUM_ACTIVE_VARIABLES),
+                       ENUM_STRING(GL_REFERENCED_BY_VERTEX_SHADER),
+                       ENUM_STRING(GL_REFERENCED_BY_TESS_CONTROL_SHADER),
+                       ENUM_STRING(GL_REFERENCED_BY_TESS_EVALUATION_SHADER),
+                       ENUM_STRING(GL_REFERENCED_BY_GEOMETRY_SHADER),
+                       ENUM_STRING(GL_REFERENCED_BY_FRAGMENT_SHADER),
+                       ENUM_STRING(GL_REFERENCED_BY_COMPUTE_SHADER),
+                       ENUM_STRING(GL_TOP_LEVEL_ARRAY_SIZE),
+                       ENUM_STRING(GL_TOP_LEVEL_ARRAY_STRIDE),
+                       ENUM_STRING(GL_LOCATION),
+                       ENUM_STRING(GL_LOCATION_INDEX),
+                       ENUM_STRING(GL_LOCATION_COMPONENT),
+                       ENUM_STRING(GL_IS_PER_PATCH),
+                       ENUM_STRING(GL_NUM_COMPATIBLE_SUBROUTINES),
+                       ENUM_STRING(GL_COMPATIBLE_SUBROUTINES),
+                       { NULL, 0 }
+               };
+
+               char name[512];
+               unsigned prop;
+               int expected;
+
+               if (parse_str(line, "\"\"", &line))
+                       name[0] = '\0';
+               else
+                       REQUIRE(parse_word_copy(line, name, sizeof(name),
+                                               &line),
+                               "Bad program resource name at: %s\n",
+                               line);
+
+               REQUIRE(parse_enum_tab(all_props, line, &prop, &line),
+                       "Bad glGetProgramResourceiv prop at: %s\n", line);
+               REQUIRE(parse_enum_tab(all_types, line, (unsigned *) &expected,
+                                      &line) ||
+                       parse_int(line, &expected, &line),
+                       "Bad expected value at: %s\n", line);
+
+               snprintf(query_str, sizeof(query_str),
+                        "glGetProgramResourceiv(%s, %s, %s)",
+                        piglit_get_gl_enum_name(interface_type),
+                        name, piglit_get_gl_enum_name(prop));
+
+               query_resource_by_name(interface_type, name, prop, expected,
+                                      query_str, block_data);
+       }
+               break;
+       case QUERY_INTERFACE:
+       case QUERY_RESOURCE_BY_DATA:
+       case QUERY_RESOURCE_INDEX:
+       case QUERY_RESOURCE_LOCATION:
+       case QUERY_RESOURCE_LOCATION_INDEX:
+       case QUERY_RESOURCE_NAME:
+               assert(!"Not implemented.");
+               break;
+       default:
+               assert(!"Should not get here.");
+       }
+}
+
 static void
 set_parameter(const char *line)
 {
@@ -4673,7 +4867,7 @@ piglit_display(void)
                } 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, block_data);
+                       verify_program_interface_query(rest, block_data);
                } else if (parse_str(line, "vertex attrib ", &rest)) {
                        set_vertex_attrib(rest);
                } else if (parse_str(line, "newlist ", &rest)) {
-- 
2.19.1

_______________________________________________
Piglit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to