xref: /aosp_15_r20/external/mesa3d/src/freedreno/decode/cffdump.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2012 Rob Clark <[email protected]>
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #include <assert.h>
7*61046927SAndroid Build Coastguard Worker #include <ctype.h>
8*61046927SAndroid Build Coastguard Worker #include <err.h>
9*61046927SAndroid Build Coastguard Worker #include <errno.h>
10*61046927SAndroid Build Coastguard Worker #include <fcntl.h>
11*61046927SAndroid Build Coastguard Worker #include <getopt.h>
12*61046927SAndroid Build Coastguard Worker #include <signal.h>
13*61046927SAndroid Build Coastguard Worker #include <stdarg.h>
14*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
15*61046927SAndroid Build Coastguard Worker #include <stdint.h>
16*61046927SAndroid Build Coastguard Worker #include <stdio.h>
17*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
18*61046927SAndroid Build Coastguard Worker #include <string.h>
19*61046927SAndroid Build Coastguard Worker #include <unistd.h>
20*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
21*61046927SAndroid Build Coastguard Worker #include <sys/stat.h>
22*61046927SAndroid Build Coastguard Worker #include <sys/types.h>
23*61046927SAndroid Build Coastguard Worker #include <sys/wait.h>
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker #include "buffers.h"
26*61046927SAndroid Build Coastguard Worker #include "cffdec.h"
27*61046927SAndroid Build Coastguard Worker #include "disasm.h"
28*61046927SAndroid Build Coastguard Worker #include "io.h"
29*61046927SAndroid Build Coastguard Worker #include "pager.h"
30*61046927SAndroid Build Coastguard Worker #include "redump.h"
31*61046927SAndroid Build Coastguard Worker #include "rnnutil.h"
32*61046927SAndroid Build Coastguard Worker #include "script.h"
33*61046927SAndroid Build Coastguard Worker #include "rdutil.h"
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker static struct cffdec_options options;
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker static bool needs_wfi = false;
38*61046927SAndroid Build Coastguard Worker static bool is_blob = false;
39*61046927SAndroid Build Coastguard Worker static int show_comp = false;
40*61046927SAndroid Build Coastguard Worker static int interactive;
41*61046927SAndroid Build Coastguard Worker static int vertices;
42*61046927SAndroid Build Coastguard Worker static const char *exename;
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker static int handle_file(const char *filename, int start, int end, int draw);
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker static void
print_usage(const char * name)47*61046927SAndroid Build Coastguard Worker print_usage(const char *name)
48*61046927SAndroid Build Coastguard Worker {
49*61046927SAndroid Build Coastguard Worker    /* clang-format off */
50*61046927SAndroid Build Coastguard Worker    fprintf(stderr, "Usage:\n\n"
51*61046927SAndroid Build Coastguard Worker            "\t%s [OPTIONS]... FILE...\n\n"
52*61046927SAndroid Build Coastguard Worker            "Options:\n"
53*61046927SAndroid Build Coastguard Worker            "\t-v, --verbose    - more verbose disassembly\n"
54*61046927SAndroid Build Coastguard Worker            "\t--dump-shaders   - dump each shader to a raw file\n"
55*61046927SAndroid Build Coastguard Worker            "\t--no-color       - disable colorized output (default for non-console\n"
56*61046927SAndroid Build Coastguard Worker            "\t                   output)\n"
57*61046927SAndroid Build Coastguard Worker            "\t--color          - enable colorized output (default for tty output)\n"
58*61046927SAndroid Build Coastguard Worker            "\t--no-pager       - disable pager (default for non-console output)\n"
59*61046927SAndroid Build Coastguard Worker            "\t--pager          - enable pager (default for tty output)\n"
60*61046927SAndroid Build Coastguard Worker            "\t-s, --summary    - don't show individual register writes, but just\n"
61*61046927SAndroid Build Coastguard Worker            "\t                   register values on draws\n"
62*61046927SAndroid Build Coastguard Worker            "\t-a, --allregs    - show all registers (including ones not written\n"
63*61046927SAndroid Build Coastguard Worker            "\t                   since previous draw) on each draw\n"
64*61046927SAndroid Build Coastguard Worker            "\t-S, --start=N    - start decoding from frame N\n"
65*61046927SAndroid Build Coastguard Worker            "\t-E, --end=N      - stop decoding after frame N\n"
66*61046927SAndroid Build Coastguard Worker            "\t-F, --frame=N    - decode only frame N\n"
67*61046927SAndroid Build Coastguard Worker            "\t-D, --draw=N     - decode only draw N\n"
68*61046927SAndroid Build Coastguard Worker            "\t-e, --exe=NAME   - only decode cmdstream from named process\n"
69*61046927SAndroid Build Coastguard Worker            "\t--textures       - dump texture contents (if possible)\n"
70*61046927SAndroid Build Coastguard Worker            "\t-L, --script=LUA - run specified lua script to analyze state\n"
71*61046927SAndroid Build Coastguard Worker            "\t-q, --query=REG  - query mode, dump only specified query registers on\n"
72*61046927SAndroid Build Coastguard Worker            "\t                   each draw; multiple --query/-q args can be given to\n"
73*61046927SAndroid Build Coastguard Worker            "\t                   dump multiple registers; register can be specified\n"
74*61046927SAndroid Build Coastguard Worker            "\t                   either by name or numeric offset\n"
75*61046927SAndroid Build Coastguard Worker            "\t--query-all      - in query mode, show all queried regs on each draw\n"
76*61046927SAndroid Build Coastguard Worker            "\t                   (default query mode)\n"
77*61046927SAndroid Build Coastguard Worker            "\t--query-written  - in query mode, show queried regs on draws if any of\n"
78*61046927SAndroid Build Coastguard Worker            "\t                   them have been written since previous draw\n"
79*61046927SAndroid Build Coastguard Worker            "\t--query-delta    - in query mode, show queried regs on draws if any of\n"
80*61046927SAndroid Build Coastguard Worker            "\t                   them have changed since previous draw\n"
81*61046927SAndroid Build Coastguard Worker            "\t--query-compare  - dump registers for BINNING vs GMEM/BYPASS per draw;\n"
82*61046927SAndroid Build Coastguard Worker            "\t                   only applicable for regs set via SDS group (a6xx+),\n"
83*61046927SAndroid Build Coastguard Worker            "\t                   implies --once, can be combined with --query-all,\n"
84*61046927SAndroid Build Coastguard Worker            "\t                   --query-written, or --query-delta\n"
85*61046927SAndroid Build Coastguard Worker            "\t--once           - decode cmdstream only once (per draw mode); if same\n"
86*61046927SAndroid Build Coastguard Worker            "\t                   cmdstream is executed for each tile, this will decode\n"
87*61046927SAndroid Build Coastguard Worker            "\t                   it only for the first tile and skip the remainder,\n"
88*61046927SAndroid Build Coastguard Worker            "\t                   which can be useful when looking at state that does\n"
89*61046927SAndroid Build Coastguard Worker            "\t                   not change per tile\n"
90*61046927SAndroid Build Coastguard Worker            "\t--not-once       - decode cmdstream for each IB (default)\n"
91*61046927SAndroid Build Coastguard Worker            "\t--unit-test      - make reproducible output for unit testing\n"
92*61046927SAndroid Build Coastguard Worker            "\t-h, --help       - show this message\n"
93*61046927SAndroid Build Coastguard Worker            , name);
94*61046927SAndroid Build Coastguard Worker    /* clang-format on */
95*61046927SAndroid Build Coastguard Worker    exit(2);
96*61046927SAndroid Build Coastguard Worker }
97*61046927SAndroid Build Coastguard Worker 
98*61046927SAndroid Build Coastguard Worker /* clang-format off */
99*61046927SAndroid Build Coastguard Worker static const struct option opts[] = {
100*61046927SAndroid Build Coastguard Worker       /* Long opts that simply set a flag (no corresponding short alias: */
101*61046927SAndroid Build Coastguard Worker       { "dump-shaders",    no_argument, &options.dump_shaders,  1 },
102*61046927SAndroid Build Coastguard Worker       { "no-color",        no_argument, &options.color,         0 },
103*61046927SAndroid Build Coastguard Worker       { "color",           no_argument, &options.color,         1 },
104*61046927SAndroid Build Coastguard Worker       { "no-pager",        no_argument, &interactive,           0 },
105*61046927SAndroid Build Coastguard Worker       { "pager",           no_argument, &interactive,           1 },
106*61046927SAndroid Build Coastguard Worker       { "textures",        no_argument, &options.dump_textures, 1 },
107*61046927SAndroid Build Coastguard Worker       { "show-compositor", no_argument, &show_comp,             1 },
108*61046927SAndroid Build Coastguard Worker       { "query-all",       no_argument, &options.query_mode,    QUERY_ALL },
109*61046927SAndroid Build Coastguard Worker       { "query-written",   no_argument, &options.query_mode,    QUERY_WRITTEN },
110*61046927SAndroid Build Coastguard Worker       { "query-delta",     no_argument, &options.query_mode,    QUERY_DELTA },
111*61046927SAndroid Build Coastguard Worker       { "query-compare",   no_argument, &options.query_compare, 1 },
112*61046927SAndroid Build Coastguard Worker       { "once",            no_argument, &options.once,          1 },
113*61046927SAndroid Build Coastguard Worker       { "not-once",        no_argument, &options.once,          0 },
114*61046927SAndroid Build Coastguard Worker       { "unit-test",       no_argument, &options.unit_test,     1 },
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker       /* Long opts with short alias: */
117*61046927SAndroid Build Coastguard Worker       { "verbose",   no_argument,       0, 'v' },
118*61046927SAndroid Build Coastguard Worker       { "summary",   no_argument,       0, 's' },
119*61046927SAndroid Build Coastguard Worker       { "allregs",   no_argument,       0, 'a' },
120*61046927SAndroid Build Coastguard Worker       { "start",     required_argument, 0, 'S' },
121*61046927SAndroid Build Coastguard Worker       { "end",       required_argument, 0, 'E' },
122*61046927SAndroid Build Coastguard Worker       { "frame",     required_argument, 0, 'F' },
123*61046927SAndroid Build Coastguard Worker       { "draw",      required_argument, 0, 'D' },
124*61046927SAndroid Build Coastguard Worker       { "exe",       required_argument, 0, 'e' },
125*61046927SAndroid Build Coastguard Worker       { "script",    required_argument, 0, 'L' },
126*61046927SAndroid Build Coastguard Worker       { "query",     required_argument, 0, 'q' },
127*61046927SAndroid Build Coastguard Worker       { "help",      no_argument,       0, 'h' },
128*61046927SAndroid Build Coastguard Worker };
129*61046927SAndroid Build Coastguard Worker /* clang-format on */
130*61046927SAndroid Build Coastguard Worker 
131*61046927SAndroid Build Coastguard Worker int
main(int argc,char ** argv)132*61046927SAndroid Build Coastguard Worker main(int argc, char **argv)
133*61046927SAndroid Build Coastguard Worker {
134*61046927SAndroid Build Coastguard Worker    enum debug_t debug = PRINT_RAW | PRINT_STATS;
135*61046927SAndroid Build Coastguard Worker    int ret = -1;
136*61046927SAndroid Build Coastguard Worker    int start = 0, end = 0x7ffffff, draw = -1;
137*61046927SAndroid Build Coastguard Worker    int c;
138*61046927SAndroid Build Coastguard Worker 
139*61046927SAndroid Build Coastguard Worker    interactive = isatty(STDOUT_FILENO);
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker    options.color = interactive;
142*61046927SAndroid Build Coastguard Worker 
143*61046927SAndroid Build Coastguard Worker    while ((c = getopt_long(argc, argv, "vsaS:E:F:D:e:L:q:h", opts, NULL)) !=
144*61046927SAndroid Build Coastguard Worker           -1) {
145*61046927SAndroid Build Coastguard Worker       switch (c) {
146*61046927SAndroid Build Coastguard Worker       case 0:
147*61046927SAndroid Build Coastguard Worker          /* option that set a flag, nothing to do */
148*61046927SAndroid Build Coastguard Worker          break;
149*61046927SAndroid Build Coastguard Worker       case 'v':
150*61046927SAndroid Build Coastguard Worker          debug |= (PRINT_RAW | EXPAND_REPEAT | PRINT_VERBOSE);
151*61046927SAndroid Build Coastguard Worker          break;
152*61046927SAndroid Build Coastguard Worker       case 's':
153*61046927SAndroid Build Coastguard Worker          options.summary = true;
154*61046927SAndroid Build Coastguard Worker          break;
155*61046927SAndroid Build Coastguard Worker       case 'a':
156*61046927SAndroid Build Coastguard Worker          options.allregs = true;
157*61046927SAndroid Build Coastguard Worker          break;
158*61046927SAndroid Build Coastguard Worker       case 'S':
159*61046927SAndroid Build Coastguard Worker          start = atoi(optarg);
160*61046927SAndroid Build Coastguard Worker          break;
161*61046927SAndroid Build Coastguard Worker       case 'E':
162*61046927SAndroid Build Coastguard Worker          end = atoi(optarg);
163*61046927SAndroid Build Coastguard Worker          break;
164*61046927SAndroid Build Coastguard Worker       case 'F':
165*61046927SAndroid Build Coastguard Worker          start = end = atoi(optarg);
166*61046927SAndroid Build Coastguard Worker          break;
167*61046927SAndroid Build Coastguard Worker       case 'D':
168*61046927SAndroid Build Coastguard Worker          draw = atoi(optarg);
169*61046927SAndroid Build Coastguard Worker          break;
170*61046927SAndroid Build Coastguard Worker       case 'e':
171*61046927SAndroid Build Coastguard Worker          exename = optarg;
172*61046927SAndroid Build Coastguard Worker          break;
173*61046927SAndroid Build Coastguard Worker       case 'L':
174*61046927SAndroid Build Coastguard Worker          options.script = optarg;
175*61046927SAndroid Build Coastguard Worker          if (script_load(options.script)) {
176*61046927SAndroid Build Coastguard Worker             errx(-1, "error loading %s\n", options.script);
177*61046927SAndroid Build Coastguard Worker          }
178*61046927SAndroid Build Coastguard Worker          break;
179*61046927SAndroid Build Coastguard Worker       case 'q':
180*61046927SAndroid Build Coastguard Worker          options.querystrs =
181*61046927SAndroid Build Coastguard Worker             realloc(options.querystrs,
182*61046927SAndroid Build Coastguard Worker                     (options.nquery + 1) * sizeof(*options.querystrs));
183*61046927SAndroid Build Coastguard Worker          options.querystrs[options.nquery] = optarg;
184*61046927SAndroid Build Coastguard Worker          options.nquery++;
185*61046927SAndroid Build Coastguard Worker          interactive = 0;
186*61046927SAndroid Build Coastguard Worker          break;
187*61046927SAndroid Build Coastguard Worker       case 'h':
188*61046927SAndroid Build Coastguard Worker       default:
189*61046927SAndroid Build Coastguard Worker          print_usage(argv[0]);
190*61046927SAndroid Build Coastguard Worker       }
191*61046927SAndroid Build Coastguard Worker    }
192*61046927SAndroid Build Coastguard Worker 
193*61046927SAndroid Build Coastguard Worker    disasm_a2xx_set_debug(debug);
194*61046927SAndroid Build Coastguard Worker    disasm_a3xx_set_debug(debug);
195*61046927SAndroid Build Coastguard Worker 
196*61046927SAndroid Build Coastguard Worker    if (interactive) {
197*61046927SAndroid Build Coastguard Worker       pager_open();
198*61046927SAndroid Build Coastguard Worker    }
199*61046927SAndroid Build Coastguard Worker 
200*61046927SAndroid Build Coastguard Worker    while (optind < argc) {
201*61046927SAndroid Build Coastguard Worker       ret = handle_file(argv[optind], start, end, draw);
202*61046927SAndroid Build Coastguard Worker       if (ret) {
203*61046927SAndroid Build Coastguard Worker          fprintf(stderr, "error reading: %s\n", argv[optind]);
204*61046927SAndroid Build Coastguard Worker          fprintf(stderr, "continuing..\n");
205*61046927SAndroid Build Coastguard Worker       }
206*61046927SAndroid Build Coastguard Worker       optind++;
207*61046927SAndroid Build Coastguard Worker    }
208*61046927SAndroid Build Coastguard Worker 
209*61046927SAndroid Build Coastguard Worker    if (ret)
210*61046927SAndroid Build Coastguard Worker       print_usage(argv[0]);
211*61046927SAndroid Build Coastguard Worker 
212*61046927SAndroid Build Coastguard Worker    if ((options.query_mode || options.query_compare) && !options.nquery) {
213*61046927SAndroid Build Coastguard Worker       fprintf(stderr, "query options only valid in query mode!\n");
214*61046927SAndroid Build Coastguard Worker       print_usage(argv[0]);
215*61046927SAndroid Build Coastguard Worker    }
216*61046927SAndroid Build Coastguard Worker 
217*61046927SAndroid Build Coastguard Worker    script_finish();
218*61046927SAndroid Build Coastguard Worker 
219*61046927SAndroid Build Coastguard Worker    if (interactive) {
220*61046927SAndroid Build Coastguard Worker       pager_close();
221*61046927SAndroid Build Coastguard Worker    }
222*61046927SAndroid Build Coastguard Worker 
223*61046927SAndroid Build Coastguard Worker    return ret;
224*61046927SAndroid Build Coastguard Worker }
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker static int
handle_file(const char * filename,int start,int end,int draw)227*61046927SAndroid Build Coastguard Worker handle_file(const char *filename, int start, int end, int draw)
228*61046927SAndroid Build Coastguard Worker {
229*61046927SAndroid Build Coastguard Worker    struct io *io;
230*61046927SAndroid Build Coastguard Worker    int submit = 0, got_gpu_id = 0;
231*61046927SAndroid Build Coastguard Worker    bool needs_reset = false;
232*61046927SAndroid Build Coastguard Worker    bool skip = false;
233*61046927SAndroid Build Coastguard Worker    struct rd_parsed_section ps = {0};
234*61046927SAndroid Build Coastguard Worker 
235*61046927SAndroid Build Coastguard Worker    options.draw_filter = draw;
236*61046927SAndroid Build Coastguard Worker 
237*61046927SAndroid Build Coastguard Worker    cffdec_init(&options);
238*61046927SAndroid Build Coastguard Worker 
239*61046927SAndroid Build Coastguard Worker    if (!options.unit_test)
240*61046927SAndroid Build Coastguard Worker       printf("Reading %s...\n", filename);
241*61046927SAndroid Build Coastguard Worker 
242*61046927SAndroid Build Coastguard Worker    script_start_cmdstream(filename);
243*61046927SAndroid Build Coastguard Worker 
244*61046927SAndroid Build Coastguard Worker    if (!strcmp(filename, "-"))
245*61046927SAndroid Build Coastguard Worker       io = io_openfd(0);
246*61046927SAndroid Build Coastguard Worker    else
247*61046927SAndroid Build Coastguard Worker       io = io_open(filename);
248*61046927SAndroid Build Coastguard Worker 
249*61046927SAndroid Build Coastguard Worker    if (!io) {
250*61046927SAndroid Build Coastguard Worker       fprintf(stderr, "could not open: %s\n", filename);
251*61046927SAndroid Build Coastguard Worker       return -1;
252*61046927SAndroid Build Coastguard Worker    }
253*61046927SAndroid Build Coastguard Worker 
254*61046927SAndroid Build Coastguard Worker    struct {
255*61046927SAndroid Build Coastguard Worker       unsigned int len;
256*61046927SAndroid Build Coastguard Worker       uint64_t gpuaddr;
257*61046927SAndroid Build Coastguard Worker    } gpuaddr = {0};
258*61046927SAndroid Build Coastguard Worker 
259*61046927SAndroid Build Coastguard Worker    while (parse_rd_section(io, &ps)) {
260*61046927SAndroid Build Coastguard Worker       needs_wfi = false;
261*61046927SAndroid Build Coastguard Worker 
262*61046927SAndroid Build Coastguard Worker       switch (ps.type) {
263*61046927SAndroid Build Coastguard Worker       case RD_TEST:
264*61046927SAndroid Build Coastguard Worker          printl(1, "test: %s\n", (char *)ps.buf);
265*61046927SAndroid Build Coastguard Worker          break;
266*61046927SAndroid Build Coastguard Worker       case RD_CMD:
267*61046927SAndroid Build Coastguard Worker          is_blob = true;
268*61046927SAndroid Build Coastguard Worker          printl(2, "cmd: %s\n", (char *)ps.buf);
269*61046927SAndroid Build Coastguard Worker          skip = false;
270*61046927SAndroid Build Coastguard Worker          if (exename) {
271*61046927SAndroid Build Coastguard Worker             skip |= (strstr(ps.buf, exename) != ps.buf);
272*61046927SAndroid Build Coastguard Worker          } else if (!show_comp) {
273*61046927SAndroid Build Coastguard Worker             skip |= (strstr(ps.buf, "fdperf") == ps.buf);
274*61046927SAndroid Build Coastguard Worker             skip |= (strstr(ps.buf, "chrome") == ps.buf);
275*61046927SAndroid Build Coastguard Worker             skip |= (strstr(ps.buf, "surfaceflinger") == ps.buf);
276*61046927SAndroid Build Coastguard Worker             skip |= ((char *)ps.buf)[0] == 'X';
277*61046927SAndroid Build Coastguard Worker          }
278*61046927SAndroid Build Coastguard Worker          break;
279*61046927SAndroid Build Coastguard Worker       case RD_VERT_SHADER:
280*61046927SAndroid Build Coastguard Worker          printl(2, "vertex shader:\n%s\n", (char *)ps.buf);
281*61046927SAndroid Build Coastguard Worker          break;
282*61046927SAndroid Build Coastguard Worker       case RD_FRAG_SHADER:
283*61046927SAndroid Build Coastguard Worker          printl(2, "fragment shader:\n%s\n", (char *)ps.buf);
284*61046927SAndroid Build Coastguard Worker          break;
285*61046927SAndroid Build Coastguard Worker       case RD_GPUADDR:
286*61046927SAndroid Build Coastguard Worker          if (needs_reset) {
287*61046927SAndroid Build Coastguard Worker             reset_buffers();
288*61046927SAndroid Build Coastguard Worker             needs_reset = false;
289*61046927SAndroid Build Coastguard Worker          }
290*61046927SAndroid Build Coastguard Worker          parse_addr(ps.buf, ps.sz, &gpuaddr.len, &gpuaddr.gpuaddr);
291*61046927SAndroid Build Coastguard Worker          break;
292*61046927SAndroid Build Coastguard Worker       case RD_BUFFER_CONTENTS:
293*61046927SAndroid Build Coastguard Worker          add_buffer(gpuaddr.gpuaddr, gpuaddr.len, ps.buf);
294*61046927SAndroid Build Coastguard Worker          ps.buf = NULL;
295*61046927SAndroid Build Coastguard Worker          break;
296*61046927SAndroid Build Coastguard Worker       case RD_CMDSTREAM_ADDR:
297*61046927SAndroid Build Coastguard Worker          if ((start <= submit) && (submit <= end)) {
298*61046927SAndroid Build Coastguard Worker             unsigned int sizedwords;
299*61046927SAndroid Build Coastguard Worker             uint64_t gpuaddr;
300*61046927SAndroid Build Coastguard Worker             parse_addr(ps.buf, ps.sz, &sizedwords, &gpuaddr);
301*61046927SAndroid Build Coastguard Worker             printl(2, "############################################################\n");
302*61046927SAndroid Build Coastguard Worker             printl(2, "cmdstream[%d]: %d dwords\n", submit, sizedwords);
303*61046927SAndroid Build Coastguard Worker             if (!skip) {
304*61046927SAndroid Build Coastguard Worker                script_start_submit();
305*61046927SAndroid Build Coastguard Worker                dump_commands(hostptr(gpuaddr), sizedwords, 0);
306*61046927SAndroid Build Coastguard Worker                script_end_submit();
307*61046927SAndroid Build Coastguard Worker             }
308*61046927SAndroid Build Coastguard Worker             printl(2, "############################################################\n");
309*61046927SAndroid Build Coastguard Worker             printl(2, "vertices: %d\n", vertices);
310*61046927SAndroid Build Coastguard Worker          }
311*61046927SAndroid Build Coastguard Worker          needs_reset = true;
312*61046927SAndroid Build Coastguard Worker          submit++;
313*61046927SAndroid Build Coastguard Worker          break;
314*61046927SAndroid Build Coastguard Worker       case RD_GPU_ID:
315*61046927SAndroid Build Coastguard Worker          if (!got_gpu_id) {
316*61046927SAndroid Build Coastguard Worker             uint32_t gpu_id = parse_gpu_id(ps.buf);
317*61046927SAndroid Build Coastguard Worker             if (!gpu_id)
318*61046927SAndroid Build Coastguard Worker                break;
319*61046927SAndroid Build Coastguard Worker             options.dev_id.gpu_id = gpu_id;
320*61046927SAndroid Build Coastguard Worker             printl(2, "gpu_id: %d\n", options.dev_id.gpu_id);
321*61046927SAndroid Build Coastguard Worker 
322*61046927SAndroid Build Coastguard Worker             options.info = fd_dev_info_raw(&options.dev_id);
323*61046927SAndroid Build Coastguard Worker             if (!options.info)
324*61046927SAndroid Build Coastguard Worker                break;
325*61046927SAndroid Build Coastguard Worker 
326*61046927SAndroid Build Coastguard Worker             cffdec_init(&options);
327*61046927SAndroid Build Coastguard Worker             got_gpu_id = 1;
328*61046927SAndroid Build Coastguard Worker          }
329*61046927SAndroid Build Coastguard Worker          break;
330*61046927SAndroid Build Coastguard Worker       case RD_CHIP_ID:
331*61046927SAndroid Build Coastguard Worker          if (!got_gpu_id) {
332*61046927SAndroid Build Coastguard Worker             options.dev_id.chip_id = parse_chip_id(ps.buf);
333*61046927SAndroid Build Coastguard Worker             printl(2, "chip_id: 0x%" PRIx64 "\n", options.dev_id.chip_id);
334*61046927SAndroid Build Coastguard Worker 
335*61046927SAndroid Build Coastguard Worker             options.info = fd_dev_info_raw(&options.dev_id);
336*61046927SAndroid Build Coastguard Worker             if (!options.info)
337*61046927SAndroid Build Coastguard Worker                break;
338*61046927SAndroid Build Coastguard Worker 
339*61046927SAndroid Build Coastguard Worker             cffdec_init(&options);
340*61046927SAndroid Build Coastguard Worker             got_gpu_id = 1;
341*61046927SAndroid Build Coastguard Worker          }
342*61046927SAndroid Build Coastguard Worker          break;
343*61046927SAndroid Build Coastguard Worker       default:
344*61046927SAndroid Build Coastguard Worker          break;
345*61046927SAndroid Build Coastguard Worker       }
346*61046927SAndroid Build Coastguard Worker    }
347*61046927SAndroid Build Coastguard Worker 
348*61046927SAndroid Build Coastguard Worker    script_end_cmdstream();
349*61046927SAndroid Build Coastguard Worker 
350*61046927SAndroid Build Coastguard Worker    reset_buffers();
351*61046927SAndroid Build Coastguard Worker 
352*61046927SAndroid Build Coastguard Worker    io_close(io);
353*61046927SAndroid Build Coastguard Worker    fflush(stdout);
354*61046927SAndroid Build Coastguard Worker 
355*61046927SAndroid Build Coastguard Worker    if (ps.ret < 0) {
356*61046927SAndroid Build Coastguard Worker       printf("corrupt file\n");
357*61046927SAndroid Build Coastguard Worker    }
358*61046927SAndroid Build Coastguard Worker    return 0;
359*61046927SAndroid Build Coastguard Worker }
360