From b7db6598df10a05e061167c0b1319a1044ad9cde Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 16 Apr 2021 12:26:21 -0700 Subject: [PATCH] venus: add vn_image_create A helper called from vn_CreateImage to allocate and initialize vn_image. Signed-off-by: Chia-I Wu Reviewed-by: Yiwei Zhang Part-of: --- src/virtio/vulkan/vn_image.c | 52 +++++++++++++++++++++++------------- src/virtio/vulkan/vn_image.h | 6 +++++ 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/src/virtio/vulkan/vn_image.c b/src/virtio/vulkan/vn_image.c index 847bde88850..9226ac68be2 100644 --- a/src/virtio/vulkan/vn_image.c +++ b/src/virtio/vulkan/vn_image.c @@ -99,6 +99,36 @@ vn_image_init_memory_requirements(struct vn_image *img, } } +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); + 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); + if (result != VK_SUCCESS) { + vk_free(alloc, img); + return result; + } + + vn_image_init_memory_requirements(img, dev, create_info); + + *out_img = img; + + return VK_SUCCESS; +} + /* image commands */ VkResult @@ -126,26 +156,12 @@ vn_CreateImage(VkDevice device, pCreateInfo = &local_create_info; } - struct vn_image *img = vk_zalloc(alloc, sizeof(*img), VN_DEFAULT_ALIGN, - VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); - if (!img) - return vn_error(dev->instance, VK_ERROR_OUT_OF_HOST_MEMORY); - - vn_object_base_init(&img->base, VK_OBJECT_TYPE_IMAGE, &dev->base); - - VkImage img_handle = vn_image_to_handle(img); - /* TODO async */ - VkResult result = vn_call_vkCreateImage(dev->instance, device, pCreateInfo, - NULL, &img_handle); - if (result != VK_SUCCESS) { - vk_free(alloc, img); + struct vn_image *img; + VkResult result = vn_image_create(dev, pCreateInfo, alloc, &img); + if (result != VK_SUCCESS) return vn_error(dev->instance, result); - } - - vn_image_init_memory_requirements(img, dev, pCreateInfo); - - *pImage = img_handle; + *pImage = vn_image_to_handle(img); return VK_SUCCESS; } diff --git a/src/virtio/vulkan/vn_image.h b/src/virtio/vulkan/vn_image.h index 2e2c06c2112..46f388dd98a 100644 --- a/src/virtio/vulkan/vn_image.h +++ b/src/virtio/vulkan/vn_image.h @@ -48,4 +48,10 @@ VK_DEFINE_NONDISP_HANDLE_CASTS(vn_sampler_ycbcr_conversion, VkSamplerYcbcrConversion, VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION) +VkResult +vn_image_create(struct vn_device *dev, + const VkImageCreateInfo *create_info, + const VkAllocationCallbacks *alloc, + struct vn_image **out_img); + #endif /* VN_IMAGE_H */