panvk: Prepare cmd_prepare_shader_res_table() for multiDrawIndirect

This will be needed for indirect draws, where the VS driver desc table
needs to be updated per-draw, which also forces us to have one resource
table per draw.

Signed-off-by: Ryan Mckeever <ryan.mckeever@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Olivia Lee <benjamin.lee@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34617>
This commit is contained in:
Ryan Mckeever 2025-04-23 15:28:56 -07:00 committed by Marge Bot
parent 690675748b
commit 2bbfcaf01f
4 changed files with 33 additions and 26 deletions

View file

@ -216,7 +216,7 @@ cmd_dispatch(struct panvk_cmd_buffer *cmdbuf, struct panvk_dispatch_info *info)
if (compute_state_dirty(cmdbuf, CS) ||
compute_state_dirty(cmdbuf, DESC_STATE)) {
result = panvk_per_arch(cmd_prepare_shader_res_table)(
cmdbuf, desc_state, shader, cs_desc_state);
cmdbuf, desc_state, shader, cs_desc_state, 1);
if (result != VK_SUCCESS)
return;
}

View file

@ -1341,8 +1341,8 @@ prepare_vs(struct panvk_cmd_buffer *cmdbuf)
if (gfx_state_dirty(cmdbuf, VS) || gfx_state_dirty(cmdbuf, DESC_STATE) ||
vs_driver_set_is_dirty(cmdbuf)) {
result = panvk_per_arch(cmd_prepare_shader_res_table)(cmdbuf, desc_state,
vs, vs_desc_state);
result = panvk_per_arch(cmd_prepare_shader_res_table)(
cmdbuf, desc_state, vs, vs_desc_state, 1);
if (result != VK_SUCCESS)
return result;
@ -1387,8 +1387,8 @@ prepare_fs(struct panvk_cmd_buffer *cmdbuf)
if (result != VK_SUCCESS)
return result;
result = panvk_per_arch(cmd_prepare_shader_res_table)(cmdbuf, desc_state,
fs, fs_desc_state);
result = panvk_per_arch(cmd_prepare_shader_res_table)(
cmdbuf, desc_state, fs, fs_desc_state, 1);
if (result != VK_SUCCESS)
return result;
}

View file

@ -76,7 +76,7 @@ VkResult panvk_per_arch(cmd_prepare_shader_res_table)(
struct panvk_cmd_buffer *cmdbuf,
const struct panvk_descriptor_state *desc_state,
const struct panvk_shader *shader,
struct panvk_shader_desc_state *shader_desc_state);
struct panvk_shader_desc_state *shader_desc_state, uint32_t repeat_count);
#endif
VkResult panvk_per_arch(cmd_prepare_push_descs)(

View file

@ -274,7 +274,7 @@ panvk_per_arch(cmd_prepare_shader_res_table)(
struct panvk_cmd_buffer *cmdbuf,
const struct panvk_descriptor_state *desc_state,
const struct panvk_shader *shader,
struct panvk_shader_desc_state *shader_desc_state)
struct panvk_shader_desc_state *shader_desc_state, uint32_t repeat_count)
{
if (!shader) {
shader_desc_state->res_table = 0;
@ -284,34 +284,41 @@ panvk_per_arch(cmd_prepare_shader_res_table)(
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 =
panvk_cmd_alloc_desc_array(cmdbuf, res_count, RESOURCE);
panvk_cmd_alloc_desc_array(cmdbuf, res_count * repeat_count, RESOURCE);
if (!ptr.gpu)
return VK_ERROR_OUT_OF_DEVICE_MEMORY;
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 r = 0; r < repeat_count; r++) {
uint64_t drv_set_addr = shader_desc_state->driver_set.dev_addr +
(r * shader_desc_state->driver_set.size);
/* 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 = drv_set_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];
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;
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;
}
}
}
res_table += first_unused_set + 1;
}
shader_desc_state->res_table = ptr.gpu | res_count;