From 35e318f2fab8bdc4ee4bc79b64392322a10e495c Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 19 Apr 2021 15:49:54 -0400 Subject: [PATCH] zink: force scanout sync when mapping scanout resource this is just for unit tests where the scanout object is redundant and the only time a flush occurs is from stalling on readback Fixes: 104603fa763 ("zink: create separate linear tiling image for scanout") Acked-by: Erik Faye-Lund Part-of: (cherry picked from commit 874535752b497bd8ab49cf97add6de2ed9b16f81) --- .pick_status.json | 2 +- src/gallium/drivers/zink/zink_resource.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index 71388909083..4de8af2b634 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -13,7 +13,7 @@ "description": "zink: force scanout sync when mapping scanout resource", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "104603fa763c52e98a79785dd514beab949546db" }, diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index 5cf4e812fa8..bf51add034a 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -1003,8 +1003,17 @@ zink_transfer_map(struct pipe_context *pctx, if (usage & PIPE_MAP_READ) { zink_transfer_copy_bufimage(ctx, staging_res, res, trans); + /* TODO: remove for wsi */ + struct zink_resource *scanout = NULL; + if (res->scanout_obj) { + scanout = ctx->flush_res; + ctx->flush_res = res; + } /* need to wait for rendering to finish */ zink_fence_wait(pctx); + /* TODO: remove for wsi */ + if (res->scanout_obj) + ctx->flush_res = scanout; } ptr = base = map_resource(screen, staging_res); @@ -1019,10 +1028,19 @@ zink_transfer_map(struct pipe_context *pctx, if (zink_resource_has_usage(res, ZINK_RESOURCE_ACCESS_READ)) resource_sync_reads(ctx, res); if (zink_resource_has_usage(res, ZINK_RESOURCE_ACCESS_RW)) { + /* TODO: remove for wsi */ + struct zink_resource *scanout = NULL; + if (res->scanout_obj) { + scanout = ctx->flush_res; + ctx->flush_res = res; + } if (usage & PIPE_MAP_READ) resource_sync_writes_from_batch_usage(ctx, res); else zink_fence_wait(pctx); + /* TODO: remove for wsi */ + if (res->scanout_obj) + ctx->flush_res = scanout; } VkImageSubresource isr = { res->aspect,