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>
This commit is contained in:
Mike Blumenkrantz
2021-06-03 15:07:58 -04:00
committed by Marge Bot
parent 0802d307f6
commit 95a67ede54
3 changed files with 26 additions and 3 deletions
+24 -3
View File
@@ -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? */
+1
View File
@@ -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;
+1
View File
@@ -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];
};