zink: force-reset unordered flags for buffer barriers on non-matching batch access

this should allow slightly better reordering

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24886>
This commit is contained in:
Mike Blumenkrantz
2023-08-24 09:27:11 -04:00
committed by Marge Bot
parent 639bdadd4a
commit e64a47cee7

View File

@@ -547,13 +547,18 @@ zink_resource_buffer_barrier(struct zink_context *ctx, struct zink_resource *res
pipeline = pipeline_access_stage(flags);
bool is_write = zink_resource_access_is_write(flags);
bool unordered = unordered_res_exec(ctx, res, is_write);
if (!buffer_needs_barrier(res, flags, pipeline, unordered))
return;
enum zink_resource_access rw = is_write ? ZINK_RESOURCE_ACCESS_RW : ZINK_RESOURCE_ACCESS_WRITE;
bool completed = zink_resource_usage_check_completion_fast(zink_screen(ctx->base.screen), res, rw);
bool usage_matches = !completed && zink_resource_usage_matches(res, ctx->batch.state);
if (!usage_matches) {
res->obj->unordered_write = true;
if (is_write || zink_resource_usage_check_completion_fast(zink_screen(ctx->base.screen), res, ZINK_RESOURCE_ACCESS_RW))
res->obj->unordered_read = true;
}
bool unordered_usage_matches = res->obj->unordered_access && usage_matches;
bool unordered = unordered_res_exec(ctx, res, is_write);
if (!buffer_needs_barrier(res, flags, pipeline, unordered))
return;
if (completed) {
/* reset access on complete */
res->obj->access = VK_ACCESS_NONE;