[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