The open source OpenXR runtime
1// Copyright 2019-2023, Collabora, Ltd.
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief Just does a probe.
6 * @author Jakob Bornecrantz <jakob@collabora.com>
7 */
8
9#include "xrt/xrt_space.h"
10#include "xrt/xrt_system.h"
11#include "xrt/xrt_device.h"
12#include "xrt/xrt_prober.h"
13#include "xrt/xrt_instance.h"
14#include "xrt/xrt_config_drivers.h"
15
16#include "cli_common.h"
17
18#include <string.h>
19#include <stdio.h>
20
21static int
22do_exit(struct xrt_instance **xi_ptr, int ret)
23{
24 xrt_instance_destroy(xi_ptr);
25
26 printf(" :: Exiting '%i'\n", ret);
27
28 return ret;
29}
30
31#define NUM_XDEVS 32
32
33int
34cli_cmd_probe(int argc, const char **argv)
35{
36 struct xrt_instance *xi = NULL;
37 xrt_result_t xret = XRT_SUCCESS;
38 int ret = 0;
39
40 // Initialize the prober.
41 printf(" :: Creating instance!\n");
42
43 ret = xrt_instance_create(NULL, &xi);
44 if (ret != 0) {
45 return do_exit(&xi, 0);
46 }
47
48 // Need to prime the prober with devices before dumping and listing.
49 printf(" :: Creating system devices!\n");
50
51 struct xrt_system *xsys = NULL;
52 struct xrt_system_devices *xsysd = NULL;
53 struct xrt_space_overseer *xso = NULL;
54 xret = xrt_instance_create_system( //
55 xi, // Instance
56 &xsys, // System
57 &xsysd, // System devices.
58 &xso, // Space overseer.
59 NULL); // System compositor.
60 if (xret != XRT_SUCCESS) {
61 printf("\tCall to xrt_instance_create_system failed! '%i'\n", xret);
62 return do_exit(&xi, -1);
63 }
64 if (xsysd == NULL) {
65 printf("\tNo xrt_system_devices returned!\n");
66 return do_exit(&xi, -1);
67 }
68
69 struct xrt_prober *xp = NULL;
70 xret = xrt_instance_get_prober(xi, &xp);
71 if (xret != XRT_SUCCESS) {
72 printf("\tNo xrt_prober could be created!\n");
73 return do_exit(&xi, -1);
74 }
75
76 size_t builder_count;
77 struct xrt_builder **builders;
78 size_t num_entries;
79 struct xrt_prober_entry **entries;
80 struct xrt_auto_prober **auto_probers;
81 ret = xrt_prober_get_builders(xp, &builder_count, &builders, &num_entries, &entries, &auto_probers);
82 if (ret != 0) {
83 do_exit(&xi, ret);
84 }
85
86 printf(" :: Regular built in drivers\n");
87 for (size_t i = 0; i < num_entries; i++) {
88 if (entries[i] == NULL) {
89 continue;
90 }
91
92 // devices with the same driver name are usually grouped, don't print duplicates
93 if (i > 0 && strcmp(entries[i - 1]->driver_name, entries[i]->driver_name) == 0) {
94 continue;
95 }
96
97 printf("\t%s\n", entries[i]->driver_name);
98 }
99
100 for (size_t i = 0; i < XRT_MAX_AUTO_PROBERS; i++) {
101 if (auto_probers[i] == NULL) {
102 continue;
103 }
104
105 printf("\t%s\n", auto_probers[i]->name);
106 }
107
108 printf(" :: Additional built in drivers\n");
109// special cased drivers that are not probed through prober entries/autoprobers
110#ifdef XRT_BUILD_DRIVER_REMOTE
111 printf("\tRemote Debugging\n");
112#endif
113
114#ifdef XRT_BUILD_DRIVER_V4L2
115 printf("\tv4l2\n");
116#endif
117
118#ifdef XRT_BUILD_DRIVER_VF
119 printf("\tvf\n");
120#endif
121
122 printf(" :: Destroying probed devices\n");
123
124 xrt_space_overseer_destroy(&xso);
125 xrt_system_devices_destroy(&xsysd);
126 xrt_system_destroy(&xsys);
127
128 // End of program
129 printf(" :: All ok, shutting down.\n");
130
131 // Finally done
132 return do_exit(&xi, 0);
133}