[Mesa-dev] [PATCH 13/21] anv/pipeline: Recompile all shaders if any are missing from the cache

Jason Ekstrand jason at jlekstrand.net
Sat Oct 28 18:36:21 UTC 2017


---
 src/intel/vulkan/anv_pipeline.c | 41 +++++++++++++++++++++++++++++++++++++----
 1 file changed, 37 insertions(+), 4 deletions(-)

diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c
index 0e58f83..cfec73d 100644
--- a/src/intel/vulkan/anv_pipeline.c
+++ b/src/intel/vulkan/anv_pipeline.c
@@ -989,6 +989,7 @@ anv_pipeline_compile_graphics(struct anv_pipeline *pipeline,
       unsigned char sha1[20];
       anv_pipeline_hash_graphics(pipeline, stages, sha1);
 
+      unsigned found = 0;
       for (unsigned s = 0; s < MESA_SHADER_STAGES; s++) {
          if (!stages[s].entrypoint)
             continue;
@@ -999,8 +1000,42 @@ anv_pipeline_compile_graphics(struct anv_pipeline *pipeline,
          struct anv_shader_bin *bin =
             anv_pipeline_cache_search(cache, &stages[s].cache_key,
                                       sizeof(stages[s].cache_key));
-         if (bin)
+         if (bin) {
+            found++;
             pipeline->shaders[s] = bin;
+         }
+      }
+
+      if (found == __builtin_popcount(pipeline->active_stages)) {
+         /* We found all our shaders in the cache.  We're done. */
+         return VK_SUCCESS;
+      } else if (found > 0) {
+         /* We found some but not all of our shaders.  This shouldn't happen
+          * most of the time but it can if we have a partially populated
+          * pipeline cache.
+          */
+         assert(found < __builtin_popcount(pipeline->active_stages));
+
+         anv_debug_report(pipeline->device->instance,
+                          VK_DEBUG_REPORT_WARNING_BIT_EXT |
+                          VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
+                          VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT,
+                          (uint64_t)(uintptr_t)cache,
+                          0, 0, "anv",
+                          "Found a partial pipeline in the cache.  This is "
+                          "most likely caused by an incomplete pipeline cache "
+                          "import or export");
+
+         /* We're going to have to recompile anyway, so just throw away our
+          * references to the shaders in the cache.  We'll get them out of the
+          * cache again as part of the compilation process.
+          */
+         for (unsigned s = 0; s < MESA_SHADER_STAGES; s++) {
+            if (pipeline->shaders[s]) {
+               anv_shader_bin_unref(pipeline->device, pipeline->shaders[s]);
+               pipeline->shaders[s] = NULL;
+            }
+         }
       }
    }
 
@@ -1009,9 +1044,7 @@ anv_pipeline_compile_graphics(struct anv_pipeline *pipeline,
          continue;
 
       assert(stages[s].stage == s);
-
-      if (pipeline->shaders[s])
-         continue;
+      assert(pipeline->shaders[s] == NULL);
 
       switch (s) {
       case MESA_SHADER_VERTEX:
-- 
2.5.0.400.gff86faf



More information about the mesa-dev mailing list