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

Timothy Arceri t_arceri at yahoo.com.au
Thu Jul 30 04:59:41 PDT 2015


On Thu, 2015-07-30 at 14:21 +0300, Tapani Pälli wrote:
> 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.

Not a problem. I would rather you be paranoid as it means I'm less likely to
break something. Hopefully this is a step towards being less fragile.


> 
> > > 
> > > 
> > > 
> > > > > 
> > > > > 
> > > > > > 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