[Mesa-dev] [PATCH 01/20] mesa: fix and simplify resource query for arrays

Tapani Pälli tapani.palli at intel.com
Thu Jul 30 04:21:20 PDT 2015


On 07/30/2015 12:26 PM, Timothy Arceri wrote:
> On Thu, 2015-07-30 at 11:07 +0300, Tapani Pälli wrote:
>> On 07/30/2015 08:56 AM, Tapani Pälli wrote:
>>> On 07/30/2015 08:50 AM, Timothy Arceri wrote:
>>>> On 30 July 2015 3:27:41 pm AEST, "Tapani Pälli"
>>>> <tapani.palli at intel.com> wrote:
>>>>> On 07/30/2015 08:25 AM, Tapani Pälli wrote:
>>>>>> Hi Timothy;
>>>>>>
>>>>>> Would it be OK for you to wait a bit with these 3 first patches? I'm
>>>>>> currently going through failing PIQ tests and I have a 1 line fix to
>>>>>> valid_program_resource_index_name() that together with your patch
>>>>>> "glsl: set stage flag for structs and arrays in resource list" will
>>>>>> fix all of the failing "ES31-CTS.program_interface_query.uniform"
>>>>>> tests. Frankly I don't see the value of such a big refactor
>>>>>> necessary
>>>>>> for this.
>>>> The value is in removing almost 200 lines of complicated code trying
>>>> to solve the same problem in different ways. How its this not a good
>>>> thing?
>>>>
>>>> Also once this is done we can also work towards removing UniformHash
>>>> from Mesa.
>>> Sure, I agree that removing lots of code is a good thing. I just don't
>>> quite yet understand how some of this will work, many of the removed
>>> checks were there for a good reason (faling tests!).
>>>   Just to make
>>> sure, did you run Piglit and conformance without regressions? Anyway,
>>> I will read through your changes and think about this more.
>>>
>> Replying myself, no regressions observed :)
> Yep :) Tested as you can see. I didn't expect to fix anything when I made the
> change it was just a tidy up before getting the AoA tests to pass. The fixes
> were a nice bonus.
>
>> Yep, it seems that parse_program_resource_name() tackles the cases. I
>> will do some further testing, particularly on the 'gl_VertexIDMESA'
>> special case and review the patches during today or tomorrow.
>>
> Yeah parse_program_resource_name() is a bit more robust than the other
> functions and by using it we get the index for free :)
>
> The old code required the gl_VertexIDMESA special case because it was
> comparing the name with the the ir var name in get_matching_index().
>
> _mesa_program_resource_name() already handles the special case for us so we
> can just use the name it returns in _mesa_program_resource_find_name() for our
> compares.

Yep, I gdb stepped these through to make sure :) Sorry about the 
paranoia before, this has been a bit fragile area and would not like to 
break it.

>>
>>
>>
>>>>
>>>>
>>>>> Woops, make it "ES31-CTS.program_interface_query.uniform-types", not
>>>>> "ES31-CTS.program_interface_query.uniform". It looks to me that most
>>>>> tests fail just because of not figuring out the correct index for the
>>>>> resource and that can be fixed by a valid_program_resource_index_name
>>>>> change.
>>>>>
>>>>>
>>>>>> On 07/29/2015 04:56 PM, Timothy Arceri wrote:
>>>>>>> This removes the need for multiple functions designed to validate
>>>>>>> an
>>>>>>> array
>>>>>>> subscript and replaces them with a call to a single function.
>>>>>>>
>>>>>>> The change also means that validation is now only done once and
>>>>>>> the
>>>>>>> index
>>>>>>> is retrived at the same time, as a result the getUniformLocation
>>>>> code
>>>>>>> can
>>>>>>> be simplified saving an extra hash table lookup (and yet another
>>>>>>> validation call).
>>>>>>>
>>>>>>> This chage also fixes some tests in:
>>>>>>> ES31-CTS.program_interface_query.uniform
>>>>>>>
>>>>>>> V3: rebase on subroutines, and move the resource index array == 0
>>>>>>> check into _mesa_GetProgramResourceIndex() to simplify things
>>>>> further
>>>>>>> V2: Fix bounds checks for program input/output, split unrelated
>>>>>>> comment fix
>>>>>>> and _mesa_get_uniform_location() removal into their own patch.
>>>>>>>
>>>>>>> Cc: Tapani Pälli <tapani.palli at intel.com>
>>>>>>> ---
>>>>>>>     src/mesa/main/program_resource.c |  14 ++--
>>>>>>>     src/mesa/main/shader_query.cpp   | 174
>>>>>>> +++++++++++++++++++++------------------
>>>>>>>     src/mesa/main/shaderapi.c        |   2 +-
>>>>>>>     src/mesa/main/shaderapi.h        |   3 +-
>>>>>>>     src/mesa/main/uniforms.c         |   5 +-
>>>>>>>     5 files changed, 106 insertions(+), 92 deletions(-)
>>>>>>>
>>>>>>> diff --git a/src/mesa/main/program_resource.c
>>>>>>> b/src/mesa/main/program_resource.c
>>>>>>> index 641ef22..fdbd5b3 100644
>>>>>>> --- a/src/mesa/main/program_resource.c
>>>>>>> +++ b/src/mesa/main/program_resource.c
>>>>>>> @@ -229,6 +229,7 @@ _mesa_GetProgramResourceIndex(GLuint program,
>>>>>>> GLenum programInterface,
>>>>>>>                                   const GLchar *name)
>>>>>>>     {
>>>>>>>        GET_CURRENT_CONTEXT(ctx);
>>>>>>> +   unsigned array_index = 0;
>>>>>>>        struct gl_program_resource *res;
>>>>>>>        struct gl_shader_program *shProg =
>>>>>>>           _mesa_lookup_shader_program_err(ctx, program,
>>>>>>> @@ -268,13 +269,10 @@ _mesa_GetProgramResourceIndex(GLuint
>>>>>>> program,
>>>>>>> GLenum programInterface,
>>>>>>>        case GL_PROGRAM_OUTPUT:
>>>>>>>        case GL_UNIFORM:
>>>>>>>        case GL_TRANSFORM_FEEDBACK_VARYING:
>>>>>>> -      /* Validate name syntax for array variables */
>>>>>>> -      if (!valid_program_resource_index_name(name))
>>>>>>> -         return GL_INVALID_INDEX;
>>>>>>> -      /* fall-through */
>>>>>>>        case GL_UNIFORM_BLOCK:
>>>>>>> -      res = _mesa_program_resource_find_name(shProg,
>>>>>>> programInterface, name);
>>>>>>> -      if (!res)
>>>>>>> +      res = _mesa_program_resource_find_name(shProg,
>>>>>>> programInterface, name,
>>>>>>> + &array_index);
>>>>>>> +      if (!res || array_index > 0)
>>>>>>>              return GL_INVALID_INDEX;
>>>>>>>             return _mesa_program_resource_index(shProg, res);
>>>>>>> @@ -403,7 +401,7 @@ _mesa_GetProgramResourceLocation(GLuint
>>>>>>> program,
>>>>>>> GLenum programInterface,
>>>>>>>        struct gl_shader_program *shProg =
>>>>>>>           lookup_linked_program(program,
>>>>> "glGetProgramResourceLocation");
>>>>>>>     -   if (!shProg || !name || invalid_array_element_syntax(name))
>>>>>>> +   if (!shProg || !name)
>>>>>>>           return -1;
>>>>>>>          /* Validate programInterface. */
>>>>>>> @@ -453,7 +451,7 @@ _mesa_GetProgramResourceLocationIndex(GLuint
>>>>>>> program, GLenum programInterface,
>>>>>>>        struct gl_shader_program *shProg =
>>>>>>>           lookup_linked_program(program,
>>>>>>> "glGetProgramResourceLocationIndex");
>>>>>>>     -   if (!shProg || !name || invalid_array_element_syntax(name))
>>>>>>> +   if (!shProg || !name)
>>>>>>>           return -1;
>>>>>>>          /* From the GL_ARB_program_interface_query spec:
>>>>>>> diff --git a/src/mesa/main/shader_query.cpp
>>>>>>> b/src/mesa/main/shader_query.cpp
>>>>>>> index 3e52a09..dd11b81 100644
>>>>>>> --- a/src/mesa/main/shader_query.cpp
>>>>>>> +++ b/src/mesa/main/shader_query.cpp
>>>>>>> @@ -44,7 +44,8 @@ extern "C" {
>>>>>>>       static GLint
>>>>>>>     program_resource_location(struct gl_shader_program *shProg,
>>>>>>> -                          struct gl_program_resource *res, const
>>>>>>> char *name);
>>>>>>> +                          struct gl_program_resource *res, const
>>>>>>> char *name,
>>>>>>> +                          unsigned array_index);
>>>>>>>       /**
>>>>>>>      * Declare convenience functions to return resource data in a
>>>>> given
>>>>>>> type.
>>>>>>> @@ -272,13 +273,15 @@ _mesa_GetAttribLocation(GLhandleARB program,
>>>>>>> const GLcharARB * name)
>>>>>>>        if (shProg->_LinkedShaders[MESA_SHADER_VERTEX] == NULL)
>>>>>>>           return -1;
>>>>>>>     +   unsigned array_index = 0;
>>>>>>>        struct gl_program_resource *res =
>>>>>>> -      _mesa_program_resource_find_name(shProg, GL_PROGRAM_INPUT,
>>>>> name);
>>>>>>> + _mesa_program_resource_find_name(shProg, GL_PROGRAM_INPUT,
>>>>> name,
>>>>>>> + &array_index);
>>>>>>>          if (!res)
>>>>>>>           return -1;
>>>>>>>     -   GLint loc = program_resource_location(shProg, res, name);
>>>>>>> +   GLint loc = program_resource_location(shProg, res, name,
>>>>>>> array_index);
>>>>>>>          /* The extra check against against 0 is made because of
>>>>>>> builtin-attribute
>>>>>>>         * locations that have offset applied. Function
>>>>>>> program_resource_location
>>>>>>> @@ -456,13 +459,15 @@ _mesa_GetFragDataLocation(GLuint program,
>>>>> const
>>>>>>> GLchar *name)
>>>>>>>        if (shProg->_LinkedShaders[MESA_SHADER_FRAGMENT] == NULL)
>>>>>>>           return -1;
>>>>>>>     +   unsigned array_index = 0;
>>>>>>>        struct gl_program_resource *res =
>>>>>>> -      _mesa_program_resource_find_name(shProg, GL_PROGRAM_OUTPUT,
>>>>>>> name);
>>>>>>> +      _mesa_program_resource_find_name(shProg, GL_PROGRAM_OUTPUT,
>>>>> name,
>>>>>>> + &array_index);
>>>>>>>          if (!res)
>>>>>>>           return -1;
>>>>>>>     -   GLint loc = program_resource_location(shProg, res, name);
>>>>>>> +   GLint loc = program_resource_location(shProg, res, name,
>>>>>>> array_index);
>>>>>>>          /* The extra check against against 0 is made because of
>>>>>>> builtin-attribute
>>>>>>>         * locations that have offset applied. Function
>>>>>>> program_resource_location
>>>>>>> @@ -552,39 +557,32 @@ _mesa_program_resource_array_size(struct
>>>>>>> gl_program_resource *res)
>>>>>>>        return 0;
>>>>>>>     }
>>>>>>>     -static int
>>>>>>> -array_index_of_resource(struct gl_program_resource *res,
>>>>>>> -                        const char *name)
>>>>>>> +/**
>>>>>>> + * Checks if array subscript is valid and if so sets array_index.
>>>>>>> + */
>>>>>>> +static bool
>>>>>>> +valid_array_index(const GLchar *name, unsigned *array_index)
>>>>>>>     {
>>>>>>> -   assert(res->Data);
>>>>>>> +   unsigned idx = 0;
>>>>>>> +   const GLchar *out_base_name_end;
>>>>>>>     -   switch (res->Type) {
>>>>>>> -   case GL_PROGRAM_INPUT:
>>>>>>> -   case GL_PROGRAM_OUTPUT:
>>>>>>> -      return get_matching_index(RESOURCE_VAR(res), name);
>>>>>>> -   default:
>>>>>>> -      assert(!"support for resource type not implemented");
>>>>>>> -      return -1;
>>>>>>> -   }
>>>>>>> +   idx = parse_program_resource_name(name, &out_base_name_end);
>>>>>>> +   if (idx < 0)
>>>>>>> +      return false;
>>>>>>> +
>>>>>>> +   if (array_index)
>>>>>>> +      *array_index = idx;
>>>>>>> +
>>>>>>> +   return true;
>>>>>>>     }
>>>>>>>       /* Find a program resource with specific name in given
>>>>> interface.
>>>>>>>      */
>>>>>>>     struct gl_program_resource *
>>>>>>>     _mesa_program_resource_find_name(struct gl_shader_program
>>>>>>> *shProg,
>>>>>>> -                                 GLenum programInterface, const
>>>>> char
>>>>>>> *name)
>>>>>>> +                                 GLenum programInterface, const
>>>>> char
>>>>>>> *name,
>>>>>>> +                                 unsigned *array_index)
>>>>>>>     {
>>>>>>> -   GET_CURRENT_CONTEXT(ctx);
>>>>>>> -   const char *full_name = name;
>>>>>>> -
>>>>>>> -   /* When context has 'VertexID_is_zero_based' set, gl_VertexID
>>>>> has
>>>>>>> been
>>>>>>> -    * lowered to gl_VertexIDMESA.
>>>>>>> -    */
>>>>>>> -   if (name && ctx->Const.VertexID_is_zero_based) {
>>>>>>> -      if (strcmp(name, "gl_VertexID") == 0)
>>>>>>> -         full_name = "gl_VertexIDMESA";
>>>>>>> -   }
>>>>>>> -
>>>>>>>        struct gl_program_resource *res = shProg
>>>>>>> ->ProgramResourceList;
>>>>>>>        for (unsigned i = 0; i < shProg->NumProgramResourceList;
>>>>>>> i++,
>>>>>>> res++) {
>>>>>>>           if (res->Type != programInterface)
>>>>>>> @@ -594,38 +592,46 @@ _mesa_program_resource_find_name(struct
>>>>>>> gl_shader_program *shProg,
>>>>>>>           const char *rname = _mesa_program_resource_name(res);
>>>>>>>           unsigned baselen = strlen(rname);
>>>>>>>     -      switch (programInterface) {
>>>>>>> -      case GL_TRANSFORM_FEEDBACK_VARYING:
>>>>>>> -      case GL_UNIFORM_BLOCK:
>>>>>>> -      case GL_UNIFORM:
>>>>>>> -      case GL_VERTEX_SUBROUTINE_UNIFORM:
>>>>>>> -      case GL_GEOMETRY_SUBROUTINE_UNIFORM:
>>>>>>> -      case GL_FRAGMENT_SUBROUTINE_UNIFORM:
>>>>>>> -      case GL_COMPUTE_SUBROUTINE_UNIFORM:
>>>>>>> -      case GL_TESS_CONTROL_SUBROUTINE_UNIFORM:
>>>>>>> -      case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM:
>>>>>>> -      case GL_VERTEX_SUBROUTINE:
>>>>>>> -      case GL_GEOMETRY_SUBROUTINE:
>>>>>>> -      case GL_FRAGMENT_SUBROUTINE:
>>>>>>> -      case GL_COMPUTE_SUBROUTINE:
>>>>>>> -      case GL_TESS_CONTROL_SUBROUTINE:
>>>>>>> -      case GL_TESS_EVALUATION_SUBROUTINE:
>>>>>>> -         if (strncmp(rname, name, baselen) == 0) {
>>>>>>> +      if (strncmp(rname, name, baselen) == 0) {
>>>>>>> +         switch (programInterface) {
>>>>>>> +         case GL_UNIFORM_BLOCK:
>>>>>>>                 /* Basename match, check if array or struct. */
>>>>>>>                 if (name[baselen] == '\0' ||
>>>>>>>                     name[baselen] == '[' ||
>>>>>>>                     name[baselen] == '.') {
>>>>>>>                    return res;
>>>>>>>                 }
>>>>>>> +            break;
>>>>>>> +         case GL_TRANSFORM_FEEDBACK_VARYING:
>>>>>>> +         case GL_UNIFORM:
>>>>>>> +         case GL_VERTEX_SUBROUTINE_UNIFORM:
>>>>>>> +         case GL_GEOMETRY_SUBROUTINE_UNIFORM:
>>>>>>> +         case GL_FRAGMENT_SUBROUTINE_UNIFORM:
>>>>>>> +         case GL_COMPUTE_SUBROUTINE_UNIFORM:
>>>>>>> +         case GL_TESS_CONTROL_SUBROUTINE_UNIFORM:
>>>>>>> +         case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM:
>>>>>>> +         case GL_VERTEX_SUBROUTINE:
>>>>>>> +         case GL_GEOMETRY_SUBROUTINE:
>>>>>>> +         case GL_FRAGMENT_SUBROUTINE:
>>>>>>> +         case GL_COMPUTE_SUBROUTINE:
>>>>>>> +         case GL_TESS_CONTROL_SUBROUTINE:
>>>>>>> +         case GL_TESS_EVALUATION_SUBROUTINE:
>>>>>>> +            if (name[baselen] == '.') {
>>>>>>> +               return res;
>>>>>>> +            }
>>>>>>> +            /* fall-through */
>>>>>>> +         case GL_PROGRAM_INPUT:
>>>>>>> +         case GL_PROGRAM_OUTPUT:
>>>>>>> +            if (name[baselen] == '\0') {
>>>>>>> +               return res;
>>>>>>> +            } else if (name[baselen] == '[' &&
>>>>>>> +                valid_array_index(name, array_index)) {
>>>>>>> +               return res;
>>>>>>> +            }
>>>>>>> +            break;
>>>>>>> +         default:
>>>>>>> +            assert(!"not implemented for given interface");
>>>>>>>              }
>>>>>>> -         break;
>>>>>>> -      case GL_PROGRAM_INPUT:
>>>>>>> -      case GL_PROGRAM_OUTPUT:
>>>>>>> -         if (array_index_of_resource(res, full_name) >= 0)
>>>>>>> -            return res;
>>>>>>> -         break;
>>>>>>> -      default:
>>>>>>> -         assert(!"not implemented for given interface");
>>>>>>>           }
>>>>>>>        }
>>>>>>>        return NULL;
>>>>>>> @@ -787,19 +793,9 @@ _mesa_get_program_resource_name(struct
>>>>>>> gl_shader_program *shProg,
>>>>>>>       static GLint
>>>>>>>     program_resource_location(struct gl_shader_program *shProg,
>>>>>>> -                          struct gl_program_resource *res, const
>>>>>>> char *name)
>>>>>>> +                          struct gl_program_resource *res, const
>>>>>>> char *name,
>>>>>>> +                          unsigned array_index)
>>>>>>>     {
>>>>>>> -   unsigned index, offset;
>>>>>>> -   int array_index = -1;
>>>>>>> -   long offset_ret;
>>>>>>> -   const GLchar *base_name_end;
>>>>>>> -
>>>>>>> -   if (res->Type == GL_PROGRAM_INPUT || res->Type ==
>>>>>>> GL_PROGRAM_OUTPUT) {
>>>>>>> -      array_index = array_index_of_resource(res, name);
>>>>>>> -      if (array_index < 0)
>>>>>>> -         return -1;
>>>>>>> -   }
>>>>>>> -
>>>>>>>        /* Built-in locations should report GL_INVALID_INDEX. */
>>>>>>>        if (is_gl_identifier(name))
>>>>>>>           return GL_INVALID_INDEX;
>>>>>>> @@ -810,13 +806,22 @@ program_resource_location(struct
>>>>>>> gl_shader_program *shProg,
>>>>>>>         */
>>>>>>>        switch (res->Type) {
>>>>>>>        case GL_PROGRAM_INPUT:
>>>>>>> +      /* If the input is an array, fail if the index is out of
>>>>>>> bounds. */
>>>>>>> +      if (array_index > 0
>>>>>>> +          && array_index >= RESOURCE_VAR(res)->type->length) {
>>>>>>> +         return -1;
>>>>>>> +      }
>>>>>>>           return RESOURCE_VAR(res)->data.location + array_index -
>>>>>>> VERT_ATTRIB_GENERIC0;
>>>>>>>        case GL_PROGRAM_OUTPUT:
>>>>>>> +      /* If the output is an array, fail if the index is out of
>>>>>>> bounds. */
>>>>>>> +      if (array_index > 0
>>>>>>> +          && array_index >= RESOURCE_VAR(res)->type->length) {
>>>>>>> +         return -1;
>>>>>>> +      }
>>>>>>>           return RESOURCE_VAR(res)->data.location + array_index -
>>>>>>> FRAG_RESULT_DATA0;
>>>>>>>        case GL_UNIFORM:
>>>>>>> -      index = _mesa_get_uniform_location(shProg, name, &offset);
>>>>>>> -
>>>>>>> -      if (index == GL_INVALID_INDEX)
>>>>>>> +      /* If the uniform is built-in, fail. */
>>>>>>> +      if (RESOURCE_UNI(res)->builtin)
>>>>>>>              return -1;
>>>>>>>             /* From the GL_ARB_uniform_buffer_object spec:
>>>>>>> @@ -830,17 +835,21 @@ program_resource_location(struct
>>>>>>> gl_shader_program *shProg,
>>>>>>>               RESOURCE_UNI(res)->atomic_buffer_index != -1)
>>>>>>>              return -1;
>>>>>>>     -      /* location in remap table + array element offset */
>>>>>>> -      return RESOURCE_UNI(res)->remap_location + offset;
>>>>>>> -
>>>>>>> +      /* fallthrough */
>>>>>>>        case GL_VERTEX_SUBROUTINE_UNIFORM:
>>>>>>>        case GL_GEOMETRY_SUBROUTINE_UNIFORM:
>>>>>>>        case GL_FRAGMENT_SUBROUTINE_UNIFORM:
>>>>>>>        case GL_COMPUTE_SUBROUTINE_UNIFORM:
>>>>>>>        case GL_TESS_CONTROL_SUBROUTINE_UNIFORM:
>>>>>>>        case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM:
>>>>>>> -      offset_ret = parse_program_resource_name(name,
>>>>> &base_name_end);
>>>>>>> -      return RESOURCE_UNI(res)->remap_location + ((offset_ret !=
>>>>> -1)
>>>>>>> ? offset_ret : 0);
>>>>>>> +      /* If the uniform is an array, fail if the index is out of
>>>>>>> bounds. */
>>>>>>> +      if (array_index > 0
>>>>>>> +          && array_index >= RESOURCE_UNI(res)->array_elements) {
>>>>>>> +         return -1;
>>>>>>> +      }
>>>>>>> +
>>>>>>> +      /* location in remap table + array element offset */
>>>>>>> +      return RESOURCE_UNI(res)->remap_location + array_index;
>>>>>>>        default:
>>>>>>>           return -1;
>>>>>>>        }
>>>>>>> @@ -854,14 +863,16 @@ GLint
>>>>>>>     _mesa_program_resource_location(struct gl_shader_program
>>>>>>> *shProg,
>>>>>>>                                     GLenum programInterface, const
>>>>> char
>>>>>>> *name)
>>>>>>>     {
>>>>>>> +   unsigned array_index = 0;
>>>>>>>        struct gl_program_resource *res =
>>>>>>> -      _mesa_program_resource_find_name(shProg, programInterface,
>>>>> name);
>>>>>>> + _mesa_program_resource_find_name(shProg, programInterface,
>>>>> name,
>>>>>>> + &array_index);
>>>>>>>          /* Resource not found. */
>>>>>>>        if (!res)
>>>>>>>           return -1;
>>>>>>>     -   return program_resource_location(shProg, res, name);
>>>>>>> +   return program_resource_location(shProg, res, name,
>>>>> array_index);
>>>>>>>     }
>>>>>>>       /**
>>>>>>> @@ -873,7 +884,7 @@ _mesa_program_resource_location_index(struct
>>>>>>> gl_shader_program *shProg,
>>>>>>>                                           GLenum programInterface,
>>>>>>> const char *name)
>>>>>>>     {
>>>>>>>        struct gl_program_resource *res =
>>>>>>> -      _mesa_program_resource_find_name(shProg, programInterface,
>>>>> name);
>>>>>>> + _mesa_program_resource_find_name(shProg, programInterface,
>>>>>>> name, NULL);
>>>>>>>          /* Non-existent variable or resource is not referenced by
>>>>>>> fragment stage. */
>>>>>>>        if (!res || !(res->StageReferences & (1 <<
>>>>> MESA_SHADER_FRAGMENT)))
>>>>>>> @@ -949,7 +960,8 @@ get_buffer_property(struct gl_shader_program
>>>>>>> *shProg,
>>>>>>>              for (unsigned i = 0; i < RESOURCE_UBO(res)
>>>>>>> ->NumUniforms;
>>>>>>> i++) {
>>>>>>>                 const char *iname =
>>>>>>> RESOURCE_UBO(res)->Uniforms[i].IndexName;
>>>>>>>                 struct gl_program_resource *uni =
>>>>>>> -               _mesa_program_resource_find_name(shProg,
>>>>>>> GL_UNIFORM,
>>>>>>> iname);
>>>>>>> +               _mesa_program_resource_find_name(shProg,
>>>>>>> GL_UNIFORM,
>>>>>>> iname,
>>>>>>> +                                                NULL);
>>>>>>>                 if (!uni)
>>>>>>>                    continue;
>>>>>>>                 (*val)++;
>>>>>>> @@ -959,7 +971,8 @@ get_buffer_property(struct gl_shader_program
>>>>>>> *shProg,
>>>>>>>              for (unsigned i = 0; i < RESOURCE_UBO(res)
>>>>>>> ->NumUniforms;
>>>>>>> i++) {
>>>>>>>                 const char *iname =
>>>>>>> RESOURCE_UBO(res)->Uniforms[i].IndexName;
>>>>>>>                 struct gl_program_resource *uni =
>>>>>>> -               _mesa_program_resource_find_name(shProg,
>>>>>>> GL_UNIFORM,
>>>>>>> iname);
>>>>>>> +               _mesa_program_resource_find_name(shProg,
>>>>>>> GL_UNIFORM,
>>>>>>> iname,
>>>>>>> +                                                NULL);
>>>>>>>                 if (!uni)
>>>>>>>                    continue;
>>>>>>>                 *val++ =
>>>>>>> @@ -1099,7 +1112,8 @@ _mesa_program_resource_prop(struct
>>>>>>> gl_shader_program *shProg,
>>>>>>>           case GL_PROGRAM_INPUT:
>>>>>>>           case GL_PROGRAM_OUTPUT:
>>>>>>>              *val = program_resource_location(shProg, res,
>>>>>>> - _mesa_program_resource_name(res));
>>>>>>> + _mesa_program_resource_name(res),
>>>>>>> +                                          0);
>>>>>>>              return 1;
>>>>>>>           default:
>>>>>>>              goto invalid_operation;
>>>>>>> diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
>>>>>>> index 0887c68..b702dcd 100644
>>>>>>> --- a/src/mesa/main/shaderapi.c
>>>>>>> +++ b/src/mesa/main/shaderapi.c
>>>>>>> @@ -2229,7 +2229,7 @@ _mesa_GetSubroutineIndex(GLuint program,
>>>>> GLenum
>>>>>>> shadertype,
>>>>>>>        }
>>>>>>>          resource_type = _mesa_shader_stage_to_subroutine(stage);
>>>>>>> -   res = _mesa_program_resource_find_name(shProg, resource_type,
>>>>> name);
>>>>>>> +   res = _mesa_program_resource_find_name(shProg, resource_type,
>>>>>>> name, NULL);
>>>>>>>        if (!res) {
>>>>>>>           _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
>>>>>>>          return -1;
>>>>>>> diff --git a/src/mesa/main/shaderapi.h b/src/mesa/main/shaderapi.h
>>>>>>> index c081f74..0a10191 100644
>>>>>>> --- a/src/mesa/main/shaderapi.h
>>>>>>> +++ b/src/mesa/main/shaderapi.h
>>>>>>> @@ -232,7 +232,8 @@ _mesa_program_resource_index(struct
>>>>>>> gl_shader_program *shProg,
>>>>>>>       extern struct gl_program_resource *
>>>>>>>     _mesa_program_resource_find_name(struct gl_shader_program
>>>>>>> *shProg,
>>>>>>> -                                 GLenum programInterface, const
>>>>> char
>>>>>>> *name);
>>>>>>> +                                 GLenum programInterface, const
>>>>> char
>>>>>>> *name,
>>>>>>> +                                 unsigned *array_index);
>>>>>>>       extern struct gl_program_resource *
>>>>>>>     _mesa_program_resource_find_index(struct gl_shader_program
>>>>> *shProg,
>>>>>>> diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c
>>>>>>> index 6ba746e..ff1df72 100644
>>>>>>> --- a/src/mesa/main/uniforms.c
>>>>>>> +++ b/src/mesa/main/uniforms.c
>>>>>>> @@ -952,7 +952,7 @@ _mesa_GetUniformBlockIndex(GLuint program,
>>>>>>>          struct gl_program_resource *res =
>>>>>>>           _mesa_program_resource_find_name(shProg,
>>>>>>> GL_UNIFORM_BLOCK,
>>>>>>> -                                       uniformBlockName);
>>>>>>> +                                       uniformBlockName, NULL);
>>>>>>>        if (!res)
>>>>>>>           return GL_INVALID_INDEX;
>>>>>>>     @@ -987,7 +987,8 @@ _mesa_GetUniformIndices(GLuint program,
>>>>>>>          for (i = 0; i < uniformCount; i++) {
>>>>>>>           struct gl_program_resource *res =
>>>>>>> -         _mesa_program_resource_find_name(shProg, GL_UNIFORM,
>>>>>>> uniformNames[i]);
>>>>>>> +         _mesa_program_resource_find_name(shProg, GL_UNIFORM,
>>>>>>> uniformNames[i],
>>>>>>> +                                          NULL);
>>>>>>>           uniformIndices[i] = _mesa_program_resource_index(shProg,
>>>>> res);
>>>>>>>        }
>>>>>>>     }
>>>>>> _______________________________________________
>>>>>> mesa-dev mailing list
>>>>>> mesa-dev at lists.freedesktop.org
>>>>>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>> _______________________________________________
>>> mesa-dev mailing list
>>> mesa-dev at lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev



More information about the mesa-dev mailing list