Revert "vulkan: remove views from the memory objects."

This reverts commit 1ea817298ee4d5ef9b00f888f8ebe16a888b1150.
This commit is contained in:
Matthew Waters 2016-02-09 17:46:53 +11:00
parent 3c2710dc0f
commit 1c2aae08c5
4 changed files with 114 additions and 0 deletions

View file

@ -56,6 +56,26 @@ _create_info_from_args (VkBufferCreateInfo * info, gsize size,
return TRUE; 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 static void
_vk_buffer_mem_init (GstVulkanBufferMemory * mem, GstAllocator * allocator, _vk_buffer_mem_init (GstVulkanBufferMemory * mem, GstAllocator * allocator,
GstMemory * parent, GstVulkanDevice * device, VkBufferUsageFlags usage, 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) if (gst_vulkan_error_to_g_error (err, &error, "vkBindBufferMemory") < 0)
goto vk_error; 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; return mem;
vk_error: vk_error:
@ -156,6 +192,8 @@ _vk_buffer_mem_new_wrapped (GstAllocator * allocator, GstMemory * parent,
{ {
GstVulkanBufferMemory *mem = g_new0 (GstVulkanBufferMemory, 1); GstVulkanBufferMemory *mem = g_new0 (GstVulkanBufferMemory, 1);
GstAllocationParams params = { 0, }; GstAllocationParams params = { 0, };
GError *error = NULL;
VkResult err;
mem->buffer = buffer; mem->buffer = buffer;
@ -168,7 +206,39 @@ _vk_buffer_mem_new_wrapped (GstAllocator * allocator, GstMemory * parent,
mem->requirements.size, user_data, notify); mem->requirements.size, user_data, notify);
mem->wrapped = TRUE; 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; 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 static gpointer
@ -246,6 +316,9 @@ _vk_buffer_mem_free (GstAllocator * allocator, GstMemory * memory)
if (mem->buffer && !mem->wrapped) if (mem->buffer && !mem->wrapped)
vkDestroyBuffer (mem->device->device, mem->buffer, NULL); vkDestroyBuffer (mem->device->device, mem->buffer, NULL);
if (mem->view)
vkDestroyBufferView (mem->device->device, mem->view, NULL);
if (mem->vk_mem) if (mem->vk_mem)
gst_memory_unref ((GstMemory *) mem->vk_mem); gst_memory_unref ((GstMemory *) mem->vk_mem);

View file

@ -49,6 +49,7 @@ struct _GstVulkanBufferMemory
GstVulkanDevice * device; GstVulkanDevice * device;
VkBuffer buffer; VkBuffer buffer;
VkBufferView view;
GstVulkanMemory *vk_mem; GstVulkanMemory *vk_mem;
VkMemoryRequirements requirements; VkMemoryRequirements requirements;

View file

@ -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 static gboolean
_create_info_from_args (VkImageCreateInfo * info, VkFormat format, gsize width, _create_info_from_args (VkImageCreateInfo * info, VkFormat format, gsize width,
gsize height, VkImageTiling tiling, VkImageUsageFlags usage) gsize height, VkImageTiling tiling, VkImageUsageFlags usage)
@ -167,6 +183,7 @@ _vk_image_mem_new_alloc (GstAllocator * allocator, GstMemory * parent,
{ {
GstVulkanImageMemory *mem = NULL; GstVulkanImageMemory *mem = NULL;
GstAllocationParams params = { 0, }; GstAllocationParams params = { 0, };
VkImageViewCreateInfo view_info;
VkImageCreateInfo image_info; VkImageCreateInfo image_info;
VkPhysicalDevice gpu; VkPhysicalDevice gpu;
GError *error = NULL; 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) if (gst_vulkan_error_to_g_error (err, &error, "vkBindImageMemory") < 0)
goto vk_error; 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; return mem;
vk_error: vk_error:
@ -239,6 +264,7 @@ _vk_image_mem_new_wrapped (GstAllocator * allocator, GstMemory * parent,
{ {
GstVulkanImageMemory *mem = g_new0 (GstVulkanImageMemory, 1); GstVulkanImageMemory *mem = g_new0 (GstVulkanImageMemory, 1);
GstAllocationParams params = { 0, }; GstAllocationParams params = { 0, };
VkImageViewCreateInfo view_info;
VkPhysicalDevice gpu; VkPhysicalDevice gpu;
GError *error = NULL; GError *error = NULL;
VkResult err; VkResult err;
@ -267,6 +293,16 @@ _vk_image_mem_new_wrapped (GstAllocator * allocator, GstMemory * parent,
"vkGetPhysicalDeviceImageFormatProperties") < 0) "vkGetPhysicalDeviceImageFormatProperties") < 0)
goto vk_error; 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; return mem;
vk_error: vk_error:
@ -359,6 +395,9 @@ _vk_image_mem_free (GstAllocator * allocator, GstMemory * memory)
if (mem->image && !mem->wrapped) if (mem->image && !mem->wrapped)
vkDestroyImage (mem->device->device, mem->image, NULL); vkDestroyImage (mem->device->device, mem->image, NULL);
if (mem->view)
vkDestroyImageView (mem->device->device, mem->view, NULL);
if (mem->vk_mem) if (mem->vk_mem)
gst_memory_unref ((GstMemory *) mem->vk_mem); gst_memory_unref ((GstMemory *) mem->vk_mem);

View file

@ -52,6 +52,7 @@ struct _GstVulkanImageMemory
VkImage image; VkImage image;
VkImageLayout image_layout; VkImageLayout image_layout;
VkImageView view;
GstVulkanMemory *vk_mem; GstVulkanMemory *vk_mem;
VkImageCreateInfo create_info; VkImageCreateInfo create_info;