From e177080bec5c168311015af39848d9209bc9cbbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?= Date: Tue, 9 May 2023 17:17:31 +0200 Subject: [PATCH] vulkan: number of memories in buffer rather than number of planes New vulkan formats don't match the number of planes with the number of memories attached to the buffer. This patch changes the pattern of using planes for traverse the memories with the number of attached memories. Part-of: --- .../ext/vulkan/vkcolorconvert.c | 13 +++-- .../gst-plugins-bad/ext/vulkan/vkdownload.c | 5 +- .../gst-plugins-bad/ext/vulkan/vkupload.c | 29 ++++++---- .../ext/vulkan/vkviewconvert.c | 24 +++++---- .../gst-libs/gst/vulkan/gstvkfullscreenquad.c | 54 +++++++++++-------- 5 files changed, 74 insertions(+), 51 deletions(-) diff --git a/subprojects/gst-plugins-bad/ext/vulkan/vkcolorconvert.c b/subprojects/gst-plugins-bad/ext/vulkan/vkcolorconvert.c index 1e1c0e21b8..54e885aa81 100644 --- a/subprojects/gst-plugins-bad/ext/vulkan/vkcolorconvert.c +++ b/subprojects/gst-plugins-bad/ext/vulkan/vkcolorconvert.c @@ -1211,6 +1211,7 @@ gst_vulkan_color_convert_transform (GstBaseTransform * bt, GstBuffer * inbuf, GError *error = NULL; VkResult err; int i; + guint in_n_mems, out_n_mems; fence = gst_vulkan_device_create_fence (vfilter->device, &error); if (!fence) @@ -1219,7 +1220,8 @@ gst_vulkan_color_convert_transform (GstBaseTransform * bt, GstBuffer * inbuf, if (!gst_vulkan_full_screen_quad_set_input_buffer (conv->quad, inbuf, &error)) goto error; - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&conv->quad->in_info); i++) { + in_n_mems = gst_buffer_n_memory (inbuf); + for (i = 0; i < in_n_mems; i++) { GstMemory *img_mem = gst_buffer_peek_memory (inbuf, i); if (!gst_is_vulkan_image_memory (img_mem)) { g_set_error_literal (&error, GST_VULKAN_ERROR, GST_VULKAN_FAILED, @@ -1237,7 +1239,8 @@ gst_vulkan_color_convert_transform (GstBaseTransform * bt, GstBuffer * inbuf, { gboolean need_render_buf = FALSE; - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&conv->quad->out_info); i++) { + out_n_mems = gst_buffer_n_memory (outbuf); + for (i = 0; i < out_n_mems; i++) { GstMemory *mem = gst_buffer_peek_memory (outbuf, i); if (!gst_is_vulkan_image_memory (mem)) { g_set_error_literal (&error, GST_VULKAN_ERROR, GST_VULKAN_FAILED, @@ -1279,7 +1282,7 @@ gst_vulkan_color_convert_transform (GstBaseTransform * bt, GstBuffer * inbuf, if (need_render_buf) { render_buf = gst_buffer_new (); - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&conv->quad->out_info); i++) { + for (i = 0; i < out_n_mems; i++) { gst_buffer_append_memory (render_buf, gst_memory_ref ((GstMemory *) render_img_mems[i])); } @@ -1291,7 +1294,7 @@ gst_vulkan_color_convert_transform (GstBaseTransform * bt, GstBuffer * inbuf, render_buf = outbuf; } - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&conv->quad->out_info); i++) { + for (i = 0; i < out_n_mems; i++) { GstMemory *img_mem = gst_buffer_peek_memory (render_buf, i); if (!gst_is_vulkan_image_memory (img_mem)) { g_set_error_literal (&error, GST_VULKAN_ERROR, GST_VULKAN_FAILED, @@ -1352,7 +1355,7 @@ gst_vulkan_color_convert_transform (GstBaseTransform * bt, GstBuffer * inbuf, fence, &error)) goto unlock_error; - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&conv->quad->out_info); i++) { + for (i = 0; i < out_n_mems; i++) { if (render_img_mems[i] != out_img_mems[i]) { VkImageMemoryBarrier out_image_memory_barrier; VkImageMemoryBarrier render_image_memory_barrier; diff --git a/subprojects/gst-plugins-bad/ext/vulkan/vkdownload.c b/subprojects/gst-plugins-bad/ext/vulkan/vkdownload.c index b1ff89bf7c..4ca2adaa9f 100644 --- a/subprojects/gst-plugins-bad/ext/vulkan/vkdownload.c +++ b/subprojects/gst-plugins-bad/ext/vulkan/vkdownload.c @@ -148,7 +148,7 @@ _image_to_raw_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf) GError *error = NULL; GstFlowReturn ret; VkResult err; - int i; + int i, n_mems; if (!raw->cmd_pool) { if (!(raw->cmd_pool = @@ -198,7 +198,8 @@ _image_to_raw_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf) goto unlock_error; } - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&raw->out_info); i++) { + n_mems = gst_buffer_n_memory (*outbuf); + for (i = 0; i < n_mems; i++) { VkBufferImageCopy region; GstMemory *in_mem, *out_mem; GstVulkanBufferMemory *buf_mem; diff --git a/subprojects/gst-plugins-bad/ext/vulkan/vkupload.c b/subprojects/gst-plugins-bad/ext/vulkan/vkupload.c index 8c984bcba2..d25ba5bd26 100644 --- a/subprojects/gst-plugins-bad/ext/vulkan/vkupload.c +++ b/subprojects/gst-plugins-bad/ext/vulkan/vkupload.c @@ -228,6 +228,8 @@ _raw_to_buffer_set_caps (gpointer impl, GstCaps * in_caps, GstCaps * out_caps) struct RawToBufferUpload *raw = impl; guint out_width, out_height; guint i; + VkFormat vk_fmts[4] = { VK_FORMAT_UNDEFINED, }; + int n_imgs; if (!gst_video_info_from_caps (&raw->in_info, in_caps)) return FALSE; @@ -238,14 +240,16 @@ _raw_to_buffer_set_caps (gpointer impl, GstCaps * in_caps, GstCaps * out_caps) out_width = GST_VIDEO_INFO_WIDTH (&raw->out_info); out_height = GST_VIDEO_INFO_HEIGHT (&raw->out_info); - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&raw->out_info); i++) { - GstVulkanImageMemory *img_mem; - VkFormat vk_format; + if (!gst_vulkan_format_from_video_info_2 (raw->upload-> + device->physical_device, &raw->out_info, VK_IMAGE_TILING_OPTIMAL, + FALSE, vk_fmts, &n_imgs, NULL)) + return FALSE; - vk_format = gst_vulkan_format_from_video_info (&raw->out_info, i); + for (i = 0; i < n_imgs; i++) { + GstVulkanImageMemory *img_mem; img_mem = (GstVulkanImageMemory *) - gst_vulkan_image_memory_alloc (raw->upload->device, vk_format, + gst_vulkan_image_memory_alloc (raw->upload->device, vk_fmts[i], out_width, out_height, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); @@ -272,7 +276,7 @@ _raw_to_buffer_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf) struct RawToBufferUpload *raw = impl; GstVideoFrame v_frame; GstFlowReturn ret; - guint i; + guint i, n_mems; if (!raw->pool) { GstStructure *config; @@ -301,7 +305,8 @@ _raw_to_buffer_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf) return GST_FLOW_ERROR; } - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&raw->out_info); i++) { + n_mems = gst_buffer_n_memory (*outbuf); + for (i = 0; i < n_mems; i++) { GstMapInfo map_info; gsize plane_size; GstMemory *mem; @@ -440,7 +445,7 @@ _buffer_to_image_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf) GError *error = NULL; VkResult err; GstVulkanCommandBuffer *cmd_buf; - guint i; + guint i, n_mems; if (!raw->cmd_pool) { if (!(raw->cmd_pool = @@ -490,7 +495,8 @@ _buffer_to_image_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf) goto unlock_error; } - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&raw->out_info); i++) { + n_mems = gst_buffer_n_memory (*outbuf); + for (i = 0; i < n_mems; i++) { VkBufferImageCopy region; GstMemory *in_mem, *out_mem; GstVulkanBufferMemory *buf_mem; @@ -769,7 +775,7 @@ _raw_to_image_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf) GstVulkanCommandBuffer *cmd_buf; GError *error = NULL; VkResult err; - guint i; + guint i, n_mems; if (!raw->cmd_pool) { if (!(raw->cmd_pool = @@ -819,7 +825,8 @@ _raw_to_image_perform (gpointer impl, GstBuffer * inbuf, GstBuffer ** outbuf) return FALSE; } - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&raw->out_info); i++) { + n_mems = gst_buffer_n_memory (*outbuf); + for (i = 0; i < n_mems; i++) { VkBufferImageCopy region; GstMemory *in_mem, *out_mem; GstVulkanBufferMemory *buf_mem; diff --git a/subprojects/gst-plugins-bad/ext/vulkan/vkviewconvert.c b/subprojects/gst-plugins-bad/ext/vulkan/vkviewconvert.c index de2a21fe03..98c6535f6e 100644 --- a/subprojects/gst-plugins-bad/ext/vulkan/vkviewconvert.c +++ b/subprojects/gst-plugins-bad/ext/vulkan/vkviewconvert.c @@ -292,7 +292,7 @@ calculate_reorder_indexes (GstVideoFormat in_format, static void update_descriptor_set (GstVulkanViewConvert * conv, - GstVulkanImageView ** in_views) + GstVulkanImageView ** in_views, guint n_mems) { GstVulkanVideoFilter *vfilter = GST_VULKAN_VIDEO_FILTER (conv); VkDescriptorImageInfo image_info[GST_VIDEO_MAX_PLANES]; @@ -308,7 +308,7 @@ update_descriptor_set (GstVulkanViewConvert * conv, in_flags = GST_VIDEO_INFO_MULTIVIEW_FLAGS (&vfilter->in_info); out_flags = GST_VIDEO_INFO_MULTIVIEW_FLAGS (&vfilter->out_info); - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&vfilter->in_info); i++) { + for (i = 0; i < n_mems; i++) { if ((in_flags & GST_VIDEO_MULTIVIEW_FLAGS_RIGHT_VIEW_FIRST) == (out_flags & GST_VIDEO_MULTIVIEW_FLAGS_RIGHT_VIEW_FIRST)) { views[2 * i] = in_views[i]->view; @@ -319,7 +319,7 @@ update_descriptor_set (GstVulkanViewConvert * conv, } } - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&vfilter->in_info) * 2; i++) { + for (i = 0; i < n_mems * 2; i++) { /* *INDENT-OFF* */ image_info[i] = (VkDescriptorImageInfo) { .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, @@ -1778,7 +1778,8 @@ done: } static gboolean -create_descriptor_set_layout (GstVulkanViewConvert * conv, GError ** error) +create_descriptor_set_layout (GstVulkanViewConvert * conv, guint n_mems, + GError ** error) { GstVulkanVideoFilter *vfilter = GST_VULKAN_VIDEO_FILTER (conv); VkDescriptorSetLayoutBinding bindings[GST_VIDEO_MAX_PLANES * 2 + 1] = @@ -1797,9 +1798,9 @@ create_descriptor_set_layout (GstVulkanViewConvert * conv, GError ** error) .pImmutableSamplers = NULL, .stageFlags = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT }; - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&vfilter->in_info) * 2; i++) { + for (i = 0; i < n_mems * 2; i++) { bindings[descriptor_n++] = (VkDescriptorSetLayoutBinding) { - .binding = i+1, + .binding = i + 1, .descriptorCount = 1, .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, .pImmutableSamplers = NULL, @@ -1914,6 +1915,7 @@ gst_vulkan_view_convert_transform (GstBaseTransform * bt, GstBuffer * inbuf, GstVulkanFence *fence = NULL; GError *error = NULL; VkResult err; + guint in_n_mems, out_n_mems; int i; if (!gst_vulkan_full_screen_quad_set_input_buffer (conv->quad, inbuf, &error)) @@ -1926,7 +1928,8 @@ gst_vulkan_view_convert_transform (GstBaseTransform * bt, GstBuffer * inbuf, if (!fence) goto error; - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&conv->quad->in_info); i++) { + in_n_mems = gst_buffer_n_memory (inbuf); + for (i = 0; i < in_n_mems; i++) { GstMemory *img_mem = gst_buffer_peek_memory (inbuf, i); if (!gst_is_vulkan_image_memory (img_mem)) { g_set_error_literal (&error, GST_VULKAN_ERROR, GST_VULKAN_FAILED, @@ -1940,7 +1943,8 @@ gst_vulkan_view_convert_transform (GstBaseTransform * bt, GstBuffer * inbuf, gst_vulkan_trash_mini_object_unref, (GstMiniObject *) in_img_views[i])); } - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&conv->quad->out_info); i++) { + out_n_mems = gst_buffer_n_memory (outbuf); + for (i = 0; i < out_n_mems; i++) { GstMemory *mem = gst_buffer_peek_memory (outbuf, i); if (!gst_is_vulkan_image_memory (mem)) { g_set_error_literal (&error, GST_VULKAN_ERROR, GST_VULKAN_FAILED, @@ -1964,7 +1968,7 @@ gst_vulkan_view_convert_transform (GstBaseTransform * bt, GstBuffer * inbuf, } if (!conv->quad->descriptor_set_layout) - if (!create_descriptor_set_layout (conv, &error)) + if (!create_descriptor_set_layout (conv, in_n_mems, &error)) goto error; if (!gst_vulkan_full_screen_quad_prepare_draw (conv->quad, fence, &error)) @@ -1992,7 +1996,7 @@ gst_vulkan_view_convert_transform (GstBaseTransform * bt, GstBuffer * inbuf, goto error; } - update_descriptor_set (conv, in_img_views); + update_descriptor_set (conv, in_img_views, in_n_mems); if (!gst_vulkan_full_screen_quad_fill_command_buffer (conv->quad, cmd_buf, fence, &error)) goto unlock_error; diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkfullscreenquad.c b/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkfullscreenquad.c index 38b8d6a83a..dbe3a94609 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkfullscreenquad.c +++ b/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkfullscreenquad.c @@ -129,7 +129,7 @@ create_sampler (GstVulkanFullScreenQuad * self, GError ** error) static GstVulkanDescriptorSet * get_and_update_descriptor_set (GstVulkanFullScreenQuad * self, - GstVulkanImageView ** views, GError ** error) + GstVulkanImageView ** views, guint n_mems, GError ** error) { GstVulkanFullScreenQuadPrivate *priv = GET_PRIV (self); GstVulkanDescriptorSet *set; @@ -169,7 +169,7 @@ get_and_update_descriptor_set (GstVulkanFullScreenQuad * self, }; } - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&self->in_info); i++) { + for (i = 0; i < n_mems; i++) { image_info[i] = (VkDescriptorImageInfo) { .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, .imageView = views[i]->view, @@ -198,12 +198,13 @@ get_and_update_descriptor_set (GstVulkanFullScreenQuad * self, static gboolean create_descriptor_set_layout (GstVulkanFullScreenQuad * self, GError ** error) { + GstVulkanFullScreenQuadPrivate *priv = GET_PRIV (self); VkDescriptorSetLayoutBinding bindings[GST_VIDEO_MAX_PLANES + 1] = { {0,} }; VkDescriptorSetLayoutCreateInfo layout_info; VkDescriptorSetLayout descriptor_set_layout; int descriptor_n = 0; VkResult err; - int i; + int i, n_mems; /* *INDENT-OFF* */ bindings[descriptor_n++] = (VkDescriptorSetLayoutBinding) { @@ -213,7 +214,8 @@ create_descriptor_set_layout (GstVulkanFullScreenQuad * self, GError ** error) .pImmutableSamplers = NULL, .stageFlags = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT }; - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&self->in_info); i++) { + n_mems = gst_buffer_n_memory (priv->inbuf); + for (i = 0; i < n_mems; i++) { bindings[descriptor_n++] = (VkDescriptorSetLayoutBinding) { .binding = i+1, .descriptorCount = 1, @@ -295,9 +297,10 @@ create_render_pass (GstVulkanFullScreenQuad * self, GError ** error) VkSubpassDescription subpass; VkRenderPass render_pass; VkResult err; - int i; + int i, n_mems; - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&self->out_info); i++) { + n_mems = gst_buffer_n_memory (priv->outbuf); + for (i = 0; i < n_mems; i++) { /* *INDENT-OFF* */ color_attachments[i] = (VkAttachmentDescription) { .format = gst_vulkan_format_from_video_info (&self->out_info, i), @@ -321,14 +324,14 @@ create_render_pass (GstVulkanFullScreenQuad * self, GError ** error) /* *INDENT-OFF* */ subpass = (VkSubpassDescription) { .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, - .colorAttachmentCount = GST_VIDEO_INFO_N_PLANES (&self->out_info), + .colorAttachmentCount = n_mems, .pColorAttachments = color_attachment_refs }; render_pass_info = (VkRenderPassCreateInfo) { .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, .pNext = NULL, - .attachmentCount = GST_VIDEO_INFO_N_PLANES (&self->out_info), + .attachmentCount = n_mems, .pAttachments = color_attachments, .subpassCount = 1, .pSubpasses = &subpass @@ -523,7 +526,7 @@ create_pipeline (GstVulkanFullScreenQuad * self, GError ** error) .pNext = NULL, .logicOpEnable = VK_FALSE, .logicOp = VK_LOGIC_OP_COPY, - .attachmentCount = GST_VIDEO_INFO_N_PLANES (&self->out_info), + .attachmentCount = gst_buffer_n_memory (priv->outbuf), .pAttachments = color_blend_attachments, .blendConstants = { 0.0f, 0.0f, 0.0f, 0.0f } }; @@ -575,7 +578,7 @@ create_descriptor_pool (GstVulkanFullScreenQuad * self, GError ** error) /* *INDENT-OFF* */ pool_sizes[0] = (VkDescriptorPoolSize) { .type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, - .descriptorCount = max_sets * GST_VIDEO_INFO_N_PLANES (&self->in_info), + .descriptorCount = max_sets * gst_buffer_n_memory (priv->inbuf), }; if (priv->uniforms) { @@ -615,7 +618,7 @@ create_descriptor_pool (GstVulkanFullScreenQuad * self, GError ** error) static gboolean create_framebuffer (GstVulkanFullScreenQuad * self, GstVulkanImageView ** views, - GError ** error) + guint n_mems, GError ** error) { VkImageView attachments[GST_VIDEO_MAX_PLANES] = { 0, }; VkFramebufferCreateInfo framebuffer_info; @@ -623,7 +626,7 @@ create_framebuffer (GstVulkanFullScreenQuad * self, GstVulkanImageView ** views, VkResult err; int i; - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&self->out_info); i++) { + for (i = 0; i < n_mems; i++) { attachments[i] = views[i]->view; } @@ -632,7 +635,7 @@ create_framebuffer (GstVulkanFullScreenQuad * self, GstVulkanImageView ** views, .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, .pNext = NULL, .renderPass = (VkRenderPass) self->render_pass->handle, - .attachmentCount = GST_VIDEO_INFO_N_PLANES (&self->out_info), + .attachmentCount = n_mems, .pAttachments = attachments, .width = GST_VIDEO_INFO_WIDTH (&self->out_info), .height = GST_VIDEO_INFO_HEIGHT (&self->out_info), @@ -1373,7 +1376,7 @@ gst_vulkan_full_screen_quad_prepare_draw (GstVulkanFullScreenQuad * self, GstVulkanFullScreenQuadPrivate *priv; GstVulkanImageView *in_views[GST_VIDEO_MAX_PLANES] = { NULL, }; GstVulkanImageView *out_views[GST_VIDEO_MAX_PLANES] = { NULL, }; - int i; + int i, n_mems; g_return_val_if_fail (GST_IS_VULKAN_FULL_SCREEN_QUAD (self), FALSE); g_return_val_if_fail (fence != NULL, FALSE); @@ -1392,7 +1395,8 @@ gst_vulkan_full_screen_quad_prepare_draw (GstVulkanFullScreenQuad * self, goto error; if (!self->descriptor_set) { - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&self->in_info); i++) { + n_mems = gst_buffer_n_memory (priv->inbuf); + for (i = 0; i < n_mems; i++) { GstVulkanImageMemory *img_mem = peek_image_from_buffer (priv->inbuf, i); if (!gst_is_vulkan_image_memory ((GstMemory *) img_mem)) { g_set_error_literal (error, GST_VULKAN_ERROR, GST_VULKAN_FAILED, @@ -1406,12 +1410,13 @@ gst_vulkan_full_screen_quad_prepare_draw (GstVulkanFullScreenQuad * self, (GstMiniObject *) in_views[i])); } if (!(self->descriptor_set = - get_and_update_descriptor_set (self, in_views, error))) + get_and_update_descriptor_set (self, in_views, n_mems, error))) goto error; } if (!self->framebuffer) { - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&self->out_info); i++) { + n_mems = gst_buffer_n_memory (priv->outbuf); + for (i = 0; i < n_mems; i++) { GstVulkanImageMemory *img_mem = peek_image_from_buffer (priv->outbuf, i); if (!gst_is_vulkan_image_memory ((GstMemory *) img_mem)) { g_set_error_literal (error, GST_VULKAN_ERROR, GST_VULKAN_FAILED, @@ -1424,7 +1429,7 @@ gst_vulkan_full_screen_quad_prepare_draw (GstVulkanFullScreenQuad * self, gst_vulkan_trash_mini_object_unref, (GstMiniObject *) out_views[i])); } - if (!create_framebuffer (self, out_views, error)) + if (!create_framebuffer (self, out_views, n_mems, error)) goto error; } @@ -1461,6 +1466,7 @@ gst_vulkan_full_screen_quad_fill_command_buffer (GstVulkanFullScreenQuad * self, GstVulkanImageView *in_views[GST_VIDEO_MAX_PLANES] = { NULL, }; GstVulkanImageView *out_views[GST_VIDEO_MAX_PLANES] = { NULL, }; int i; + guint n_in_mems, n_out_mems; g_return_val_if_fail (GST_IS_VULKAN_FULL_SCREEN_QUAD (self), FALSE); g_return_val_if_fail (cmd != NULL, FALSE); @@ -1468,7 +1474,8 @@ gst_vulkan_full_screen_quad_fill_command_buffer (GstVulkanFullScreenQuad * self, priv = GET_PRIV (self); - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&self->in_info); i++) { + n_in_mems = gst_buffer_n_memory (priv->inbuf); + for (i = 0; i < n_in_mems; i++) { GstVulkanImageMemory *img_mem = peek_image_from_buffer (priv->inbuf, i); if (!gst_is_vulkan_image_memory ((GstMemory *) img_mem)) { g_set_error_literal (error, GST_VULKAN_ERROR, GST_VULKAN_FAILED, @@ -1480,7 +1487,8 @@ gst_vulkan_full_screen_quad_fill_command_buffer (GstVulkanFullScreenQuad * self, gst_vulkan_trash_list_acquire (self->trash_list, fence, gst_vulkan_trash_mini_object_unref, (GstMiniObject *) in_views[i])); } - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&self->out_info); i++) { + n_out_mems = gst_buffer_n_memory (priv->outbuf); + for (i = 0; i < n_out_mems; i++) { GstVulkanImageMemory *img_mem = peek_image_from_buffer (priv->outbuf, i); if (!gst_is_vulkan_image_memory ((GstMemory *) img_mem)) { g_set_error_literal (error, GST_VULKAN_ERROR, GST_VULKAN_FAILED, @@ -1494,7 +1502,7 @@ gst_vulkan_full_screen_quad_fill_command_buffer (GstVulkanFullScreenQuad * self, (GstMiniObject *) out_views[i])); } - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&self->in_info); i++) { + for (i = 0; i < n_in_mems; i++) { /* *INDENT-OFF* */ VkImageMemoryBarrier in_image_memory_barrier = { .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, @@ -1524,7 +1532,7 @@ gst_vulkan_full_screen_quad_fill_command_buffer (GstVulkanFullScreenQuad * self, in_image_memory_barrier.newLayout; } - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&self->out_info); i++) { + for (i = 0; i < n_out_mems; i++) { /* *INDENT-OFF* */ VkImageMemoryBarrier out_image_memory_barrier = { .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, @@ -1569,7 +1577,7 @@ gst_vulkan_full_screen_quad_fill_command_buffer (GstVulkanFullScreenQuad * self, GST_VIDEO_INFO_WIDTH (&self->out_info), GST_VIDEO_INFO_HEIGHT (&self->out_info) }, - .clearValueCount = GST_VIDEO_INFO_N_PLANES (&self->out_info), + .clearValueCount = n_out_mems, .pClearValues = clearColors, }; /* *INDENT-ON* */