panvk: Add an helper to create internal shaders

Blend and framebuffer preload shaders will be created as internal
shaders and added to the vk_meta object list.

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-23 16:37:38 +02:00 committed by Marge Bot
parent 206bf1be09
commit 91c86c31cd
2 changed files with 88 additions and 0 deletions

View file

@ -199,4 +199,32 @@ bool panvk_per_arch(nir_lower_descriptors)(
struct vk_descriptor_set_layout *const *set_layouts,
struct panvk_shader *shader);
enum panvk_internal_shader_type {
PANVK_INTERNAL_SHADER_BLEND,
PANVK_INTERNAL_SHADER_FB_PRELOAD,
};
/* This a stripped-down version of panvk_shader for internal shaders that
* are managed by vk_meta (blend and preload shaders). Those don't need the
* complexity inherent to user provided shaders as they're not exposed. */
struct panvk_internal_shader {
struct vk_shader vk;
struct pan_shader_info info;
struct panvk_priv_mem code_mem;
#if PAN_ARCH <= 7
struct panvk_priv_mem rsd;
#else
struct panvk_priv_mem spd;
#endif
};
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_internal_shader, vk.base, VkShaderEXT,
VK_OBJECT_TYPE_SHADER_EXT)
VkResult panvk_per_arch(create_internal_shader)(
struct panvk_device *dev, nir_shader *nir,
struct panfrost_compile_inputs *compiler_inputs,
struct panvk_internal_shader **shader_out);
#endif

View file

@ -1445,3 +1445,63 @@ const struct vk_device_shader_ops panvk_per_arch(device_shader_ops) = {
.cmd_set_dynamic_graphics_state = vk_cmd_set_dynamic_graphics_state,
.cmd_bind_shaders = panvk_cmd_bind_shaders,
};
static void
panvk_internal_shader_destroy(struct vk_device *vk_dev,
struct vk_shader *vk_shader,
const VkAllocationCallbacks *pAllocator)
{
struct panvk_device *dev = to_panvk_device(vk_dev);
struct panvk_internal_shader *shader =
container_of(vk_shader, struct panvk_internal_shader, vk);
panvk_pool_free_mem(&dev->mempools.exec, shader->code_mem);
#if PAN_ARCH <= 7
panvk_pool_free_mem(&dev->mempools.exec, shader->rsd);
#else
panvk_pool_free_mem(&dev->mempools.exec, shader->spd);
#endif
vk_shader_free(&dev->vk, pAllocator, &shader->vk);
}
static const struct vk_shader_ops panvk_internal_shader_ops = {
.destroy = panvk_internal_shader_destroy,
};
VkResult
panvk_per_arch(create_internal_shader)(
struct panvk_device *dev, nir_shader *nir,
struct panfrost_compile_inputs *compiler_inputs,
struct panvk_internal_shader **shader_out)
{
struct panvk_internal_shader *shader =
vk_shader_zalloc(&dev->vk, &panvk_internal_shader_ops, nir->info.stage,
NULL, sizeof(*shader));
if (shader == NULL)
return panvk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY);
VkResult result;
struct util_dynarray binary;
util_dynarray_init(&binary, nir);
GENX(pan_shader_compile)(nir, compiler_inputs, &binary, &shader->info);
unsigned bin_size = util_dynarray_num_elements(&binary, uint8_t);
if (bin_size) {
shader->code_mem = panvk_pool_upload_aligned(&dev->mempools.exec,
binary.data, bin_size, 128);
if (!panvk_priv_mem_dev_addr(shader->code_mem)) {
result = panvk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY);
goto err_free_shader;
}
}
*shader_out = shader;
return VK_SUCCESS;
err_free_shader:
vk_shader_free(&dev->vk, NULL, &shader->vk);
return result;
}