diff --git a/src/panfrost/vulkan/bifrost/panvk_vX_pipeline.c b/src/panfrost/vulkan/bifrost/panvk_vX_pipeline.c index 55d52fed583..2c6acb109d5 100644 --- a/src/panfrost/vulkan/bifrost/panvk_vX_pipeline.c +++ b/src/panfrost/vulkan/bifrost/panvk_vX_pipeline.c @@ -65,12 +65,9 @@ init_pipeline_shader(struct panvk_pipeline *pipeline, if (!shader) return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY); - void *shader_data = util_dynarray_element(&shader->binary, uint8_t, 0); - unsigned shader_sz = util_dynarray_num_elements(&shader->binary, uint8_t); - - if (shader_sz) { - pshader->code = panvk_pool_upload_aligned(&dev->mempools.exec, - shader_data, shader_sz, 128); + if (shader->bin_size) { + pshader->code = panvk_pool_upload_aligned( + &dev->mempools.exec, shader->bin_ptr, shader->bin_size, 128); } else { pshader->code = (struct panvk_priv_mem){0}; } diff --git a/src/panfrost/vulkan/panvk_shader.h b/src/panfrost/vulkan/panvk_shader.h index e924db0a99e..17da74cba82 100644 --- a/src/panfrost/vulkan/panvk_shader.h +++ b/src/panfrost/vulkan/panvk_shader.h @@ -10,8 +10,6 @@ #error "PAN_ARCH must be defined" #endif -#include "util/u_dynarray.h" - #include "util/pan_ir.h" #include "pan_desc.h" @@ -118,9 +116,11 @@ struct panvk_shader_desc_info { struct panvk_shader { struct pan_shader_info info; - struct util_dynarray binary; struct pan_compute_dim local_size; struct panvk_shader_desc_info desc_info; + + const void *bin_ptr; + uint32_t bin_size; }; struct panvk_shader *panvk_per_arch(shader_create)( diff --git a/src/panfrost/vulkan/panvk_vX_shader.c b/src/panfrost/vulkan/panvk_vX_shader.c index 452b4938533..b04c08fe226 100644 --- a/src/panfrost/vulkan/panvk_vX_shader.c +++ b/src/panfrost/vulkan/panvk_vX_shader.c @@ -36,6 +36,7 @@ #include "spirv/nir_spirv.h" #include "util/mesa-sha1.h" +#include "util/u_dynarray.h" #include "nir_builder.h" #include "nir_conversion_builder.h" #include "nir_deref.h" @@ -151,8 +152,6 @@ panvk_per_arch(shader_create)(struct panvk_device *dev, if (!shader) return NULL; - util_dynarray_init(&shader->binary, NULL); - /* TODO these are made-up */ const struct spirv_to_nir_options spirv_options = { .ubo_addr_format = nir_address_format_32bit_index_offset, @@ -301,7 +300,31 @@ panvk_per_arch(shader_create)(struct panvk_device *dev, NIR_PASS_V(nir, nir_shader_instructions_pass, panvk_lower_sysvals, nir_metadata_block_index | nir_metadata_dominance, NULL); - GENX(pan_shader_compile)(nir, &inputs, &shader->binary, &shader->info); + struct util_dynarray binary; + util_dynarray_init(&binary, NULL); + + GENX(pan_shader_compile)(nir, &inputs, &binary, &shader->info); + + void *bin_ptr = util_dynarray_element(&binary, uint8_t, 0); + unsigned bin_size = util_dynarray_num_elements(&binary, uint8_t); + + shader->bin_size = 0; + shader->bin_ptr = NULL; + + if (bin_size) { + void *data = malloc(bin_size); + + if (data == NULL) { + ralloc_free(nir); + panvk_per_arch(shader_destroy)(dev, shader, alloc); + return NULL; + } + + memcpy(data, bin_ptr, bin_size); + shader->bin_size = bin_size; + shader->bin_ptr = data; + } + util_dynarray_fini(&binary); /* Patch the descriptor count */ shader->info.ubo_count = @@ -350,7 +373,7 @@ panvk_per_arch(shader_destroy)(struct panvk_device *dev, struct panvk_shader *shader, const VkAllocationCallbacks *alloc) { - util_dynarray_fini(&shader->binary); + free((void *)shader->bin_ptr); free(shader->desc_info.dyn_ubos.map); vk_free2(&dev->vk.alloc, alloc, shader); }