diff options
Diffstat (limited to 'ext/vulkan/vkimagememory.c')
-rw-r--r-- | ext/vulkan/vkimagememory.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/ext/vulkan/vkimagememory.c b/ext/vulkan/vkimagememory.c index 2375a1456..d387b849d 100644 --- a/ext/vulkan/vkimagememory.c +++ b/ext/vulkan/vkimagememory.c @@ -101,6 +101,22 @@ gst_vulkan_format_from_video_format (GstVideoFormat v_format, guint plane) } } +static void +_view_create_info (VkImage image, VkFormat format, VkImageViewCreateInfo * info) +{ + info->sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; + info->pNext = NULL; + info->image = image; + info->format = format; + info->viewType = VK_IMAGE_VIEW_TYPE_2D; + info->flags = 0; + + GST_VK_COMPONENT_MAPPING (info->components, VK_COMPONENT_SWIZZLE_R, + VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A); + GST_VK_IMAGE_SUBRESOURCE_RANGE (info->subresourceRange, + VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1); +} + static gboolean _create_info_from_args (VkImageCreateInfo * info, VkFormat format, gsize width, gsize height, VkImageTiling tiling, VkImageUsageFlags usage) @@ -167,6 +183,7 @@ _vk_image_mem_new_alloc (GstAllocator * allocator, GstMemory * parent, { GstVulkanImageMemory *mem = NULL; GstAllocationParams params = { 0, }; + VkImageViewCreateInfo view_info; VkImageCreateInfo image_info; VkPhysicalDevice gpu; GError *error = NULL; @@ -213,6 +230,14 @@ _vk_image_mem_new_alloc (GstAllocator * allocator, GstMemory * parent, if (gst_vulkan_error_to_g_error (err, &error, "vkBindImageMemory") < 0) goto vk_error; + if (usage & (VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT | + VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)) { + _view_create_info (mem->image, format, &view_info); + err = vkCreateImageView (device->device, &view_info, NULL, &mem->view); + if (gst_vulkan_error_to_g_error (err, &error, "vkCreateImageView") < 0) + goto vk_error; + } + return mem; vk_error: @@ -239,6 +264,7 @@ _vk_image_mem_new_wrapped (GstAllocator * allocator, GstMemory * parent, { GstVulkanImageMemory *mem = g_new0 (GstVulkanImageMemory, 1); GstAllocationParams params = { 0, }; + VkImageViewCreateInfo view_info; VkPhysicalDevice gpu; GError *error = NULL; VkResult err; @@ -267,6 +293,16 @@ _vk_image_mem_new_wrapped (GstAllocator * allocator, GstMemory * parent, "vkGetPhysicalDeviceImageFormatProperties") < 0) goto vk_error; + /* XXX: we don't actually if the image has a vkDeviceMemory bound so + * this may fail */ + if (usage & (VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT | + VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)) { + _view_create_info (mem->image, format, &view_info); + err = vkCreateImageView (device->device, &view_info, NULL, &mem->view); + if (gst_vulkan_error_to_g_error (err, &error, "vkCreateImageView") < 0) + goto vk_error; + } + return mem; vk_error: @@ -359,6 +395,9 @@ _vk_image_mem_free (GstAllocator * allocator, GstMemory * memory) if (mem->image && !mem->wrapped) vkDestroyImage (mem->device->device, mem->image, NULL); + if (mem->view) + vkDestroyImageView (mem->device->device, mem->view, NULL); + if (mem->vk_mem) gst_memory_unref ((GstMemory *) mem->vk_mem); |