The IR is reused in different pipeline combinations so we need
to clone it to avoid link time optimistaions messing up the
original copy.
---
 src/amd/vulkan/radv_pipeline.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index 2a25a423a2..d0e47383d7 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -1771,20 +1771,27 @@ void radv_create_shaders(struct radv_pipeline *pipeline,
                const VkPipelineShaderStageCreateInfo *stage = pStages[i];
 
                if (!modules[i])
                        continue;
 
                nir[i] = radv_shader_compile_to_nir(device, modules[i],
                                                    stage ? stage->pName : 
"main", i,
                                                    stage ? 
stage->pSpecializationInfo : NULL);
                pipeline->active_stages |= mesa_to_vk_shader_stage(i);
 
+               /* We don't want to alter meta shaders IR directly so clone it
+                * first.
+                */
+               if (nir[i]->info.name) {
+                       nir[i] = nir_shader_clone(NULL, nir[i]);
+               }
+
                if (first != last) {
                        nir_variable_mode mask = 0;
 
                        if (i != first)
                                mask = mask | nir_var_shader_in;
 
                        if (i != last)
                                mask = mask | nir_var_shader_out;
 
                        nir_lower_io_to_scalar_early(nir[i], mask);
@@ -1880,21 +1887,21 @@ void radv_create_shaders(struct radv_pipeline *pipeline,
                                                           code_size);
                }
                free(gs_copy_code);
        }
 
        radv_pipeline_cache_insert_shaders(device, cache, hash, 
pipeline->shaders,
                                           (const void**)codes, code_sizes);
 
        for (int i = 0; i < MESA_SHADER_STAGES; ++i) {
                free(codes[i]);
-               if (modules[i] && !modules[i]->nir && 
!pipeline->device->trace_bo)
+               if (modules[i] && !pipeline->device->trace_bo)
                        ralloc_free(nir[i]);
        }
 
        if (fs_m.nir)
                ralloc_free(fs_m.nir);
 }
 
 static VkResult
 radv_pipeline_init(struct radv_pipeline *pipeline,
                   struct radv_device *device,
-- 
2.13.6

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to