vkfullscreenrender: create descriptor sets later
authorMatthew Waters <matthew@centricular.com>
Wed, 19 Jun 2019 05:27:11 +0000 (15:27 +1000)
committerMatthew Waters <matthew@centricular.com>
Wed, 19 Jun 2019 15:41:56 +0000 (01:41 +1000)
The desciptor sets may be dependant on the caps

ext/vulkan/vkfullscreenrender.c
ext/vulkan/vkimageidentity.c

index b48c154..f755e19 100644 (file)
@@ -500,6 +500,41 @@ _create_render_pass (GstVulkanFullScreenRender * render)
   return render_pass;
 }
 
+static VkDescriptorSetLayout
+_create_descriptor_set_layout (GstVulkanFullScreenRender * render)
+{
+  GstVulkanFullScreenRenderClass *render_class =
+      GST_VULKAN_FULL_SCREEN_RENDER_GET_CLASS (render);
+  guint n_bindings;
+  VkDescriptorSetLayoutBinding *bindings =
+      render_class->descriptor_set_layout_bindings (render, &n_bindings);
+
+  /* *INDENT-OFF* */
+  VkDescriptorSetLayoutCreateInfo layout_info = {
+      .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
+      .pNext = NULL,
+      .bindingCount = n_bindings,
+      .pBindings = bindings
+  };
+  /* *INDENT-ON* */
+  VkDescriptorSetLayout descriptor_set_layout;
+  VkResult err;
+  GError *error = NULL;
+
+  err =
+      vkCreateDescriptorSetLayout (render->device->device, &layout_info,
+      NULL, &descriptor_set_layout);
+  g_free (bindings);
+  if (gst_vulkan_error_to_g_error (err, &error,
+          "vkCreateDescriptorSetLayout") < 0) {
+    GST_ERROR_OBJECT (render, "Failed to create renderpass: %s",
+        error->message);
+    return NULL;
+  }
+
+  return descriptor_set_layout;
+}
+
 static gboolean
 gst_vulkan_full_screen_render_set_caps (GstBaseTransform * bt,
     GstCaps * in_caps, GstCaps * out_caps)
@@ -514,22 +549,58 @@ gst_vulkan_full_screen_render_set_caps (GstBaseTransform * bt,
   gst_caps_replace (&render->in_caps, in_caps);
   gst_caps_replace (&render->out_caps, out_caps);
 
-  if (render->render_pass) {
-    render->trash_list = g_list_prepend (render->trash_list,
-        gst_vulkan_trash_new_free_render_pass (gst_vulkan_fence_ref
-            (render->last_fence), render->render_pass));
+  if (render->last_fence) {
+    if (render->descriptor_set_layout) {
+      render->trash_list = g_list_prepend (render->trash_list,
+          gst_vulkan_trash_new_free_descriptor_set_layout (gst_vulkan_fence_ref
+              (render->last_fence), render->descriptor_set_layout));
+      render->descriptor_set_layout = NULL;
+    }
+    if (render->pipeline_layout) {
+      render->trash_list = g_list_prepend (render->trash_list,
+          gst_vulkan_trash_new_free_pipeline_layout (gst_vulkan_fence_ref
+              (render->last_fence), render->pipeline_layout));
+      render->pipeline_layout = NULL;
+    }
+    if (render->render_pass) {
+      render->trash_list = g_list_prepend (render->trash_list,
+          gst_vulkan_trash_new_free_render_pass (gst_vulkan_fence_ref
+              (render->last_fence), render->render_pass));
+      render->render_pass = NULL;
+    }
+    if (render->graphics_pipeline) {
+      render->trash_list = g_list_prepend (render->trash_list,
+          gst_vulkan_trash_new_free_pipeline (gst_vulkan_fence_ref
+              (render->last_fence), render->graphics_pipeline));
+      render->graphics_pipeline = NULL;
+    }
+  } else {
+    if (render->graphics_pipeline)
+      vkDestroyPipeline (render->device->device,
+          render->graphics_pipeline, NULL);
+    render->graphics_pipeline = NULL;
+
+    if (render->pipeline_layout)
+      vkDestroyPipelineLayout (render->device->device,
+          render->pipeline_layout, NULL);
+    render->pipeline_layout = NULL;
+
+    if (render->render_pass)
+      vkDestroyRenderPass (render->device->device, render->render_pass, NULL);
     render->render_pass = NULL;
+
+    if (render->descriptor_set_layout)
+      vkDestroyDescriptorSetLayout (render->device->device,
+          render->descriptor_set_layout, NULL);
+    render->descriptor_set_layout = NULL;
   }
 
+  if (!(render->descriptor_set_layout = _create_descriptor_set_layout (render)))
+    return FALSE;
+  if (!(render->pipeline_layout = _create_pipeline_layout (render)))
+    return FALSE;
   if (!(render->render_pass = _create_render_pass (render)))
     return FALSE;
-
-  if (render->graphics_pipeline) {
-    render->trash_list = g_list_prepend (render->trash_list,
-        gst_vulkan_trash_new_free_pipeline (gst_vulkan_fence_ref
-            (render->last_fence), render->graphics_pipeline));
-    render->graphics_pipeline = NULL;
-  }
   if (!(render->graphics_pipeline = _create_pipeline (render)))
     return FALSE;
 
@@ -598,41 +669,6 @@ gst_vulkan_full_screen_render_decide_allocation (GstBaseTransform * bt,
   return TRUE;
 }
 
-static VkDescriptorSetLayout
-_create_descriptor_set_layout (GstVulkanFullScreenRender * render)
-{
-  GstVulkanFullScreenRenderClass *render_class =
-      GST_VULKAN_FULL_SCREEN_RENDER_GET_CLASS (render);
-  guint n_bindings;
-  VkDescriptorSetLayoutBinding *bindings =
-      render_class->descriptor_set_layout_bindings (render, &n_bindings);
-
-  /* *INDENT-OFF* */
-  VkDescriptorSetLayoutCreateInfo layout_info = {
-      .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
-      .pNext = NULL,
-      .bindingCount = n_bindings,
-      .pBindings = bindings
-  };
-  /* *INDENT-ON* */
-  VkDescriptorSetLayout descriptor_set_layout;
-  VkResult err;
-  GError *error = NULL;
-
-  err =
-      vkCreateDescriptorSetLayout (render->device->device, &layout_info,
-      NULL, &descriptor_set_layout);
-  g_free (bindings);
-  if (gst_vulkan_error_to_g_error (err, &error,
-          "vkCreateDescriptorSetLayout") < 0) {
-    GST_ERROR_OBJECT (render, "Failed to create renderpass: %s",
-        error->message);
-    return NULL;
-  }
-
-  return descriptor_set_layout;
-}
-
 static gboolean
 _create_vertex_buffers (GstVulkanFullScreenRender * render)
 {
@@ -705,11 +741,6 @@ gst_vulkan_full_screen_render_start (GstBaseTransform * bt)
   if (!render->queue)
     return FALSE;
 
-  if (!(render->descriptor_set_layout = _create_descriptor_set_layout (render)))
-    return FALSE;
-  if (!(render->pipeline_layout = _create_pipeline_layout (render)))
-    return FALSE;
-
   if (!_create_vertex_buffers (render))
     return FALSE;
 
index 469556d..2d666ba 100644 (file)
@@ -47,6 +47,8 @@ static GstCaps *gst_vulkan_image_identity_transform_caps (GstBaseTransform * bt,
     GstPadDirection direction, GstCaps * caps, GstCaps * filter);
 static GstFlowReturn gst_vulkan_image_identity_transform (GstBaseTransform * bt,
     GstBuffer * inbuf, GstBuffer * outbuf);
+static gboolean gst_vulkan_image_identity_set_caps (GstBaseTransform * bt,
+    GstCaps * in_caps, GstCaps * out_caps);
 
 static VkAttachmentReference
     * gst_vulkan_image_identity_render_pass_attachment_references
@@ -124,6 +126,7 @@ gst_vulkan_image_identity_class_init (GstVulkanImageIdentityClass * klass)
       GST_DEBUG_FUNCPTR (gst_vulkan_image_identity_stop);
   gstbasetransform_class->transform_caps =
       gst_vulkan_image_identity_transform_caps;
+  gstbasetransform_class->set_caps = gst_vulkan_image_identity_set_caps;
   gstbasetransform_class->transform = gst_vulkan_image_identity_transform;
 
   fullscreenrender_class->render_pass_attachment_references =
@@ -340,6 +343,38 @@ _create_descriptor_set (GstVulkanImageIdentity * vk_identity)
   return descriptor;
 }
 
+static gboolean
+gst_vulkan_image_identity_set_caps (GstBaseTransform * bt, GstCaps * in_caps,
+    GstCaps * out_caps)
+{
+  GstVulkanImageIdentity *vk_identity = GST_VULKAN_IMAGE_IDENTITY (bt);
+  GstVulkanFullScreenRender *render = GST_VULKAN_FULL_SCREEN_RENDER (bt);
+
+  if (!GST_BASE_TRANSFORM_CLASS (parent_class)->set_caps (bt, in_caps,
+          out_caps))
+    return FALSE;
+
+  if (render->last_fence) {
+    render->trash_list = g_list_prepend (render->trash_list,
+        gst_vulkan_trash_new_free_descriptor_pool (gst_vulkan_fence_ref
+            (render->last_fence), vk_identity->descriptor_pool));
+    vk_identity->descriptor_set = NULL;
+    vk_identity->descriptor_pool = NULL;
+  } else {
+    vkDestroyDescriptorPool (render->device->device,
+        vk_identity->descriptor_pool, NULL);
+    vk_identity->descriptor_set = NULL;
+    vk_identity->descriptor_pool = NULL;
+  }
+
+  if (!(vk_identity->descriptor_pool = _create_descriptor_pool (vk_identity)))
+    return FALSE;
+  if (!(vk_identity->descriptor_set = _create_descriptor_set (vk_identity)))
+    return FALSE;
+
+  return TRUE;
+}
+
 static VkSampler
 _create_sampler (GstVulkanImageIdentity * vk_identity)
 {
@@ -391,10 +426,6 @@ gst_vulkan_image_identity_start (GstBaseTransform * bt)
 
   if (!(vk_identity->sampler = _create_sampler (vk_identity)))
     return FALSE;
-  if (!(vk_identity->descriptor_pool = _create_descriptor_pool (vk_identity)))
-    return FALSE;
-  if (!(vk_identity->descriptor_set = _create_descriptor_set (vk_identity)))
-    return FALSE;
 
   return TRUE;
 }