From c4cff5f40254deb89ecb3569fc2936cc859c0a81 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Fri, 18 Mar 2016 21:51:49 +1100 Subject: [PATCH] glsl: add basic support for resource list to shader cache MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This initially adds support for simple uniforms and varyings. Reviewed-by: Nicolai Hähnle --- 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 cc34ef1de8e..b9ffbb25cfd 100644 --- a/src/compiler/glsl/shader_cache.cpp +++ b/src/compiler/glsl/shader_cache.cpp @@ -415,6 +415,123 @@ read_hash_tables(struct blob_reader *metadata, struct gl_shader_program *prog) read_hash_table(metadata, prog->FragDataIndexBindings); } +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 writing resource not yet implemented."); + } +} + +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) @@ -576,6 +693,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); @@ -679,6 +798,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 has gone wrong discard the item from the cache and rebuild * from source. -- 2.30.2