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