[Piglit] [PATCH 3/4] program_interface_query: add tests for getprogramresourceindex

Martin Peres martin.peres at linux.intel.com
Thu Mar 26 03:52:34 PDT 2015


On 26/03/15 12:50, Tapani Pälli wrote:
> 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.peres at 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 :)

Hehe, indeed. But now that you mention it, I forgot why 
"vs_input2[1][0]" was supposed to fail...

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

You are welcome!

>
> Reviewed-by: Tapani Pälli <tapani.palli at 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 at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/piglit



More information about the Piglit mailing list