[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