[Mesa-dev] [PATCH] glsl: use remap location when serialising uniform program resource data

Tapani Pälli tapani.palli at intel.com
Mon Jan 28 06:48:52 UTC 2019


On 1/28/19 8:15 AM, Timothy Arceri wrote:
> This allows us to avoid expensive string compares since we already have
> a map to the pointers.
> 
> These compares were taking ~30 seconds for a single shader compile
> in Godot due to it using 64,000+ uniforms.

wow .. and I thought Borderlands was using too many (IIRC had something 
like 12000)

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

> Fixes: c4cff5f40254 ("glsl: add basic support for resource list to shader cache")
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=109229
> ---
>   src/compiler/glsl/serialize.cpp | 33 ++++++++++++++++++++++++++-------
>   1 file changed, 26 insertions(+), 7 deletions(-)
> 
> diff --git a/src/compiler/glsl/serialize.cpp b/src/compiler/glsl/serialize.cpp
> index 26d8ec4b75b..fdd99ec59da 100644
> --- a/src/compiler/glsl/serialize.cpp
> +++ b/src/compiler/glsl/serialize.cpp
> @@ -764,6 +764,12 @@ get_shader_var_and_pointer_sizes(size_t *s_var_size, size_t *s_var_ptrs,
>         sizeof(var->name);
>   }
>   
> +enum uniform_type
> +{
> +   uniform_remapped,
> +   uniform_not_remapped
> +};
> +
>   static void
>   write_program_resource_data(struct blob *metadata,
>                               struct gl_shader_program *prog,
> @@ -816,12 +822,19 @@ write_program_resource_data(struct blob *metadata,
>      case GL_TESS_CONTROL_SUBROUTINE_UNIFORM:
>      case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM:
>      case GL_UNIFORM:
> -      for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
> -         if (strcmp(((gl_uniform_storage *)res->Data)->name,
> -                    prog->data->UniformStorage[i].name) == 0) {
> -            blob_write_uint32(metadata, i);
> -            break;
> +      if (((gl_uniform_storage *)res->Data)->builtin ||
> +          res->Type != GL_UNIFORM) {
> +         blob_write_uint32(metadata, uniform_not_remapped);
> +         for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
> +            if (strcmp(((gl_uniform_storage *)res->Data)->name,
> +                       prog->data->UniformStorage[i].name) == 0) {
> +               blob_write_uint32(metadata, i);
> +               break;
> +            }
>            }
> +      } else {
> +         blob_write_uint32(metadata, uniform_remapped);
> +         blob_write_uint32(metadata, ((gl_uniform_storage *)res->Data)->remap_location);
>         }
>         break;
>      case GL_ATOMIC_COUNTER_BUFFER:
> @@ -906,9 +919,15 @@ read_program_resource_data(struct blob_reader *metadata,
>      case GL_COMPUTE_SUBROUTINE_UNIFORM:
>      case GL_TESS_CONTROL_SUBROUTINE_UNIFORM:
>      case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM:
> -   case GL_UNIFORM:
> -      res->Data = &prog->data->UniformStorage[blob_read_uint32(metadata)];
> +   case GL_UNIFORM: {
> +      enum uniform_type type = (enum uniform_type) blob_read_uint32(metadata);
> +      if (type == uniform_not_remapped) {
> +         res->Data = &prog->data->UniformStorage[blob_read_uint32(metadata)];
> +      } else {
> +         res->Data = prog->UniformRemapTable[blob_read_uint32(metadata)];
> +      }
>         break;
> +   }
>      case GL_ATOMIC_COUNTER_BUFFER:
>         res->Data = &prog->data->AtomicBuffers[blob_read_uint32(metadata)];
>         break;
> 


More information about the mesa-dev mailing list