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:
committed by
Marge Bot
parent
0802d307f6
commit
95a67ede54
@@ -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? */
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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];
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user