summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>2021-06-03 15:07:58 -0400
committerMarge Bot <eric+marge@anholt.net>2021-08-24 14:17:50 +0000
commit95a67ede542d702f577ab5abdad5cf82a40589f7 (patch)
tree0fa3d20ff0d9397dfcca1710366bc4860229cb0a
parent0802d307f669abc79024e4d2efa74d81cf9b0d33 (diff)
zink: add bind counts for so bindings
Reviewed-by: Dave Airlie <airlied@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12425>
-rw-r--r--src/gallium/drivers/zink/zink_context.c27
-rw-r--r--src/gallium/drivers/zink/zink_draw.cpp1
-rw-r--r--src/gallium/drivers/zink/zink_resource.h1
3 files changed, 26 insertions, 3 deletions
diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index 68c63ea1301..9033f31db4d 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -2280,7 +2280,7 @@ static void
resource_check_defer_buffer_barrier(struct zink_context *ctx, struct zink_resource *res, VkPipelineStageFlags pipeline)
{
assert(res->obj->is_buffer);
- if (res->bind_count[0]) {
+ if (res->bind_count[0] - res->so_bind_count > 0) {
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 */
@@ -3093,8 +3093,16 @@ zink_set_stream_output_targets(struct pipe_context *pctx,
struct zink_context *ctx = zink_context(pctx);
if (num_targets == 0) {
- for (unsigned i = 0; i < ctx->num_so_targets; i++)
+ for (unsigned i = 0; i < ctx->num_so_targets; i++) {
+ if (ctx->so_targets[i]) {
+ struct zink_resource *so = zink_resource(ctx->so_targets[i]->buffer);
+ if (so) {
+ so->so_bind_count--;
+ update_res_bind_count(ctx, so, false, true);
+ }
+ }
pipe_so_target_reference(&ctx->so_targets[i], NULL);
+ }
ctx->num_so_targets = 0;
} else {
for (unsigned i = 0; i < num_targets; i++) {
@@ -3111,9 +3119,22 @@ zink_set_stream_output_targets(struct pipe_context *pctx,
ctx->xfb_barrier |= zink_resource_buffer_needs_barrier(res,
VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT,
VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT);
+ struct zink_resource *so = zink_resource(ctx->so_targets[i]->buffer);
+ if (so) {
+ so->so_bind_count++;
+ update_res_bind_count(ctx, so, false, false);
+ }
}
- for (unsigned i = num_targets; i < ctx->num_so_targets; i++)
+ for (unsigned i = num_targets; i < ctx->num_so_targets; i++) {
+ if (ctx->so_targets[i]) {
+ struct zink_resource *so = zink_resource(ctx->so_targets[i]->buffer);
+ if (so) {
+ so->so_bind_count--;
+ update_res_bind_count(ctx, so, false, true);
+ }
+ }
pipe_so_target_reference(&ctx->so_targets[i], NULL);
+ }
ctx->num_so_targets = num_targets;
/* TODO: possibly avoid rebinding on resume if resuming from same buffers? */
diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp
index b59a566dd5e..62ae9e0b226 100644
--- a/src/gallium/drivers/zink/zink_draw.cpp
+++ b/src/gallium/drivers/zink/zink_draw.cpp
@@ -369,6 +369,7 @@ update_barriers(struct zink_context *ctx, bool is_compute)
pipeline |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT;
bind_count -= util_bitcount(res->vbo_bind_mask);
}
+ bind_count -= res->so_bind_count;
}
if (bind_count)
access |= VK_ACCESS_SHADER_READ_BIT;
diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h
index d83799e10e1..3b91404abcc 100644
--- a/src/gallium/drivers/zink/zink_resource.h
+++ b/src/gallium/drivers/zink/zink_resource.h
@@ -100,6 +100,7 @@ struct zink_resource {
struct util_range valid_buffer_range;
uint32_t vbo_bind_mask : PIPE_MAX_ATTRIBS;
uint8_t ubo_bind_count[2];
+ uint8_t so_bind_count;
uint32_t ubo_bind_mask[PIPE_SHADER_TYPES];
uint32_t ssbo_bind_mask[PIPE_SHADER_TYPES];
};