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,