Add tests/kmsprint
[android/external-libkmsxx.git] / tests / kmsprint.cpp
1 #include <cstdio>
2 #include <algorithm>
3 #include <iostream>
5 #include "kms++.h"
6 #include "cmdoptions.h"
8 using namespace std;
9 using namespace kms;
11 namespace kmsprint {
13 string width(int w, string str)
14 {
15         str.resize(w, ' ');
16         return str;
17 }
19 void print_mode(const Videomode &m, int ind)
20 {
21         printf("%s%s %6d %4d %4d %4d %4d %d %4d %4d %4d %4d %d  %2d 0x%04x %2d\n",
22                width(ind, "").c_str(),
23                m.name[0] == '\0' ? "" : width(11, m.name).c_str(),
24                m.clock,
25                m.hdisplay,
26                m.hsync_start,
27                m.hsync_end,
28                m.htotal,
29                m.hskew,
30                m.vdisplay,
31                m.vsync_start,
32                m.vsync_end,
33                m.vtotal,
34                m.vscan,
35                m.vrefresh,
36                m.flags,
37                m.type);
38 }
40 void print_property(uint64_t val, const Property& p, int ind)
41 {
42         printf("%s%s (id %d) = %s\n", width(ind, "").c_str(),
43                p.name().c_str(), p.id(), p.to_str(val).c_str());
44 }
46 void print_properties(DrmObject& o, int ind)
47 {
48         auto pmap = o.get_prop_map();
49         printf("%sProperties, %u in total:\n", width(ind, "").c_str(),
50                (unsigned) pmap.size());
51         for (auto pp : pmap) {
52                 const Property& p = *o.card().get_prop(pp.first);
53                 print_property(pp.second, p, ind + 2);
54         }
55 }
57 void print_plane(Plane& p, int ind, const CmdOptions& opts)
58 {
59         printf("%sPlane Id %d %d,%d -> %dx%d formats:", width(ind, "").c_str(),
60                p.id(), p.crtc_x(), p.crtc_y(), p.x(), p.y());
61         for (auto f : p.get_formats())
62                 printf(" %s", PixelFormatToFourCC(f).c_str());
63         printf("\n");
65         if (opts.is_set("p"))
66                 print_properties(p, ind+2);
67 }
69 void print_crtc(Crtc& cc, int ind, const CmdOptions& opts)
70 {
71         printf("%sCRTC Id %d BufferId %d %dx%d at %dx%d gamma_size %d\n",
72                width(ind, "").c_str(), cc.id(), cc.buffer_id(), cc.width(),
73                cc.height(), cc.x(), cc.y(), cc.gamma_size());
75         printf("%s   Mode ", width(ind, "").c_str());
76         print_mode(cc.mode(), 0);
78         if (opts.is_set("p"))
79                 print_properties(cc, ind+2);
81         if (opts.is_set("r"))
82                 for (auto p : cc.get_possible_planes())
83                         print_plane(*p, ind + 2, opts);
84 }
86 void print_encoder(Encoder& e, int ind, const CmdOptions& opts)
87 {
88         printf("%sEncoder Id %d type %s\n", width(ind, "").c_str(),
89                e.id(), e.get_encoder_type().c_str());
91         if (opts.is_set("p"))
92                 print_properties(e, ind+2);
94         if (opts.is_set("r"))
95                 for (auto cc : e.get_possible_crtcs())
96                         print_crtc(*cc, ind + 2, opts);
97 }
99 void print_connector(Connector& c, int ind, const CmdOptions& opts)
101         printf("%sConnector %s Id %d %sconnected", width(ind, "").c_str(),
102                c.fullname().c_str(), c.id(), c.connected() ? "" : "dis");
103         if (c.subpixel() != 0)
104                 printf(" Subpixel: %s", c.subpixel_str().c_str());
105         printf("\n");
107         if (opts.is_set("p"))
108                 print_properties(c, ind+2);
110         if (opts.is_set("r"))
111                 for (auto enc : c.get_encoders())
112                         print_encoder(*enc, ind + 2, opts);
114         if (opts.is_set("m")) {
115                 auto modes = c.get_modes();
116                 printf("%sModes, %u in total:\n", width(ind + 2, "").c_str(),
117                        (unsigned) modes.size());
118                 for (auto mode : modes)
119                         print_mode(mode, ind + 3);
120         }
125 static map<string, CmdOption> options = {
126         { "-id", HAS_PARAM("Object id to print") },
127         { "p", NO_PARAM("Print properties") },
128         { "m", NO_PARAM("Print modes") },
129         { "r", NO_PARAM("Recursively print all related objects") },
130 };
132 using namespace kmsprint;
134 int main(int argc, char **argv)
136         Card card;
137         CmdOptions opts(argc, argv, options);
139         if (opts.error().length()) {
140                 cerr << opts.error() << opts.usage();
141                 return -1;
142         }
144         /* No options implyles recursion */
145         if (!opts.is_set("-id")) {
146                 opts.get_option("r").oset();
147                 for (auto conn : card.get_connectors())
148                         print_connector(*conn, 0, opts);
149                 return 0;
150         }
152         if (opts.is_set("-id")) {
153                 auto ob = card.get_object(atoi(opts.opt_param("-id").c_str()));
154                 if (!ob) {
155                         cerr << opts.cmd() << ": Object id " <<
156                                 opts.opt_param("-id") << " not found." << endl;
157                         return -1;
158                 }
160                 if (auto co = dynamic_cast<Connector*>(ob))
161                         print_connector(*co, 0, opts);
162                 else if (auto en = dynamic_cast<Encoder*>(ob))
163                         print_encoder(*en, 0, opts);
164                 else if (auto cr = dynamic_cast<Crtc*>(ob))
165                         print_crtc(*cr, 0, opts);
166                 else if (auto pl = dynamic_cast<Plane*>(ob))
167                         print_plane(*pl, 0, opts);
168                 else {
169                         cerr << opts.cmd() << ": Unkown DRM Object type" <<
170                                 endl;
171                         return -1;
172                 }
174                 return 0;
175         }