Mesa (main): zink: consolidate and optimize index buffer handling during draw
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Jul 7 03:16:05 UTC 2021
Module: Mesa
Branch: main
Commit: a793067387f8b040b75352965b36e5014e5ae0ac
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a793067387f8b040b75352965b36e5014e5ae0ac
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Tue May 11 13:50:51 2021 -0400
zink: consolidate and optimize index buffer handling during draw
this can be reorganized to have more readable handling
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11746>
---
src/gallium/drivers/zink/zink_draw.c | 58 ++++++++++++++----------------------
1 file changed, 23 insertions(+), 35 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c
index 613fccd975b..d8280c649cd 100644
--- a/src/gallium/drivers/zink/zink_draw.c
+++ b/src/gallium/drivers/zink/zink_draw.c
@@ -442,15 +442,28 @@ zink_draw_vbo(struct pipe_context *pctx,
ctx->gfx_pipeline_state.primitive_restart = dinfo->primitive_restart;
unsigned index_offset = 0;
+ unsigned index_size = dinfo->index_size;
struct pipe_resource *index_buffer = NULL;
- if (dinfo->index_size > 0) {
- if (dinfo->has_user_indices) {
- if (!util_upload_index_buffer(pctx, dinfo, &draws[0], &index_buffer, &index_offset, 4)) {
- debug_printf("util_upload_index_buffer() failed\n");
- return;
- }
- } else
- index_buffer = dinfo->index.resource;
+ if (index_size > 0) {
+ if (dinfo->has_user_indices) {
+ if (!util_upload_index_buffer(pctx, dinfo, &draws[0], &index_buffer, &index_offset, 4)) {
+ debug_printf("util_upload_index_buffer() failed\n");
+ return;
+ }
+ zink_batch_reference_resource_move(batch, zink_resource(index_buffer));
+ } else {
+ index_buffer = dinfo->index.resource;
+ zink_batch_reference_resource_rw(batch, zink_resource(index_buffer), false);
+ }
+ assert(index_size <= 4 && index_size != 3);
+ assert(index_size != 1 || screen->info.have_EXT_index_type_uint8);
+ const VkIndexType index_type[3] = {
+ VK_INDEX_TYPE_UINT8_EXT,
+ VK_INDEX_TYPE_UINT16,
+ VK_INDEX_TYPE_UINT32,
+ };
+ struct zink_resource *res = zink_resource(index_buffer);
+ vkCmdBindIndexBuffer(batch->state->cmdbuf, res->obj->buffer, index_offset, index_type[index_size >> 1]);
}
bool have_streamout = !!ctx->num_so_targets;
@@ -625,7 +638,7 @@ zink_draw_vbo(struct pipe_context *pctx,
zink_bind_vertex_buffers(batch, ctx);
if (BITSET_TEST(ctx->gfx_stages[PIPE_SHADER_VERTEX]->nir->info.system_values_read, SYSTEM_VALUE_BASE_VERTEX)) {
- unsigned draw_mode_is_indexed = dinfo->index_size > 0;
+ unsigned draw_mode_is_indexed = index_size > 0;
vkCmdPushConstants(batch->state->cmdbuf, ctx->curr_program->base.layout, VK_SHADER_STAGE_VERTEX_BIT,
offsetof(struct zink_gfx_push_constant, draw_mode_is_indexed), sizeof(unsigned),
&draw_mode_is_indexed);
@@ -659,29 +672,7 @@ zink_draw_vbo(struct pipe_context *pctx,
unsigned draw_id = drawid_offset;
bool needs_drawid = ctx->drawid_broken;
batch->state->draw_count += num_draws;
- if (dinfo->index_size > 0) {
- VkIndexType index_type;
- unsigned index_size = dinfo->index_size;
- if (need_index_buffer_unref)
- /* index buffer will have been promoted from uint8 to uint16 in this case */
- index_size = MAX2(index_size, 2);
- switch (index_size) {
- case 1:
- assert(screen->info.have_EXT_index_type_uint8);
- index_type = VK_INDEX_TYPE_UINT8_EXT;
- break;
- case 2:
- index_type = VK_INDEX_TYPE_UINT16;
- break;
- case 4:
- index_type = VK_INDEX_TYPE_UINT32;
- break;
- default:
- unreachable("unknown index size!");
- }
- struct zink_resource *res = zink_resource(index_buffer);
- vkCmdBindIndexBuffer(batch->state->cmdbuf, res->obj->buffer, index_offset, index_type);
- zink_batch_reference_resource_rw(batch, res, false);
+ if (index_size > 0) {
if (dindirect && dindirect->buffer) {
assert(num_draws == 1);
if (needs_drawid)
@@ -730,9 +721,6 @@ zink_draw_vbo(struct pipe_context *pctx,
}
}
- if (dinfo->index_size > 0 && (dinfo->has_user_indices || need_index_buffer_unref))
- pipe_resource_reference(&index_buffer, NULL);
-
if (have_streamout) {
for (unsigned i = 0; i < ctx->num_so_targets; i++) {
struct zink_so_target *t = zink_so_target(ctx->so_targets[i]);
More information about the mesa-commit
mailing list