Mesa (main): vulkan/wsi: Persistently map CPU images

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jul 7 18:47:59 UTC 2022


Module: Mesa
Branch: main
Commit: cf37837d36b287813fba8c94bd3502dc6025e1b3
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=cf37837d36b287813fba8c94bd3502dc6025e1b3

Author: Jason Ekstrand <jason.ekstrand at collabora.com>
Date:   Wed Jul  6 18:52:32 2022 -0500

vulkan/wsi: Persistently map CPU images

Reviewed-by: Jesse Natalie <jenatali at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17388>

---

 src/vulkan/wsi/wsi_common.c         |  8 ++++++++
 src/vulkan/wsi/wsi_common_private.h |  1 +
 src/vulkan/wsi/wsi_common_wayland.c | 13 ++-----------
 src/vulkan/wsi/wsi_common_x11.c     |  9 ++-------
 4 files changed, 13 insertions(+), 18 deletions(-)

diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c
index d621d35edc9..5b2b005a308 100644
--- a/src/vulkan/wsi/wsi_common.c
+++ b/src/vulkan/wsi/wsi_common.c
@@ -547,6 +547,9 @@ wsi_destroy_image(const struct wsi_swapchain *chain,
       close(image->dma_buf_fd);
 #endif
 
+   if (image->cpu_map != NULL)
+      wsi->UnmapMemory(chain->device, image->memory);
+
    if (image->buffer.blit_cmd_buffers) {
       int cmd_buffer_count =
          chain->buffer_blit_queue != VK_NULL_HANDLE ? 1 : wsi->queue_family_count;
@@ -1567,6 +1570,11 @@ wsi_create_cpu_image_mem(const struct wsi_swapchain *chain,
    if (result != VK_SUCCESS)
       return result;
 
+   result = wsi->MapMemory(chain->device, image->memory,
+                           0, VK_WHOLE_SIZE, 0, &image->cpu_map);
+   if (result != VK_SUCCESS)
+      return result;
+
    image->num_planes = 1;
    image->sizes[0] = reqs.size;
    image->row_pitches[0] = layout.rowPitch;
diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h
index 992ebf448b4..8db8014a178 100644
--- a/src/vulkan/wsi/wsi_common_private.h
+++ b/src/vulkan/wsi/wsi_common_private.h
@@ -85,6 +85,7 @@ struct wsi_image {
 #ifndef _WIN32
    int dma_buf_fd;
 #endif
+   void *cpu_map;
 };
 
 struct wsi_swapchain {
diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c
index e6d0e28b82b..097c732c669 100644
--- a/src/vulkan/wsi/wsi_common_wayland.c
+++ b/src/vulkan/wsi/wsi_common_wayland.c
@@ -1045,17 +1045,8 @@ wsi_wl_swapchain_queue_present(struct wsi_swapchain *wsi_chain,
 
    if (chain->display->sw) {
       struct wsi_wl_image *image = &chain->images[image_index];
-      void *dptr = image->data_ptr;
-      void *sptr;
-      chain->base.wsi->MapMemory(chain->base.device,
-                                 image->base.memory,
-                                 0, VK_WHOLE_SIZE, 0, &sptr);
-
-      memcpy(dptr, sptr, image->base.row_pitches[0] * chain->extent.height);
-
-      chain->base.wsi->UnmapMemory(chain->base.device,
-                                   image->base.memory);
-
+      memcpy(image->data_ptr, image->base.cpu_map,
+             image->base.row_pitches[0] * chain->extent.height);
    }
    if (chain->base.present_mode == VK_PRESENT_MODE_FIFO_KHR) {
       while (!chain->fifo_ready) {
diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c
index 5221b430947..eaabaceafb7 100644
--- a/src/vulkan/wsi/wsi_common_x11.c
+++ b/src/vulkan/wsi/wsi_common_x11.c
@@ -1290,16 +1290,12 @@ x11_present_to_x11_sw(struct x11_swapchain *chain, uint32_t image_index,
    struct x11_image *image = &chain->images[image_index];
 
    xcb_void_cookie_t cookie;
-   void *myptr;
+   void *myptr = image->base.cpu_map;
    size_t hdr_len = sizeof(xcb_put_image_request_t);
    int stride_b = image->base.row_pitches[0];
    size_t size = (hdr_len + stride_b * chain->extent.height) >> 2;
    uint64_t max_req_len = xcb_get_maximum_request_length(chain->conn);
 
-   chain->base.wsi->MapMemory(chain->base.device,
-                              image->base.memory,
-                              0, VK_WHOLE_SIZE, 0, &myptr);
-
    if (size < max_req_len) {
       cookie = xcb_put_image(chain->conn, XCB_IMAGE_FORMAT_Z_PIXMAP,
                              chain->window,
@@ -1308,7 +1304,7 @@ x11_present_to_x11_sw(struct x11_swapchain *chain, uint32_t image_index,
                              chain->extent.height,
                              0,0,0,24,
                              image->base.row_pitches[0] * chain->extent.height,
-                             myptr);
+                             image->base.cpu_map);
       xcb_discard_reply(chain->conn, cookie.sequence);
    } else {
       int num_lines = ((max_req_len << 2) - hdr_len) / stride_b;
@@ -1330,7 +1326,6 @@ x11_present_to_x11_sw(struct x11_swapchain *chain, uint32_t image_index,
       }
    }
 
-   chain->base.wsi->UnmapMemory(chain->base.device, image->base.memory);
    xcb_flush(chain->conn);
    return x11_swapchain_result(chain, VK_SUCCESS);
 }



More information about the mesa-commit mailing list