[Piglit] [PATCH] shader_runner: fix uniform array name lookups
Tapani
tapani.palli at intel.com
Wed Mar 4 07:31:57 PST 2015
On 03/04/2015 05:07 PM, Ilia Mirkin wrote:
> On Wed, Mar 4, 2015 at 9:58 AM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
>> On Wed, Mar 4, 2015 at 4:53 AM, Arthur Huillet <arthur.huillet at free.fr> wrote:
>>> From: Arthur Huillet <ahuillet at nvidia.com>
>>>
>>> Don't look up uniform names for non-zero array elements, as this is illegal per GL4.5.
>>>
>>> From the discussion of GetProgramResourceIndex in the GL4.5 spec:
>>>
>>> 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.
>> Hm, and the spec goes on to define GetUniformIndices in terms of
>> GetProgramResourceIndex...
>>
>> What does this say about a[3].b[75].c[2] ? Do they all have to be 0
>> and you have to retrieve all 3 strides? If so, your implementation
>> isn't quite doing that.
> Also I'm having a ton of trouble parsing the meaning of
>
> """
> 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.
> """
>
> It's unclear to me that it means what you claim it means in the first
> place. Ian, as the resident GL and UBO expert, care to comment? :)
IMO Arthur's interpretation is correct. I had to read this many many
times while writing test for GetProgramResourceIndex to get it, the
"a[1]" example seems misleading at first. GL_ARB_array_of_arrays is
special case explained in GL_ARB_program_interface_query spec:
"For a uniform array such as: uniform vec4 a[5][4][3]; we enumerate
twenty different entries ("a[0][0][0]" through "a[4][3][0]"), ..."
> -ilia
>
>>> Instead, strip the "[xxx]" part of the name for the lookup.
>>>
>>> The NVIDIA proprietary driver enforces this rule of the specification, while Mesa
>>> is more permissive. Piglit shouldn't rely on the implementation being lax.
>>>
>>> Signed-off-by: Arthur Huillet <ahuillet at nvidia.com>
>>> ---
>>> tests/shaders/shader_runner.c | 33 ++++++++++++++++++++++++++-------
>>> 1 file changed, 26 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/tests/shaders/shader_runner.c b/tests/shaders/shader_runner.c
>>> index c193de9..22a9828 100644
>>> --- a/tests/shaders/shader_runner.c
>>> +++ b/tests/shaders/shader_runner.c
>>> @@ -1227,11 +1227,12 @@ check_double_support(void)
>>> * the data. If the uniform is not in a uniform block, returns false.
>>> */
>>> bool
>>> -set_ubo_uniform(const char *name, const char *type, const char *line, int ubo_array_index)
>>> +set_ubo_uniform(char *name, const char *type, const char *line, int ubo_array_index)
>>> {
>>> GLuint uniform_index;
>>> GLint block_index;
>>> GLint offset;
>>> + GLint array_index;
>>> char *data;
>>> float f[16];
>>> double d[16];
>>> @@ -1242,7 +1243,29 @@ set_ubo_uniform(const char *name, const char *type, const char *line, int ubo_ar
>>> if (!num_uniform_blocks)
>>> return false;
>>>
>>> - glGetUniformIndices(prog, 1, &name, &uniform_index);
>>> + /* if the uniform is an array, strip the index, as GL
>>> + prevents non-zero indexes from matching a name */
>>> + if (name[name_len - 1] == ']') {
>>> + int i;
>>> +
>>> + for (i = name_len - 1; (i > 0) && isdigit(name[i-1]); --i)
>>> + /* empty */;
>>> +
>>> + array_index = strtol(&name[i], NULL, 0);
>>> +
>>> + if (i) {
>>> + i--;
>>> + if (name[i] != '[') {
>>> + printf("cannot parse uniform \"%s\"\n", name);
>>> + piglit_report_result(PIGLIT_FAIL);
>>> + }
>>> + name[i] = 0;
>>> + }
>>> +
>>> + }
>>> +
>>> +
>>> + glGetUniformIndices(prog, 1, (const char **)&name, &uniform_index);
>>> if (uniform_index == GL_INVALID_INDEX) {
>>> printf("cannot get index of uniform \"%s\"\n", name);
>>> piglit_report_result(PIGLIT_FAIL);
>>> @@ -1265,14 +1288,10 @@ set_ubo_uniform(const char *name, const char *type, const char *line, int ubo_ar
>>>
>>> if (name[name_len - 1] == ']') {
>>> GLint stride;
>>> - int i;
>>> -
>>> - for (i = name_len - 1; (i > 0) && isdigit(name[i-1]); --i)
>>> - /* empty */;
>>>
>>> glGetActiveUniformsiv(prog, 1, &uniform_index,
>>> GL_UNIFORM_ARRAY_STRIDE, &stride);
>>> - offset += stride * strtol(&name[i], NULL, 0);
>>> + offset += stride * array_index;
>>> }
>>>
>>> glBindBuffer(GL_UNIFORM_BUFFER,
>>> --
>>> 2.3.0
>>> _______________________________________________
>>> Piglit mailing list
>>> Piglit at lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/piglit
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20150304/3676e1a3/attachment.html>
More information about the Piglit
mailing list