Mesa (main): vulkan/wsi: provide more info in wsi_image_create_info

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jun 3 04:43:36 UTC 2021


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

Author: Chia-I Wu <olvaffe at gmail.com>
Date:   Wed May 12 13:11:52 2021 -0700

vulkan/wsi: provide more info in wsi_image_create_info

Always chain wsi_image_create_info to VkImageCreateInfo, which indicates
that the image is a wsi image and can be transitioned to/from
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR.

Add prime_blit_buffer to the struct as well.  When set, it indicates the
prime blit destination and implies that the image is a prime blit
source.

Signed-off-by: Chia-I Wu <olvaffe at gmail.com>
Reviewed-by: Yiwei Zhang <zzyiwei at chromium.org>
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10789>

---

 src/broadcom/vulkan/v3dv_image.c  |  2 +-
 src/virtio/vulkan/vn_image.c      |  3 +--
 src/vulkan/wsi/wsi_common.h       |  9 +++++++++
 src/vulkan/wsi/wsi_common_drm.c   | 17 ++++++++++-------
 src/vulkan/wsi/wsi_common_win32.c |  4 ++++
 5 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/src/broadcom/vulkan/v3dv_image.c b/src/broadcom/vulkan/v3dv_image.c
index 971a3c0e487..3fc80acd7cb 100644
--- a/src/broadcom/vulkan/v3dv_image.c
+++ b/src/broadcom/vulkan/v3dv_image.c
@@ -291,7 +291,7 @@ create_image(struct v3dv_device *device,
    } else {
       const struct wsi_image_create_info *wsi_info =
          vk_find_struct_const(pCreateInfo->pNext, WSI_IMAGE_CREATE_INFO_MESA);
-      if (wsi_info)
+      if (wsi_info && wsi_info->scanout)
          modifier = DRM_FORMAT_MOD_LINEAR;
    }
 
diff --git a/src/virtio/vulkan/vn_image.c b/src/virtio/vulkan/vn_image.c
index 611664e3ade..bfb51250a89 100644
--- a/src/virtio/vulkan/vn_image.c
+++ b/src/virtio/vulkan/vn_image.c
@@ -399,8 +399,7 @@ vn_CreateImage(VkDevice device,
       external_info->handleTypes ==
          VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
 
-   if (wsi_info) {
-      assert(wsi_info->scanout);
+   if (wsi_info && wsi_info->scanout) {
       result = vn_wsi_create_scanout_image(dev, pCreateInfo, alloc, &img);
    } else if (anb_info) {
       result =
diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h
index b0ab216c5b6..d5367db3a94 100644
--- a/src/vulkan/wsi/wsi_common.h
+++ b/src/vulkan/wsi/wsi_common.h
@@ -38,10 +38,19 @@
 #define VK_STRUCTURE_TYPE_WSI_SURFACE_SUPPORTED_COUNTERS_MESA (VkStructureType)1000001005
 #define VK_STRUCTURE_TYPE_WSI_MEMORY_SIGNAL_SUBMIT_INFO_MESA (VkStructureType)1000001006
 
+/* This is always chained to VkImageCreateInfo when a wsi image is created.
+ * It indicates that the image can be transitioned to/from
+ * VK_IMAGE_LAYOUT_PRESENT_SRC_KHR.
+ */
 struct wsi_image_create_info {
     VkStructureType sType;
     const void *pNext;
     bool scanout;
+
+    /* If set, the buffer is the prime blit destination and the image is the
+     * source.
+     */
+    VkBuffer prime_blit_buffer;
 };
 
 struct wsi_memory_allocate_info {
diff --git a/src/vulkan/wsi/wsi_common_drm.c b/src/vulkan/wsi/wsi_common_drm.c
index 88483cfabdf..57d10c4aa6d 100644
--- a/src/vulkan/wsi/wsi_common_drm.c
+++ b/src/vulkan/wsi/wsi_common_drm.c
@@ -104,8 +104,12 @@ wsi_create_native_image(const struct wsi_swapchain *chain,
    for (int i = 0; i < ARRAY_SIZE(image->fds); i++)
       image->fds[i] = -1;
 
+   struct wsi_image_create_info image_wsi_info = {
+      .sType = VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA,
+   };
    VkImageCreateInfo image_info = {
       .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
+      .pNext = &image_wsi_info,
       .flags = 0,
       .imageType = VK_IMAGE_TYPE_2D,
       .format = pCreateInfo->imageFormat,
@@ -148,7 +152,6 @@ wsi_create_native_image(const struct wsi_swapchain *chain,
       __vk_append_struct(&image_info, &image_format_list);
    }
 
-   struct wsi_image_create_info image_wsi_info;
    VkImageDrmFormatModifierListCreateInfoEXT image_modifier_list;
 
    uint32_t image_modifier_count = 0, modifier_prop_count = 0;
@@ -156,11 +159,7 @@ wsi_create_native_image(const struct wsi_swapchain *chain,
    uint64_t *image_modifiers = NULL;
    if (num_modifier_lists == 0) {
       /* If we don't have modifiers, fall back to the legacy "scanout" flag */
-      image_wsi_info = (struct wsi_image_create_info) {
-         .sType = VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA,
-         .scanout = true,
-      };
-      __vk_append_struct(&image_info, &image_wsi_info);
+      image_wsi_info.scanout = true;
    } else {
       /* The winsys can't request modifiers if we don't support them. */
       assert(wsi->supports_modifiers);
@@ -490,9 +489,13 @@ wsi_create_prime_image(const struct wsi_swapchain *chain,
    if (result != VK_SUCCESS)
       goto fail;
 
+   const struct wsi_image_create_info image_wsi_info = {
+      .sType = VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA,
+      .prime_blit_buffer = image->prime.buffer,
+   };
    const VkImageCreateInfo image_info = {
       .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
-      .pNext = NULL,
+      .pNext = &image_wsi_info,
       .flags = 0,
       .imageType = VK_IMAGE_TYPE_2D,
       .format = pCreateInfo->imageFormat,
diff --git a/src/vulkan/wsi/wsi_common_win32.c b/src/vulkan/wsi/wsi_common_win32.c
index fa6f898e590..4368ad80a1b 100644
--- a/src/vulkan/wsi/wsi_common_win32.c
+++ b/src/vulkan/wsi/wsi_common_win32.c
@@ -310,8 +310,12 @@ wsi_create_native_image(const struct wsi_swapchain *chain,
    for (int i = 0; i < ARRAY_SIZE(image->fds); i++)
       image->fds[i] = -1;
 
+   const struct wsi_image_create_info image_wsi_info = {
+      .sType = VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA,
+   };
    VkImageCreateInfo image_info = {
       .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
+      .pNext = &image_wsi_info,
       .flags = 0,
       .imageType = VK_IMAGE_TYPE_2D,
       .format = pCreateInfo->imageFormat,



More information about the mesa-commit mailing list