diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c index 7a46b28c1a4..547e640e288 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c @@ -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; } diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index 435d49c3d5c..47d48dbbf23 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -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; } diff --git a/src/panfrost/vulkan/panvk_cmd_desc_state.h b/src/panfrost/vulkan/panvk_cmd_desc_state.h index 88e843ba906..78b335b25ee 100644 --- a/src/panfrost/vulkan/panvk_cmd_desc_state.h +++ b/src/panfrost/vulkan/panvk_cmd_desc_state.h @@ -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)( diff --git a/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c b/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c index 7c8c232b7c4..389c3d7c0c5 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c @@ -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;