/* * Copyright © 2019-2020 Collabora, Ltd. * Author: Antonio Caggiano * Author: Rohan Garg * Author: Robert Beckett * Author: Corentin Noël * * SPDX-License-Identifier: MIT */ #include "pps_driver.h" #include #include #ifdef PPS_FREEDRENO #include "freedreno/ds/fd_pps_driver.h" #endif // PPS_FREEDRENO #ifdef PPS_INTEL #include "intel/ds/intel_pps_driver.h" #endif // PPS_INTEL #ifdef PPS_PANFROST #include "panfrost/ds/pan_pps_driver.h" #endif // PPS_PANFROST #include "pps.h" #include "pps_algorithm.h" namespace pps { std::unordered_map> create_supported_drivers() { std::unordered_map> map; #ifdef PPS_FREEDRENO map.emplace("msm", std::make_unique()); #endif // PPS_FREEDRENO #ifdef PPS_INTEL map.emplace("i915", std::make_unique()); #endif // PPS_INTEL #ifdef PPS_PANFROST map.emplace("panfrost", std::make_unique()); #endif // PPS_PANFROST return map; } const std::unordered_map> &Driver::get_supported_drivers() { static auto map = create_supported_drivers(); return map; } const std::vector Driver::supported_device_names() { std::vector supported_device_names; for (auto &entry : get_supported_drivers()) { supported_device_names.emplace_back(entry.first); } return supported_device_names; } Driver *Driver::get_driver(DrmDevice &&drm_device) { auto &supported_drivers = get_supported_drivers(); auto it = supported_drivers.find(drm_device.name); if (it == std::end(supported_drivers)) { PERFETTO_FATAL("Failed to find a driver for DRM device %s", drm_device.name.c_str()); } Driver *driver = it->second.get(); driver->drm_device = std::move(drm_device); return driver; } std::string Driver::default_driver_name() { auto supported_devices = Driver::supported_device_names(); auto devices = DrmDevice::create_all(); for (auto &device : devices) { if (CONTAINS(supported_devices, device.name)) { PPS_LOG_IMPORTANT("Driver selected: %s", device.name.c_str()); return device.name; } } PPS_LOG_FATAL("Failed to find any driver"); } std::string Driver::find_driver_name(const char *requested) { auto supported_devices = Driver::supported_device_names(); auto devices = DrmDevice::create_all(); for (auto &device : devices) { if (device.name == requested) { PPS_LOG_IMPORTANT("Driver selected: %s", device.name.c_str()); return device.name; } } std::ostringstream drivers_os; std::copy(supported_devices.begin(), supported_devices.end() - 1, std::ostream_iterator(drivers_os, ", ")); drivers_os << supported_devices.back(); PPS_LOG_ERROR( "Device '%s' not found (supported drivers: %s)", requested, drivers_os.str().c_str()); return default_driver_name(); } } // namespace pps