Mesa (main): vulkan/wsi/drm: Break create_prime_image in pieces

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jan 31 20:20:13 UTC 2022


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

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Thu Jul 22 18:24:02 2021 -0500

vulkan/wsi/drm: Break create_prime_image in pieces

This is similar to the previous two commits that we did for DRM native
images.  It breaks it into configure/create/bind/finish and calls
wsi_create_image to walk through the process.  The primary difference is
that prime images need fifth step in the process to set up the blit
command buffer.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Acked-by: Erik Faye-Lund <erik.faye-lund at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12031>

---

 src/vulkan/wsi/wsi_common.c         |   7 +-
 src/vulkan/wsi/wsi_common_drm.c     | 168 ++++++++++++++++++------------------
 src/vulkan/wsi/wsi_common_private.h |  14 +++
 3 files changed, 105 insertions(+), 84 deletions(-)

diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c
index 30f781d7599..725239ba8c0 100644
--- a/src/vulkan/wsi/wsi_common.c
+++ b/src/vulkan/wsi/wsi_common.c
@@ -402,7 +402,6 @@ wsi_configure_image(const struct wsi_swapchain *chain,
 
    info->wsi = (struct wsi_image_create_info) {
       .sType = VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA,
-      .scanout = true,
    };
    __vk_append_struct(&info->create, &info->wsi);
 
@@ -482,6 +481,12 @@ wsi_create_image(const struct wsi_swapchain *chain,
    if (result != VK_SUCCESS)
       goto fail;
 
+   if (info->finish_create) {
+      result = info->finish_create(chain, info, image);
+      if (result != VK_SUCCESS)
+         goto fail;
+   }
+
    return VK_SUCCESS;
 
 fail:
diff --git a/src/vulkan/wsi/wsi_common_drm.c b/src/vulkan/wsi/wsi_common_drm.c
index 50a6a6c3e7c..39e66949f74 100644
--- a/src/vulkan/wsi/wsi_common_drm.c
+++ b/src/vulkan/wsi/wsi_common_drm.c
@@ -454,22 +454,15 @@ align_u32(uint32_t v, uint32_t a)
 
 #define WSI_PRIME_LINEAR_STRIDE_ALIGN 256
 
-VkResult
-wsi_create_prime_image(const struct wsi_swapchain *chain,
-                       const VkSwapchainCreateInfoKHR *pCreateInfo,
-                       bool use_modifier,
-                       struct wsi_image *image)
+static VkResult
+wsi_create_prime_image_mem(const struct wsi_swapchain *chain,
+                           const struct wsi_image_info *info,
+                           struct wsi_image *image)
 {
    const struct wsi_device *wsi = chain->wsi;
    VkResult result;
 
-   memset(image, 0, sizeof(*image));
-
-   const uint32_t cpp = vk_format_size(pCreateInfo->imageFormat);
-   const uint32_t linear_stride = align_u32(pCreateInfo->imageExtent.width * cpp,
-                                            WSI_PRIME_LINEAR_STRIDE_ALIGN);
-
-   uint32_t linear_size = linear_stride * pCreateInfo->imageExtent.height;
+   uint32_t linear_size = info->linear_stride * info->create.extent.height;
    linear_size = align_u32(linear_size, 4096);
 
    const VkExternalMemoryBufferCreateInfo prime_buffer_external_info = {
@@ -487,7 +480,7 @@ wsi_create_prime_image(const struct wsi_swapchain *chain,
    result = wsi->CreateBuffer(chain->device, &prime_buffer_info,
                               &chain->alloc, &image->prime.buffer);
    if (result != VK_SUCCESS)
-      goto fail;
+      return result;
 
    VkMemoryRequirements reqs;
    wsi->GetBufferMemoryRequirements(chain->device, image->prime.buffer, &reqs);
@@ -518,46 +511,12 @@ wsi_create_prime_image(const struct wsi_swapchain *chain,
    result = wsi->AllocateMemory(chain->device, &prime_memory_info,
                                 &chain->alloc, &image->prime.memory);
    if (result != VK_SUCCESS)
-      goto fail;
+      return result;
 
    result = wsi->BindBufferMemory(chain->device, image->prime.buffer,
                                   image->prime.memory, 0);
    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_src = true,
-   };
-   VkImageCreateInfo image_info = {
-      .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
-      .pNext = &image_wsi_info,
-      .flags = 0,
-      .imageType = VK_IMAGE_TYPE_2D,
-      .format = pCreateInfo->imageFormat,
-      .extent = {
-         .width = pCreateInfo->imageExtent.width,
-         .height = pCreateInfo->imageExtent.height,
-         .depth = 1,
-      },
-      .mipLevels = 1,
-      .arrayLayers = 1,
-      .samples = VK_SAMPLE_COUNT_1_BIT,
-      .tiling = VK_IMAGE_TILING_OPTIMAL,
-      .usage = pCreateInfo->imageUsage | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
-      .sharingMode = pCreateInfo->imageSharingMode,
-      .queueFamilyIndexCount = pCreateInfo->queueFamilyIndexCount,
-      .pQueueFamilyIndices = pCreateInfo->pQueueFamilyIndices,
-      .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
-   };
-   if (pCreateInfo->flags & VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR) {
-      image_info.flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT |
-                          VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR;
-   }
-   result = wsi->CreateImage(chain->device, &image_info,
-                             &chain->alloc, &image->image);
-   if (result != VK_SUCCESS)
-      goto fail;
+      return result;
 
    wsi->GetImageMemoryRequirements(chain->device, image->image, &reqs);
 
@@ -576,21 +535,44 @@ wsi_create_prime_image(const struct wsi_swapchain *chain,
    result = wsi->AllocateMemory(chain->device, &memory_info,
                                 &chain->alloc, &image->memory);
    if (result != VK_SUCCESS)
-      goto fail;
+      return result;
 
-   result = wsi->BindImageMemory(chain->device, image->image,
-                                 image->memory, 0);
+   const VkMemoryGetFdInfoKHR linear_memory_get_fd_info = {
+      .sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR,
+      .pNext = NULL,
+      .memory = image->prime.memory,
+      .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
+   };
+   int fd;
+   result = wsi->GetMemoryFdKHR(chain->device, &linear_memory_get_fd_info, &fd);
    if (result != VK_SUCCESS)
-      goto fail;
+      return result;
+
+   image->drm_modifier = info->prime_use_linear_modifier ?
+                         DRM_FORMAT_MOD_LINEAR : DRM_FORMAT_MOD_INVALID;
+   image->num_planes = 1;
+   image->sizes[0] = linear_size;
+   image->row_pitches[0] = info->linear_stride;
+   image->offsets[0] = 0;
+   image->fds[0] = fd;
+
+   return VK_SUCCESS;
+}
+
+static VkResult
+wsi_finish_create_prime_image(const struct wsi_swapchain *chain,
+                              const struct wsi_image_info *info,
+                              struct wsi_image *image)
+{
+   const struct wsi_device *wsi = chain->wsi;
+   VkResult result;
 
    image->prime.blit_cmd_buffers =
       vk_zalloc(&chain->alloc,
                 sizeof(VkCommandBuffer) * wsi->queue_family_count, 8,
                 VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
-   if (!image->prime.blit_cmd_buffers) {
-      result = VK_ERROR_OUT_OF_HOST_MEMORY;
-      goto fail;
-   }
+   if (!image->prime.blit_cmd_buffers)
+      return VK_ERROR_OUT_OF_HOST_MEMORY;
 
    int cmd_buffer_count = chain->prime_blit_queue != VK_NULL_HANDLE ? 1 : wsi->queue_family_count;
    for (uint32_t i = 0; i < cmd_buffer_count; i++) {
@@ -604,7 +586,7 @@ wsi_create_prime_image(const struct wsi_swapchain *chain,
       result = wsi->AllocateCommandBuffers(chain->device, &cmd_buffer_info,
                                            &image->prime.blit_cmd_buffers[i]);
       if (result != VK_SUCCESS)
-         goto fail;
+         return result;
 
       const VkCommandBufferBeginInfo begin_info = {
          .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
@@ -613,7 +595,8 @@ wsi_create_prime_image(const struct wsi_swapchain *chain,
 
       struct VkBufferImageCopy buffer_image_copy = {
          .bufferOffset = 0,
-         .bufferRowLength = linear_stride / cpp,
+         .bufferRowLength = info->linear_stride /
+                            vk_format_size(info->create.format),
          .bufferImageHeight = 0,
          .imageSubresource = {
             .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
@@ -622,11 +605,7 @@ wsi_create_prime_image(const struct wsi_swapchain *chain,
             .layerCount = 1,
          },
          .imageOffset = { .x = 0, .y = 0, .z = 0 },
-         .imageExtent = {
-            .width = pCreateInfo->imageExtent.width,
-            .height = pCreateInfo->imageExtent.height,
-            .depth = 1,
-         },
+         .imageExtent = info->create.extent,
       };
       wsi->CmdCopyImageToBuffer(image->prime.blit_cmd_buffers[i],
                                 image->image,
@@ -636,32 +615,55 @@ wsi_create_prime_image(const struct wsi_swapchain *chain,
 
       result = wsi->EndCommandBuffer(image->prime.blit_cmd_buffers[i]);
       if (result != VK_SUCCESS)
-         goto fail;
+         return result;
    }
 
-   const VkMemoryGetFdInfoKHR linear_memory_get_fd_info = {
-      .sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR,
-      .pNext = NULL,
-      .memory = image->prime.memory,
-      .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
-   };
-   int fd;
-   result = wsi->GetMemoryFdKHR(chain->device, &linear_memory_get_fd_info, &fd);
+   return VK_SUCCESS;
+}
+
+VkResult
+wsi_configure_prime_image(UNUSED const struct wsi_swapchain *chain,
+                          const VkSwapchainCreateInfoKHR *pCreateInfo,
+                          bool use_modifier,
+                          struct wsi_image_info *info)
+{
+   VkResult result = wsi_configure_image(chain, pCreateInfo,
+                                         0 /* handle_types */, info);
    if (result != VK_SUCCESS)
-      goto fail;
+      return result;
 
-   image->drm_modifier = use_modifier ? DRM_FORMAT_MOD_LINEAR : DRM_FORMAT_MOD_INVALID;
-   image->num_planes = 1;
-   image->sizes[0] = linear_size;
-   image->row_pitches[0] = linear_stride;
-   image->offsets[0] = 0;
-   image->fds[0] = fd;
+   info->create.usage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
+   info->wsi.prime_blit_src = true,
+   info->prime_use_linear_modifier = use_modifier;
+
+   const uint32_t cpp = vk_format_size(info->create.format);
+   info->linear_stride = align_u32(info->create.extent.width * cpp,
+                                   WSI_PRIME_LINEAR_STRIDE_ALIGN);
+
+   info->create_mem = wsi_create_prime_image_mem;
+   info->finish_create = wsi_finish_create_prime_image;
 
    return VK_SUCCESS;
+}
 
-fail:
-   wsi_destroy_image(chain, image);
+VkResult
+wsi_create_prime_image(const struct wsi_swapchain *chain,
+                       const VkSwapchainCreateInfoKHR *pCreateInfo,
+                       bool use_modifier,
+                       struct wsi_image *image)
+{
+   struct wsi_image_info info;
+   VkResult result = wsi_configure_prime_image(chain, pCreateInfo,
+                                               use_modifier, &info);
+   if (result != VK_SUCCESS)
+      return result;
 
-   return result;
+   result = wsi_create_image(chain, &info, image);
+   if (result != VK_SUCCESS) {
+      wsi_destroy_image_info(chain, &info);
+      return result;
+   }
+
+   return VK_SUCCESS;
 }
 
diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h
index 10008c53867..a2a646fba6b 100644
--- a/src/vulkan/wsi/wsi_common_private.h
+++ b/src/vulkan/wsi/wsi_common_private.h
@@ -36,17 +36,26 @@ struct wsi_image_info {
    VkImageFormatListCreateInfoKHR format_list;
    VkImageDrmFormatModifierListCreateInfoEXT drm_mod_list;
 
+   bool prime_use_linear_modifier;
+
    /* Not really part of VkImageCreateInfo but needed to figure out the
     * number of planes we need to bind.
     */
    uint32_t modifier_prop_count;
    struct VkDrmFormatModifierPropertiesEXT *modifier_props;
 
+   /* For prime blit images, the linear stride in bytes */
+   uint32_t linear_stride;
+
    uint8_t *(*alloc_shm)(struct wsi_image *image, unsigned size);
 
    VkResult (*create_mem)(const struct wsi_swapchain *chain,
                           const struct wsi_image_info *info,
                           struct wsi_image *image);
+
+   VkResult (*finish_create)(const struct wsi_swapchain *chain,
+                             const struct wsi_image_info *info,
+                             struct wsi_image *image);
 };
 
 struct wsi_image {
@@ -139,6 +148,11 @@ wsi_create_native_image(const struct wsi_swapchain *chain,
                         struct wsi_image *image);
 
 VkResult
+wsi_configure_prime_image(UNUSED const struct wsi_swapchain *chain,
+                          const VkSwapchainCreateInfoKHR *pCreateInfo,
+                          bool use_modifier,
+                          struct wsi_image_info *info);
+VkResult
 wsi_create_prime_image(const struct wsi_swapchain *chain,
                        const VkSwapchainCreateInfoKHR *pCreateInfo,
                        bool use_modifier,



More information about the mesa-commit mailing list