From 4c0a169af9a772ef79d40816dbc8d04edd12b9f8 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Tue, 9 Feb 2016 16:21:00 +1100 Subject: [PATCH] vulkan: remove views from the memory objects. They are not used and it's not possible to create the view before binding the VkDeviceMemory object to them. --- ext/vulkan/vkbuffermemory.c | 86 ++++--------------------------------- ext/vulkan/vkbuffermemory.h | 1 - ext/vulkan/vkimagememory.c | 52 ++++------------------ ext/vulkan/vkimagememory.h | 1 - 4 files changed, 18 insertions(+), 122 deletions(-) diff --git a/ext/vulkan/vkbuffermemory.c b/ext/vulkan/vkbuffermemory.c index d97f494324..3ed6a4c71d 100644 --- a/ext/vulkan/vkbuffermemory.c +++ b/ext/vulkan/vkbuffermemory.c @@ -56,26 +56,6 @@ _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, @@ -136,22 +116,6 @@ _vk_buffer_mem_new_alloc (GstAllocator * allocator, GstMemory * parent, mem->requirements.size, user_data, notify); mem->buffer = buffer; - 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: @@ -177,8 +141,6 @@ _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; @@ -191,37 +153,7 @@ _vk_buffer_mem_new_wrapped (GstAllocator * allocator, GstMemory * parent, mem->requirements.size, user_data, notify); mem->wrapped = TRUE; - 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 @@ -299,9 +231,6 @@ _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); @@ -405,13 +334,16 @@ gst_vulkan_buffer_memory_bind (GstVulkanBufferMemory * buf_mem, g_mutex_lock (&buf_mem->lock); + /* "Once a buffer or image is bound to a region of a memory object, it must + * not be rebound or unbound." */ + if (buf_mem->vk_mem == memory) { + g_mutex_unlock (&buf_mem->lock); + return TRUE; + } + if (buf_mem->vk_mem) { - guint vk_mem_map_count = buf_mem->vk_mem->map_count; - if (vk_mem_map_count > 0) { - g_mutex_unlock (&buf_mem->lock); - g_return_val_if_fail (vk_mem_map_count > 0, FALSE); - } - gst_memory_unref (GST_MEMORY_CAST (buf_mem->vk_mem)); + g_mutex_unlock (&buf_mem->lock); + return FALSE; } vkBindBufferMemory (buf_mem->device->device, buf_mem->buffer, memory->mem_ptr, diff --git a/ext/vulkan/vkbuffermemory.h b/ext/vulkan/vkbuffermemory.h index e25e57d1d6..166e1c1cbf 100644 --- a/ext/vulkan/vkbuffermemory.h +++ b/ext/vulkan/vkbuffermemory.h @@ -49,7 +49,6 @@ 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 4d2a4234a4..be4d7d28e5 100644 --- a/ext/vulkan/vkimagememory.c +++ b/ext/vulkan/vkimagememory.c @@ -101,22 +101,6 @@ 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) @@ -183,7 +167,6 @@ _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,14 +196,6 @@ _vk_image_mem_new_alloc (GstAllocator * allocator, GstMemory * parent, vkGetPhysicalDeviceImageFormatProperties (gpu, format, VK_IMAGE_TYPE_2D, tiling, usage, 0, &mem->format_properties); - 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: @@ -247,7 +222,6 @@ _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; @@ -274,14 +248,6 @@ _vk_image_mem_new_wrapped (GstAllocator * allocator, GstMemory * parent, "vkGetPhysicalDeviceImageFormatProperties") < 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: @@ -374,9 +340,6 @@ _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); @@ -538,13 +501,16 @@ gst_vulkan_image_memory_bind (GstVulkanImageMemory * img_mem, g_mutex_lock (&img_mem->lock); + /* "Once a buffer or image is bound to a region of a memory object, it must + * not be rebound or unbound." */ + if (img_mem->vk_mem == memory) { + g_mutex_unlock (&img_mem->lock); + return TRUE; + } + if (img_mem->vk_mem) { - guint vk_mem_map_count = img_mem->vk_mem->map_count; - if (vk_mem_map_count > 0) { - g_mutex_unlock (&img_mem->lock); - g_return_val_if_fail (vk_mem_map_count > 0, FALSE); - } - gst_memory_unref (GST_MEMORY_CAST (img_mem->vk_mem)); + g_mutex_unlock (&img_mem->lock); + return FALSE; } vkBindImageMemory (img_mem->device->device, img_mem->image, memory->mem_ptr, diff --git a/ext/vulkan/vkimagememory.h b/ext/vulkan/vkimagememory.h index eb957b9960..6484b315f8 100644 --- a/ext/vulkan/vkimagememory.h +++ b/ext/vulkan/vkimagememory.h @@ -52,7 +52,6 @@ struct _GstVulkanImageMemory VkImage image; VkImageLayout image_layout; - VkImageView view; GstVulkanMemory *vk_mem; VkImageCreateInfo create_info;