From 65d6708bc33694b662d1195fd65842b85b7afc99 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Mon, 6 Jun 2022 15:50:53 -0700 Subject: [PATCH] anv: Remove FS executables when applying the null FS optimization If the executables are still hanging out, anv_GetPipelineExecutableStatisticsKHR will try to dereference NULL pointers in pipeline->shaders[MESA_SHADER_FRAGMENT]. At least in terms of fossil-db output, this matches the behavior from before 73b3efcd59a. Fixes: 73b3efcd59a ("anv: Handle the null FS optimization after compiling shaders") Closes: #6590 Reviewed-by: Lionel Landwerlin Reviewed-by: Jason Ekstrand Part-of: --- src/intel/vulkan/anv_pipeline.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c index 1c7f8b05804..41e2131f58e 100644 --- a/src/intel/vulkan/anv_pipeline.c +++ b/src/intel/vulkan/anv_pipeline.c @@ -1865,6 +1865,25 @@ done: anv_shader_bin_unref(pipeline->base.device, fs); pipeline->shaders[MESA_SHADER_FRAGMENT] = NULL; pipeline->active_stages &= ~VK_SHADER_STAGE_FRAGMENT_BIT; + + /* The per-SIMD size fragment shaders should be last in the + * executables array. Remove all of them. + */ + ASSERTED unsigned removed = 0; + + util_dynarray_foreach_reverse(&pipeline->base.executables, + struct anv_pipeline_executable, + tail) { + /* There must be at least one fragment shader. */ + assert(removed > 0 || tail->stage == MESA_SHADER_FRAGMENT); + + if (tail->stage != MESA_SHADER_FRAGMENT) + break; + + (void) util_dynarray_pop(&pipeline->base.executables, + struct anv_pipeline_executable); + removed++; + } } }