[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