diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.h b/src/gallium/drivers/panfrost/pan_cmdstream.h index 8757c1071cf..a19e82b7783 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.h +++ b/src/gallium/drivers/panfrost/pan_cmdstream.h @@ -285,7 +285,8 @@ panfrost_emit_resources(struct panfrost_batch *batch, { struct panfrost_context *ctx = batch->ctx; struct pan_ptr T; - unsigned nr_tables = PAN_NUM_RESOURCE_TABLES; + unsigned nr_tables = + ALIGN_POT(PAN_NUM_RESOURCE_TABLES, MALI_RESOURCE_TABLE_SIZE_ALIGNMENT); /* Although individual resources need only 16 byte alignment, the * resource table as a whole must be 64-byte aligned. diff --git a/src/gallium/drivers/panfrost/pan_fb_preload.c b/src/gallium/drivers/panfrost/pan_fb_preload.c index ef0d27c0142..02dc3906de7 100644 --- a/src/gallium/drivers/panfrost/pan_fb_preload.c +++ b/src/gallium/drivers/panfrost/pan_fb_preload.c @@ -1090,7 +1090,8 @@ pan_preload_emit_dcd(struct pan_fb_preload_cache *cache, struct pan_pool *pool, } #else struct pan_ptr T; - unsigned nr_tables = PAN_BLIT_NUM_RESOURCE_TABLES; + unsigned nr_tables = ALIGN_POT(PAN_BLIT_NUM_RESOURCE_TABLES, + MALI_RESOURCE_TABLE_SIZE_ALIGNMENT); /* Although individual resources need only 16 byte alignment, the * resource table as a whole must be 64-byte aligned. diff --git a/src/panfrost/genxml/v10.xml b/src/panfrost/genxml/v10.xml index b851f85b02a..031fc0ad441 100644 --- a/src/panfrost/genxml/v10.xml +++ b/src/panfrost/genxml/v10.xml @@ -1813,6 +1813,8 @@ + + diff --git a/src/panfrost/genxml/v12.xml b/src/panfrost/genxml/v12.xml index 016fd5990d2..17b90132368 100644 --- a/src/panfrost/genxml/v12.xml +++ b/src/panfrost/genxml/v12.xml @@ -2177,6 +2177,8 @@ + + diff --git a/src/panfrost/genxml/v13.xml b/src/panfrost/genxml/v13.xml index 1c017b2e400..cd964c27eb3 100644 --- a/src/panfrost/genxml/v13.xml +++ b/src/panfrost/genxml/v13.xml @@ -2489,6 +2489,8 @@ + + diff --git a/src/panfrost/genxml/v9.xml b/src/panfrost/genxml/v9.xml index d330663952c..efdcc6a24f5 100644 --- a/src/panfrost/genxml/v9.xml +++ b/src/panfrost/genxml/v9.xml @@ -1327,6 +1327,8 @@ + + diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index ff124574abd..2d28171f104 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -2476,7 +2476,7 @@ panvk_cmd_draw_indirect(struct panvk_cmd_buffer *cmdbuf, uint32_t patch_attribs = cmdbuf->state.gfx.vi.attribs_changing_on_base_instance; uint32_t vs_res_table_size = - (util_last_bit(vs->desc_info.used_set_mask) + 1) * pan_size(RESOURCE); + panvk_shader_res_table_count(&cmdbuf->state.gfx.vs.desc); bool patch_faus = shader_uses_sysval(vs, graphics, vs.first_vertex) || shader_uses_sysval(vs, graphics, vs.base_instance); struct cs_index draw_params_addr = cs_scratch_reg64(b, 0); diff --git a/src/panfrost/vulkan/panvk_cmd_desc_state.h b/src/panfrost/vulkan/panvk_cmd_desc_state.h index f41021734a0..5bc57f0f51e 100644 --- a/src/panfrost/vulkan/panvk_cmd_desc_state.h +++ b/src/panfrost/vulkan/panvk_cmd_desc_state.h @@ -41,6 +41,16 @@ struct panvk_shader_desc_state { #endif }; +#if PAN_ARCH >= 9 +static inline uint32_t +panvk_shader_res_table_count(struct panvk_shader_desc_state *shader_desc_state) +{ + uint32_t count = (shader_desc_state->res_table & BITFIELD_MASK(6)); + assert(count % MALI_RESOURCE_TABLE_SIZE_ALIGNMENT == 0); + return count; +} +#endif + struct panvk_push_set { struct panvk_cmd_pool_obj base; struct panvk_descriptor_set set; diff --git a/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c b/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c index b4a32eb1204..463daeb9f4f 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c @@ -282,7 +282,8 @@ 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; + uint32_t res_count = + ALIGN_POT(1 + first_unused_set, MALI_RESOURCE_TABLE_SIZE_ALIGNMENT); struct pan_ptr ptr = panvk_cmd_alloc_desc_array(cmdbuf, res_count * repeat_count, RESOURCE); if (!ptr.gpu) @@ -317,8 +318,15 @@ panvk_per_arch(cmd_prepare_shader_res_table)( } } } + for (uint32_t i = first_unused_set + 1; i < res_count; i++) { + pan_pack(&res_table[i], RESOURCE, cfg) { + cfg.address = 0; + cfg.contains_descriptors = false; + cfg.size = 0; + } + } - res_table += first_unused_set + 1; + res_table += res_count; } shader_desc_state->res_table = ptr.gpu | res_count; diff --git a/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c b/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c index a90d995f313..57ba32abb1b 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c @@ -588,9 +588,15 @@ cmd_emit_dcd(struct panvk_cmd_buffer *cmdbuf, struct pan_fb_info *fbinfo, if (key->aspects == VK_IMAGE_ASPECT_COLOR_BIT) fill_bds(fbinfo, key, bds.cpu); - struct pan_ptr res_table = panvk_cmd_alloc_desc(cmdbuf, RESOURCE); + /* Resource table sizes need to be multiples of 4. We use only one + * element here though. + */ + const uint32_t res_table_size = MALI_RESOURCE_TABLE_SIZE_ALIGNMENT; + struct pan_ptr res_table = + panvk_cmd_alloc_desc_array(cmdbuf, res_table_size, RESOURCE); if (!res_table.cpu) return VK_ERROR_OUT_OF_DEVICE_MEMORY; + memset(res_table.cpu, 0, pan_size(RESOURCE) * res_table_size); pan_cast_and_pack(res_table.cpu, RESOURCE, cfg) { cfg.address = descs.gpu; @@ -668,12 +674,12 @@ cmd_emit_dcd(struct panvk_cmd_buffer *cmdbuf, struct pan_fb_info *fbinfo, cfg.flags_0.clean_fragment_write = true; #if PAN_ARCH >= 12 - cfg.fragment_resources = res_table.gpu | 1; + cfg.fragment_resources = res_table.gpu | res_table_size; cfg.fragment_shader = panvk_priv_mem_dev_addr(shader->spd); cfg.thread_storage = cmdbuf->state.gfx.tsd; #else cfg.maximum_z = 1.0; - cfg.shader.resources = res_table.gpu | 1; + cfg.shader.resources = res_table.gpu | res_table_size; cfg.shader.shader = panvk_priv_mem_dev_addr(shader->spd); cfg.shader.thread_storage = cmdbuf->state.gfx.tsd; #endif