xref: /aosp_15_r20/external/mesa3d/src/freedreno/computerator/main.cc (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2020 Google, Inc.
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20*61046927SAndroid Build Coastguard Worker  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*61046927SAndroid Build Coastguard Worker  * SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #include <getopt.h>
25*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
26*61046927SAndroid Build Coastguard Worker #include <locale.h>
27*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
28*61046927SAndroid Build Coastguard Worker #include <xf86drm.h>
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker #include "perfcntrs/freedreno_perfcntr.h"
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker #include "main.h"
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker static void
dump_float(void * buf,int sz)37*61046927SAndroid Build Coastguard Worker dump_float(void *buf, int sz)
38*61046927SAndroid Build Coastguard Worker {
39*61046927SAndroid Build Coastguard Worker    uint8_t *ptr = (uint8_t *)buf;
40*61046927SAndroid Build Coastguard Worker    uint8_t *end = ptr + sz - 3;
41*61046927SAndroid Build Coastguard Worker    int i = 0;
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker    while (ptr < end) {
44*61046927SAndroid Build Coastguard Worker       uint32_t d = 0;
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker       printf((i % 8) ? " " : "\t");
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker       d |= *(ptr++) << 0;
49*61046927SAndroid Build Coastguard Worker       d |= *(ptr++) << 8;
50*61046927SAndroid Build Coastguard Worker       d |= *(ptr++) << 16;
51*61046927SAndroid Build Coastguard Worker       d |= *(ptr++) << 24;
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker       printf("%8f", uif(d));
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker       if ((i % 8) == 7) {
56*61046927SAndroid Build Coastguard Worker          printf("\n");
57*61046927SAndroid Build Coastguard Worker       }
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker       i++;
60*61046927SAndroid Build Coastguard Worker    }
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker    if (i % 8) {
63*61046927SAndroid Build Coastguard Worker       printf("\n");
64*61046927SAndroid Build Coastguard Worker    }
65*61046927SAndroid Build Coastguard Worker }
66*61046927SAndroid Build Coastguard Worker 
67*61046927SAndroid Build Coastguard Worker static void
dump_hex(void * buf,int sz)68*61046927SAndroid Build Coastguard Worker dump_hex(void *buf, int sz)
69*61046927SAndroid Build Coastguard Worker {
70*61046927SAndroid Build Coastguard Worker    uint8_t *ptr = (uint8_t *)buf;
71*61046927SAndroid Build Coastguard Worker    uint8_t *end = ptr + sz;
72*61046927SAndroid Build Coastguard Worker    int i = 0;
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker    while (ptr < end) {
75*61046927SAndroid Build Coastguard Worker       uint32_t d = 0;
76*61046927SAndroid Build Coastguard Worker 
77*61046927SAndroid Build Coastguard Worker       printf((i % 8) ? " " : "\t");
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker       d |= *(ptr++) << 0;
80*61046927SAndroid Build Coastguard Worker       d |= *(ptr++) << 8;
81*61046927SAndroid Build Coastguard Worker       d |= *(ptr++) << 16;
82*61046927SAndroid Build Coastguard Worker       d |= *(ptr++) << 24;
83*61046927SAndroid Build Coastguard Worker 
84*61046927SAndroid Build Coastguard Worker       printf("%08x", d);
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker       if ((i % 8) == 7) {
87*61046927SAndroid Build Coastguard Worker          printf("\n");
88*61046927SAndroid Build Coastguard Worker       }
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker       i++;
91*61046927SAndroid Build Coastguard Worker    }
92*61046927SAndroid Build Coastguard Worker 
93*61046927SAndroid Build Coastguard Worker    if (i % 8) {
94*61046927SAndroid Build Coastguard Worker       printf("\n");
95*61046927SAndroid Build Coastguard Worker    }
96*61046927SAndroid Build Coastguard Worker }
97*61046927SAndroid Build Coastguard Worker 
98*61046927SAndroid Build Coastguard Worker static const char *shortopts = "df:g:hp:";
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker static const struct option longopts[] = {
101*61046927SAndroid Build Coastguard Worker    {"disasm", no_argument, 0, 'd'},         {"file", required_argument, 0, 'f'},
102*61046927SAndroid Build Coastguard Worker    {"groups", required_argument, 0, 'g'},   {"help", no_argument, 0, 'h'},
103*61046927SAndroid Build Coastguard Worker    {"perfcntr", required_argument, 0, 'p'}, {0, 0, 0, 0}};
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker static void
usage(const char * name)106*61046927SAndroid Build Coastguard Worker usage(const char *name)
107*61046927SAndroid Build Coastguard Worker {
108*61046927SAndroid Build Coastguard Worker    printf(
109*61046927SAndroid Build Coastguard Worker       "Usage: %s [-dfgh]\n"
110*61046927SAndroid Build Coastguard Worker       "\n"
111*61046927SAndroid Build Coastguard Worker       "options:\n"
112*61046927SAndroid Build Coastguard Worker       "    -d, --disasm             print disassembled shader\n"
113*61046927SAndroid Build Coastguard Worker       "    -f, --file=FILE          read shader from file (instead of stdin)\n"
114*61046927SAndroid Build Coastguard Worker       "    -g, --groups=X,Y,Z       use specified group size\n"
115*61046927SAndroid Build Coastguard Worker       "    -h, --help               show this message\n"
116*61046927SAndroid Build Coastguard Worker       "    -p, --perfcntr=LIST      sample specified performance counters "
117*61046927SAndroid Build Coastguard Worker       "(comma\n"
118*61046927SAndroid Build Coastguard Worker       "                             separated list)\n",
119*61046927SAndroid Build Coastguard Worker       name);
120*61046927SAndroid Build Coastguard Worker }
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker /* performance counter description: */
123*61046927SAndroid Build Coastguard Worker static unsigned num_groups;
124*61046927SAndroid Build Coastguard Worker static const struct fd_perfcntr_group *groups;
125*61046927SAndroid Build Coastguard Worker 
126*61046927SAndroid Build Coastguard Worker /* Track enabled counters per group: */
127*61046927SAndroid Build Coastguard Worker static unsigned *enabled_counters;
128*61046927SAndroid Build Coastguard Worker 
129*61046927SAndroid Build Coastguard Worker static void
setup_counter(const char * name,struct perfcntr * c)130*61046927SAndroid Build Coastguard Worker setup_counter(const char *name, struct perfcntr *c)
131*61046927SAndroid Build Coastguard Worker {
132*61046927SAndroid Build Coastguard Worker    for (int i = 0; i < num_groups; i++) {
133*61046927SAndroid Build Coastguard Worker       const struct fd_perfcntr_group *group = &groups[i];
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker       for (int j = 0; j < group->num_countables; j++) {
136*61046927SAndroid Build Coastguard Worker          const struct fd_perfcntr_countable *countable = &group->countables[j];
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker          if (strcmp(name, countable->name) != 0)
139*61046927SAndroid Build Coastguard Worker             continue;
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker          /*
142*61046927SAndroid Build Coastguard Worker           * Allocate a counter to use to monitor the requested countable:
143*61046927SAndroid Build Coastguard Worker           */
144*61046927SAndroid Build Coastguard Worker          if (enabled_counters[i] >= group->num_counters) {
145*61046927SAndroid Build Coastguard Worker             errx(-1, "Too many counters selected in group: %s", group->name);
146*61046927SAndroid Build Coastguard Worker          }
147*61046927SAndroid Build Coastguard Worker 
148*61046927SAndroid Build Coastguard Worker          unsigned idx = enabled_counters[i]++;
149*61046927SAndroid Build Coastguard Worker          const struct fd_perfcntr_counter *counter = &group->counters[idx];
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker          /*
152*61046927SAndroid Build Coastguard Worker           * And initialize the perfcntr struct, pulling together the info
153*61046927SAndroid Build Coastguard Worker           * about selected counter and countable, to simplify life for the
154*61046927SAndroid Build Coastguard Worker           * backend:
155*61046927SAndroid Build Coastguard Worker           */
156*61046927SAndroid Build Coastguard Worker          c->name = name;
157*61046927SAndroid Build Coastguard Worker          c->select_reg = counter->select_reg;
158*61046927SAndroid Build Coastguard Worker          c->counter_reg_lo = counter->counter_reg_lo;
159*61046927SAndroid Build Coastguard Worker          c->counter_reg_hi = counter->counter_reg_hi;
160*61046927SAndroid Build Coastguard Worker          c->selector = countable->selector;
161*61046927SAndroid Build Coastguard Worker 
162*61046927SAndroid Build Coastguard Worker          return;
163*61046927SAndroid Build Coastguard Worker       }
164*61046927SAndroid Build Coastguard Worker    }
165*61046927SAndroid Build Coastguard Worker 
166*61046927SAndroid Build Coastguard Worker    errx(-1, "could not find countable: %s", name);
167*61046927SAndroid Build Coastguard Worker }
168*61046927SAndroid Build Coastguard Worker 
169*61046927SAndroid Build Coastguard Worker static struct perfcntr *
parse_perfcntrs(const struct fd_dev_id * dev_id,const char * perfcntrstr,unsigned * num_perfcntrs)170*61046927SAndroid Build Coastguard Worker parse_perfcntrs(const struct fd_dev_id *dev_id, const char *perfcntrstr,
171*61046927SAndroid Build Coastguard Worker                 unsigned *num_perfcntrs)
172*61046927SAndroid Build Coastguard Worker {
173*61046927SAndroid Build Coastguard Worker    struct perfcntr *counters = NULL;
174*61046927SAndroid Build Coastguard Worker    char *cnames, *s;
175*61046927SAndroid Build Coastguard Worker    unsigned cnt = 0;
176*61046927SAndroid Build Coastguard Worker 
177*61046927SAndroid Build Coastguard Worker    groups = fd_perfcntrs(dev_id, &num_groups);
178*61046927SAndroid Build Coastguard Worker    enabled_counters = (uint32_t *) calloc(num_groups, sizeof(enabled_counters[0]));
179*61046927SAndroid Build Coastguard Worker 
180*61046927SAndroid Build Coastguard Worker    cnames = strdup(perfcntrstr);
181*61046927SAndroid Build Coastguard Worker    while ((s = strstr(cnames, ","))) {
182*61046927SAndroid Build Coastguard Worker       char *name = cnames;
183*61046927SAndroid Build Coastguard Worker       s[0] = '\0';
184*61046927SAndroid Build Coastguard Worker       cnames = &s[1];
185*61046927SAndroid Build Coastguard Worker 
186*61046927SAndroid Build Coastguard Worker       counters =
187*61046927SAndroid Build Coastguard Worker          (struct perfcntr *)realloc(counters, ++cnt * sizeof(counters[0]));
188*61046927SAndroid Build Coastguard Worker       setup_counter(name, &counters[cnt - 1]);
189*61046927SAndroid Build Coastguard Worker    }
190*61046927SAndroid Build Coastguard Worker 
191*61046927SAndroid Build Coastguard Worker    char *name = cnames;
192*61046927SAndroid Build Coastguard Worker    counters = (struct perfcntr *)realloc(counters, ++cnt * sizeof(counters[0]));
193*61046927SAndroid Build Coastguard Worker    setup_counter(name, &counters[cnt - 1]);
194*61046927SAndroid Build Coastguard Worker 
195*61046927SAndroid Build Coastguard Worker    *num_perfcntrs = cnt;
196*61046927SAndroid Build Coastguard Worker 
197*61046927SAndroid Build Coastguard Worker    return counters;
198*61046927SAndroid Build Coastguard Worker }
199*61046927SAndroid Build Coastguard Worker 
200*61046927SAndroid Build Coastguard Worker int
main(int argc,char ** argv)201*61046927SAndroid Build Coastguard Worker main(int argc, char **argv)
202*61046927SAndroid Build Coastguard Worker {
203*61046927SAndroid Build Coastguard Worker    FILE *in = stdin;
204*61046927SAndroid Build Coastguard Worker    const char *perfcntrstr = NULL;
205*61046927SAndroid Build Coastguard Worker    struct perfcntr *perfcntrs = NULL;
206*61046927SAndroid Build Coastguard Worker    unsigned num_perfcntrs = 0;
207*61046927SAndroid Build Coastguard Worker    bool disasm = false;
208*61046927SAndroid Build Coastguard Worker    uint32_t grid[3] = {0};
209*61046927SAndroid Build Coastguard Worker    int opt, ret;
210*61046927SAndroid Build Coastguard Worker 
211*61046927SAndroid Build Coastguard Worker    setlocale(LC_NUMERIC, "en_US.UTF-8");
212*61046927SAndroid Build Coastguard Worker 
213*61046927SAndroid Build Coastguard Worker    while ((opt = getopt_long_only(argc, argv, shortopts, longopts, NULL)) !=
214*61046927SAndroid Build Coastguard Worker           -1) {
215*61046927SAndroid Build Coastguard Worker       switch (opt) {
216*61046927SAndroid Build Coastguard Worker       case 'd':
217*61046927SAndroid Build Coastguard Worker          disasm = true;
218*61046927SAndroid Build Coastguard Worker          break;
219*61046927SAndroid Build Coastguard Worker       case 'f':
220*61046927SAndroid Build Coastguard Worker          in = fopen(optarg, "r");
221*61046927SAndroid Build Coastguard Worker          if (!in)
222*61046927SAndroid Build Coastguard Worker             err(1, "could not open '%s'", optarg);
223*61046927SAndroid Build Coastguard Worker          break;
224*61046927SAndroid Build Coastguard Worker       case 'g':
225*61046927SAndroid Build Coastguard Worker          ret = sscanf(optarg, "%u,%u,%u", &grid[0], &grid[1], &grid[2]);
226*61046927SAndroid Build Coastguard Worker          if (ret != 3) {
227*61046927SAndroid Build Coastguard Worker             usage(argv[0]);
228*61046927SAndroid Build Coastguard Worker             return -1;
229*61046927SAndroid Build Coastguard Worker          }
230*61046927SAndroid Build Coastguard Worker          break;
231*61046927SAndroid Build Coastguard Worker       case 'h':
232*61046927SAndroid Build Coastguard Worker          usage(argv[0]);
233*61046927SAndroid Build Coastguard Worker          return -1;
234*61046927SAndroid Build Coastguard Worker       case 'p':
235*61046927SAndroid Build Coastguard Worker          perfcntrstr = optarg;
236*61046927SAndroid Build Coastguard Worker          break;
237*61046927SAndroid Build Coastguard Worker       default:
238*61046927SAndroid Build Coastguard Worker          printf("unrecognized arg: %c\n", opt);
239*61046927SAndroid Build Coastguard Worker          usage(argv[0]);
240*61046927SAndroid Build Coastguard Worker          return -1;
241*61046927SAndroid Build Coastguard Worker       }
242*61046927SAndroid Build Coastguard Worker    }
243*61046927SAndroid Build Coastguard Worker 
244*61046927SAndroid Build Coastguard Worker    struct fd_device *dev = fd_device_open();
245*61046927SAndroid Build Coastguard Worker    struct fd_pipe *pipe = fd_pipe_new(dev, FD_PIPE_3D);
246*61046927SAndroid Build Coastguard Worker 
247*61046927SAndroid Build Coastguard Worker    const struct fd_dev_id *dev_id = fd_pipe_dev_id(pipe);
248*61046927SAndroid Build Coastguard Worker 
249*61046927SAndroid Build Coastguard Worker    printf("got gpu: %s\n", fd_dev_name(dev_id));
250*61046927SAndroid Build Coastguard Worker 
251*61046927SAndroid Build Coastguard Worker    struct backend *backend;
252*61046927SAndroid Build Coastguard Worker    switch (fd_dev_gen(dev_id)) {
253*61046927SAndroid Build Coastguard Worker    case 4:
254*61046927SAndroid Build Coastguard Worker       backend = a4xx_init(dev, dev_id);
255*61046927SAndroid Build Coastguard Worker       break;
256*61046927SAndroid Build Coastguard Worker    case 6:
257*61046927SAndroid Build Coastguard Worker       backend = a6xx_init<A6XX>(dev, dev_id);
258*61046927SAndroid Build Coastguard Worker       break;
259*61046927SAndroid Build Coastguard Worker    case 7:
260*61046927SAndroid Build Coastguard Worker       backend = a6xx_init<A7XX>(dev, dev_id);
261*61046927SAndroid Build Coastguard Worker       break;
262*61046927SAndroid Build Coastguard Worker    default:
263*61046927SAndroid Build Coastguard Worker       err(1, "unsupported gpu generation: a%uxx", fd_dev_gen(dev_id));
264*61046927SAndroid Build Coastguard Worker    }
265*61046927SAndroid Build Coastguard Worker 
266*61046927SAndroid Build Coastguard Worker    struct kernel *kernel = backend->assemble(backend, in);
267*61046927SAndroid Build Coastguard Worker    printf("localsize: %dx%dx%d\n", kernel->local_size[0], kernel->local_size[1],
268*61046927SAndroid Build Coastguard Worker           kernel->local_size[2]);
269*61046927SAndroid Build Coastguard Worker    for (int i = 0; i < kernel->num_bufs; i++) {
270*61046927SAndroid Build Coastguard Worker       printf("buf[%d]: size=%u\n", i, kernel->buf_sizes[i]);
271*61046927SAndroid Build Coastguard Worker       kernel->bufs[i] = fd_bo_new(dev, kernel->buf_sizes[i] * 4, 0, "buf[%d]", i);
272*61046927SAndroid Build Coastguard Worker 
273*61046927SAndroid Build Coastguard Worker       if (kernel->buf_init_data[i]) {
274*61046927SAndroid Build Coastguard Worker          fd_bo_cpu_prep(kernel->bufs[i], pipe, FD_BO_PREP_WRITE);
275*61046927SAndroid Build Coastguard Worker          void *map = fd_bo_map(kernel->bufs[i]);
276*61046927SAndroid Build Coastguard Worker          memcpy(map, kernel->buf_init_data[i], kernel->buf_sizes[i] * 4);
277*61046927SAndroid Build Coastguard Worker          free(kernel->buf_init_data[i]);
278*61046927SAndroid Build Coastguard Worker       }
279*61046927SAndroid Build Coastguard Worker    }
280*61046927SAndroid Build Coastguard Worker 
281*61046927SAndroid Build Coastguard Worker    if (disasm)
282*61046927SAndroid Build Coastguard Worker       backend->disassemble(kernel, stdout);
283*61046927SAndroid Build Coastguard Worker 
284*61046927SAndroid Build Coastguard Worker    if (grid[0] == 0)
285*61046927SAndroid Build Coastguard Worker       return 0;
286*61046927SAndroid Build Coastguard Worker 
287*61046927SAndroid Build Coastguard Worker    struct fd_submit *submit = fd_submit_new(pipe);
288*61046927SAndroid Build Coastguard Worker 
289*61046927SAndroid Build Coastguard Worker    if (perfcntrstr) {
290*61046927SAndroid Build Coastguard Worker       if (!backend->set_perfcntrs) {
291*61046927SAndroid Build Coastguard Worker          err(1, "performance counters not supported");
292*61046927SAndroid Build Coastguard Worker       }
293*61046927SAndroid Build Coastguard Worker       perfcntrs = parse_perfcntrs(dev_id, perfcntrstr, &num_perfcntrs);
294*61046927SAndroid Build Coastguard Worker       backend->set_perfcntrs(backend, perfcntrs, num_perfcntrs);
295*61046927SAndroid Build Coastguard Worker    }
296*61046927SAndroid Build Coastguard Worker 
297*61046927SAndroid Build Coastguard Worker    backend->emit_grid(kernel, grid, submit);
298*61046927SAndroid Build Coastguard Worker 
299*61046927SAndroid Build Coastguard Worker    struct fd_fence *fence = fd_submit_flush(submit, -1, false);
300*61046927SAndroid Build Coastguard Worker 
301*61046927SAndroid Build Coastguard Worker    fd_fence_flush(fence);
302*61046927SAndroid Build Coastguard Worker    fd_fence_del(fence);
303*61046927SAndroid Build Coastguard Worker 
304*61046927SAndroid Build Coastguard Worker    for (int i = 0; i < kernel->num_bufs; i++) {
305*61046927SAndroid Build Coastguard Worker       fd_bo_cpu_prep(kernel->bufs[i], pipe, FD_BO_PREP_READ);
306*61046927SAndroid Build Coastguard Worker       void *map = fd_bo_map(kernel->bufs[i]);
307*61046927SAndroid Build Coastguard Worker 
308*61046927SAndroid Build Coastguard Worker       printf("buf[%d]:\n", i);
309*61046927SAndroid Build Coastguard Worker       dump_hex(map, kernel->buf_sizes[i] * 4);
310*61046927SAndroid Build Coastguard Worker       dump_float(map, kernel->buf_sizes[i] * 4);
311*61046927SAndroid Build Coastguard Worker    }
312*61046927SAndroid Build Coastguard Worker 
313*61046927SAndroid Build Coastguard Worker    if (perfcntrstr) {
314*61046927SAndroid Build Coastguard Worker       uint64_t results[num_perfcntrs];
315*61046927SAndroid Build Coastguard Worker       backend->read_perfcntrs(backend, results);
316*61046927SAndroid Build Coastguard Worker 
317*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < num_perfcntrs; i++) {
318*61046927SAndroid Build Coastguard Worker          printf("%s:\t%'" PRIu64 "\n", perfcntrs[i].name, results[i]);
319*61046927SAndroid Build Coastguard Worker       }
320*61046927SAndroid Build Coastguard Worker    }
321*61046927SAndroid Build Coastguard Worker 
322*61046927SAndroid Build Coastguard Worker    return 0;
323*61046927SAndroid Build Coastguard Worker }
324