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:
committed by
Marge Bot
parent
b186220566
commit
d54592ec72
@@ -28,7 +28,6 @@
|
||||
|
||||
struct panvk_pipeline_shader {
|
||||
struct panvk_shader *base;
|
||||
struct panvk_priv_mem code;
|
||||
struct panvk_priv_mem rsd;
|
||||
|
||||
struct {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user