mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-22 00:06:36 +00:00
vulkan: don't require every element to have a display
Only sink elements really care about a valid display
This commit is contained in:
parent
eb0f7f3279
commit
7ee28e2e4b
3 changed files with 26 additions and 22 deletions
|
@ -564,7 +564,7 @@ gst_vulkan_upload_query (GstBaseTransform * bt, GstPadDirection direction,
|
||||||
switch (GST_QUERY_TYPE (query)) {
|
switch (GST_QUERY_TYPE (query)) {
|
||||||
case GST_QUERY_CONTEXT:{
|
case GST_QUERY_CONTEXT:{
|
||||||
res = gst_vulkan_handle_context_query (GST_ELEMENT (vk_upload), query,
|
res = gst_vulkan_handle_context_query (GST_ELEMENT (vk_upload), query,
|
||||||
&vk_upload->display, &vk_upload->instance, &vk_upload->device);
|
NULL, &vk_upload->instance, &vk_upload->device);
|
||||||
|
|
||||||
if (res)
|
if (res)
|
||||||
return res;
|
return res;
|
||||||
|
@ -582,8 +582,7 @@ gst_vulkan_upload_set_context (GstElement * element, GstContext * context)
|
||||||
{
|
{
|
||||||
GstVulkanUpload *vk_upload = GST_VULKAN_UPLOAD (element);
|
GstVulkanUpload *vk_upload = GST_VULKAN_UPLOAD (element);
|
||||||
|
|
||||||
gst_vulkan_handle_set_context (element, context, &vk_upload->display,
|
gst_vulkan_handle_set_context (element, context, NULL, &vk_upload->instance);
|
||||||
&vk_upload->instance);
|
|
||||||
|
|
||||||
GST_ELEMENT_CLASS (parent_class)->set_context (element, context);
|
GST_ELEMENT_CLASS (parent_class)->set_context (element, context);
|
||||||
}
|
}
|
||||||
|
@ -602,17 +601,23 @@ gst_vulkan_upload_change_state (GstElement * element, GstStateChange transition)
|
||||||
case GST_STATE_CHANGE_NULL_TO_READY:
|
case GST_STATE_CHANGE_NULL_TO_READY:
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
||||||
if (!gst_vulkan_ensure_element_data (element, &vk_upload->display,
|
if (!gst_vulkan_ensure_element_data (element, NULL, &vk_upload->instance)) {
|
||||||
&vk_upload->instance)) {
|
|
||||||
GST_ELEMENT_ERROR (vk_upload, RESOURCE, NOT_FOUND,
|
GST_ELEMENT_ERROR (vk_upload, RESOURCE, NOT_FOUND,
|
||||||
("Failed to retreive vulkan instance/display"), (NULL));
|
("Failed to retreive vulkan instance"), (NULL));
|
||||||
return GST_STATE_CHANGE_FAILURE;
|
return GST_STATE_CHANGE_FAILURE;
|
||||||
}
|
}
|
||||||
if (!gst_vulkan_device_run_context_query (GST_ELEMENT (vk_upload),
|
if (!gst_vulkan_device_run_context_query (GST_ELEMENT (vk_upload),
|
||||||
&vk_upload->device)) {
|
&vk_upload->device)) {
|
||||||
GST_ELEMENT_ERROR (vk_upload, RESOURCE, NOT_FOUND,
|
GError *error = NULL;
|
||||||
("Failed to retreive vulkan device"), (NULL));
|
GST_DEBUG_OBJECT (vk_upload, "No device retrieved from peer elements");
|
||||||
return GST_STATE_CHANGE_FAILURE;
|
if (!(vk_upload->device =
|
||||||
|
gst_vulkan_instance_create_device (vk_upload->instance,
|
||||||
|
&error))) {
|
||||||
|
GST_ELEMENT_ERROR (vk_upload, RESOURCE, NOT_FOUND,
|
||||||
|
("Failed to create vulkan device"), ("%s", error->message));
|
||||||
|
g_clear_error (&error);
|
||||||
|
return GST_STATE_CHANGE_FAILURE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
|
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
|
||||||
|
@ -629,9 +634,6 @@ gst_vulkan_upload_change_state (GstElement * element, GstStateChange transition)
|
||||||
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
|
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||||
if (vk_upload->display)
|
|
||||||
gst_object_unref (vk_upload->display);
|
|
||||||
vk_upload->display = NULL;
|
|
||||||
if (vk_upload->device)
|
if (vk_upload->device)
|
||||||
gst_object_unref (vk_upload->device);
|
gst_object_unref (vk_upload->device);
|
||||||
vk_upload->device = NULL;
|
vk_upload->device = NULL;
|
||||||
|
|
|
@ -66,8 +66,6 @@ struct _GstVulkanUpload
|
||||||
GstVulkanInstance *instance;
|
GstVulkanInstance *instance;
|
||||||
GstVulkanDevice *device;
|
GstVulkanDevice *device;
|
||||||
|
|
||||||
GstVulkanDisplay *display;
|
|
||||||
|
|
||||||
GstCaps *in_caps;
|
GstCaps *in_caps;
|
||||||
GstCaps *out_caps;
|
GstCaps *out_caps;
|
||||||
|
|
||||||
|
|
|
@ -184,7 +184,6 @@ gst_vulkan_ensure_element_data (gpointer element,
|
||||||
GstVulkanDisplay ** display_ptr, GstVulkanInstance ** instance_ptr)
|
GstVulkanDisplay ** display_ptr, GstVulkanInstance ** instance_ptr)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (element != NULL, FALSE);
|
g_return_val_if_fail (element != NULL, FALSE);
|
||||||
g_return_val_if_fail (display_ptr != NULL, FALSE);
|
|
||||||
g_return_val_if_fail (instance_ptr != NULL, FALSE);
|
g_return_val_if_fail (instance_ptr != NULL, FALSE);
|
||||||
|
|
||||||
/* 1) Check if the element already has a context of the specific
|
/* 1) Check if the element already has a context of the specific
|
||||||
|
@ -192,21 +191,18 @@ gst_vulkan_ensure_element_data (gpointer element,
|
||||||
*/
|
*/
|
||||||
if (!*instance_ptr) {
|
if (!*instance_ptr) {
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
GstContext *context = NULL;
|
||||||
|
|
||||||
gst_vulkan_global_context_query (element,
|
gst_vulkan_global_context_query (element,
|
||||||
GST_VULKAN_INSTANCE_CONTEXT_TYPE_STR);
|
GST_VULKAN_INSTANCE_CONTEXT_TYPE_STR);
|
||||||
|
|
||||||
/* Neighbour found and it updated the display */
|
/* Neighbour found and it updated the display */
|
||||||
if (!*instance_ptr) {
|
if (!*instance_ptr) {
|
||||||
GstContext *context;
|
|
||||||
|
|
||||||
/* If no neighboor, or application not interested, use system default */
|
/* If no neighboor, or application not interested, use system default */
|
||||||
*instance_ptr = gst_vulkan_instance_new ();
|
*instance_ptr = gst_vulkan_instance_new ();
|
||||||
|
|
||||||
context = gst_context_new (GST_VULKAN_INSTANCE_CONTEXT_TYPE_STR, TRUE);
|
context = gst_context_new (GST_VULKAN_INSTANCE_CONTEXT_TYPE_STR, TRUE);
|
||||||
gst_context_set_vulkan_instance (context, *instance_ptr);
|
gst_context_set_vulkan_instance (context, *instance_ptr);
|
||||||
|
|
||||||
_vk_context_propagate (element, context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gst_vulkan_instance_open (*instance_ptr, &error)) {
|
if (!gst_vulkan_instance_open (*instance_ptr, &error)) {
|
||||||
|
@ -217,8 +213,15 @@ gst_vulkan_ensure_element_data (gpointer element,
|
||||||
g_clear_error (&error);
|
g_clear_error (&error);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (context)
|
||||||
|
_vk_context_propagate (element, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* we don't care about a display */
|
||||||
|
if (!display_ptr)
|
||||||
|
return *instance_ptr != NULL;
|
||||||
|
|
||||||
if (!*display_ptr) {
|
if (!*display_ptr) {
|
||||||
_vk_display_context_query (element, display_ptr);
|
_vk_display_context_query (element, display_ptr);
|
||||||
|
|
||||||
|
@ -250,7 +253,6 @@ gst_vulkan_handle_set_context (GstElement * element, GstContext * context,
|
||||||
GstVulkanInstance *instance_replacement = NULL;
|
GstVulkanInstance *instance_replacement = NULL;
|
||||||
const gchar *context_type;
|
const gchar *context_type;
|
||||||
|
|
||||||
g_return_val_if_fail (display != NULL, FALSE);
|
|
||||||
g_return_val_if_fail (instance != NULL, FALSE);
|
g_return_val_if_fail (instance != NULL, FALSE);
|
||||||
|
|
||||||
if (!context)
|
if (!context)
|
||||||
|
@ -258,7 +260,8 @@ gst_vulkan_handle_set_context (GstElement * element, GstContext * context,
|
||||||
|
|
||||||
context_type = gst_context_get_context_type (context);
|
context_type = gst_context_get_context_type (context);
|
||||||
|
|
||||||
if (g_strcmp0 (context_type, GST_VULKAN_DISPLAY_CONTEXT_TYPE_STR) == 0) {
|
if (display
|
||||||
|
&& g_strcmp0 (context_type, GST_VULKAN_DISPLAY_CONTEXT_TYPE_STR) == 0) {
|
||||||
if (!gst_context_get_vulkan_display (context, &display_replacement)) {
|
if (!gst_context_get_vulkan_display (context, &display_replacement)) {
|
||||||
GST_WARNING_OBJECT (element, "Failed to get display from context");
|
GST_WARNING_OBJECT (element, "Failed to get display from context");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -295,7 +298,8 @@ gst_vulkan_handle_context_query (GstElement * element, GstQuery * query,
|
||||||
GstVulkanDisplay ** display, GstVulkanInstance ** instance,
|
GstVulkanDisplay ** display, GstVulkanInstance ** instance,
|
||||||
GstVulkanDevice ** device)
|
GstVulkanDevice ** device)
|
||||||
{
|
{
|
||||||
if (gst_vulkan_display_handle_context_query (element, query, display))
|
if (display
|
||||||
|
&& gst_vulkan_display_handle_context_query (element, query, display))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
if (gst_vulkan_instance_handle_context_query (element, query, instance))
|
if (gst_vulkan_instance_handle_context_query (element, query, instance))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
Loading…
Reference in a new issue