[Piglit] [PATCH 4/4] program_interface_query: add tests for getprogramresourcename

Tapani Pälli tapani.palli at intel.com
Thu Mar 26 02:01:11 PDT 2015



On 03/26/2015 10:58 AM, Martin Peres wrote:
>
>
> On 26/03/15 10:45, Tapani Pälli wrote:
>> Hi;
>>
>> starting with the shortest .. :)
>>
>> I have one addition to the test, after linking try out giving NULL for
>> the name field:
>>
>> glGetProgramResourceName(prog, GL_UNIFORM, pos, 0, &length, NULL);
>
> This is not really in the spec, hence why I did not add it. Pointers
> should always be valid.

Yeah I tried to search for 'general null check/error' from specs but it 
does not seem to exist, it's a bit extra checking but for robustness 
sake it's good to have.

> Anyway, better catch a bad implementation so I added it:
>
> diff --git
> a/tests/spec/arb_program_interface_query/getprogramresourcename.c
> b/tests/spec/arb_program_interface_query/getprogramresourcename.c
> index 9db705e..7dc3195 100755
> --- a/tests/spec/arb_program_interface_query/getprogramresourcename.c
> +++ b/tests/spec/arb_program_interface_query/getprogramresourcename.c
> @@ -155,6 +155,12 @@ piglit_display(void)
>          piglit_report_subtest_result(local ? PIGLIT_PASS : PIGLIT_FAIL,
>                                       "size == 0");
>
> +       glGetProgramResourceName(prog, GL_UNIFORM, pos, 0, &length, NULL);
> +       local = piglit_check_gl_error(GL_NO_ERROR);
> +       pass = pass && local;
> +       piglit_report_subtest_result(local ? PIGLIT_PASS : PIGLIT_FAIL,
> +                                    "NULL name");
> +
>          if
> (piglit_is_extension_supported("GL_ARB_shader_atomic_counters")) {
>                  glGetProgramResourceName(prog,
> GL_ATOMIC_COUNTER_BUFFER, 0,
>                                           100, &length, name);
>
>>
>>
>> With this addition;
>> Reviewed-by: Tapani Pälli <tapani.palli at intel.com>
>
> Added too, thanks.
>>
>>
>> On 03/25/2015 06:01 PM, Martin Peres wrote:
>>> Tests the error paths of GetProgramResourceName
>>>
>>> Signed-off-by: Martin Peres <martin.peres at linux.intel.com>
>>> ---
>>>   tests/all.py                                       |   1 +
>>>   .../arb_program_interface_query/CMakeLists.gl.txt  |   1 +
>>>   .../getprogramresourcename.c                       | 177
>>> +++++++++++++++++++++
>>>   3 files changed, 179 insertions(+)
>>>   create mode 100755
>>> tests/spec/arb_program_interface_query/getprogramresourcename.c
>>>
>>> diff --git a/tests/all.py b/tests/all.py
>>> index 170d5b8..d0b4b09 100755
>>> --- a/tests/all.py
>>> +++ b/tests/all.py
>>> @@ -2276,6 +2276,7 @@ with profile.group_manager(
>>>       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)
>>> +    g(['arb_program_interface_query-getprogramresourcename'],
>>> 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 8b3bbd9..2508342 100755
>>> --- a/tests/spec/arb_program_interface_query/CMakeLists.gl.txt
>>> +++ b/tests/spec/arb_program_interface_query/CMakeLists.gl.txt
>>> @@ -13,3 +13,4 @@ piglit_add_executable
>>> (arb_program_interface_query-resource-location resource-lo
>>>   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)
>>> +piglit_add_executable
>>> (arb_program_interface_query-getprogramresourcename
>>> getprogramresourcename.c)
>>> diff --git
>>> a/tests/spec/arb_program_interface_query/getprogramresourcename.c
>>> b/tests/spec/arb_program_interface_query/getprogramresourcename.c
>>> new file mode 100755
>>> index 0000000..9db705e
>>> --- /dev/null
>>> +++ b/tests/spec/arb_program_interface_query/getprogramresourcename.c
>>> @@ -0,0 +1,177 @@
>>> +/*
>>> + * 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 getprogramresourcename.c
>>> + *
>>> + * Tests the error cases of the GetProgramResourceName interface.
>>> The real
>>> + * functional test is resource-query.
>>> + *
>>> + * From the GL_ARB_program_interface_query spec:
>>> + *      "The command
>>> + *
>>> + *      void GetProgramResourceName(uint program, enum
>>> programInterface,
>>> + *                                  uint index, sizei bufSize, sizei
>>> *length,
>>> + *                                  char *name);
>>> + *
>>> + *      returns the name string assigned to the single active
>>> resource with an
>>> + *      index of <index> in the interface <programInterface> of
>>> program object
>>> + *      <program>.  The error INVALID_VALUE is generated if <index>
>>> is greater
>>> + *      than or equal to the number of entries in the active
>>> resource list for
>>> + *      <programInterface>.  The error INVALID_ENUM is generated if
>>> + *      <programInterface> is ATOMIC_COUNTER_BUFFER, since active
>>> atomic counter
>>> + *      buffer resources are not assigned name strings.
>>> + *
>>> + *      The name string assigned to the active resource identified
>>> by <index> is
>>> + *      returned as a null-terminated string in <name>. The actual
>>> number of
>>> + *      characters written into <name>, excluding the null
>>> terminator, is
>>> + *      returned in <length>.  If <length> is NULL, no length is
>>> returned. The
>>> + *      maximum number of characters that may be written into
>>> <name>, including
>>> + *      the null terminator, is specified by <bufSize>. If the
>>> length of the
>>> + *      name string (including the null terminator) is greater than
>>> <bufSize>,
>>> + *      the first <bufSize>-1 characters of the name string will be
>>> written to
>>> + *      <name>, followed by a null terminator.  If <bufSize> is
>>> zero, no error
>>> + *      will be generated but no characters will be written to
>>> <name>.  The
>>> + *      length of the longest name string for <programInterface>,
>>> including a
>>> + *      null terminator, can be queried by calling
>>> GetProgramInterfaceiv with a
>>> + *      <pname> of MAX_NAME_LENGTH.
>>> + *
>>> + *      [...]
>>> + *
>>> + *      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_VALUE is generated by GetProgramResourceName if
>>> <index> is
>>> + *      greater than or equal to the number of entries in the active
>>> resource
>>> + *      list for <programInterface>.
>>> + *
>>> + *      INVALID_ENUM is generated by GetProgramResourceName 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
>>> +
>>> +void
>>> +piglit_init(int argc, char **argv)
>>> +{
>>> +    piglit_require_extension("GL_ARB_program_interface_query");
>>> +}
>>> +
>>> +enum piglit_result
>>> +piglit_display(void)
>>> +{
>>> +    GLsizei length;
>>> +    bool pass = true, local;
>>> +    GLuint shader, prog;
>>> +    GLchar name[100];
>>> +    GLint pos;
>>> +
>>> +    /* test using an unexisting program ID */
>>> +    glGetProgramResourceName(1337, GL_UNIFORM, 0, 100, &length, name);
>>> +    local = piglit_check_gl_error(GL_INVALID_VALUE);
>>> +    pass = pass && local;
>>> +    piglit_report_subtest_result(local ? PIGLIT_PASS : PIGLIT_FAIL,
>>> +                     "Invalid program (undefined ID)");
>>> +
>>> +    /* test using a shader ID */
>>> +    shader = piglit_compile_shader_text(GL_VERTEX_SHADER, vs_empty);
>>> +    glGetProgramResourceName(shader, GL_UNIFORM, 0, 100, &length,
>>> name);
>>> +    local = piglit_check_gl_error(GL_INVALID_OPERATION);
>>> +    pass = pass && local;
>>> +    piglit_report_subtest_result(local ? PIGLIT_PASS : PIGLIT_FAIL,
>>> +                     "Invalid program (call on shader)");
>>> +
>>> +    prog = piglit_build_simple_program(vs_array, NULL);
>>> +    if (!piglit_link_check_status(prog)) {
>>> +        glDeleteProgram(prog);
>>> +        return PIGLIT_FAIL;
>>> +    }
>>> +
>>> +    glGetProgramResourceName(prog, GL_TRUE, 0, 100, &length, name);
>>> +    local = piglit_check_gl_error(GL_INVALID_ENUM);
>>> +    pass = pass && local;
>>> +    piglit_report_subtest_result(local ? PIGLIT_PASS : PIGLIT_FAIL,
>>> +                     "invalid programInterface");
>>> +
>>> +    glGetProgramResourceName(prog, GL_UNIFORM, -1, 100, &length, name);
>>> +    local = piglit_check_gl_error(GL_INVALID_VALUE);
>>> +    pass = pass && local;
>>> +    piglit_report_subtest_result(local ? PIGLIT_PASS : PIGLIT_FAIL,
>>> +                     "idx < 0");
>>> +
>>> +    glGetProgramResourceName(prog, GL_UNIFORM, 1337, 100, &length,
>>> name);
>>> +    local = piglit_check_gl_error(GL_INVALID_VALUE);
>>> +    pass = pass && local;
>>> +    piglit_report_subtest_result(local ? PIGLIT_PASS : PIGLIT_FAIL,
>>> +                     "idx > #entries");
>>> +
>>> +    pos = glGetProgramResourceIndex(prog, GL_UNIFORM, "sa[0].world");
>>> +
>>> +    glGetProgramResourceName(prog, GL_UNIFORM, pos, -1, &length, name);
>>> +    local = piglit_check_gl_error(GL_INVALID_VALUE);
>>> +    pass = pass && local;
>>> +    piglit_report_subtest_result(local ? PIGLIT_PASS : PIGLIT_FAIL,
>>> +                     "size < 0");
>>> +
>>> +    glGetProgramResourceName(prog, GL_UNIFORM, pos, 0, &length, name);
>>> +    local = piglit_check_gl_error(GL_NO_ERROR);
>>> +    pass = pass && local;
>>> +    piglit_report_subtest_result(local ? PIGLIT_PASS : PIGLIT_FAIL,
>>> +                     "size == 0");
>>> +
>>> +    if
>>> (piglit_is_extension_supported("GL_ARB_shader_atomic_counters")) {
>>> +        glGetProgramResourceName(prog, GL_ATOMIC_COUNTER_BUFFER, 0,
>>> +                     100, &length, name);
>>> +        local = piglit_check_gl_error(GL_INVALID_ENUM);
>>> +        pass = pass && local;
>>> +        piglit_report_subtest_result(local ? PIGLIT_PASS : PIGLIT_FAIL,
>>> +                         "GL_ATOMIC_COUNTER_BUFFER");
>>> +    } else {
>>> +        piglit_report_subtest_result(PIGLIT_SKIP,
>>> +                         "GL_ATOMIC_COUNTER_BUFFER");
>>> +    }
>>> +
>>> +    glGetProgramResourceName(prog, GL_UNIFORM, pos, 0, NULL, name);
>>> +    local = piglit_check_gl_error(GL_NO_ERROR);
>>> +    pass = pass && local;
>>> +    piglit_report_subtest_result(local ? PIGLIT_PASS : PIGLIT_FAIL,
>>> +                     "length == NULL");
>>> +
>>> +    return pass ? PIGLIT_PASS : PIGLIT_FAIL;
>>> +}
>>>
>


More information about the Piglit mailing list