Mesa (main): zink: change vbo_bind_count to a mask of slots
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jul 22 00:21:05 UTC 2021
Module: Mesa
Branch: main
Commit: d5dd1259c5653b25ff7d6c0cb662cf5e5a27f798
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d5dd1259c5653b25ff7d6c0cb662cf5e5a27f798
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Fri May 14 10:44:02 2021 -0400
zink: change vbo_bind_count to a mask of slots
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11836>
---
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 e4599292dc2..613ab845e13 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 1557f267bfb..6c3d597c4ec 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 406b7d70b81..3c362e6ba6a 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];
More information about the mesa-commit
mailing list