zink: force scanout sync when mapping scanout resource
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Mon, 19 Apr 2021 19:49:54 +0000 (15:49 -0400)
committerMarge Bot <eric+marge@anholt.net>
Tue, 20 Apr 2021 14:29:38 +0000 (14:29 +0000)
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 <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10239>

src/gallium/drivers/zink/zink_resource.c

index efd7a6e..f9aae49 100644 (file)
@@ -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,