[Mesa-dev] [PATCH v2] main: Remove interface block array index for doing the name comparison

Tapani Pälli tapani.palli at intel.com
Mon Oct 26 03:54:00 PDT 2015



On 10/26/2015 12:45 PM, Samuel Iglesias Gonsálvez wrote:
>
>
> 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).

Was just about to comment on this, no booleans required. The problem 
here is that find_name function was broken for names which contained the 
array brackets.

This patch (with changes to commit message) is

Reviewed-by: Tapani Pälli <tapani.palli at intel.com>



> 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