panvk: Keep our copy_desc shader in vk_meta_device

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Mary Guillemard <mary.guillemard@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31441>
This commit is contained in:
Boris Brezillon
2024-09-24 10:59:18 +02:00
committed by Marge Bot
parent d2515347f4
commit 4971538ffc
4 changed files with 38 additions and 52 deletions
@@ -236,12 +236,18 @@ single_desc_copy(nir_builder *b, nir_def *desc_copy_idx)
nir_pop_if(b, NULL);
}
static struct panvk_priv_mem
panvk_meta_desc_copy_shader(struct panvk_device *dev,
struct pan_shader_info *shader_info)
static mali_ptr
panvk_meta_desc_copy_rsd(struct panvk_device *dev)
{
struct panvk_physical_device *phys_dev =
to_panvk_physical_device(dev->vk.physical);
enum panvk_meta_object_key_type key = PANVK_META_OBJECT_KEY_COPY_DESC_SHADER;
struct panvk_internal_shader *shader;
VkShaderEXT shader_handle = (VkShaderEXT)vk_meta_lookup_object(
&dev->meta, VK_OBJECT_TYPE_SHADER_EXT, &key, sizeof(key));
if (shader_handle != VK_NULL_HANDLE)
goto out;
nir_builder b = nir_builder_init_simple_shader(
MESA_SHADER_COMPUTE, GENX(pan_shader_get_compiler_options)(), "%s",
@@ -261,46 +267,38 @@ panvk_meta_desc_copy_shader(struct panvk_device *dev,
.gpu_id = phys_dev->kmod.props.gpu_prod_id,
.no_ubo_to_push = true,
};
struct util_dynarray binary;
util_dynarray_init(&binary, NULL);
pan_shader_preprocess(b.shader, inputs.gpu_id);
GENX(pan_shader_compile)(b.shader, &inputs, &binary, shader_info);
VkResult result = panvk_per_arch(create_internal_shader)(
dev, b.shader, &inputs, &shader);
ralloc_free(b.shader);
shader_info->push.count =
if (result != VK_SUCCESS)
return 0;
shader->info.push.count =
DIV_ROUND_UP(sizeof(struct pan_nir_desc_copy_info), 4);
struct panvk_priv_mem shader = panvk_pool_upload_aligned(
&dev->mempools.exec, binary.data, binary.size, 128);
util_dynarray_fini(&binary);
return shader;
}
void
panvk_per_arch(meta_desc_copy_init)(struct panvk_device *dev)
{
struct pan_shader_info shader_info;
dev->desc_copy.shader = panvk_meta_desc_copy_shader(dev, &shader_info);
mali_ptr shader = panvk_priv_mem_dev_addr(dev->desc_copy.shader);
struct panvk_priv_mem rsd =
panvk_pool_alloc_desc(&dev->mempools.rw, RENDERER_STATE);
pan_pack(panvk_priv_mem_host_addr(rsd), RENDERER_STATE, cfg) {
pan_shader_prepare_rsd(&shader_info, shader, &cfg);
shader->rsd = panvk_pool_alloc_desc(&dev->mempools.rw, RENDERER_STATE);
if (!panvk_priv_mem_host_addr(shader->rsd)) {
vk_shader_destroy(&dev->vk, &shader->vk, NULL);
return 0;
}
dev->desc_copy.rsd = rsd;
}
pan_pack(panvk_priv_mem_host_addr(shader->rsd), RENDERER_STATE, cfg) {
pan_shader_prepare_rsd(&shader->info,
panvk_priv_mem_dev_addr(shader->code_mem), &cfg);
}
void
panvk_per_arch(meta_desc_copy_cleanup)(struct panvk_device *dev)
{
panvk_pool_free_mem(&dev->mempools.rw, dev->desc_copy.rsd);
panvk_pool_free_mem(&dev->mempools.exec, dev->desc_copy.shader);
shader_handle = (VkShaderEXT)vk_meta_cache_object(
&dev->vk, &dev->meta, &key, sizeof(key), VK_OBJECT_TYPE_SHADER_EXT,
(uint64_t)panvk_internal_shader_to_handle(shader));
out:
shader = panvk_internal_shader_from_handle(shader_handle);
return panvk_priv_mem_dev_addr(shader->rsd);
}
VkResult
@@ -354,6 +352,10 @@ panvk_per_arch(meta_get_copy_desc_job)(
copy_info.tables[i] = shader_desc_state->tables[i];
}
mali_ptr desc_copy_rsd = panvk_meta_desc_copy_rsd(dev);
if (!desc_copy_rsd)
return VK_ERROR_OUT_OF_DEVICE_MEMORY;
struct panfrost_ptr push_uniforms =
panvk_cmd_alloc_dev_mem(cmdbuf, desc, sizeof(copy_info), 16);
@@ -391,7 +393,7 @@ panvk_per_arch(meta_get_copy_desc_job)(
GENX(pan_emit_tls)(&tlsinfo, tls.cpu);
pan_section_pack(job_desc->cpu, COMPUTE_JOB, DRAW, cfg) {
cfg.state = panvk_priv_mem_dev_addr(dev->desc_copy.rsd);
cfg.state = desc_copy_rsd,
cfg.push_uniforms = push_uniforms.gpu;
cfg.thread_storage = tls.gpu;
}
-5
View File
@@ -61,11 +61,6 @@ struct panvk_device {
struct vk_meta_device meta;
struct {
struct panvk_priv_mem shader;
struct panvk_priv_mem rsd;
} desc_copy;
struct {
struct panvk_pool rw;
struct panvk_pool rw_nc;
+1 -4
View File
@@ -14,6 +14,7 @@
enum panvk_meta_object_key_type {
PANVK_META_OBJECT_KEY_BLEND_SHADER = VK_META_OBJECT_KEY_DRIVER_OFFSET,
PANVK_META_OBJECT_KEY_COPY_DESC_SHADER,
};
static inline VkFormat
@@ -128,10 +129,6 @@ panvk_meta_copy_get_image_properties(struct panvk_image *img)
}
#if defined(PAN_ARCH) && PAN_ARCH <= 7
void panvk_per_arch(meta_desc_copy_init)(struct panvk_device *dev);
void panvk_per_arch(meta_desc_copy_cleanup)(struct panvk_device *dev);
struct panvk_cmd_buffer;
struct panvk_descriptor_state;
struct panvk_device;
-8
View File
@@ -141,20 +141,12 @@ panvk_meta_init(struct panvk_device *device)
MIN2(1024 >> i, pdev->properties.maxComputeWorkGroupSize[0]);
}
#if PAN_ARCH <= 7
panvk_per_arch(meta_desc_copy_init)(device);
#endif
return VK_SUCCESS;
}
static void
panvk_meta_cleanup(struct panvk_device *device)
{
#if PAN_ARCH <= 7
panvk_per_arch(meta_desc_copy_cleanup)(device);
#endif
vk_meta_device_finish(&device->vk, &device->meta);
}