summaryrefslogtreecommitdiff
path: root/ext/vulkan/vkimagememory.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/vulkan/vkimagememory.c')
-rw-r--r--ext/vulkan/vkimagememory.c39
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);