mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-25 17:50:36 +00:00
vkfullscreenrender: create descriptor sets later
The desciptor sets may be dependant on the caps
This commit is contained in:
parent
2e34dd891d
commit
b93de8b0d8
2 changed files with 117 additions and 55 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue