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

Timothy Arceri tarceri at itsqueeze.com
Mon Nov 20 11:14:15 UTC 2017


Hmm I'm not sure we do this in RADV I should check that.

13-16 & 21 are:

Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>

I believe everything else is already in master.

On 29/10/17 05:36, Jason Ekstrand wrote:
> ---
>   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:
> 


More information about the mesa-dev mailing list