From d54592ec723ade9832ac927b96836c5d8d00709e Mon Sep 17 00:00:00 2001 From: Mary Guillemard Date: Mon, 13 May 2024 10:40:14 +0200 Subject: [PATCH] panvk: Upload shader in panvk_shader Signed-off-by: Mary Guillemard Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/vulkan/bifrost/panvk_pipeline.h | 1 - .../vulkan/bifrost/panvk_vX_pipeline.c | 10 +----- src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c | 2 +- src/panfrost/vulkan/panvk_shader.h | 11 +++++- src/panfrost/vulkan/panvk_vX_shader.c | 36 +++++++++++++++---- 5 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/panfrost/vulkan/bifrost/panvk_pipeline.h b/src/panfrost/vulkan/bifrost/panvk_pipeline.h index 45f2b488de9..eff68e717e5 100644 --- a/src/panfrost/vulkan/bifrost/panvk_pipeline.h +++ b/src/panfrost/vulkan/bifrost/panvk_pipeline.h @@ -28,7 +28,6 @@ struct panvk_pipeline_shader { struct panvk_shader *base; - struct panvk_priv_mem code; struct panvk_priv_mem rsd; struct { diff --git a/src/panfrost/vulkan/bifrost/panvk_vX_pipeline.c b/src/panfrost/vulkan/bifrost/panvk_vX_pipeline.c index 9a844406273..bff4ae8bcaf 100644 --- a/src/panfrost/vulkan/bifrost/panvk_vX_pipeline.c +++ b/src/panfrost/vulkan/bifrost/panvk_vX_pipeline.c @@ -65,13 +65,6 @@ init_pipeline_shader(struct panvk_pipeline *pipeline, if (!shader) return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY); - 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}; - } - pshader->base = shader; pshader->info = shader->info; pshader->desc_info.used_set_mask = shader->desc_info.used_set_mask; @@ -113,7 +106,7 @@ init_pipeline_shader(struct panvk_pipeline *pipeline, pan_pack(panvk_priv_mem_host_addr(pshader->rsd), RENDERER_STATE, cfg) { pan_shader_prepare_rsd(&pshader->info, - panvk_priv_mem_dev_addr(pshader->code), &cfg); + panvk_shader_get_dev_addr(pshader->base), &cfg); } } @@ -127,7 +120,6 @@ cleanup_pipeline_shader(struct panvk_pipeline *pipeline, { struct panvk_device *dev = to_panvk_device(pipeline->base.device); - panvk_pool_free_mem(&dev->mempools.exec, pshader->code); panvk_pool_free_mem(&dev->mempools.rw, pshader->rsd); panvk_pool_free_mem(&dev->mempools.rw, pshader->desc_info.others.map); diff --git a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c index dab05dd10cc..0d6f61b42d2 100644 --- a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c @@ -349,7 +349,7 @@ panvk_draw_prepare_fs_rsd(struct panvk_cmd_buffer *cmdbuf, PAN_DESC_ARRAY(bd_count, BLEND)); struct mali_renderer_state_packed *rsd = ptr.cpu; struct mali_blend_packed *bds = ptr.cpu + pan_size(RENDERER_STATE); - mali_ptr fs_code = panvk_priv_mem_dev_addr(pipeline->fs.code); + mali_ptr fs_code = panvk_shader_get_dev_addr(pipeline->fs.base); panvk_per_arch(blend_emit_descs)( dev, cb, cmdbuf->state.gfx.render.color_attachments.fmts, diff --git a/src/panfrost/vulkan/panvk_shader.h b/src/panfrost/vulkan/panvk_shader.h index 17da74cba82..c1c6ac44022 100644 --- a/src/panfrost/vulkan/panvk_shader.h +++ b/src/panfrost/vulkan/panvk_shader.h @@ -16,6 +16,7 @@ #include "panvk_descriptor_set.h" #include "panvk_macros.h" +#include "panvk_mempool.h" #include "vk_pipeline_layout.h" @@ -94,7 +95,7 @@ enum panvk_bifrost_desc_table_type { }; #define COPY_DESC_HANDLE(table, idx) ((table << 28) | (idx)) -#define COPY_DESC_HANDLE_EXTRACT_INDEX(handle) ((handle)&BITFIELD_MASK(28)) +#define COPY_DESC_HANDLE_EXTRACT_INDEX(handle) ((handle) & BITFIELD_MASK(28)) #define COPY_DESC_HANDLE_EXTRACT_TABLE(handle) ((handle) >> 28) struct panvk_shader_desc_map { @@ -121,8 +122,16 @@ struct panvk_shader { const void *bin_ptr; uint32_t bin_size; + + struct panvk_priv_mem code_mem; }; +static inline mali_ptr +panvk_shader_get_dev_addr(const struct panvk_shader *shader) +{ + return shader != NULL ? panvk_priv_mem_dev_addr(shader->code_mem) : 0; +} + struct panvk_shader *panvk_per_arch(shader_create)( struct panvk_device *dev, const VkPipelineShaderStageCreateInfo *stage_info, const struct vk_pipeline_layout *layout, const VkAllocationCallbacks *alloc); diff --git a/src/panfrost/vulkan/panvk_vX_shader.c b/src/panfrost/vulkan/panvk_vX_shader.c index b04c08fe226..81a81b4af78 100644 --- a/src/panfrost/vulkan/panvk_vX_shader.c +++ b/src/panfrost/vulkan/panvk_vX_shader.c @@ -31,6 +31,7 @@ #include "panvk_device.h" #include "panvk_instance.h" +#include "panvk_mempool.h" #include "panvk_physical_device.h" #include "panvk_shader.h" @@ -46,6 +47,7 @@ #include "util/pan_lower_framebuffer.h" #include "pan_shader.h" +#include "vk_log.h" #include "vk_pipeline.h" #include "vk_pipeline_layout.h" #include "vk_util.h" @@ -134,6 +136,20 @@ shared_type_info(const struct glsl_type *type, unsigned *size, unsigned *align) *size = comp_size * length, *align = comp_size * (length == 3 ? 4 : length); } +static VkResult +panvk_shader_upload(struct panvk_device *dev, struct panvk_shader *shader, + const VkAllocationCallbacks *pAllocator) +{ + if (shader->bin_size > 0) { + shader->code_mem = panvk_pool_upload_aligned( + &dev->mempools.exec, shader->bin_ptr, shader->bin_size, 128); + } else { + shader->code_mem = (struct panvk_priv_mem){0}; + } + + return VK_SUCCESS; +} + struct panvk_shader * panvk_per_arch(shader_create)(struct panvk_device *dev, const VkPipelineShaderStageCreateInfo *stage_info, @@ -314,11 +330,8 @@ panvk_per_arch(shader_create)(struct panvk_device *dev, if (bin_size) { void *data = malloc(bin_size); - if (data == NULL) { - ralloc_free(nir); - panvk_per_arch(shader_destroy)(dev, shader, alloc); - return NULL; - } + if (data == NULL) + goto err; memcpy(data, bin_ptr, bin_size); shader->bin_size = bin_size; @@ -363,9 +376,18 @@ panvk_per_arch(shader_create)(struct panvk_device *dev, shader->local_size.y = nir->info.workgroup_size[1]; shader->local_size.z = nir->info.workgroup_size[2]; - ralloc_free(nir); + result = panvk_shader_upload(dev, shader, alloc); + if (result != VK_SUCCESS) + goto err; + + ralloc_free(nir); return shader; + +err: + ralloc_free(nir); + panvk_per_arch(shader_destroy)(dev, shader, alloc); + return NULL; } void @@ -373,6 +395,8 @@ panvk_per_arch(shader_destroy)(struct panvk_device *dev, struct panvk_shader *shader, const VkAllocationCallbacks *alloc) { + panvk_pool_free_mem(&dev->mempools.exec, shader->code_mem); + free((void *)shader->bin_ptr); free(shader->desc_info.dyn_ubos.map); vk_free2(&dev->vk.alloc, alloc, shader);