On 03/26/2015 12:35 PM, Tapani Pälli wrote:


On 03/25/2015 06:01 PM, Martin Peres wrote:
Tests tricky cases of resource naming along with some error cases of
getprogramresourceindex. It also replaces the resource-index test that
was incomplete and did not consistently report the same number of
subtests depending on errors.

Signed-off-by: Martin Peres <martin.pe...@linux.intel.org>
---
  tests/all.py                                       |   2 +-
  .../arb_program_interface_query/CMakeLists.gl.txt  |   2 +-
  tests/spec/arb_program_interface_query/common.h    |  21 ++
  .../getprogramresourceindex.c                      | 338
+++++++++++++++++++++
  .../arb_program_interface_query/resource-index.c   | 284
-----------------
  5 files changed, 361 insertions(+), 286 deletions(-)
  create mode 100755
tests/spec/arb_program_interface_query/getprogramresourceindex.c
  delete mode 100644
tests/spec/arb_program_interface_query/resource-index.c

diff --git a/tests/all.py b/tests/all.py
index 86f2369..170d5b8 100755
--- a/tests/all.py
+++ b/tests/all.py
@@ -2273,9 +2273,9 @@ with profile.group_manager(
          PiglitGLTest,
          grouptools.join('spec', 'ARB_program_interface_query')) as g:
      g(['arb_program_interface_query-resource-location'],
run_concurrent=False)
-    g(['arb_program_interface_query-resource-index'],
run_concurrent=False)
      g(['arb_program_interface_query-resource-query'],
run_concurrent=False)
      g(['arb_program_interface_query-getprograminterfaceiv'],
run_concurrent=False)
+    g(['arb_program_interface_query-getprogramresourceindex'],
run_concurrent=False)

  # Group ARB_explicit_uniform_location
  with profile.group_manager(
diff --git a/tests/spec/arb_program_interface_query/CMakeLists.gl.txt
b/tests/spec/arb_program_interface_query/CMakeLists.gl.txt
index 91ace72..8b3bbd9 100755
--- a/tests/spec/arb_program_interface_query/CMakeLists.gl.txt
+++ b/tests/spec/arb_program_interface_query/CMakeLists.gl.txt
@@ -10,6 +10,6 @@ link_libraries (
  )

  piglit_add_executable (arb_program_interface_query-resource-location
resource-location.c)
-piglit_add_executable (arb_program_interface_query-resource-index
resource-index.c)
  piglit_add_executable (arb_program_interface_query-resource-query
resource-query.c)
  piglit_add_executable
(arb_program_interface_query-getprograminterfaceiv
getprograminterfaceiv.c)
+piglit_add_executable
(arb_program_interface_query-getprogramresourceindex
getprogramresourceindex.c)
diff --git a/tests/spec/arb_program_interface_query/common.h
b/tests/spec/arb_program_interface_query/common.h
index cc0b2bd..457e79e 100755
--- a/tests/spec/arb_program_interface_query/common.h
+++ b/tests/spec/arb_program_interface_query/common.h
@@ -35,6 +35,27 @@ static const char fs_empty[] =
      "void main() {\n"
      "}";

+static const char vs_array[] =
+    "#version 150\n"
+    "in vec4 vs_input[2];\n"
+    "struct vs_struct {\n"
+    "    vec4 hello;\n"
+    "    vec4 world[2];\n"
+    "};\n"
+    "uniform vs_struct sa[2];\n"
+    "void main() {\n"
+    "    gl_Position = vs_input[0] + sa[0].hello + sa[0].world[0];\n"
+    "}";
+
+static const char vs_aofa[] =
+    "#version 150\n"
+    "#extension GL_ARB_arrays_of_arrays : require\n"
+    "in vec4 vs_input2[2][2];\n"
+    "in vec4 vs_input3[2][2][2];\n"
+    "void main() {\n"
+    "    gl_Position = vs_input2[0][0] + vs_input3[0][0][0];\n"
+    "}";
+
  static const char vs_std[] =
      "#version 150\n"
      "struct vs_struct {\n"
diff --git
a/tests/spec/arb_program_interface_query/getprogramresourceindex.c
b/tests/spec/arb_program_interface_query/getprogramresourceindex.c
new file mode 100755
index 0000000..41aac3d
--- /dev/null
+++ b/tests/spec/arb_program_interface_query/getprogramresourceindex.c
@@ -0,0 +1,338 @@
+/*
+ * Copyright © 2015 Intel Corporation
+ *
+ * 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 getprogramresourceindex.c
+ *
+ * Tests the errors reported by the GetProgramResourceIndex interface
while also
+ * testing tricky naming cases. The real functional test is in
resource-query.c.
+ *
+ * From the GL_ARB_program_interface_query spec:
+ *      "The command
+ *
+ *      uint GetProgramResourceIndex(uint program, enum
programInterface,
+ *                                   const char *name);
+ *
+ *      returns the unsigned integer index assigned to a resource
named <name>
+ *      in the interface type <programInterface> of program object
<program>.
+ *      The error INVALID_ENUM is generated if <programInterface> is
+ *      ATOMIC_COUNTER_BUFFER, since active atomic counter buffer
resources are
+ *      not assigned name strings.
+ *
+ *      If <name> exactly matches the name string of one of the
active resources
+ *      for <programInterface>, the index of the matched resource is
returned.
+ *      Additionally, if <name> would exactly match the name string
of an active
+ *      resource if "[0]" were appended to <name>, the index of the
matched
+ *      resource is returned.  Otherwise, <name> is considered not to
be the
+ *      name of an active resource, and INVALID_INDEX is returned.
Note that if
+ *      an interface enumerates a single active resource list entry
for an array
+ *      variable (e.g., "a[0]"), a <name> identifying any array
element other
+ *      than the first (e.g., "a[1]") is not considered to match.
+ *
+ *      For the interface TRANSFORM_FEEDBACK_VARYING, the value
INVALID_INDEX
+ *      should be returned when querying the index assigned to the
special names
+ *      "gl_NextBuffer", "gl_SkipComponents1", "gl_SkipComponents2",
+ *      "gl_SkipComponents3", and "gl_SkipComponents4".
+ *
+ *      [...]
+ *
+ *      An INVALID_VALUE error is generated by GetProgramInterfaceiv,
+ *      GetProgramResourceIndex, GetProgramResourceName,
GetProgramResourceiv,
+ *      GetProgramResourceLocation, and
GetProgramResourceLocationIndex if
+ *      <program> is not the name of either a shader or program object.
+ *
+ *      An INVALID_OPERATION error is generated by
GetProgramInterfaceiv,
+ *      GetProgramResourceIndex, GetProgramResourceName,
GetProgramResourceiv,
+ *      GetProgramResourceLocation, and
GetProgramResourceLocationIndex if
+ *      <program> is the name of a shader object.
+ *
+ *      [...]
+ *
+ *      INVALID_ENUM is generated by GetProgramResourceIndex if
+ *      <programInterface> is ATOMIC_COUNTER_BUFFER."
+ */
+
+#include "piglit-util-gl.h"
+#include "common.h"
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+
+    config.supports_gl_core_version = 32;
+
+PIGLIT_GL_TEST_CONFIG_END
+
+/* Naming conventions, from the GL_ARB_program_interface_query
extension:
+ *
+ * "When building a list of active variable or interface blocks,
resources
+ * with aggregate types (such as arrays or structures) may produce
multiple
+ * entries in the active resource list for the corresponding interface.
+ * Additionally, each active variable, interface block, or subroutine
in the
+ * list is assigned an associated name string that can be used by
+ * applications to refer to the resources.  For interfaces involving
+ * variables, interface blocks, or subroutines, the entries of active
+ * resource lists are generated as follows:
+ *
+ *  * For an active variable declared as a single instance of a basic
type,
+ *    a single entry will be generated, using the variable name from the
+ *    shader source.
+ *
+ *  * For an active variable declared as an array of basic types, a
single
+ *    entry will be generated, with its name string formed by
concatenating
+ *    the name of the array and the string "[0]".
+ *
+ *  * For an active variable declared as a structure, a separate
entry will
+ *    be generated for each active structure member.  The name of
each entry
+ *    is formed by concatenating the name of the structure, the "."
+ *    character, and the name of the structure member.  If a structure
+ *    member to enumerate is itself a structure or array, these
enumeration
+ *    rules are applied recursively.
+ *
+ *  * For an active variable declared as an array of an aggregate
data type
+ *    (structures or arrays), a separate entry will be generated for
each
+ *    active array element, unless noted immediately below.  The name of
+ *    each entry is formed by concatenating the name of the array,
the "["
+ *    character, an integer identifying the element number, and the "]"
+ *    character.  These enumeration rules are applied recursively,
treating
+ *    each enumerated array element as a separate active variable.
+ *
+ *  * For an active shader storage block member declared as an array, an
+ *    entry will be generated only for the first array element,
regardless
+ *    of its type.  For arrays of aggregate types, the enumeration
rules are
+ *    applied recursively for the single enumerated array element.
+ *
+ *  * For an active interface block not declared as an array of block
+ *    instances, a single entry will be generated, using the block
name from
+ *    the shader source.
+ *
+ *  * For an active interface block declared as an array of instances,
+ *    separate entries will be generated for each active instance.
The name
+ *    of the instance is formed by concatenating the block name, the "["
+ *    character, an integer identifying the instance number, and the "]"
+ *    character.
+ *
+ *  * For an active subroutine, a single entry will be generated,
using the
+ *    subroutine name from the shader source.
+ *
+ * When an integer array element or block instance number is part of
the name
+ * string, it will be specified in decimal form without a "+" or "-"
sign or
+ * any extra leading zeroes.  Additionally, the name string will not
include
+ * white space anywhere in the string.
+ */
+
+struct subtest_index_t {
+    const char *vs_text;
+
+    GLenum programInterface;
+    const char *name;
+    GLint expect_value; /* 0 == any number >= 0, -1 == INVALID_INDEX */
+    GLenum expected_error;
+
+    const char *programInterface_str;
+    const char *error_str;
+};
+
+#define ST(vs_text, programInterface, name, value, error) { \
+    (vs_text), (programInterface), (name), (value), (error), \
+    #programInterface, #error \
+}
+
+/* Test for arrays of arrays */
+static const struct subtest_index_t index_subtests[] = {
+ ST(vs_empty,      GL_ATOMIC_COUNTER_BUFFER,              "dummy",
-1, GL_INVALID_ENUM),
+ ST(vs_empty,                    GL_UNIFORM,              "dummy",
-1, GL_NO_ERROR),
+ ST(vs_empty,                       GL_TRUE,           "vs_input",
0, GL_INVALID_ENUM),
+ ST(vs_array,              GL_PROGRAM_INPUT,           "vs_input",
0, GL_NO_ERROR),
+ ST(vs_array,              GL_PROGRAM_INPUT,        "vs_input[0]",
0, GL_NO_ERROR),
+ ST(vs_array,              GL_PROGRAM_INPUT,        "vs_input[1]",
-1, GL_NO_ERROR),
+ ST(vs_array,                    GL_UNIFORM,              "hello",
-1, GL_NO_ERROR),
+ ST(vs_array,                    GL_UNIFORM,        "sa[0].hello",
0, GL_NO_ERROR),
+ ST(vs_array,                    GL_UNIFORM,        "sa[0].world",
0, GL_NO_ERROR),
+ ST(vs_array,                    GL_UNIFORM,     "sa[0].world[0]",
0, GL_NO_ERROR),
+ ST(vs_array,                    GL_UNIFORM,        "sa[1].hello",
-1, GL_NO_ERROR),
+ ST( vs_aofa,              GL_PROGRAM_INPUT,          "vs_input2",
-1, GL_NO_ERROR),
+ ST( vs_aofa,              GL_PROGRAM_INPUT,       "vs_input2[0]",
0, GL_NO_ERROR),
+ ST( vs_aofa,              GL_PROGRAM_INPUT,    "vs_input2[0][0]",
0, GL_NO_ERROR),
+ ST( vs_aofa,              GL_PROGRAM_INPUT,    "vs_input2[1][0]",
-1, GL_NO_ERROR),
+ ST( vs_aofa,              GL_PROGRAM_INPUT,    "vs_input2[0][1]",
-1, GL_NO_ERROR),

I'm not sure if "vs_input2[0][1]" is legal input because vs_input2 is
declared like "vs_input2[2][2]", so it is not exact match of the name
and it would be not be if [0] would be appended to it.

In my understanding the last array index given must be 0 or it must be
omitted, meaning you would give vs_input2[2] or vs_input[2][0].

Gah, I got fooled (again and again) by this spec. It is not error condition and GL_INVALID_INDEX is returned, just like you assume there with '-1', so, everythings fine :)

Thanks a lot, this is much better than the initial test I wrote for the function;

Reviewed-by: Tapani Pälli <tapani.pa...@intel.com>


Issue 8 in the spec says like this:

"RESOLVED:  We only accept entries of the form "a[2][1][0]" or
"a[2][1]", which is consistent with the existing rules that only allow
applications to omit the last index of a bottom-level array that has
been rolled up."

// Tapani
_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/piglit
_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to