From d5dd1259c5653b25ff7d6c0cb662cf5e5a27f798 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 14 May 2021 10:44:02 -0400 Subject: [PATCH] zink: change vbo_bind_count to a mask of slots Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_context.c | 17 +++++++++++------ src/gallium/drivers/zink/zink_draw.cpp | 4 ++-- src/gallium/drivers/zink/zink_resource.h | 2 +- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index e459929..613ab84 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -899,7 +899,7 @@ update_existing_vbo(struct zink_context *ctx, unsigned slot) if (!ctx->vertex_buffers[slot].buffer.resource) return; struct zink_resource *res = zink_resource(ctx->vertex_buffers[slot].buffer.resource); - res->vbo_bind_count--; + res->vbo_bind_mask &= ~BITFIELD_BIT(slot); update_res_bind_count(ctx, res, false, true); } @@ -932,7 +932,7 @@ zink_set_vertex_buffers(struct pipe_context *pctx, } if (vb->buffer.resource) { struct zink_resource *res = zink_resource(vb->buffer.resource); - res->vbo_bind_count++; + res->vbo_bind_mask |= BITFIELD_BIT(start_slot + i); update_res_bind_count(ctx, res, false, false); ctx_vb->stride = vb->stride; ctx_vb->buffer_offset = vb->buffer_offset; @@ -2247,8 +2247,8 @@ resource_check_defer_buffer_barrier(struct zink_context *ctx, struct zink_resour { assert(res->obj->is_buffer); if (res->bind_count[0]) { - if ((res->obj->is_buffer && res->vbo_bind_count && !(pipeline & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT)) || - ((!res->obj->is_buffer || res->vbo_bind_count != res->bind_count[0]) && !is_shader_pipline_stage(pipeline))) + if ((res->obj->is_buffer && res->vbo_bind_mask && !(pipeline & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT)) || + ((!res->obj->is_buffer || util_bitcount(res->vbo_bind_mask) != res->bind_count[0]) && !is_shader_pipline_stage(pipeline))) /* gfx rebind */ _mesa_set_add(ctx->need_barriers[0], res); } @@ -3124,9 +3124,14 @@ rebind_buffer(struct zink_context *ctx, struct zink_resource *res) unsigned num_rebinds = 0, num_image_rebinds_remaining[2] = {res->image_bind_count[0], res->image_bind_count[1]}; bool has_write = false; - if (res->vbo_bind_count) { + if (res->vbo_bind_mask) { + u_foreach_bit(slot, res->vbo_bind_mask) { + if (ctx->vertex_buffers[slot].buffer.resource != &res->base.b) //wrong context + return; + break; + } ctx->vertex_buffers_dirty = true; - num_rebinds += res->vbo_bind_count; + num_rebinds += util_bitcount(res->vbo_bind_mask); } for (unsigned shader = 0; num_rebinds < total_rebinds && shader < PIPE_SHADER_TYPES; shader++) { u_foreach_bit(slot, res->ubo_bind_mask[shader]) { diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index 1557f26..6c3d597 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -360,10 +360,10 @@ update_barriers(struct zink_context *ctx, bool is_compute) access |= VK_ACCESS_UNIFORM_READ_BIT; bind_count -= res->ubo_bind_count[is_compute]; } - if (!is_compute && res->vbo_bind_count) { + if (!is_compute && res->vbo_bind_mask) { access |= VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT; pipeline |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT; - bind_count -= res->vbo_bind_count; + bind_count -= util_bitcount(res->vbo_bind_mask); } } if (bind_count) diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h index 406b7d7..3c362e6 100644 --- a/src/gallium/drivers/zink/zink_resource.h +++ b/src/gallium/drivers/zink/zink_resource.h @@ -105,7 +105,7 @@ struct zink_resource { union { struct { struct util_range valid_buffer_range; - uint16_t vbo_bind_count; + uint32_t vbo_bind_mask : PIPE_MAX_ATTRIBS; uint8_t ubo_bind_count[2]; uint32_t ubo_bind_mask[PIPE_SHADER_TYPES]; uint32_t ssbo_bind_mask[PIPE_SHADER_TYPES]; -- 2.7.4