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