diff options
author | Matthew Waters <matthew@centricular.com> | 2016-02-09 17:46:53 +1100 |
---|---|---|
committer | Matthew Waters <matthew@centricular.com> | 2016-02-17 01:13:43 +1100 |
commit | 1c2aae08c563d614359ad1b30b8a02e760cd991a (patch) | |
tree | 5004f6a1bc89483a09b0f8726759efd3be398fe3 | |
parent | 3c2710dc0f3a5ba842dff0cb02c40485788ffb68 (diff) | |
download | gstreamer-plugins-bad-1c2aae08c563d614359ad1b30b8a02e760cd991a.tar.gz |
Revert "vulkan: remove views from the memory objects."
This reverts commit 1ea817298ee4d5ef9b00f888f8ebe16a888b1150.
-rw-r--r-- | ext/vulkan/vkbuffermemory.c | 73 | ||||
-rw-r--r-- | ext/vulkan/vkbuffermemory.h | 1 | ||||
-rw-r--r-- | ext/vulkan/vkimagememory.c | 39 | ||||
-rw-r--r-- | ext/vulkan/vkimagememory.h | 1 |
4 files changed, 114 insertions, 0 deletions
diff --git a/ext/vulkan/vkbuffermemory.c b/ext/vulkan/vkbuffermemory.c index 3ae0c3a4f..e54d15930 100644 --- a/ext/vulkan/vkbuffermemory.c +++ b/ext/vulkan/vkbuffermemory.c @@ -56,6 +56,26 @@ _create_info_from_args (VkBufferCreateInfo * info, gsize size, return TRUE; } +#define GST_VK_BUFFER_VIEW_CREATE_INFO_INIT GST_VK_STRUCT_7 +#define GST_VK_BUFFER_VIEW_CREATE_INFO(info, pNext, flags, buffer, format, offset, range) \ + G_STMT_START { \ + VkBufferViewCreateInfo tmp = GST_VK_BUFFER_VIEW_CREATE_INFO_INIT (VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO, pNext, flags, buffer, format, offset, range); \ + (info) = tmp; \ + } G_STMT_END + +static gboolean +_create_view_from_args (VkBufferViewCreateInfo * info, VkBuffer buffer, + VkFormat format, gsize offset, gsize range) +{ + /* FIXME: validate these */ + g_assert (format != VK_FORMAT_UNDEFINED); + + GST_VK_BUFFER_VIEW_CREATE_INFO (*info, NULL, 0, buffer, format, offset, + range); + + return TRUE; +} + static void _vk_buffer_mem_init (GstVulkanBufferMemory * mem, GstAllocator * allocator, GstMemory * parent, GstVulkanDevice * device, VkBufferUsageFlags usage, @@ -131,6 +151,22 @@ _vk_buffer_mem_new_alloc (GstAllocator * allocator, GstMemory * parent, if (gst_vulkan_error_to_g_error (err, &error, "vkBindBufferMemory") < 0) goto vk_error; + if (usage & (VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | + VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | + VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | + VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | + VK_BUFFER_USAGE_INDEX_BUFFER_BIT | + VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | + VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT)) { + VkBufferViewCreateInfo view_info; + + _create_view_from_args (&view_info, mem->buffer, format, 0, + mem->requirements.size); + err = vkCreateBufferView (device->device, &view_info, NULL, &mem->view); + if (gst_vulkan_error_to_g_error (err, &error, "vkCreateBufferView") < 0) + goto vk_error; + } + return mem; vk_error: @@ -156,6 +192,8 @@ _vk_buffer_mem_new_wrapped (GstAllocator * allocator, GstMemory * parent, { GstVulkanBufferMemory *mem = g_new0 (GstVulkanBufferMemory, 1); GstAllocationParams params = { 0, }; + GError *error = NULL; + VkResult err; mem->buffer = buffer; @@ -168,7 +206,39 @@ _vk_buffer_mem_new_wrapped (GstAllocator * allocator, GstMemory * parent, mem->requirements.size, user_data, notify); mem->wrapped = TRUE; + /* XXX: we don't actually if the buffer has a vkDeviceMemory bound so + * this may fail */ + if (usage & (VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | + VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | + VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | + VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | + VK_BUFFER_USAGE_INDEX_BUFFER_BIT | + VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | + VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT)) { + VkBufferViewCreateInfo view_info; + + _create_view_from_args (&view_info, mem->buffer, format, 0, + mem->requirements.size); + err = vkCreateBufferView (device->device, &view_info, NULL, &mem->view); + if (gst_vulkan_error_to_g_error (err, &error, "vkCreateBufferView") < 0) + goto vk_error; + } + return mem; + +vk_error: + { + GST_CAT_ERROR (GST_CAT_VULKAN_BUFFER_MEMORY, + "Failed to allocate buffer memory %s", error->message); + g_clear_error (&error); + goto error; + } + +error: + { + gst_memory_unref ((GstMemory *) mem); + return NULL; + } } static gpointer @@ -246,6 +316,9 @@ _vk_buffer_mem_free (GstAllocator * allocator, GstMemory * memory) if (mem->buffer && !mem->wrapped) vkDestroyBuffer (mem->device->device, mem->buffer, NULL); + if (mem->view) + vkDestroyBufferView (mem->device->device, mem->view, NULL); + if (mem->vk_mem) gst_memory_unref ((GstMemory *) mem->vk_mem); diff --git a/ext/vulkan/vkbuffermemory.h b/ext/vulkan/vkbuffermemory.h index 90c8d54f6..3b582823b 100644 --- a/ext/vulkan/vkbuffermemory.h +++ b/ext/vulkan/vkbuffermemory.h @@ -49,6 +49,7 @@ struct _GstVulkanBufferMemory GstVulkanDevice * device; VkBuffer buffer; + VkBufferView view; GstVulkanMemory *vk_mem; VkMemoryRequirements requirements; 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); diff --git a/ext/vulkan/vkimagememory.h b/ext/vulkan/vkimagememory.h index 72a336815..aa6cad614 100644 --- a/ext/vulkan/vkimagememory.h +++ b/ext/vulkan/vkimagememory.h @@ -52,6 +52,7 @@ struct _GstVulkanImageMemory VkImage image; VkImageLayout image_layout; + VkImageView view; GstVulkanMemory *vk_mem; VkImageCreateInfo create_info; |