mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-20 22:30:12 +01:00
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:
parent
c257bf5142
commit
713f5c3600
3 changed files with 92 additions and 1 deletions
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
@ -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,
|
||||
Loading…
Add table
Reference in a new issue