[Piglit] [PATCH] shader_runner: fix uniform array name lookups
Ilia Mirkin
imirkin at alum.mit.edu
Wed Mar 4 06:58:50 PST 2015
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.
>
> 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
More information about the Piglit
mailing list