diff options
author | Mike Blumenkrantz <michael.blumenkrantz@gmail.com> | 2021-06-03 15:07:58 -0400 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2021-08-24 14:17:50 +0000 |
commit | 95a67ede542d702f577ab5abdad5cf82a40589f7 (patch) | |
tree | 0fa3d20ff0d9397dfcca1710366bc4860229cb0a | |
parent | 0802d307f669abc79024e4d2efa74d81cf9b0d33 (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.c | 27 | ||||
-rw-r--r-- | src/gallium/drivers/zink/zink_draw.cpp | 1 | ||||
-rw-r--r-- | src/gallium/drivers/zink/zink_resource.h | 1 |
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]; }; |