/* GStreamer Vulkan device provider unit test * * Copyright (C) 2019 Matthew Wayers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include static GstDeviceMonitor * vulkan_sink_device_provider (void) { GstDeviceMonitor *monitor = gst_device_monitor_new (); GstCaps *caps; caps = gst_caps_from_string ("video/x-raw(memory:VulkanImage)"); gst_device_monitor_add_filter (monitor, "Video/Sink", caps); gst_caps_unref (caps); gst_device_monitor_start (monitor); return monitor; } GST_START_TEST (vulkan_provider_creation) { GstDeviceMonitor *monitor; GList *devices, *l; gboolean found_vulkan_device = FALSE; monitor = vulkan_sink_device_provider (); devices = gst_device_monitor_get_devices (monitor); for (l = devices; l; l = g_list_next (l)) { GstDevice *device = GST_DEVICE (l->data); GstVulkanPhysicalDevice *vk_phys_device; GstVulkanDevice *elem_device; GstElement *pipeline, *sink, *upload, *src; GParamSpec *pspec; if (!(pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (device), "physical-device"))) continue; if (G_PARAM_SPEC_VALUE_TYPE (pspec) != GST_TYPE_VULKAN_PHYSICAL_DEVICE) continue; found_vulkan_device = TRUE; g_object_get (device, "physical-device", &vk_phys_device, NULL); fail_unless (GST_IS_VULKAN_PHYSICAL_DEVICE (vk_phys_device)); pipeline = gst_pipeline_new ("vkdeviceprovider"); src = gst_element_factory_make ("videotestsrc", NULL); upload = gst_element_factory_make ("vulkanupload", NULL); sink = gst_device_create_element (device, NULL); fail_unless (gst_bin_add (GST_BIN (pipeline), src)); fail_unless (gst_bin_add (GST_BIN (pipeline), upload)); fail_unless (gst_bin_add (GST_BIN (pipeline), sink)); fail_unless (gst_element_link_many (src, upload, sink, NULL)); gst_element_set_state (pipeline, GST_STATE_READY); g_object_get (sink, "device", &elem_device, NULL); fail_unless (GST_IS_VULKAN_DEVICE (elem_device)); GST_DEBUG ("%p =? %p", vk_phys_device, elem_device->physical_device); fail_unless (vk_phys_device == elem_device->physical_device); gst_object_unref (vk_phys_device); gst_object_unref (elem_device); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); } g_list_free_full (devices, gst_object_unref); gst_device_monitor_stop (monitor); gst_object_unref (monitor); if (!found_vulkan_device) GST_WARNING ("No vulkan devices found"); } GST_END_TEST; static Suite * vkdeviceprovider_suite (void) { Suite *s = suite_create ("vkdeviceprovider"); TCase *tc_basic = tcase_create ("general"); GstVulkanInstance *instance; gboolean have_instance; suite_add_tcase (s, tc_basic); /* FIXME: CI doesn't have a software vulkan renderer (and none exists currently) */ instance = gst_vulkan_instance_new (); have_instance = gst_vulkan_instance_open (instance, NULL); gst_object_unref (instance); if (have_instance) { tcase_add_test (tc_basic, vulkan_provider_creation); } return s; } GST_CHECK_MAIN (vkdeviceprovider);