Mesa (main): vulkan/wsi/wayland: Use host pointer import when available

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


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

Author: Jason Ekstrand <jason.ekstrand at collabora.com>
Date:   Wed Jul  6 17:27:42 2022 -0500

vulkan/wsi/wayland: Use host pointer import when available

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

---

 src/vulkan/wsi/wsi_common_wayland.c | 70 ++++++++++++++++++++++++-------------
 1 file changed, 46 insertions(+), 24 deletions(-)

diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c
index 097c732c669..1c87f1dfb90 100644
--- a/src/vulkan/wsi/wsi_common_wayland.c
+++ b/src/vulkan/wsi/wsi_common_wayland.c
@@ -909,8 +909,9 @@ struct wsi_wl_image {
    struct wsi_image                             base;
    struct wl_buffer *                           buffer;
    bool                                         busy;
-   void *                                       data_ptr;
-   uint32_t                                     data_size;
+   int                                          shm_fd;
+   void *                                       shm_ptr;
+   unsigned                                     shm_size;
 };
 
 struct wsi_wl_swapchain {
@@ -1043,9 +1044,9 @@ wsi_wl_swapchain_queue_present(struct wsi_swapchain *wsi_chain,
 {
    struct wsi_wl_swapchain *chain = (struct wsi_wl_swapchain *)wsi_chain;
 
-   if (chain->display->sw) {
+   if (!chain->base.wsi->has_import_memory_host) {
       struct wsi_wl_image *image = &chain->images[image_index];
-      memcpy(image->data_ptr, image->base.cpu_map,
+      memcpy(image->shm_ptr, image->base.cpu_map,
              image->base.row_pitches[0] * chain->extent.height);
    }
    if (chain->base.present_mode == VK_PRESENT_MODE_FIFO_KHR) {
@@ -1100,6 +1101,29 @@ static const struct wl_buffer_listener buffer_listener = {
    buffer_handle_release,
 };
 
+static uint8_t *
+wsi_wl_alloc_image_shm(struct wsi_image *imagew, unsigned size)
+{
+   struct wsi_wl_image *image = (struct wsi_wl_image *)imagew;
+
+   /* Create a shareable buffer */
+   int fd = os_create_anonymous_file(size, NULL);
+   if (fd < 0)
+      return NULL;
+
+   void *ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+   if (ptr == MAP_FAILED) {
+      close(fd);
+      return NULL;
+   }
+
+   image->shm_fd = fd;
+   image->shm_ptr = ptr;
+   image->shm_size = size;
+
+   return ptr;
+}
+
 static VkResult
 wsi_wl_image_init(struct wsi_wl_swapchain *chain,
                   struct wsi_wl_image *image,
@@ -1115,29 +1139,24 @@ wsi_wl_image_init(struct wsi_wl_swapchain *chain,
       return result;
 
    if (display->sw) {
-      int fd, stride;
-
-      stride = image->base.row_pitches[0];
-      image->data_size = stride * chain->extent.height;
-
-      /* Create a shareable buffer */
-      fd = os_create_anonymous_file(image->data_size, NULL);
-      if (fd < 0)
-         goto fail_image;
-
-      image->data_ptr = mmap(NULL, image->data_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
-      if (image->data_ptr == MAP_FAILED) {
-         close(fd);
-         goto fail_image;
+      if (chain->base.wsi->has_import_memory_host) {
+         assert(image->shm_ptr != NULL);
+      } else {
+         assert(image->shm_ptr == NULL);
+         wsi_wl_alloc_image_shm(&image->base, image->base.row_pitches[0] *
+                                              chain->extent.height);
       }
+
       /* Share it in a wl_buffer */
-      struct wl_shm_pool *pool = wl_shm_create_pool(display->wl_shm, fd, image->data_size);
+      struct wl_shm_pool *pool = wl_shm_create_pool(display->wl_shm,
+                                                    image->shm_fd,
+                                                    image->shm_size);
       wl_proxy_set_queue((struct wl_proxy *)pool, display->queue);
       image->buffer = wl_shm_pool_create_buffer(pool, 0, chain->extent.width,
-                                                chain->extent.height, stride,
+                                                chain->extent.height,
+                                                image->base.row_pitches[0],
                                                 chain->shm_format);
       wl_shm_pool_destroy(pool);
-      close(fd);
    } else {
       assert(display->wl_dmabuf);
 
@@ -1185,8 +1204,10 @@ wsi_wl_swapchain_images_free(struct wsi_wl_swapchain *chain)
       if (chain->images[i].buffer) {
          wl_buffer_destroy(chain->images[i].buffer);
          wsi_destroy_image(&chain->base, &chain->images[i].base);
-         if (chain->images[i].data_ptr)
-            munmap(chain->images[i].data_ptr, chain->images[i].data_size);
+         if (chain->images[i].shm_size) {
+            close(chain->images[i].shm_fd);
+            munmap(chain->images[i].shm_ptr, chain->images[i].shm_size);
+         }
       }
    }
    wsi_destroy_image_info(&chain->base, &chain->base.image_info);
@@ -1307,7 +1328,8 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface,
 
    if (wsi_device->sw) {
       result = wsi_configure_cpu_image(&chain->base, pCreateInfo,
-                                       NULL /* alloc_shm */,
+                                       wsi_device->has_import_memory_host ?
+                                          wsi_wl_alloc_image_shm : NULL,
                                        &chain->base.image_info);
    } else {
       result = wsi_configure_native_image(&chain->base, pCreateInfo,



More information about the mesa-commit mailing list