diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h index 0145e94e886..77933d7a4a4 100644 --- a/src/gallium/drivers/panfrost/pan_context.h +++ b/src/gallium/drivers/panfrost/pan_context.h @@ -406,6 +406,11 @@ panfrost_shader_compile(struct pipe_screen *pscreen, void panfrost_analyze_sysvals(struct panfrost_shader_state *ss); +mali_ptr +panfrost_get_index_buffer(struct panfrost_batch *batch, + const struct pipe_draw_info *info, + const struct pipe_draw_start_count_bias *draw); + mali_ptr panfrost_get_index_buffer_bounded(struct panfrost_batch *batch, const struct pipe_draw_info *info, diff --git a/src/gallium/drivers/panfrost/pan_helpers.c b/src/gallium/drivers/panfrost/pan_helpers.c index e428aa43553..c487ef023cd 100644 --- a/src/gallium/drivers/panfrost/pan_helpers.c +++ b/src/gallium/drivers/panfrost/pan_helpers.c @@ -83,6 +83,37 @@ panfrost_analyze_sysvals(struct panfrost_shader_state *ss) ss->dirty_shader = dirty_shader; } +/* + * Gets a GPU address for the associated index buffer. Only gauranteed to be + * good for the duration of the draw (transient), could last longer. Bounds are + * not calculated. + */ +mali_ptr +panfrost_get_index_buffer(struct panfrost_batch *batch, + const struct pipe_draw_info *info, + const struct pipe_draw_start_count_bias *draw) +{ + struct panfrost_resource *rsrc = pan_resource(info->index.resource); + off_t offset = draw->start * info->index_size; + + if (!info->has_user_indices) { + /* Only resources can be directly mapped */ + panfrost_batch_read_rsrc(batch, rsrc, PIPE_SHADER_VERTEX); + return rsrc->image.data.bo->ptr.gpu + offset; + } else { + /* Otherwise, we need to upload to transient memory */ + const uint8_t *ibuf8 = (const uint8_t *) info->index.user; + struct panfrost_ptr T = + pan_pool_alloc_aligned(&batch->pool.base, + draw->count * + info->index_size, + info->index_size); + + memcpy(T.cpu, ibuf8 + offset, draw->count * info->index_size); + return T.gpu; + } +} + /* Gets a GPU address for the associated index buffer. Only gauranteed to be * good for the duration of the draw (transient), could last longer. Also get * the bounds on the index buffer for the range accessed by the draw. We do @@ -97,38 +128,19 @@ panfrost_get_index_buffer_bounded(struct panfrost_batch *batch, { struct panfrost_resource *rsrc = pan_resource(info->index.resource); struct panfrost_context *ctx = batch->ctx; - off_t offset = draw->start * info->index_size; bool needs_indices = true; - mali_ptr out = 0; if (info->index_bounds_valid) { *min_index = info->min_index; *max_index = info->max_index; needs_indices = false; - } - - if (!info->has_user_indices) { - /* Only resources can be directly mapped */ - panfrost_batch_read_rsrc(batch, rsrc, PIPE_SHADER_VERTEX); - out = rsrc->image.data.bo->ptr.gpu + offset; - + } else if (!info->has_user_indices) { /* Check the cache */ needs_indices = !panfrost_minmax_cache_get(rsrc->index_cache, draw->start, draw->count, min_index, max_index); - } else { - /* Otherwise, we need to upload to transient memory */ - const uint8_t *ibuf8 = (const uint8_t *) info->index.user; - struct panfrost_ptr T = - pan_pool_alloc_aligned(&batch->pool.base, - draw->count * - info->index_size, - info->index_size); - - memcpy(T.cpu, ibuf8 + offset, draw->count * info->index_size); - out = T.gpu; } if (needs_indices) { @@ -141,7 +153,7 @@ panfrost_get_index_buffer_bounded(struct panfrost_batch *batch, *min_index, *max_index); } - return out; + return panfrost_get_index_buffer(batch, info, draw); } /**