gboolean gst_vulkan_instance_handle_context_query (GstElement * element, GstQuery * query, GstVulkanInstance ** instance) { gboolean res = FALSE; const gchar *context_type; GstContext *context, *old_context; g_return_val_if_fail (element != NULL, FALSE); g_return_val_if_fail (query != NULL, FALSE); g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_CONTEXT, FALSE); g_return_val_if_fail (instance != NULL, FALSE); gst_query_parse_context_type (query, &context_type); if (g_strcmp0 (context_type, GST_VULKAN_INSTANCE_CONTEXT_TYPE_STR) == 0) { gst_query_parse_context (query, &old_context); if (old_context) context = gst_context_copy (old_context); else context = gst_context_new (GST_VULKAN_INSTANCE_CONTEXT_TYPE_STR, TRUE); gst_context_set_vulkan_instance (context, *instance); gst_query_set_context (query, context); gst_context_unref (context); res = *instance != NULL; } return res; }
gboolean gst_vulkan_ensure_element_data (gpointer element, GstVulkanDisplay ** display_ptr, GstVulkanInstance ** instance_ptr) { 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); /* 1) Check if the element already has a context of the specific * type. */ if (!*instance_ptr) { GError *error = NULL; gst_vulkan_global_context_query (element, GST_VULKAN_INSTANCE_CONTEXT_TYPE_STR); /* Neighbour found and it updated the display */ if (!*instance_ptr) { GstContext *context; /* If no neighboor, or application not interested, use system default */ *instance_ptr = gst_vulkan_instance_new (); context = gst_context_new (GST_VULKAN_INSTANCE_CONTEXT_TYPE_STR, TRUE); gst_context_set_vulkan_instance (context, *instance_ptr); _vk_context_propagate (element, context); } if (!gst_vulkan_instance_open (*instance_ptr, &error)) { GST_ELEMENT_ERROR (element, RESOURCE, NOT_FOUND, ("Failed to create vulkan instance"), ("%s", error->message)); g_clear_error (&error); return FALSE; } } if (!*display_ptr) { _vk_display_context_query (element, display_ptr); /* Neighbour found and it updated the display */ if (!*display_ptr) { GstContext *context; /* instance is required before the display */ g_return_val_if_fail (*instance_ptr != NULL, FALSE); /* If no neighboor, or application not interested, use system default */ *display_ptr = gst_vulkan_display_new (*instance_ptr); context = gst_context_new (GST_VULKAN_DISPLAY_CONTEXT_TYPE_STR, TRUE); gst_context_set_vulkan_display (context, *display_ptr); _vk_context_propagate (element, context); } } return *display_ptr != NULL && *instance_ptr != NULL; }