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

Timothy Arceri t_arceri at yahoo.com.au
Mon Jan 23 23:12:51 UTC 2017


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 a6f8238..ff35f69 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -43,7 +43,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"
 
@@ -265,8 +265,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);
+      }
    }
 }
 
@@ -276,12 +288,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;
+      }
    }
 }
 
-- 
2.9.3



More information about the mesa-dev mailing list