[Mesa-dev] [PATCH 09/40] glsl: fix uniform remap table cache when explicit locations used

Nicolai Hähnle nhaehnle at gmail.com
Fri Feb 10 10:52:34 UTC 2017


On 07.02.2017 04:42, Timothy Arceri wrote:
> From: Timothy Arceri <timothy.arceri at collabora.com>
>
> ---
>  src/compiler/glsl/shader_cache.cpp | 32 +++++++++++++++++++++++++-------
>  1 file changed, 25 insertions(+), 7 deletions(-)
>
> diff --git a/src/compiler/glsl/shader_cache.cpp b/src/compiler/glsl/shader_cache.cpp
> index ba05655..ff8d150 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"
>
> @@ -283,8 +283,20 @@ 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);
> +      blob_write_uint64(metadata,
> +                        ptr_to_uint64_t(prog->UniformRemapTable[i]));
> +
> +      if (prog->UniformRemapTable[i] != INACTIVE_UNIFORM_EXPLICIT_LOCATION &&
> +          prog->UniformRemapTable[i] != NULL) {
> +
> +         /* Here we store the offset rather than calculating it on restore
> +          * because gl_uniform_storage may have a different size on the
> +          * platform we are restoring the cache on.
> +          */
> +         uint32_t offset =
> +            prog->UniformRemapTable[i] - prog->data->UniformStorage;
> +         blob_write_uint32(metadata, offset);
> +      }
>     }
>  }
>
> @@ -294,12 +306,18 @@ 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);
> +      uint64_t uni_ptr = blob_read_uint64(metadata);
> +      if (uni_ptr == (uint64_t) INACTIVE_UNIFORM_EXPLICIT_LOCATION ||
> +          uni_ptr == (uint64_t) NULL) {
> +         prog->UniformRemapTable[i] = (gl_uniform_storage *) uni_ptr;
> +      } else {
> +         uint32_t uni_offset = blob_read_uint32(metadata);
> +         prog->UniformRemapTable[i] = prog->data->UniformStorage + uni_offset;
> +      }

Instead of storing a pointer that isn't used anyway, IMHO it would be 
better to store an explicit "union tag" enum.

Nicolai

>     }
>  }
>
>



More information about the mesa-dev mailing list