summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYiwei Zhang <zzyiwei@chromium.org>2021-05-18 04:58:13 +0000
committerMarge Bot <eric+marge@anholt.net>2021-05-26 20:26:18 +0000
commit19b7b09885c5975535605465ceb58b06c0170148 (patch)
tree76c5aa425587876b96164cd9c6fecf500d2fee37
parent53e35f716e26c2074a286e97fcc6ba1dd656b851 (diff)
venus: prepare image creation helpers for AHB
Store image create info for deferred creation of AHB image. Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org> Reviewed-by: Chia-I Wu <olvaffe@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10960>
-rw-r--r--src/virtio/vulkan/vn_image.c118
-rw-r--r--src/virtio/vulkan/vn_image.h21
2 files changed, 130 insertions, 9 deletions
diff --git a/src/virtio/vulkan/vn_image.c b/src/virtio/vulkan/vn_image.c
index 56d56054d8c..bbfa59d6209 100644
--- a/src/virtio/vulkan/vn_image.c
+++ b/src/virtio/vulkan/vn_image.c
@@ -244,32 +244,129 @@ vn_image_init_memory_requirements(struct vn_image *img,
}
}
+static VkResult
+vn_image_store_deferred_create_info(
+ const VkImageCreateInfo *create_info,
+ const VkAllocationCallbacks *alloc,
+ struct vn_image_create_deferred_info **out_info)
+{
+ struct vn_image_create_deferred_info *info = NULL;
+ VkBaseOutStructure *dst = NULL;
+
+ info = vk_zalloc(alloc, sizeof(*info), VN_DEFAULT_ALIGN,
+ VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
+ if (!info)
+ return VK_ERROR_OUT_OF_HOST_MEMORY;
+
+ info->create = *create_info;
+ dst = (void *)&info->create;
+
+ vk_foreach_struct_const(src, create_info->pNext) {
+ void *pnext = NULL;
+ switch (src->sType) {
+ case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
+ memcpy(&info->list, src, sizeof(info->list));
+ pnext = &info->list;
+ break;
+ case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
+ memcpy(&info->stencil, src, sizeof(info->stencil));
+ pnext = &info->stencil;
+ break;
+ default:
+ break;
+ }
+
+ if (pnext) {
+ dst->pNext = pnext;
+ dst = pnext;
+ }
+ }
+ dst->pNext = NULL;
+
+ *out_info = info;
+
+ return VK_SUCCESS;
+}
+
+static VkResult
+vn_image_init(struct vn_device *dev,
+ const VkImageCreateInfo *create_info,
+ struct vn_image *img)
+{
+ VkDevice device = vn_device_to_handle(dev);
+ VkImage image = vn_image_to_handle(img);
+ VkResult result = VK_SUCCESS;
+
+ /* TODO async */
+ result =
+ vn_call_vkCreateImage(dev->instance, device, create_info, NULL, &image);
+ if (result != VK_SUCCESS)
+ return result;
+
+ vn_image_init_memory_requirements(img, dev, create_info);
+
+ img->sharing_mode = create_info->sharingMode;
+
+ return VK_SUCCESS;
+}
+
VkResult
vn_image_create(struct vn_device *dev,
const VkImageCreateInfo *create_info,
const VkAllocationCallbacks *alloc,
struct vn_image **out_img)
{
- struct vn_image *img = vk_zalloc(alloc, sizeof(*img), VN_DEFAULT_ALIGN,
- VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
+ struct vn_image *img = NULL;
+ VkResult result = VK_SUCCESS;
+
+ img = vk_zalloc(alloc, sizeof(*img), VN_DEFAULT_ALIGN,
+ VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
if (!img)
return VK_ERROR_OUT_OF_HOST_MEMORY;
vn_object_base_init(&img->base, VK_OBJECT_TYPE_IMAGE, &dev->base);
- VkDevice dev_handle = vn_device_to_handle(dev);
- VkImage img_handle = vn_image_to_handle(img);
- /* TODO async */
- VkResult result = vn_call_vkCreateImage(dev->instance, dev_handle,
- create_info, NULL, &img_handle);
+ result = vn_image_init(dev, create_info, img);
if (result != VK_SUCCESS) {
vk_free(alloc, img);
return result;
}
- vn_image_init_memory_requirements(img, dev, create_info);
+ *out_img = img;
- img->sharing_mode = create_info->sharingMode;
+ return VK_SUCCESS;
+}
+
+VkResult
+vn_image_init_deferred(struct vn_device *dev,
+ const VkImageCreateInfo *create_info,
+ struct vn_image *img)
+{
+ return vn_image_init(dev, create_info, img);
+}
+
+VkResult
+vn_image_create_deferred(struct vn_device *dev,
+ const VkImageCreateInfo *create_info,
+ const VkAllocationCallbacks *alloc,
+ struct vn_image **out_img)
+{
+ struct vn_image *img = NULL;
+ VkResult result = VK_SUCCESS;
+
+ img = vk_zalloc(alloc, sizeof(*img), VN_DEFAULT_ALIGN,
+ VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
+ if (!img)
+ return VK_ERROR_OUT_OF_HOST_MEMORY;
+
+ vn_object_base_init(&img->base, VK_OBJECT_TYPE_IMAGE, &dev->base);
+
+ result = vn_image_store_deferred_create_info(create_info, alloc,
+ &img->deferred_info);
+ if (result != VK_SUCCESS) {
+ vk_free(alloc, img);
+ return result;
+ }
*out_img = img;
@@ -332,6 +429,9 @@ vn_DestroyImage(VkDevice device,
vn_async_vkDestroyImage(dev->instance, device, image, NULL);
+ if (img->deferred_info)
+ vk_free(alloc, img->deferred_info);
+
vn_object_base_fini(&img->base);
vk_free(alloc, img);
}
diff --git a/src/virtio/vulkan/vn_image.h b/src/virtio/vulkan/vn_image.h
index b8fe8d3c6b4..f5560aa9acf 100644
--- a/src/virtio/vulkan/vn_image.h
+++ b/src/virtio/vulkan/vn_image.h
@@ -22,6 +22,12 @@ struct vn_image_ownership_cmds {
VkCommandBuffer cmds[2];
};
+struct vn_image_create_deferred_info {
+ VkImageCreateInfo create;
+ VkImageFormatListCreateInfo list;
+ VkImageStencilUsageCreateInfo stencil;
+};
+
struct vn_image {
struct vn_object_base base;
@@ -29,6 +35,10 @@ struct vn_image {
VkMemoryDedicatedRequirements dedicated_requirements[4];
/* For VK_ANDROID_native_buffer, the WSI image owns the memory, */
VkDeviceMemory private_memory;
+ /* For VK_ANDROID_external_memory_android_hardware_buffer, real image
+ * creation is deferred until bind image memory.
+ */
+ struct vn_image_create_deferred_info *deferred_info;
/* For queue family ownership transfer of WSI images */
VkSharingMode sharing_mode;
struct vn_image_ownership_cmds *ownership_cmds;
@@ -70,6 +80,17 @@ vn_image_create(struct vn_device *dev,
struct vn_image **out_img);
VkResult
+vn_image_init_deferred(struct vn_device *dev,
+ const VkImageCreateInfo *create_info,
+ struct vn_image *img);
+
+VkResult
+vn_image_create_deferred(struct vn_device *dev,
+ const VkImageCreateInfo *create_info,
+ const VkAllocationCallbacks *alloc,
+ struct vn_image **out_img);
+
+VkResult
vn_image_android_wsi_init(struct vn_device *dev,
struct vn_image *img,
const VkAllocationCallbacks *alloc);