Mesa (main): vulkan/wsi: Add a helper for creating CPU images
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jul 7 18:47:58 UTC 2022
Module: Mesa
Branch: main
Commit: afe2cb7b11dd5398e330195ffd88fc346ad152fd
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=afe2cb7b11dd5398e330195ffd88fc346ad152fd
Author: Jason Ekstrand <jason.ekstrand at collabora.com>
Date: Wed Jul 6 16:39:17 2022 -0500
vulkan/wsi: Add a helper for creating CPU images
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 | 89 +++++++++++++++++++++++++++++++++++++
src/vulkan/wsi/wsi_common_private.h | 7 +++
2 files changed, 96 insertions(+)
diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c
index 4028321a147..d621d35edc9 100644
--- a/src/vulkan/wsi/wsi_common.c
+++ b/src/vulkan/wsi/wsi_common.c
@@ -1293,6 +1293,14 @@ wsi_select_device_memory_type(const struct wsi_device *wsi,
0 /* deny_props */, type_bits);
}
+static uint32_t
+wsi_select_host_memory_type(const struct wsi_device *wsi,
+ uint32_t type_bits)
+{
+ return wsi_select_memory_type(wsi, VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ 0 /* deny_props */, type_bits);
+}
+
VkResult
wsi_create_buffer_image_mem(const struct wsi_swapchain *chain,
const struct wsi_image_info *info,
@@ -1506,3 +1514,84 @@ wsi_configure_buffer_image(UNUSED const struct wsi_swapchain *chain,
return VK_SUCCESS;
}
+
+static VkResult
+wsi_create_cpu_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;
+
+ VkMemoryRequirements reqs;
+ wsi->GetImageMemoryRequirements(chain->device, image->image, &reqs);
+
+ VkSubresourceLayout layout;
+ wsi->GetImageSubresourceLayout(chain->device, image->image,
+ &(VkImageSubresource) {
+ .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+ .mipLevel = 0,
+ .arrayLayer = 0,
+ }, &layout);
+ assert(layout.offset == 0);
+
+ const VkMemoryDedicatedAllocateInfo memory_dedicated_info = {
+ .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
+ .image = image->image,
+ .buffer = VK_NULL_HANDLE,
+ };
+ VkMemoryAllocateInfo memory_info = {
+ .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
+ .pNext = &memory_dedicated_info,
+ .allocationSize = reqs.size,
+ .memoryTypeIndex =
+ wsi_select_host_memory_type(wsi, reqs.memoryTypeBits),
+ };
+
+ void *sw_host_ptr = NULL;
+ if (info->alloc_shm)
+ sw_host_ptr = info->alloc_shm(image, layout.size);
+
+ VkImportMemoryHostPointerInfoEXT host_ptr_info;
+ if (sw_host_ptr != NULL) {
+ host_ptr_info = (VkImportMemoryHostPointerInfoEXT) {
+ .sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT,
+ .pHostPointer = sw_host_ptr,
+ .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT,
+ };
+ __vk_append_struct(&memory_info, &host_ptr_info);
+ }
+
+ result = wsi->AllocateMemory(chain->device, &memory_info,
+ &chain->alloc, &image->memory);
+ if (result != VK_SUCCESS)
+ return result;
+
+ image->num_planes = 1;
+ image->sizes[0] = reqs.size;
+ image->row_pitches[0] = layout.rowPitch;
+ image->offsets[0] = 0;
+
+ return VK_SUCCESS;
+}
+
+VkResult
+wsi_configure_cpu_image(const struct wsi_swapchain *chain,
+ const VkSwapchainCreateInfoKHR *pCreateInfo,
+ uint8_t *(alloc_shm)(struct wsi_image *image,
+ unsigned size),
+ struct wsi_image_info *info)
+{
+ const VkExternalMemoryHandleTypeFlags handle_type =
+ alloc_shm ? VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT : 0;
+
+ VkResult result = wsi_configure_image(chain, pCreateInfo,
+ handle_type, info);
+ if (result != VK_SUCCESS)
+ return result;
+
+ info->alloc_shm = alloc_shm;
+ info->create_mem = wsi_create_cpu_image_mem;
+
+ return VK_SUCCESS;
+}
diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h
index 3b43425417b..57fba7d838f 100644
--- a/src/vulkan/wsi/wsi_common_private.h
+++ b/src/vulkan/wsi/wsi_common_private.h
@@ -170,6 +170,13 @@ wsi_configure_prime_image(UNUSED const struct wsi_swapchain *chain,
bool use_modifier,
struct wsi_image_info *info);
+VkResult
+wsi_configure_cpu_image(const struct wsi_swapchain *chain,
+ const VkSwapchainCreateInfoKHR *pCreateInfo,
+ uint8_t *(alloc_shm)(struct wsi_image *image,
+ unsigned size),
+ struct wsi_image_info *info);
+
VkResult
wsi_create_buffer_image_mem(const struct wsi_swapchain *chain,
const struct wsi_image_info *info,
More information about the mesa-commit
mailing list