panvk: Upload shader in panvk_shader

Signed-off-by: Mary Guillemard <mary.guillemard@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29161>
This commit is contained in:
Mary Guillemard
2024-05-13 10:40:14 +02:00
committed by Marge Bot
parent b186220566
commit d54592ec72
5 changed files with 42 additions and 18 deletions

View File

@@ -28,7 +28,6 @@
struct panvk_pipeline_shader {
struct panvk_shader *base;
struct panvk_priv_mem code;
struct panvk_priv_mem rsd;
struct {

View File

@@ -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);

View File

@@ -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,

View File

@@ -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);

View File

@@ -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);