diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index a6857810271..9b9bc96adf0 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -1170,6 +1170,26 @@ prepare_dcd(struct panvk_cmd_buffer *cmdbuf) } } +static void +prepare_index_buffer(struct panvk_cmd_buffer *cmdbuf, + struct panvk_draw_info *draw) +{ + struct cs_builder *b = + panvk_get_cs_builder(cmdbuf, PANVK_SUBQUEUE_VERTEX_TILER); + + if (draw->index.size && cmdbuf->state.gfx.ib.dirty) { + uint64_t ib_size = + panvk_buffer_range(cmdbuf->state.gfx.ib.buffer, + cmdbuf->state.gfx.ib.offset, VK_WHOLE_SIZE); + assert(ib_size <= UINT32_MAX); + cs_move32_to(b, cs_sr_reg32(b, 39), ib_size); + + cs_move64_to(b, cs_sr_reg64(b, 54), + panvk_buffer_gpu_ptr(cmdbuf->state.gfx.ib.buffer, + cmdbuf->state.gfx.ib.offset)); + } +} + static void clear_dirty(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw) { @@ -1319,15 +1339,7 @@ panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw) /* We don't use the resource dep system yet. */ cs_move32_to(b, cs_sr_reg32(b, 38), 0); - cs_move32_to( - b, cs_sr_reg32(b, 39), - (draw->index.offset + draw->vertex.count) * draw->index.size); - - if (draw->index.size && cmdbuf->state.gfx.ib.dirty) { - cs_move64_to(b, cs_sr_reg64(b, 54), - panvk_buffer_gpu_ptr(cmdbuf->state.gfx.ib.buffer, - cmdbuf->state.gfx.ib.offset)); - } + prepare_index_buffer(cmdbuf, draw); /* TODO: Revisit to avoid passing everything through the override flags * (likely needed for state preservation in secondary command buffers). */