From de354a48b9089ee32c43e783b3263a9a09041d55 Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Thu, 25 Jan 2024 15:34:00 +0100 Subject: [PATCH] zink: extract check_unordered_exec from zink_get_cmdbuf Avoid some code duplication and interleaving of resource checks v2: Use ALWAYS_INLINE (zmike) Signed-off-by: Gert Wollny Part-of: --- .../drivers/zink/zink_synchronization.cpp | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/gallium/drivers/zink/zink_synchronization.cpp b/src/gallium/drivers/zink/zink_synchronization.cpp index 05a904f3231..bd42ae94469 100644 --- a/src/gallium/drivers/zink/zink_synchronization.cpp +++ b/src/gallium/drivers/zink/zink_synchronization.cpp @@ -262,29 +262,36 @@ unordered_res_exec(const struct zink_context *ctx, const struct zink_resource *r return res->obj->unordered_write || !zink_batch_usage_matches(res->obj->bo->writes.u, ctx->batch.state); } +static ALWAYS_INLINE bool +check_unordered_exec(struct zink_context *ctx, struct zink_resource *res, bool is_write) +{ + if (res) { + if (!res->obj->is_buffer) { + /* TODO: figure out how to link up unordered layout -> ordered layout and delete this conditionals */ + if (zink_resource_usage_is_unflushed(res) && !res->obj->unordered_read && !res->obj->unordered_write) + return false; + } + return unordered_res_exec(ctx, res, is_write); + } + return true; +} + VkCommandBuffer zink_get_cmdbuf(struct zink_context *ctx, struct zink_resource *src, struct zink_resource *dst) { bool unordered_exec = (zink_debug & ZINK_DEBUG_NOREORDER) == 0; - /* TODO: figure out how to link up unordered layout -> ordered layout and delete these two conditionals */ - if (src && !src->obj->is_buffer) { - if (zink_resource_usage_is_unflushed(src) && !src->obj->unordered_read && !src->obj->unordered_write) - unordered_exec = false; - } - if (dst && !dst->obj->is_buffer) { - if (zink_resource_usage_is_unflushed(dst) && !dst->obj->unordered_read && !dst->obj->unordered_write) - unordered_exec = false; - } - if (src && unordered_exec) - unordered_exec &= unordered_res_exec(ctx, src, false); - if (dst && unordered_exec) - unordered_exec &= unordered_res_exec(ctx, dst, true); + + unordered_exec &= check_unordered_exec(ctx, src, false) && + check_unordered_exec(ctx, dst, true); + if (src) src->obj->unordered_read = unordered_exec; if (dst) dst->obj->unordered_write = unordered_exec; + if (!unordered_exec || ctx->unordered_blitting) zink_batch_no_rp(ctx); + if (unordered_exec) { ctx->batch.state->has_barriers = true; ctx->batch.has_work = true;