xref: /third_party/mesa3d/src/tool/pps/pps_driver.cc (revision bf215546)
1/*
2 * Copyright © 2019-2020 Collabora, Ltd.
3 * Author: Antonio Caggiano <antonio.caggiano@collabora.com>
4 * Author: Rohan Garg <rohan.garg@collabora.com>
5 * Author: Robert Beckett <bob.beckett@collabora.com>
6 * Author: Corentin Noël <corentin.noel@collabora.com>
7 *
8 * SPDX-License-Identifier: MIT
9 */
10
11#include "pps_driver.h"
12
13#include <iterator>
14#include <sstream>
15
16#ifdef PPS_FREEDRENO
17#include "freedreno/ds/fd_pps_driver.h"
18#endif // PPS_FREEDRENO
19
20#ifdef PPS_INTEL
21#include "intel/ds/intel_pps_driver.h"
22#endif // PPS_INTEL
23
24#ifdef PPS_PANFROST
25#include "panfrost/ds/pan_pps_driver.h"
26#endif // PPS_PANFROST
27
28#include "pps.h"
29#include "pps_algorithm.h"
30
31namespace pps
32{
33std::unordered_map<std::string, std::unique_ptr<Driver>> create_supported_drivers()
34{
35   std::unordered_map<std::string, std::unique_ptr<Driver>> map;
36
37#ifdef PPS_FREEDRENO
38   map.emplace("msm", std::make_unique<FreedrenoDriver>());
39#endif // PPS_FREEDRENO
40
41#ifdef PPS_INTEL
42   map.emplace("i915", std::make_unique<IntelDriver>());
43#endif // PPS_INTEL
44
45#ifdef PPS_PANFROST
46   map.emplace("panfrost", std::make_unique<PanfrostDriver>());
47#endif // PPS_PANFROST
48
49   return map;
50}
51
52const std::unordered_map<std::string, std::unique_ptr<Driver>> &Driver::get_supported_drivers()
53{
54   static auto map = create_supported_drivers();
55   return map;
56}
57
58const std::vector<std::string> Driver::supported_device_names()
59{
60   std::vector<std::string> supported_device_names;
61
62   for (auto &entry : get_supported_drivers()) {
63      supported_device_names.emplace_back(entry.first);
64   }
65
66   return supported_device_names;
67}
68
69Driver *Driver::get_driver(DrmDevice &&drm_device)
70{
71   auto &supported_drivers = get_supported_drivers();
72   auto it = supported_drivers.find(drm_device.name);
73   if (it == std::end(supported_drivers)) {
74      PERFETTO_FATAL("Failed to find a driver for DRM device %s", drm_device.name.c_str());
75   }
76
77   Driver *driver = it->second.get();
78   driver->drm_device = std::move(drm_device);
79   return driver;
80}
81
82std::string Driver::default_driver_name()
83{
84   auto supported_devices = Driver::supported_device_names();
85   auto devices = DrmDevice::create_all();
86   for (auto &device : devices) {
87      if (CONTAINS(supported_devices, device.name)) {
88         PPS_LOG_IMPORTANT("Driver selected: %s", device.name.c_str());
89         return device.name;
90      }
91   }
92   PPS_LOG_FATAL("Failed to find any driver");
93}
94
95std::string Driver::find_driver_name(const char *requested)
96{
97   auto supported_devices = Driver::supported_device_names();
98   auto devices = DrmDevice::create_all();
99   for (auto &device : devices) {
100      if (device.name == requested) {
101         PPS_LOG_IMPORTANT("Driver selected: %s", device.name.c_str());
102         return device.name;
103      }
104   }
105
106   std::ostringstream drivers_os;
107   std::copy(supported_devices.begin(),
108      supported_devices.end() - 1,
109      std::ostream_iterator<std::string>(drivers_os, ", "));
110   drivers_os << supported_devices.back();
111
112   PPS_LOG_ERROR(
113      "Device '%s' not found (supported drivers: %s)", requested, drivers_os.str().c_str());
114
115   return default_driver_name();
116}
117
118} // namespace pps
119