From: Timothy Arceri Date: Tue, 12 Apr 2016 07:20:49 +0000 (+1000) Subject: glsl: fix uniform remap table cache when explicit locations used X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3c45d8f4642b86eeecd7b8c30b4e6225d4e9ebdc;p=mesa.git glsl: fix uniform remap table cache when explicit locations used V2: don't store pointers use an enum instead to flag what should be restored. Also do the work in a helper that we will later use for the subroutine remap table. Reviewed-by: Nicolai Hähnle --- diff --git a/src/compiler/glsl/shader_cache.cpp b/src/compiler/glsl/shader_cache.cpp index b0f8e025668..cc34ef1de8e 100644 --- a/src/compiler/glsl/shader_cache.cpp +++ b/src/compiler/glsl/shader_cache.cpp @@ -57,7 +57,7 @@ #include "main/core.h" #include "nir.h" #include "program.h" -#include "util/disk_cache.h" +#include "shader_cache.h" #include "util/mesa-sha1.h" #include "util/string_to_uint_map.h" @@ -275,6 +275,29 @@ read_uniforms(struct blob_reader *metadata, struct gl_shader_program *prog) } } +enum uniform_remap_type +{ + remap_type_inactive_explicit_location, + remap_type_null_ptr, + remap_type_uniform_offset +}; + +static void +write_uniform_remap_table_entry(struct blob *metadata, + gl_uniform_storage *uniform_storage, + gl_uniform_storage *entry) +{ + if (entry == INACTIVE_UNIFORM_EXPLICIT_LOCATION) { + blob_write_uint32(metadata, remap_type_inactive_explicit_location); + } else if (entry == NULL) { + blob_write_uint32(metadata, remap_type_null_ptr); + } else { + blob_write_uint32(metadata, remap_type_uniform_offset); + + uint32_t offset = entry - uniform_storage; + blob_write_uint32(metadata, offset); + } +} static void write_uniform_remap_table(struct blob *metadata, @@ -283,8 +306,24 @@ write_uniform_remap_table(struct blob *metadata, blob_write_uint32(metadata, prog->NumUniformRemapTable); for (unsigned i = 0; i < prog->NumUniformRemapTable; i++) { - blob_write_uint32(metadata, prog->UniformRemapTable[i] - - prog->data->UniformStorage); + write_uniform_remap_table_entry(metadata, prog->data->UniformStorage, + prog->UniformRemapTable[i]); + } +} + +static void +read_uniform_remap_table_entry(struct blob_reader *metadata, + gl_uniform_storage *uniform_storage, + gl_uniform_storage **entry, + enum uniform_remap_type type) +{ + if (type == remap_type_inactive_explicit_location) { + *entry = INACTIVE_UNIFORM_EXPLICIT_LOCATION; + } else if (type == remap_type_null_ptr) { + *entry = NULL; + } else { + uint32_t uni_offset = blob_read_uint32(metadata); + *entry = uniform_storage + uni_offset; } } @@ -294,12 +333,15 @@ read_uniform_remap_table(struct blob_reader *metadata, { prog->NumUniformRemapTable = blob_read_uint32(metadata); - prog->UniformRemapTable =rzalloc_array(prog, struct gl_uniform_storage *, - prog->NumUniformRemapTable); + prog->UniformRemapTable = rzalloc_array(prog, struct gl_uniform_storage *, + prog->NumUniformRemapTable); for (unsigned i = 0; i < prog->NumUniformRemapTable; i++) { - prog->UniformRemapTable[i] = - prog->data->UniformStorage + blob_read_uint32(metadata); + enum uniform_remap_type type = + (enum uniform_remap_type) blob_read_uint32(metadata); + + read_uniform_remap_table_entry(metadata, prog->data->UniformStorage, + &prog->UniformRemapTable[i], type); } }