[Mesa-dev] [PATCH v2] main: Remove interface block array index for doing the name comparison
Samuel Iglesias Gonsálvez
siglesias at igalia.com
Mon Oct 26 03:45:20 PDT 2015
On 26/10/15 11:38, Samuel Iglesias Gonsalvez wrote:
> From ARB_program_query_interface spec:
>
> "uint GetProgramResourceIndex(uint program, enum programInterface,
> const char *name);
> [...]
> 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. [...]"
>
> "A string provided to GetProgramResourceLocation or
> GetProgramResourceLocationIndex is considered to match an active variable
> if:
> [...]
> * if the string identifies the base name of an active array, where the
> string would exactly match the name of the variable if the suffix
> "[0]" were appended to the string;
> [...]
> "
>
> But this is only happening on those ARB_program_query_interface's queries.
> For the rest of specs we need to keep old behavior. For that reason,
> arb_program_interface_query boolean is added to the affected functions.
>
Forgot to remove this paragraph ^ from commit log. I will do it before
pushing it to master or before sending a v3 (if needed).
Sam
> Fixes the following two dEQP-GLES31 tests:
>
> dEQP-GLES31.functional.program_interface_query.shader_storage_block.resource_list.block_array
> dEQP-GLES31.functional.program_interface_query.shader_storage_block.resource_list.block_array_single_element
>
> v2:
> - Add AoA support (Timothy)
> - Apply it too for GetUniformLocation(), GetUniformName() and others
> because ARB_program_interface_query says that they are equivalent
> to GetProgramResourceLocation() and GetProgramResourceName() (Tapani)
>
> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> Cc: Tapani Pälli <tapani.palli at intel.com>
> ---
> src/mesa/main/shader_query.cpp | 43 +++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 42 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp
> index b0707a4..a0514b0 100644
> --- a/src/mesa/main/shader_query.cpp
> +++ b/src/mesa/main/shader_query.cpp
> @@ -543,8 +543,49 @@ _mesa_program_resource_find_name(struct gl_shader_program *shProg,
> /* Resource basename. */
> const char *rname = _mesa_program_resource_name(res);
> unsigned baselen = strlen(rname);
> + unsigned baselen_without_array_index = baselen;
> + const char *rname_last_square_bracket = strrchr(rname, '[');
> + bool found = false;
> + bool rname_has_array_index_zero = false;
> + /* From ARB_program_interface_query spec:
> + *
> + * "uint GetProgramResourceIndex(uint program, enum programInterface,
> + * const char *name);
> + * [...]
> + * 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. [...]"
> + *
> + * "A string provided to GetProgramResourceLocation or
> + * GetProgramResourceLocationIndex is considered to match an active variable
> + * if:
> + *
> + * * the string exactly matches the name of the active variable;
> + *
> + * * if the string identifies the base name of an active array, where the
> + * string would exactly match the name of the variable if the suffix
> + * "[0]" were appended to the string; [...]"
> + */
> + /* Remove array's index from interface block name comparison only if
> + * array's index is zero and the resulting string length is the same
> + * than the provided name's length.
> + */
> + if (rname_last_square_bracket) {
> + baselen_without_array_index -= strlen(rname_last_square_bracket);
> + rname_has_array_index_zero =
> + (strncmp(rname_last_square_bracket, "[0]\0", 4) == 0) &&
> + (baselen_without_array_index == strlen(name));
> + }
> +
> + if (strncmp(rname, name, baselen) == 0)
> + found = true;
> + else if (rname_has_array_index_zero &&
> + strncmp(rname, name, baselen_without_array_index) == 0)
> + found = true;
>
> - if (strncmp(rname, name, baselen) == 0) {
> + if (found) {
> switch (programInterface) {
> case GL_UNIFORM_BLOCK:
> case GL_SHADER_STORAGE_BLOCK:
>
More information about the mesa-dev
mailing list