Mesa (main): vulkan/wsi: Compute stride and size in configure_buffer_image

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


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

Author: Jason Ekstrand <jason.ekstrand at collabora.com>
Date:   Thu Jul  7 10:08:30 2022 -0500

vulkan/wsi: Compute stride and size in configure_buffer_image

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         | 23 ++++++++++++++++-------
 src/vulkan/wsi/wsi_common_drm.c     | 10 +++-------
 src/vulkan/wsi/wsi_common_private.h |  5 ++++-
 3 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c
index 5b2b005a308..0a599eb30d1 100644
--- a/src/vulkan/wsi/wsi_common.c
+++ b/src/vulkan/wsi/wsi_common.c
@@ -1314,9 +1314,6 @@ wsi_create_buffer_image_mem(const struct wsi_swapchain *chain,
    const struct wsi_device *wsi = chain->wsi;
    VkResult result;
 
-   uint32_t linear_size = info->linear_stride * info->create.extent.height;
-   linear_size = ALIGN_POT(linear_size, info->size_align);
-
    const VkExternalMemoryBufferCreateInfo buffer_external_info = {
       .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO,
       .pNext = NULL,
@@ -1325,7 +1322,7 @@ wsi_create_buffer_image_mem(const struct wsi_swapchain *chain,
    const VkBufferCreateInfo buffer_info = {
       .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
       .pNext = &buffer_external_info,
-      .size = linear_size,
+      .size = info->linear_size,
       .usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT,
       .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
    };
@@ -1336,7 +1333,7 @@ wsi_create_buffer_image_mem(const struct wsi_swapchain *chain,
 
    VkMemoryRequirements reqs;
    wsi->GetBufferMemoryRequirements(chain->device, image->buffer.buffer, &reqs);
-   assert(reqs.size <= linear_size);
+   assert(reqs.size <= info->linear_size);
 
    const struct wsi_memory_allocate_info memory_wsi_info = {
       .sType = VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO_MESA,
@@ -1357,7 +1354,7 @@ wsi_create_buffer_image_mem(const struct wsi_swapchain *chain,
    const VkMemoryAllocateInfo buf_mem_info = {
       .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
       .pNext = &buf_mem_dedicated_info,
-      .allocationSize = linear_size,
+      .allocationSize = info->linear_size,
       .memoryTypeIndex =
          info->select_buffer_memory_type(wsi, reqs.memoryTypeBits),
    };
@@ -1393,7 +1390,7 @@ wsi_create_buffer_image_mem(const struct wsi_swapchain *chain,
       return result;
 
    image->num_planes = 1;
-   image->sizes[0] = linear_size;
+   image->sizes[0] = info->linear_size;
    image->row_pitches[0] = info->linear_stride;
    image->offsets[0] = 0;
 
@@ -1504,8 +1501,12 @@ wsi_finish_create_buffer_image(const struct wsi_swapchain *chain,
 VkResult
 wsi_configure_buffer_image(UNUSED const struct wsi_swapchain *chain,
                            const VkSwapchainCreateInfoKHR *pCreateInfo,
+                           uint32_t stride_align, uint32_t size_align,
                            struct wsi_image_info *info)
 {
+   assert(util_is_power_of_two_nonzero(stride_align));
+   assert(util_is_power_of_two_nonzero(size_align));
+
    VkResult result = wsi_configure_image(chain, pCreateInfo,
                                          0 /* handle_types */, info);
    if (result != VK_SUCCESS)
@@ -1513,6 +1514,14 @@ wsi_configure_buffer_image(UNUSED const struct wsi_swapchain *chain,
 
    info->create.usage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
    info->wsi.buffer_blit_src = true;
+
+   const uint32_t cpp = vk_format_get_blocksize(pCreateInfo->imageFormat);
+   info->linear_stride = pCreateInfo->imageExtent.width * cpp;
+   info->linear_stride = ALIGN_POT(info->linear_stride, stride_align);
+
+   info->linear_size = info->linear_stride * pCreateInfo->imageExtent.height;
+   info->linear_size = ALIGN_POT(info->linear_size, size_align);
+
    info->finish_create = wsi_finish_create_buffer_image;
 
    return VK_SUCCESS;
diff --git a/src/vulkan/wsi/wsi_common_drm.c b/src/vulkan/wsi/wsi_common_drm.c
index 310508940e7..f41268a1685 100644
--- a/src/vulkan/wsi/wsi_common_drm.c
+++ b/src/vulkan/wsi/wsi_common_drm.c
@@ -27,7 +27,6 @@
 #include "util/os_file.h"
 #include "util/xmlconfig.h"
 #include "vk_device.h"
-#include "vk_format.h"
 #include "vk_physical_device.h"
 #include "vk_util.h"
 #include "drm-uapi/drm_fourcc.h"
@@ -597,17 +596,14 @@ wsi_configure_prime_image(UNUSED const struct wsi_swapchain *chain,
                           struct wsi_image_info *info)
 {
    VkResult result =
-      wsi_configure_buffer_image(chain, pCreateInfo, info);
+      wsi_configure_buffer_image(chain, pCreateInfo,
+                                 WSI_PRIME_LINEAR_STRIDE_ALIGN, 4096,
+                                 info);
    if (result != VK_SUCCESS)
       return result;
 
    info->prime_use_linear_modifier = use_modifier;
 
-   const uint32_t cpp = vk_format_get_blocksize(info->create.format);
-   info->linear_stride = ALIGN_POT(info->create.extent.width * cpp,
-                                   WSI_PRIME_LINEAR_STRIDE_ALIGN);
-   info->size_align = 4096;
-
    info->create_mem = wsi_create_prime_image_mem;
    info->select_buffer_memory_type = prime_select_buffer_memory_type;
    info->select_image_memory_type = wsi_select_device_memory_type;
diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h
index 8db8014a178..0981d6cf06e 100644
--- a/src/vulkan/wsi/wsi_common_private.h
+++ b/src/vulkan/wsi/wsi_common_private.h
@@ -47,7 +47,9 @@ struct wsi_image_info {
 
    /* For buffer blit images, the linear stride in bytes */
    uint32_t linear_stride;
-   uint32_t size_align;
+
+   /* For buffer blit images, the size of the buffer in bytes */
+   uint32_t linear_size;
 
    uint32_t (*select_image_memory_type)(const struct wsi_device *wsi,
                                         uint32_t type_bits);
@@ -191,6 +193,7 @@ wsi_finish_create_buffer_image(const struct wsi_swapchain *chain,
 VkResult
 wsi_configure_buffer_image(UNUSED const struct wsi_swapchain *chain,
                            const VkSwapchainCreateInfoKHR *pCreateInfo,
+                           uint32_t stride_align, uint32_t size_align,
                            struct wsi_image_info *info);
 
 VkResult



More information about the mesa-commit mailing list