mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-27 06:10:13 +01:00
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:
parent
690675748b
commit
2bbfcaf01f
4 changed files with 33 additions and 26 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)(
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue