panvk: Prepare the cmd_desc_state logic for Valhall

Quite a few things are common to Valhall/Bifrost. Specialize what's
different, and move the move to the root driver directory.

We don't compile it on v10 as this requires the cmd_buffer bits
that are not yet defined.

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/30736>
This commit is contained in:
Boris Brezillon 2024-06-28 13:40:55 +02:00 committed by Marge Bot
parent c257bf5142
commit 713f5c3600
3 changed files with 92 additions and 1 deletions

View file

@ -39,7 +39,6 @@ panvk_per_arch_libs = []
bifrost_archs = [6, 7]
bifrost_inc_dir = ['bifrost']
bifrost_files = [
'bifrost/panvk_vX_cmd_desc_state.c',
'bifrost/panvk_vX_meta_desc_copy.c',
]
@ -62,6 +61,7 @@ common_per_arch_files = [
panvk_entrypoints[0],
'panvk_vX_blend.c',
'panvk_vX_buffer_view.c',
'panvk_vX_cmd_desc_state.c',
'panvk_vX_cmd_meta.c',
'panvk_vX_descriptor_set.c',
'panvk_vX_descriptor_set_layout.c',

View file

@ -19,14 +19,24 @@
#include "panvk_macros.h"
#include "panvk_shader.h"
#include "vk_alloc.h"
#include "vk_command_buffer.h"
#include "vk_command_pool.h"
#include "pan_pool.h"
struct panvk_shader_desc_state {
#if PAN_ARCH <= 7
mali_ptr tables[PANVK_BIFROST_DESC_TABLE_COUNT];
mali_ptr img_attrib_table;
mali_ptr dyn_ssbos;
#else
struct {
mali_ptr dev_addr;
uint32_t size;
} driver_set;
mali_ptr res_table;
#endif
};
struct panvk_push_set {
@ -50,6 +60,7 @@ struct panvk_descriptor_set *panvk_per_arch(cmd_push_descriptors)(
struct vk_command_buffer *cmdbuf, struct panvk_descriptor_state *desc_state,
uint32_t set);
#if PAN_ARCH <= 7
void panvk_per_arch(cmd_prepare_dyn_ssbos)(
struct pan_pool *desc_pool, const struct panvk_descriptor_state *desc_state,
const struct panvk_shader *shader,
@ -59,6 +70,16 @@ void panvk_per_arch(cmd_prepare_shader_desc_tables)(
struct pan_pool *desc_pool, const struct panvk_descriptor_state *desc_state,
const struct panvk_shader *shader,
struct panvk_shader_desc_state *shader_desc_state);
#else
void panvk_per_arch(cmd_fill_dyn_bufs)(
struct pan_pool *desc_pool, const struct panvk_descriptor_state *desc_state,
const struct panvk_shader *shader, struct mali_buffer_packed *buffers);
void panvk_per_arch(cmd_prepare_shader_res_table)(
struct pan_pool *desc_pool, const struct panvk_descriptor_state *desc_state,
const struct panvk_shader *shader,
struct panvk_shader_desc_state *shader_desc_state);
#endif
void panvk_per_arch(cmd_prepare_push_descs)(
struct pan_pool *desc_pool, struct panvk_descriptor_state *desc_state,

View file

@ -106,6 +106,7 @@ panvk_per_arch(cmd_push_descriptors)(struct vk_command_buffer *vk_cmdbuf,
return set;
}
#if PAN_ARCH <= 7
void
panvk_per_arch(cmd_prepare_dyn_ssbos)(
struct pan_pool *desc_pool, const struct panvk_descriptor_state *desc_state,
@ -222,6 +223,75 @@ panvk_per_arch(cmd_prepare_shader_desc_tables)(
shader_desc_state->tables[PANVK_BIFROST_DESC_TABLE_SAMPLER] = sampler.gpu;
}
}
#else
void
panvk_per_arch(cmd_fill_dyn_bufs)(
struct pan_pool *desc_pool, const struct panvk_descriptor_state *desc_state,
const struct panvk_shader *shader, struct mali_buffer_packed *buffers)
{
if (!shader)
return;
for (uint32_t i = 0; i < shader->desc_info.dyn_bufs.count; i++) {
uint32_t src_handle = shader->desc_info.dyn_bufs.map[i];
uint32_t set_idx = COPY_DESC_HANDLE_EXTRACT_TABLE(src_handle);
uint32_t dyn_buf_idx = COPY_DESC_HANDLE_EXTRACT_INDEX(src_handle);
const struct panvk_descriptor_set *set = desc_state->sets[set_idx];
const uint32_t dyn_buf_offset =
desc_state->dyn_buf_offsets[set_idx][dyn_buf_idx];
assert(set_idx < MAX_SETS);
assert(set);
pan_pack(&buffers[i], BUFFER, cfg) {
cfg.size = set->dyn_bufs[dyn_buf_idx].size;
cfg.address = set->dyn_bufs[dyn_buf_idx].dev_addr + dyn_buf_offset;
}
}
}
void
panvk_per_arch(cmd_prepare_shader_res_table)(
struct pan_pool *desc_pool, const struct panvk_descriptor_state *desc_state,
const struct panvk_shader *shader,
struct panvk_shader_desc_state *shader_desc_state)
{
if (!shader || shader_desc_state->res_table)
return;
uint32_t first_unused_set = util_last_bit(shader->desc_info.used_set_mask);
uint32_t res_count = 1 + first_unused_set;
struct panfrost_ptr ptr =
pan_pool_alloc_desc_array(desc_pool, res_count, RESOURCE);
struct mali_resource_packed *res_table = ptr.cpu;
/* First entry is the driver set table, where we store the vertex attributes,
* the dummy sampler, the dynamic buffers and the vertex buffers. */
pan_pack(&res_table[0], RESOURCE, cfg) {
cfg.address = shader_desc_state->driver_set.dev_addr;
cfg.size = shader_desc_state->driver_set.size;
cfg.contains_descriptors = cfg.size > 0;
}
for (uint32_t i = 0; i < first_unused_set; i++) {
const struct panvk_descriptor_set *set = desc_state->sets[i];
pan_pack(&res_table[i + 1], RESOURCE, cfg) {
if (shader->desc_info.used_set_mask & BITFIELD_BIT(i)) {
cfg.address = set->descs.dev;
cfg.contains_descriptors = true;
cfg.size = set->desc_count * PANVK_DESCRIPTOR_SIZE;
} else {
cfg.address = 0;
cfg.contains_descriptors = false;
cfg.size = 0;
}
}
}
shader_desc_state->res_table = ptr.gpu | res_count;
}
#endif
void
panvk_per_arch(cmd_prepare_push_descs)(struct pan_pool *desc_pool,