[Mesa-dev] [PATCH 01/25] mesa/glsl: move ProgramResourceList to gl_shader_program_data

Lionel Landwerlin lionel.g.landwerlin at intel.com
Wed Jan 11 13:08:56 UTC 2017


Looks fine :

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>

On 09/01/17 05:13, Timothy Arceri wrote:
> We also move NumProgramResourceList at the same time.
>
> GLES does interface validation on SSO at runtime so we need to move
> this to be able to switch to storing gl_program pointers in
> CurrentProgram.
> ---
>   src/compiler/glsl/linker.cpp     | 20 +++++++++----------
>   src/mesa/main/mtypes.h           |  8 ++++----
>   src/mesa/main/program_resource.c | 40 ++++++++++++++++++-------------------
>   src/mesa/main/shader_query.cpp   | 43 +++++++++++++++++++++++-----------------
>   src/mesa/main/shaderobj.c        |  8 ++++----
>   5 files changed, 63 insertions(+), 56 deletions(-)
>
> diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
> index d187b66..dfee70a 100644
> --- a/src/compiler/glsl/linker.cpp
> +++ b/src/compiler/glsl/linker.cpp
> @@ -3534,25 +3534,25 @@ add_program_resource(struct gl_shader_program *prog,
>      if (_mesa_set_search(resource_set, data))
>         return true;
>   
> -   prog->ProgramResourceList =
> +   prog->data->ProgramResourceList =
>         reralloc(prog,
> -               prog->ProgramResourceList,
> +               prog->data->ProgramResourceList,
>                  gl_program_resource,
> -               prog->NumProgramResourceList + 1);
> +               prog->data->NumProgramResourceList + 1);
>   
> -   if (!prog->ProgramResourceList) {
> +   if (!prog->data->ProgramResourceList) {
>         linker_error(prog, "Out of memory during linking.\n");
>         return false;
>      }
>   
>      struct gl_program_resource *res =
> -      &prog->ProgramResourceList[prog->NumProgramResourceList];
> +      &prog->data->ProgramResourceList[prog->data->NumProgramResourceList];
>   
>      res->Type = type;
>      res->Data = data;
>      res->StageReferences = stages;
>   
> -   prog->NumProgramResourceList++;
> +   prog->data->NumProgramResourceList++;
>   
>      _mesa_set_add(resource_set, data);
>   
> @@ -4196,10 +4196,10 @@ build_program_resource_list(struct gl_context *ctx,
>                               struct gl_shader_program *shProg)
>   {
>      /* Rebuild resource list. */
> -   if (shProg->ProgramResourceList) {
> -      ralloc_free(shProg->ProgramResourceList);
> -      shProg->ProgramResourceList = NULL;
> -      shProg->NumProgramResourceList = 0;
> +   if (shProg->data->ProgramResourceList) {
> +      ralloc_free(shProg->data->ProgramResourceList);
> +      shProg->data->ProgramResourceList = NULL;
> +      shProg->data->NumProgramResourceList = 0;
>      }
>   
>      int input_stage = MESA_SHADER_STAGES, output_stage = 0;
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 793a527..8608b66 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -2668,6 +2668,10 @@ struct gl_shader_program_data
>      struct gl_active_atomic_buffer *AtomicBuffers;
>      unsigned NumAtomicBuffers;
>   
> +   /** List of all active resources after linking. */
> +   struct gl_program_resource *ProgramResourceList;
> +   unsigned NumProgramResourceList;
> +
>      GLboolean LinkStatus;   /**< GL_LINK_STATUS */
>      GLboolean Validated;
>      GLchar *InfoLog;
> @@ -2857,10 +2861,6 @@ struct gl_shader_program
>       */
>      struct gl_linked_shader *_LinkedShaders[MESA_SHADER_STAGES];
>   
> -   /** List of all active resources after linking. */
> -   struct gl_program_resource *ProgramResourceList;
> -   unsigned NumProgramResourceList;
> -
>      /* True if any of the fragment shaders attached to this program use:
>       * #extension ARB_fragment_coord_conventions: enable
>       */
> diff --git a/src/mesa/main/program_resource.c b/src/mesa/main/program_resource.c
> index 5461c4e..4b5be6f 100644
> --- a/src/mesa/main/program_resource.c
> +++ b/src/mesa/main/program_resource.c
> @@ -119,8 +119,8 @@ _mesa_GetProgramInterfaceiv(GLuint program, GLenum programInterface,
>      /* Validate pname against interface. */
>      switch(pname) {
>      case GL_ACTIVE_RESOURCES:
> -      for (i = 0, *params = 0; i < shProg->NumProgramResourceList; i++)
> -         if (shProg->ProgramResourceList[i].Type == programInterface)
> +      for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++)
> +         if (shProg->data->ProgramResourceList[i].Type == programInterface)
>               (*params)++;
>         break;
>      case GL_MAX_NAME_LENGTH:
> @@ -135,32 +135,32 @@ _mesa_GetProgramInterfaceiv(GLuint program, GLenum programInterface,
>         /* Name length consists of base name, 3 additional chars '[0]' if
>          * resource is an array and finally 1 char for string terminator.
>          */
> -      for (i = 0, *params = 0; i < shProg->NumProgramResourceList; i++) {
> -         if (shProg->ProgramResourceList[i].Type != programInterface)
> +      for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) {
> +         if (shProg->data->ProgramResourceList[i].Type != programInterface)
>               continue;
>            unsigned len =
> -            _mesa_program_resource_name_len(&shProg->ProgramResourceList[i]);
> +            _mesa_program_resource_name_len(&shProg->data->ProgramResourceList[i]);
>            *params = MAX2(*params, len + 1);
>         }
>         break;
>      case GL_MAX_NUM_ACTIVE_VARIABLES:
>         switch (programInterface) {
>         case GL_UNIFORM_BLOCK:
> -         for (i = 0, *params = 0; i < shProg->NumProgramResourceList; i++) {
> -            if (shProg->ProgramResourceList[i].Type == programInterface) {
> +         for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) {
> +            if (shProg->data->ProgramResourceList[i].Type == programInterface) {
>                  struct gl_uniform_block *block =
>                     (struct gl_uniform_block *)
> -                  shProg->ProgramResourceList[i].Data;
> +                  shProg->data->ProgramResourceList[i].Data;
>                  *params = MAX2(*params, block->NumUniforms);
>               }
>            }
>            break;
>         case GL_SHADER_STORAGE_BLOCK:
> -         for (i = 0, *params = 0; i < shProg->NumProgramResourceList; i++) {
> -            if (shProg->ProgramResourceList[i].Type == programInterface) {
> +         for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) {
> +            if (shProg->data->ProgramResourceList[i].Type == programInterface) {
>                  struct gl_uniform_block *block =
>                     (struct gl_uniform_block *)
> -                  shProg->ProgramResourceList[i].Data;
> +                  shProg->data->ProgramResourceList[i].Data;
>                  GLint block_params = 0;
>                  for (unsigned j = 0; j < block->NumUniforms; j++) {
>                     const char *iname = block->Uniforms[j].IndexName;
> @@ -176,21 +176,21 @@ _mesa_GetProgramInterfaceiv(GLuint program, GLenum programInterface,
>            }
>            break;
>         case GL_ATOMIC_COUNTER_BUFFER:
> -         for (i = 0, *params = 0; i < shProg->NumProgramResourceList; i++) {
> -            if (shProg->ProgramResourceList[i].Type == programInterface) {
> +         for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) {
> +            if (shProg->data->ProgramResourceList[i].Type == programInterface) {
>                  struct gl_active_atomic_buffer *buffer =
>                     (struct gl_active_atomic_buffer *)
> -                  shProg->ProgramResourceList[i].Data;
> +                  shProg->data->ProgramResourceList[i].Data;
>                  *params = MAX2(*params, buffer->NumUniforms);
>               }
>            }
>            break;
>         case GL_TRANSFORM_FEEDBACK_BUFFER:
> -         for (i = 0, *params = 0; i < shProg->NumProgramResourceList; i++) {
> -            if (shProg->ProgramResourceList[i].Type == programInterface) {
> +         for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) {
> +            if (shProg->data->ProgramResourceList[i].Type == programInterface) {
>                  struct gl_transform_feedback_buffer *buffer =
>                     (struct gl_transform_feedback_buffer *)
> -                  shProg->ProgramResourceList[i].Data;
> +                  shProg->data->ProgramResourceList[i].Data;
>                  *params = MAX2(*params, buffer->NumVaryings);
>               }
>            }
> @@ -210,11 +210,11 @@ _mesa_GetProgramInterfaceiv(GLuint program, GLenum programInterface,
>         case GL_COMPUTE_SUBROUTINE_UNIFORM:
>         case GL_TESS_CONTROL_SUBROUTINE_UNIFORM:
>         case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM: {
> -         for (i = 0, *params = 0; i < shProg->NumProgramResourceList; i++) {
> -            if (shProg->ProgramResourceList[i].Type == programInterface) {
> +         for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) {
> +            if (shProg->data->ProgramResourceList[i].Type == programInterface) {
>                  struct gl_uniform_storage *uni =
>                     (struct gl_uniform_storage *)
> -                  shProg->ProgramResourceList[i].Data;
> +                  shProg->data->ProgramResourceList[i].Data;
>                  *params = MAX2(*params, uni->num_compatible_subroutines);
>               }
>            }
> diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp
> index 0f4b282..4010737 100644
> --- a/src/mesa/main/shader_query.cpp
> +++ b/src/mesa/main/shader_query.cpp
> @@ -198,9 +198,10 @@ _mesa_count_active_attribs(struct gl_shader_program *shProg)
>         return 0;
>      }
>   
> -   struct gl_program_resource *res = shProg->ProgramResourceList;
> +   struct gl_program_resource *res = shProg->data->ProgramResourceList;
>      unsigned count = 0;
> -   for (unsigned j = 0; j < shProg->NumProgramResourceList; j++, res++) {
> +   for (unsigned j = 0; j < shProg->data->NumProgramResourceList;
> +        j++, res++) {
>         if (res->Type == GL_PROGRAM_INPUT &&
>             res->StageReferences & (1 << MESA_SHADER_VERTEX))
>            count++;
> @@ -217,9 +218,10 @@ _mesa_longest_attribute_name_length(struct gl_shader_program *shProg)
>         return 0;
>      }
>   
> -   struct gl_program_resource *res = shProg->ProgramResourceList;
> +   struct gl_program_resource *res = shProg->data->ProgramResourceList;
>      size_t longest = 0;
> -   for (unsigned j = 0; j < shProg->NumProgramResourceList; j++, res++) {
> +   for (unsigned j = 0; j < shProg->data->NumProgramResourceList;
> +        j++, res++) {
>         if (res->Type == GL_PROGRAM_INPUT &&
>             res->StageReferences & (1 << MESA_SHADER_VERTEX)) {
>   
> @@ -466,8 +468,9 @@ _mesa_program_resource_find_name(struct gl_shader_program *shProg,
>                                    GLenum programInterface, const char *name,
>                                    unsigned *array_index)
>   {
> -   struct gl_program_resource *res = shProg->ProgramResourceList;
> -   for (unsigned i = 0; i < shProg->NumProgramResourceList; i++, res++) {
> +   struct gl_program_resource *res = shProg->data->ProgramResourceList;
> +   for (unsigned i = 0; i < shProg->data->NumProgramResourceList;
> +        i++, res++) {
>         if (res->Type != programInterface)
>            continue;
>   
> @@ -570,10 +573,10 @@ calc_resource_index(struct gl_shader_program *shProg,
>   {
>      unsigned i;
>      GLuint index = 0;
> -   for (i = 0; i < shProg->NumProgramResourceList; i++) {
> -      if (&shProg->ProgramResourceList[i] == res)
> +   for (i = 0; i < shProg->data->NumProgramResourceList; i++) {
> +      if (&shProg->data->ProgramResourceList[i] == res)
>            return index;
> -      if (shProg->ProgramResourceList[i].Type == res->Type)
> +      if (shProg->data->ProgramResourceList[i].Type == res->Type)
>            index++;
>      }
>      return GL_INVALID_INDEX;
> @@ -614,8 +617,9 @@ _mesa_program_resource_index(struct gl_shader_program *shProg,
>   static struct gl_program_resource*
>   program_resource_find_data(struct gl_shader_program *shProg, void *data)
>   {
> -   struct gl_program_resource *res = shProg->ProgramResourceList;
> -   for (unsigned i = 0; i < shProg->NumProgramResourceList; i++, res++) {
> +   struct gl_program_resource *res = shProg->data->ProgramResourceList;
> +   for (unsigned i = 0; i < shProg->data->NumProgramResourceList;
> +        i++, res++) {
>         if (res->Data == data)
>            return res;
>      }
> @@ -628,10 +632,11 @@ struct gl_program_resource *
>   _mesa_program_resource_find_index(struct gl_shader_program *shProg,
>                                     GLenum programInterface, GLuint index)
>   {
> -   struct gl_program_resource *res = shProg->ProgramResourceList;
> +   struct gl_program_resource *res = shProg->data->ProgramResourceList;
>      int idx = -1;
>   
> -   for (unsigned i = 0; i < shProg->NumProgramResourceList; i++, res++) {
> +   for (unsigned i = 0; i < shProg->data->NumProgramResourceList;
> +        i++, res++) {
>         if (res->Type != programInterface)
>            continue;
>   
> @@ -1385,7 +1390,7 @@ validate_io(struct gl_shader_program *producer,
>      bool valid = true;
>   
>      gl_shader_variable const **outputs =
> -      (gl_shader_variable const **) calloc(producer->NumProgramResourceList,
> +      (gl_shader_variable const **) calloc(producer->data->NumProgramResourceList,
>                                              sizeof(gl_shader_variable *));
>      if (outputs == NULL)
>         return false;
> @@ -1408,8 +1413,9 @@ validate_io(struct gl_shader_program *producer,
>       * some output that did not have an input.
>       */
>      unsigned num_outputs = 0;
> -   for (unsigned i = 0; i < producer->NumProgramResourceList; i++) {
> -      struct gl_program_resource *res = &producer->ProgramResourceList[i];
> +   for (unsigned i = 0; i < producer->data->NumProgramResourceList; i++) {
> +      struct gl_program_resource *res =
> +         &producer->data->ProgramResourceList[i];
>   
>         if (res->Type != GL_PROGRAM_OUTPUT)
>            continue;
> @@ -1428,8 +1434,9 @@ validate_io(struct gl_shader_program *producer,
>      }
>   
>      unsigned match_index = 0;
> -   for (unsigned i = 0; i < consumer->NumProgramResourceList; i++) {
> -      struct gl_program_resource *res = &consumer->ProgramResourceList[i];
> +   for (unsigned i = 0; i < consumer->data->NumProgramResourceList; i++) {
> +      struct gl_program_resource *res =
> +         &consumer->data->ProgramResourceList[i];
>   
>         if (res->Type != GL_PROGRAM_INPUT)
>            continue;
> diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c
> index 7b73f56..4e514a3 100644
> --- a/src/mesa/main/shaderobj.c
> +++ b/src/mesa/main/shaderobj.c
> @@ -364,10 +364,10 @@ _mesa_clear_shader_program_data(struct gl_context *ctx,
>      shProg->data->AtomicBuffers = NULL;
>      shProg->data->NumAtomicBuffers = 0;
>   
> -   if (shProg->ProgramResourceList) {
> -      ralloc_free(shProg->ProgramResourceList);
> -      shProg->ProgramResourceList = NULL;
> -      shProg->NumProgramResourceList = 0;
> +   if (shProg->data->ProgramResourceList) {
> +      ralloc_free(shProg->data->ProgramResourceList);
> +      shProg->data->ProgramResourceList = NULL;
> +      shProg->data->NumProgramResourceList = 0;
>      }
>   }
>   




More information about the mesa-dev mailing list