On 08/09/17 17:59, Bas Nieuwenhuizen wrote:
On Fri, Sep 8, 2017 at 9:27 AM, Timothy Arceri <[email protected]> wrote:
It seems by luck master works fine but with an alternate
compilation flow this is ends up causing a crash in
radv_shader_variant_destroy().
---
  src/amd/vulkan/radv_pipeline.c       | 2 ++
  src/amd/vulkan/radv_pipeline_cache.c | 1 +
  2 files changed, 3 insertions(+)

diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index c090b8e2f0..3d9831236f 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -494,20 +494,22 @@ static struct radv_shader_variant 
*radv_shader_variant_create(struct radv_device
                 *code_out = binary.code;
                 *code_size_out = binary.code_size;
         } else
                 free(binary.code);
         free(binary.config);
         free(binary.rodata);
         free(binary.global_symbol_offsets);
         free(binary.relocs);
         free(binary.disasm_string);
         variant->ref_count = 1;
+       list_inithead(&variant->slab_list);

This resets it after the list is added to a slab in
radv_fill_shader_variant -> radv_alloc_shader_memory ? How does that
not crash and why does it crash previously?

Yeah it does crash. I originally had this in radv_fill_shader_variant() moving it back there fixed things again.

+
         return variant;
  }

  static struct radv_shader_variant *
  radv_pipeline_create_gs_copy_shader(struct radv_pipeline *pipeline,
                                     struct nir_shader *nir,
                                     void** code_out,
                                     unsigned *code_size_out,
                                     bool dump_shader,
                                     bool multiview)
diff --git a/src/amd/vulkan/radv_pipeline_cache.c 
b/src/amd/vulkan/radv_pipeline_cache.c
index ef1f513f36..39b4e24e70 100644
--- a/src/amd/vulkan/radv_pipeline_cache.c
+++ b/src/amd/vulkan/radv_pipeline_cache.c
@@ -172,20 +172,21 @@ radv_create_shader_variant_from_pipeline_cache(struct 
radv_device *device,
                 if (!variant)
                         return NULL;

                 variant->code_size = entry->code_size;
                 variant->config = entry->config;
                 variant->info = entry->variant_info;
                 variant->rsrc1 = entry->rsrc1;
                 variant->rsrc2 = entry->rsrc2;
                 variant->code_size = entry->code_size;
                 variant->ref_count = 1;
+               list_inithead(&variant->slab_list);

It should not be needed here. radv_alloc_shader_memory does a list_add
or list_addtail, which don't need it initialized.

Hmm .. your right, please ignore. I need to update the patch I'm using to make use of radv_alloc_shader_memory() in the equivalent function.



                 void *ptr = radv_alloc_shader_memory(device, variant);
                 memcpy(ptr, entry->code, entry->code_size);

                 entry->variant = variant;
         }

         p_atomic_inc(&entry->variant->ref_count);
         return entry->variant;
  }
--
2.13.5

_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to