[Mesa-dev] [PATCH 10/40] glsl: add basic support for resource list to shader cache

Anuj Phogat anuj.phogat at gmail.com
Wed Feb 8 22:47:16 UTC 2017


On Mon, Feb 6, 2017 at 7:42 PM, Timothy Arceri <tarceri at itsqueeze.com> wrote:
> From: Timothy Arceri <timothy.arceri at collabora.com>
>
> This initially adds support for simple uniforms and varyings.
> ---
>  src/compiler/glsl/shader_cache.cpp | 121 +++++++++++++++++++++++++++++++++++++
>  1 file changed, 121 insertions(+)
>
> diff --git a/src/compiler/glsl/shader_cache.cpp b/src/compiler/glsl/shader_cache.cpp
> index ff8d150..56ea305 100644
> --- a/src/compiler/glsl/shader_cache.cpp
> +++ b/src/compiler/glsl/shader_cache.cpp
> @@ -392,6 +392,123 @@ read_hash_tables(struct blob_reader *metadata, struct gl_shader_program *prog)
>  }
>
>  static void
> +write_program_resource_data(struct blob *metadata,
> +                            struct gl_shader_program *prog,
> +                            struct gl_program_resource *res)
> +{
> +   switch(res->Type) {
> +   case GL_PROGRAM_INPUT:
> +   case GL_PROGRAM_OUTPUT: {
> +      const gl_shader_variable *var = (gl_shader_variable *)res->Data;
> +      blob_write_bytes(metadata, var, sizeof(gl_shader_variable));
> +      encode_type_to_blob(metadata, var->type);
> +
> +      if (var->interface_type)
> +         encode_type_to_blob(metadata, var->interface_type);
> +
> +      if (var->outermost_struct_type)
> +         encode_type_to_blob(metadata, var->outermost_struct_type);
> +
> +      blob_write_string(metadata, var->name);
> +      break;
> +   }
> +   case GL_BUFFER_VARIABLE:
> +   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_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;
> +         }
> +      }
> +      break;
> +   default:
> +      assert(!"Support for writting resource not yet implemented.");
s/writting/writing
> +   }
> +}
> +
> +static void
> +read_program_resource_data(struct blob_reader *metadata,
> +                           struct gl_shader_program *prog,
> +                           struct gl_program_resource *res)
> +{
> +   switch(res->Type) {
> +   case GL_PROGRAM_INPUT:
> +   case GL_PROGRAM_OUTPUT: {
> +      gl_shader_variable *var = ralloc(prog, struct gl_shader_variable);
> +
> +      blob_copy_bytes(metadata, (uint8_t *) var, sizeof(gl_shader_variable));
> +      var->type = decode_type_from_blob(metadata);
> +
> +      if (var->interface_type)
> +         var->interface_type = decode_type_from_blob(metadata);
> +
> +      if (var->outermost_struct_type)
> +         var->outermost_struct_type = decode_type_from_blob(metadata);
> +
> +      var->name = ralloc_strdup(prog, blob_read_string(metadata));
> +
> +      res->Data = var;
> +      break;
> +   }
> +   case GL_BUFFER_VARIABLE:
> +   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_UNIFORM:
> +      res->Data = &prog->data->UniformStorage[blob_read_uint32(metadata)];
> +      break;
> +   default:
> +      assert(!"Support for reading resource not yet implemented.");
> +   }
> +}
> +
> +static void
> +write_program_resource_list(struct blob *metadata,
> +                            struct gl_shader_program *prog)
> +{
> +   blob_write_uint32(metadata, prog->data->NumProgramResourceList);
> +
> +   for (unsigned i = 0; i < prog->data->NumProgramResourceList; i++) {
> +      blob_write_uint32(metadata, prog->data->ProgramResourceList[i].Type);
> +      write_program_resource_data(metadata, prog,
> +                                  &prog->data->ProgramResourceList[i]);
> +      blob_write_bytes(metadata,
> +                       &prog->data->ProgramResourceList[i].StageReferences,
> +                       sizeof(prog->data->ProgramResourceList[i].StageReferences));
> +   }
> +}
> +
> +static void
> +read_program_resource_list(struct blob_reader *metadata,
> +                           struct gl_shader_program *prog)
> +{
> +   prog->data->NumProgramResourceList = blob_read_uint32(metadata);
> +
> +   prog->data->ProgramResourceList =
> +      ralloc_array(prog, gl_program_resource,
> +                   prog->data->NumProgramResourceList);
> +
> +   for (unsigned i = 0; i < prog->data->NumProgramResourceList; i++) {
> +      prog->data->ProgramResourceList[i].Type = blob_read_uint32(metadata);
> +      read_program_resource_data(metadata, prog,
> +                                 &prog->data->ProgramResourceList[i]);
> +      blob_copy_bytes(metadata,
> +                      (uint8_t *) &prog->data->ProgramResourceList[i].StageReferences,
> +                      sizeof(prog->data->ProgramResourceList[i].StageReferences));
> +   }
> +}
> +
> +static void
>  write_shader_parameters(struct blob *metadata,
>                          struct gl_program_parameter_list *params)
>  {
> @@ -556,6 +673,8 @@ shader_cache_write_program_metadata(struct gl_context *ctx,
>
>     write_uniform_remap_table(metadata, prog);
>
> +   write_program_resource_list(metadata, prog);
> +
>     char sha1_buf[41];
>     for (unsigned i = 0; i < prog->NumShaders; i++) {
>        disk_cache_put_key(cache, prog->Shaders[i]->sha1);
> @@ -667,6 +786,8 @@ shader_cache_read_program_metadata(struct gl_context *ctx,
>
>     read_uniform_remap_table(&metadata, prog);
>
> +   read_program_resource_list(&metadata, prog);
> +
>     if (metadata.current != metadata.end || metadata.overrun) {
>        /* Something very bad has gone wrong discard the item from the cache and
>         * rebuild from source.
> --
> 2.9.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list