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 <fcntl.h>
7*61046927SAndroid Build Coastguard Worker #include <stdint.h>
8*61046927SAndroid Build Coastguard Worker #include <stdio.h>
9*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
10*61046927SAndroid Build Coastguard Worker #include <string.h>
11*61046927SAndroid Build Coastguard Worker #include <unistd.h>
12*61046927SAndroid Build Coastguard Worker #include <sys/stat.h>
13*61046927SAndroid Build Coastguard Worker #include <sys/types.h>
14*61046927SAndroid Build Coastguard Worker
15*61046927SAndroid Build Coastguard Worker #include "disasm.h"
16*61046927SAndroid Build Coastguard Worker #include "io.h"
17*61046927SAndroid Build Coastguard Worker #include "redump.h"
18*61046927SAndroid Build Coastguard Worker
19*61046927SAndroid Build Coastguard Worker #define ASCII_XOR 0xff
20*61046927SAndroid Build Coastguard Worker #include "util.h"
21*61046927SAndroid Build Coastguard Worker
22*61046927SAndroid Build Coastguard Worker struct pgm_header {
23*61046927SAndroid Build Coastguard Worker uint32_t size;
24*61046927SAndroid Build Coastguard Worker uint32_t unknown1;
25*61046927SAndroid Build Coastguard Worker uint32_t unknown2;
26*61046927SAndroid Build Coastguard Worker uint32_t revision;
27*61046927SAndroid Build Coastguard Worker uint32_t unknown4;
28*61046927SAndroid Build Coastguard Worker uint32_t unknown5;
29*61046927SAndroid Build Coastguard Worker uint32_t unknown6;
30*61046927SAndroid Build Coastguard Worker uint32_t unknown7;
31*61046927SAndroid Build Coastguard Worker uint32_t unknown8;
32*61046927SAndroid Build Coastguard Worker uint32_t num_attribs;
33*61046927SAndroid Build Coastguard Worker uint32_t num_uniforms;
34*61046927SAndroid Build Coastguard Worker uint32_t num_samplers;
35*61046927SAndroid Build Coastguard Worker uint32_t num_varyings;
36*61046927SAndroid Build Coastguard Worker uint32_t num_uniformblocks;
37*61046927SAndroid Build Coastguard Worker };
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker struct vs_header {
40*61046927SAndroid Build Coastguard Worker uint32_t unknown1; /* seems to be # of sections up to and including shader */
41*61046927SAndroid Build Coastguard Worker uint32_t unknown2; /* seems to be low byte or so of SQ_PROGRAM_CNTL */
42*61046927SAndroid Build Coastguard Worker uint32_t unknown3;
43*61046927SAndroid Build Coastguard Worker uint32_t unknown4;
44*61046927SAndroid Build Coastguard Worker uint32_t unknown5;
45*61046927SAndroid Build Coastguard Worker uint32_t unknown6;
46*61046927SAndroid Build Coastguard Worker uint32_t unknown7;
47*61046927SAndroid Build Coastguard Worker uint32_t unknown8;
48*61046927SAndroid Build Coastguard Worker uint32_t unknown9; /* seems to be # of sections following shader */
49*61046927SAndroid Build Coastguard Worker };
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker struct fs_header {
52*61046927SAndroid Build Coastguard Worker uint32_t unknown1;
53*61046927SAndroid Build Coastguard Worker };
54*61046927SAndroid Build Coastguard Worker /*
55*61046927SAndroid Build Coastguard Worker // Covers a lot of type_info
56*61046927SAndroid Build Coastguard Worker // varying, attribute, uniform, sampler
57*61046927SAndroid Build Coastguard Worker type_info & 0xFF
58*61046927SAndroid Build Coastguard Worker if ((type_info >> 8) == 0x8b) // vector
59*61046927SAndroid Build Coastguard Worker 0x50 = vec2
60*61046927SAndroid Build Coastguard Worker 0x51 = vec3
61*61046927SAndroid Build Coastguard Worker 0x52 = vec4
62*61046927SAndroid Build Coastguard Worker 0x53 = ivec2
63*61046927SAndroid Build Coastguard Worker 0x54 = ivec3
64*61046927SAndroid Build Coastguard Worker 0x55 = ivec4
65*61046927SAndroid Build Coastguard Worker 0x56 = bool // Why is this in vector?
66*61046927SAndroid Build Coastguard Worker 0x57 = bvec2
67*61046927SAndroid Build Coastguard Worker 0x58 = bvec3
68*61046927SAndroid Build Coastguard Worker 0x59 = bvec4
69*61046927SAndroid Build Coastguard Worker 0x5a = mat2
70*61046927SAndroid Build Coastguard Worker 0x5b = mat3
71*61046927SAndroid Build Coastguard Worker 0x5c = mat4
72*61046927SAndroid Build Coastguard Worker 0x5a = mat2x2 // Same as mat2
73*61046927SAndroid Build Coastguard Worker 0x65 = mat2x3
74*61046927SAndroid Build Coastguard Worker 0x66 = mat2x4
75*61046927SAndroid Build Coastguard Worker 0x67 = mat3x2
76*61046927SAndroid Build Coastguard Worker 0x5b = mat3x3 // Same as mat3
77*61046927SAndroid Build Coastguard Worker 0x68 = mat3x4
78*61046927SAndroid Build Coastguard Worker 0x69 = mat4x2
79*61046927SAndroid Build Coastguard Worker 0x6a = mat4x3
80*61046927SAndroid Build Coastguard Worker 0x5c = mat4x4 // same as mat4
81*61046927SAndroid Build Coastguard Worker 0x5e = sampler2D
82*61046927SAndroid Build Coastguard Worker 0x5f = sampler3D
83*61046927SAndroid Build Coastguard Worker 0x60 = samplerCube // XXX: Doesn't work
84*61046927SAndroid Build Coastguard Worker 0x62 = sampler2DShadow
85*61046927SAndroid Build Coastguard Worker 0xc6 = uvec2
86*61046927SAndroid Build Coastguard Worker 0xc7 = uvec3
87*61046927SAndroid Build Coastguard Worker 0xc8 = uvec4
88*61046927SAndroid Build Coastguard Worker else if ((type_info >> 8) == 0x8d) // GLES3 samplers
89*61046927SAndroid Build Coastguard Worker 0xC1 = sampler2DArray
90*61046927SAndroid Build Coastguard Worker 0xC4 = sampler2DArrayShadow
91*61046927SAndroid Build Coastguard Worker 0xC5 = samplerCubeShadow
92*61046927SAndroid Build Coastguard Worker 0xCA = isampler2D
93*61046927SAndroid Build Coastguard Worker 0xCB = isampler3D
94*61046927SAndroid Build Coastguard Worker 0xCC = isamplerCube
95*61046927SAndroid Build Coastguard Worker 0xD2 = usampler2D
96*61046927SAndroid Build Coastguard Worker 0xD3 = usampler3D
97*61046927SAndroid Build Coastguard Worker 0xD4 = usamplerCube
98*61046927SAndroid Build Coastguard Worker 0xD7 = isampler2DArray
99*61046927SAndroid Build Coastguard Worker 0xD7 = usampler2DArray // Is the same as isampler2DArray?
100*61046927SAndroid Build Coastguard Worker else // 0x14 = single
101*61046927SAndroid Build Coastguard Worker 0x04 = int
102*61046927SAndroid Build Coastguard Worker 0x05 = uint
103*61046927SAndroid Build Coastguard Worker 0x06 = float
104*61046927SAndroid Build Coastguard Worker */
105*61046927SAndroid Build Coastguard Worker struct attribute {
106*61046927SAndroid Build Coastguard Worker uint32_t type_info;
107*61046927SAndroid Build Coastguard Worker uint32_t reg; /* seems to be the register the fetch instruction loads to */
108*61046927SAndroid Build Coastguard Worker uint32_t const_idx; /* the CONST() indx value for sampler */
109*61046927SAndroid Build Coastguard Worker uint32_t unknown2;
110*61046927SAndroid Build Coastguard Worker uint32_t unknown3;
111*61046927SAndroid Build Coastguard Worker uint32_t unknown4;
112*61046927SAndroid Build Coastguard Worker uint32_t unknown5;
113*61046927SAndroid Build Coastguard Worker char name[];
114*61046927SAndroid Build Coastguard Worker };
115*61046927SAndroid Build Coastguard Worker
116*61046927SAndroid Build Coastguard Worker struct uniform {
117*61046927SAndroid Build Coastguard Worker uint32_t type_info;
118*61046927SAndroid Build Coastguard Worker uint32_t unknown2;
119*61046927SAndroid Build Coastguard Worker uint32_t unknown3;
120*61046927SAndroid Build Coastguard Worker uint32_t unknown4;
121*61046927SAndroid Build Coastguard Worker uint32_t const_base; /* const base register (for uniforms that take more than
122*61046927SAndroid Build Coastguard Worker one const reg, ie. matrices) */
123*61046927SAndroid Build Coastguard Worker uint32_t unknown6;
124*61046927SAndroid Build Coastguard Worker uint32_t const_reg; /* the const register holding the value */
125*61046927SAndroid Build Coastguard Worker uint32_t unknown7;
126*61046927SAndroid Build Coastguard Worker uint32_t unknown8;
127*61046927SAndroid Build Coastguard Worker uint32_t unknown9;
128*61046927SAndroid Build Coastguard Worker union {
129*61046927SAndroid Build Coastguard Worker struct {
130*61046927SAndroid Build Coastguard Worker char name[1];
131*61046927SAndroid Build Coastguard Worker } v1;
132*61046927SAndroid Build Coastguard Worker struct {
133*61046927SAndroid Build Coastguard Worker uint32_t unknown10;
134*61046927SAndroid Build Coastguard Worker uint32_t unknown11;
135*61046927SAndroid Build Coastguard Worker uint32_t unknown12;
136*61046927SAndroid Build Coastguard Worker char name[];
137*61046927SAndroid Build Coastguard Worker } v2;
138*61046927SAndroid Build Coastguard Worker };
139*61046927SAndroid Build Coastguard Worker };
140*61046927SAndroid Build Coastguard Worker
141*61046927SAndroid Build Coastguard Worker struct uniformblockmember {
142*61046927SAndroid Build Coastguard Worker uint32_t type_info;
143*61046927SAndroid Build Coastguard Worker uint32_t is_array;
144*61046927SAndroid Build Coastguard Worker uint32_t array_size; /* elements in the array */
145*61046927SAndroid Build Coastguard Worker uint32_t unknown2; /* Same as array_size */
146*61046927SAndroid Build Coastguard Worker uint32_t
147*61046927SAndroid Build Coastguard Worker unknown3; /* Seems to be a offset within UBO in vertex (by components) */
148*61046927SAndroid Build Coastguard Worker uint32_t unknown4;
149*61046927SAndroid Build Coastguard Worker uint32_t
150*61046927SAndroid Build Coastguard Worker unknown5; /* Seems to be a offset within UBO in fragment (by vec4) */
151*61046927SAndroid Build Coastguard Worker uint32_t unknown6;
152*61046927SAndroid Build Coastguard Worker uint32_t unknown7;
153*61046927SAndroid Build Coastguard Worker uint32_t unknown8;
154*61046927SAndroid Build Coastguard Worker uint32_t unknown9; /* UBO block index? */
155*61046927SAndroid Build Coastguard Worker uint32_t unknown10;
156*61046927SAndroid Build Coastguard Worker uint32_t unknown11;
157*61046927SAndroid Build Coastguard Worker uint32_t unknown12;
158*61046927SAndroid Build Coastguard Worker char name[];
159*61046927SAndroid Build Coastguard Worker };
160*61046927SAndroid Build Coastguard Worker
161*61046927SAndroid Build Coastguard Worker struct uniformblock {
162*61046927SAndroid Build Coastguard Worker uint32_t type_info;
163*61046927SAndroid Build Coastguard Worker uint32_t unknown1;
164*61046927SAndroid Build Coastguard Worker uint32_t unknown2;
165*61046927SAndroid Build Coastguard Worker uint32_t unknown3;
166*61046927SAndroid Build Coastguard Worker uint32_t unknown4;
167*61046927SAndroid Build Coastguard Worker uint32_t num_members;
168*61046927SAndroid Build Coastguard Worker uint32_t num_members2;
169*61046927SAndroid Build Coastguard Worker uint32_t unknown5;
170*61046927SAndroid Build Coastguard Worker uint32_t unknown6;
171*61046927SAndroid Build Coastguard Worker uint32_t unknown7;
172*61046927SAndroid Build Coastguard Worker char name[];
173*61046927SAndroid Build Coastguard Worker };
174*61046927SAndroid Build Coastguard Worker
175*61046927SAndroid Build Coastguard Worker struct sampler {
176*61046927SAndroid Build Coastguard Worker uint32_t type_info;
177*61046927SAndroid Build Coastguard Worker uint32_t is_array;
178*61046927SAndroid Build Coastguard Worker uint32_t array_size; /* elements in the array */
179*61046927SAndroid Build Coastguard Worker uint32_t unknown4; /* same as array_size */
180*61046927SAndroid Build Coastguard Worker uint32_t unknown5;
181*61046927SAndroid Build Coastguard Worker uint32_t unknown6;
182*61046927SAndroid Build Coastguard Worker uint32_t const_idx; /* the CONST() indx value for the sampler */
183*61046927SAndroid Build Coastguard Worker uint32_t unknown7;
184*61046927SAndroid Build Coastguard Worker char name[];
185*61046927SAndroid Build Coastguard Worker };
186*61046927SAndroid Build Coastguard Worker
187*61046927SAndroid Build Coastguard Worker struct varying {
188*61046927SAndroid Build Coastguard Worker uint32_t type_info;
189*61046927SAndroid Build Coastguard Worker uint32_t unknown2;
190*61046927SAndroid Build Coastguard Worker uint32_t unknown3;
191*61046927SAndroid Build Coastguard Worker uint32_t reg; /* the register holding the value (on entry to the shader) */
192*61046927SAndroid Build Coastguard Worker char name[];
193*61046927SAndroid Build Coastguard Worker };
194*61046927SAndroid Build Coastguard Worker
195*61046927SAndroid Build Coastguard Worker struct output {
196*61046927SAndroid Build Coastguard Worker uint32_t type_info;
197*61046927SAndroid Build Coastguard Worker uint32_t unknown2;
198*61046927SAndroid Build Coastguard Worker uint32_t unknown3;
199*61046927SAndroid Build Coastguard Worker uint32_t unknown4;
200*61046927SAndroid Build Coastguard Worker uint32_t unknown5;
201*61046927SAndroid Build Coastguard Worker uint32_t unknown6;
202*61046927SAndroid Build Coastguard Worker uint32_t unknown7;
203*61046927SAndroid Build Coastguard Worker uint32_t unknown8;
204*61046927SAndroid Build Coastguard Worker char name[];
205*61046927SAndroid Build Coastguard Worker };
206*61046927SAndroid Build Coastguard Worker
207*61046927SAndroid Build Coastguard Worker struct constant {
208*61046927SAndroid Build Coastguard Worker uint32_t unknown1;
209*61046927SAndroid Build Coastguard Worker uint32_t unknown2;
210*61046927SAndroid Build Coastguard Worker uint32_t unknown3;
211*61046927SAndroid Build Coastguard Worker uint32_t const_idx;
212*61046927SAndroid Build Coastguard Worker float val[];
213*61046927SAndroid Build Coastguard Worker };
214*61046927SAndroid Build Coastguard Worker
215*61046927SAndroid Build Coastguard Worker struct state {
216*61046927SAndroid Build Coastguard Worker char *buf;
217*61046927SAndroid Build Coastguard Worker int sz;
218*61046927SAndroid Build Coastguard Worker struct pgm_header *hdr;
219*61046927SAndroid Build Coastguard Worker struct attribute *attribs[32]; /* don't really know the upper limit.. */
220*61046927SAndroid Build Coastguard Worker struct uniform *uniforms[32];
221*61046927SAndroid Build Coastguard Worker struct sampler *samplers[32];
222*61046927SAndroid Build Coastguard Worker struct varying *varyings[32];
223*61046927SAndroid Build Coastguard Worker struct {
224*61046927SAndroid Build Coastguard Worker struct uniformblock *header;
225*61046927SAndroid Build Coastguard Worker struct uniformblockmember **members; /* GL ES 3.0 spec mandates minimum
226*61046927SAndroid Build Coastguard Worker 16K support. a3xx supports 65K */
227*61046927SAndroid Build Coastguard Worker } uniformblocks[24]; /* Maximum a330 supports */
228*61046927SAndroid Build Coastguard Worker struct output *outputs[0]; /* I guess only one?? */
229*61046927SAndroid Build Coastguard Worker };
230*61046927SAndroid Build Coastguard Worker
231*61046927SAndroid Build Coastguard Worker static const char *infile;
232*61046927SAndroid Build Coastguard Worker static int full_dump = 1;
233*61046927SAndroid Build Coastguard Worker static int dump_shaders = 0;
234*61046927SAndroid Build Coastguard Worker static int gpu_id;
235*61046927SAndroid Build Coastguard Worker
236*61046927SAndroid Build Coastguard Worker static char *
find_sect_end(char * buf,int sz)237*61046927SAndroid Build Coastguard Worker find_sect_end(char *buf, int sz)
238*61046927SAndroid Build Coastguard Worker {
239*61046927SAndroid Build Coastguard Worker uint8_t *ptr = (uint8_t *)buf;
240*61046927SAndroid Build Coastguard Worker uint8_t *end = ptr + sz - 3;
241*61046927SAndroid Build Coastguard Worker
242*61046927SAndroid Build Coastguard Worker while (ptr < end) {
243*61046927SAndroid Build Coastguard Worker uint32_t d = 0;
244*61046927SAndroid Build Coastguard Worker
245*61046927SAndroid Build Coastguard Worker d |= ptr[0] << 0;
246*61046927SAndroid Build Coastguard Worker d |= ptr[1] << 8;
247*61046927SAndroid Build Coastguard Worker d |= ptr[2] << 16;
248*61046927SAndroid Build Coastguard Worker d |= ptr[3] << 24;
249*61046927SAndroid Build Coastguard Worker
250*61046927SAndroid Build Coastguard Worker /* someone at QC likes baseball */
251*61046927SAndroid Build Coastguard Worker if (d == 0xba5eba11)
252*61046927SAndroid Build Coastguard Worker return (char *)ptr;
253*61046927SAndroid Build Coastguard Worker
254*61046927SAndroid Build Coastguard Worker ptr++;
255*61046927SAndroid Build Coastguard Worker }
256*61046927SAndroid Build Coastguard Worker return NULL;
257*61046927SAndroid Build Coastguard Worker }
258*61046927SAndroid Build Coastguard Worker
259*61046927SAndroid Build Coastguard Worker static void *
next_sect(struct state * state,int * sect_size)260*61046927SAndroid Build Coastguard Worker next_sect(struct state *state, int *sect_size)
261*61046927SAndroid Build Coastguard Worker {
262*61046927SAndroid Build Coastguard Worker char *end = find_sect_end(state->buf, state->sz);
263*61046927SAndroid Build Coastguard Worker void *sect;
264*61046927SAndroid Build Coastguard Worker
265*61046927SAndroid Build Coastguard Worker if (!end)
266*61046927SAndroid Build Coastguard Worker return NULL;
267*61046927SAndroid Build Coastguard Worker
268*61046927SAndroid Build Coastguard Worker *sect_size = end - state->buf;
269*61046927SAndroid Build Coastguard Worker
270*61046927SAndroid Build Coastguard Worker /* copy the section to keep things nicely 32b aligned: */
271*61046927SAndroid Build Coastguard Worker sect = malloc(ALIGN(*sect_size, 4));
272*61046927SAndroid Build Coastguard Worker memcpy(sect, state->buf, *sect_size);
273*61046927SAndroid Build Coastguard Worker
274*61046927SAndroid Build Coastguard Worker state->sz -= *sect_size + 4;
275*61046927SAndroid Build Coastguard Worker state->buf = end + 4;
276*61046927SAndroid Build Coastguard Worker
277*61046927SAndroid Build Coastguard Worker return sect;
278*61046927SAndroid Build Coastguard Worker }
279*61046927SAndroid Build Coastguard Worker
280*61046927SAndroid Build Coastguard Worker static int
valid_type(uint32_t type_info)281*61046927SAndroid Build Coastguard Worker valid_type(uint32_t type_info)
282*61046927SAndroid Build Coastguard Worker {
283*61046927SAndroid Build Coastguard Worker switch ((type_info >> 8) & 0xff) {
284*61046927SAndroid Build Coastguard Worker case 0x8b: /* vector */
285*61046927SAndroid Build Coastguard Worker case 0x8d: /* GLES3 samplers */
286*61046927SAndroid Build Coastguard Worker case 0x14: /* float */
287*61046927SAndroid Build Coastguard Worker return 1;
288*61046927SAndroid Build Coastguard Worker default:
289*61046927SAndroid Build Coastguard Worker return 0;
290*61046927SAndroid Build Coastguard Worker }
291*61046927SAndroid Build Coastguard Worker }
292*61046927SAndroid Build Coastguard Worker
293*61046927SAndroid Build Coastguard Worker #if 0
294*61046927SAndroid Build Coastguard Worker static int valid_uniformblock(uint32_t type_info)
295*61046927SAndroid Build Coastguard Worker {
296*61046927SAndroid Build Coastguard Worker if (type_info == 0x128)
297*61046927SAndroid Build Coastguard Worker return 1;
298*61046927SAndroid Build Coastguard Worker return 0;
299*61046927SAndroid Build Coastguard Worker }
300*61046927SAndroid Build Coastguard Worker #endif
301*61046927SAndroid Build Coastguard Worker
302*61046927SAndroid Build Coastguard Worker static void
dump_attribute(struct attribute * attrib)303*61046927SAndroid Build Coastguard Worker dump_attribute(struct attribute *attrib)
304*61046927SAndroid Build Coastguard Worker {
305*61046927SAndroid Build Coastguard Worker printf("\tR%d, CONST(%d): %s\n", attrib->reg, attrib->const_idx,
306*61046927SAndroid Build Coastguard Worker attrib->name);
307*61046927SAndroid Build Coastguard Worker }
308*61046927SAndroid Build Coastguard Worker
309*61046927SAndroid Build Coastguard Worker static inline int
is_uniform_v2(struct uniform * uniform)310*61046927SAndroid Build Coastguard Worker is_uniform_v2(struct uniform *uniform)
311*61046927SAndroid Build Coastguard Worker {
312*61046927SAndroid Build Coastguard Worker /* TODO maybe this should be based on revision #? */
313*61046927SAndroid Build Coastguard Worker if (uniform->v2.unknown10 == 0)
314*61046927SAndroid Build Coastguard Worker return 1;
315*61046927SAndroid Build Coastguard Worker return 0;
316*61046927SAndroid Build Coastguard Worker }
317*61046927SAndroid Build Coastguard Worker
318*61046927SAndroid Build Coastguard Worker static void
dump_uniform(struct uniform * uniform)319*61046927SAndroid Build Coastguard Worker dump_uniform(struct uniform *uniform)
320*61046927SAndroid Build Coastguard Worker {
321*61046927SAndroid Build Coastguard Worker char *name = is_uniform_v2(uniform) ? uniform->v2.name : uniform->v1.name;
322*61046927SAndroid Build Coastguard Worker if (uniform->const_reg == -1) {
323*61046927SAndroid Build Coastguard Worker printf("\tC%d+: %s\n", uniform->const_base, name);
324*61046927SAndroid Build Coastguard Worker } else {
325*61046927SAndroid Build Coastguard Worker printf("\tC%d: %s\n", uniform->const_reg, name);
326*61046927SAndroid Build Coastguard Worker }
327*61046927SAndroid Build Coastguard Worker }
328*61046927SAndroid Build Coastguard Worker
329*61046927SAndroid Build Coastguard Worker static void
dump_sampler(struct sampler * sampler)330*61046927SAndroid Build Coastguard Worker dump_sampler(struct sampler *sampler)
331*61046927SAndroid Build Coastguard Worker {
332*61046927SAndroid Build Coastguard Worker printf("\tCONST(%d): %s\n", sampler->const_idx, sampler->name);
333*61046927SAndroid Build Coastguard Worker }
334*61046927SAndroid Build Coastguard Worker
335*61046927SAndroid Build Coastguard Worker static void
dump_varying(struct varying * varying)336*61046927SAndroid Build Coastguard Worker dump_varying(struct varying *varying)
337*61046927SAndroid Build Coastguard Worker {
338*61046927SAndroid Build Coastguard Worker printf("\tR%d: %s\n", varying->reg, varying->name);
339*61046927SAndroid Build Coastguard Worker }
340*61046927SAndroid Build Coastguard Worker
341*61046927SAndroid Build Coastguard Worker static void
dump_uniformblock(struct uniformblock * uniformblock)342*61046927SAndroid Build Coastguard Worker dump_uniformblock(struct uniformblock *uniformblock)
343*61046927SAndroid Build Coastguard Worker {
344*61046927SAndroid Build Coastguard Worker printf("\tUniform Block: %s(%d)\n", uniformblock->name,
345*61046927SAndroid Build Coastguard Worker uniformblock->num_members);
346*61046927SAndroid Build Coastguard Worker }
347*61046927SAndroid Build Coastguard Worker
348*61046927SAndroid Build Coastguard Worker static void
dump_uniformblockmember(struct uniformblockmember * member)349*61046927SAndroid Build Coastguard Worker dump_uniformblockmember(struct uniformblockmember *member)
350*61046927SAndroid Build Coastguard Worker {
351*61046927SAndroid Build Coastguard Worker printf("Uniform Block member: %s\n", member->name);
352*61046927SAndroid Build Coastguard Worker }
353*61046927SAndroid Build Coastguard Worker
354*61046927SAndroid Build Coastguard Worker static void
dump_output(struct output * output)355*61046927SAndroid Build Coastguard Worker dump_output(struct output *output)
356*61046927SAndroid Build Coastguard Worker {
357*61046927SAndroid Build Coastguard Worker printf("\tR?: %s\n", output->name);
358*61046927SAndroid Build Coastguard Worker }
359*61046927SAndroid Build Coastguard Worker
360*61046927SAndroid Build Coastguard Worker static void
dump_constant(struct constant * constant)361*61046927SAndroid Build Coastguard Worker dump_constant(struct constant *constant)
362*61046927SAndroid Build Coastguard Worker {
363*61046927SAndroid Build Coastguard Worker printf("\tC%d: %f, %f, %f, %f\n", constant->const_idx, constant->val[0],
364*61046927SAndroid Build Coastguard Worker constant->val[1], constant->val[2], constant->val[3]);
365*61046927SAndroid Build Coastguard Worker }
366*61046927SAndroid Build Coastguard Worker
367*61046927SAndroid Build Coastguard Worker /* dump attr/uniform/sampler/varying/const summary: */
368*61046927SAndroid Build Coastguard Worker static void
dump_short_summary(struct state * state,int nconsts,struct constant ** constants)369*61046927SAndroid Build Coastguard Worker dump_short_summary(struct state *state, int nconsts,
370*61046927SAndroid Build Coastguard Worker struct constant **constants)
371*61046927SAndroid Build Coastguard Worker {
372*61046927SAndroid Build Coastguard Worker int i;
373*61046927SAndroid Build Coastguard Worker
374*61046927SAndroid Build Coastguard Worker /* dump attr/uniform/sampler/varying/const summary: */
375*61046927SAndroid Build Coastguard Worker for (i = 0; i < state->hdr->num_varyings; i++) {
376*61046927SAndroid Build Coastguard Worker dump_varying(state->varyings[i]);
377*61046927SAndroid Build Coastguard Worker }
378*61046927SAndroid Build Coastguard Worker for (i = 0; i < state->hdr->num_attribs; i++) {
379*61046927SAndroid Build Coastguard Worker dump_attribute(state->attribs[i]);
380*61046927SAndroid Build Coastguard Worker }
381*61046927SAndroid Build Coastguard Worker for (i = 0; i < state->hdr->num_uniforms; i++) {
382*61046927SAndroid Build Coastguard Worker dump_uniform(state->uniforms[i]);
383*61046927SAndroid Build Coastguard Worker }
384*61046927SAndroid Build Coastguard Worker for (i = 0; i < state->hdr->num_samplers; i++) {
385*61046927SAndroid Build Coastguard Worker dump_sampler(state->samplers[i]);
386*61046927SAndroid Build Coastguard Worker }
387*61046927SAndroid Build Coastguard Worker for (i = 0; i < nconsts - 1; i++) {
388*61046927SAndroid Build Coastguard Worker if (constants[i]->unknown2 == 0) {
389*61046927SAndroid Build Coastguard Worker dump_constant(constants[i]);
390*61046927SAndroid Build Coastguard Worker }
391*61046927SAndroid Build Coastguard Worker }
392*61046927SAndroid Build Coastguard Worker printf("\n");
393*61046927SAndroid Build Coastguard Worker }
394*61046927SAndroid Build Coastguard Worker
395*61046927SAndroid Build Coastguard Worker static void
dump_raw_shader(uint32_t * dwords,uint32_t sizedwords,int n,char * ext)396*61046927SAndroid Build Coastguard Worker dump_raw_shader(uint32_t *dwords, uint32_t sizedwords, int n, char *ext)
397*61046927SAndroid Build Coastguard Worker {
398*61046927SAndroid Build Coastguard Worker static char filename[256];
399*61046927SAndroid Build Coastguard Worker int fd;
400*61046927SAndroid Build Coastguard Worker
401*61046927SAndroid Build Coastguard Worker if (!dump_shaders)
402*61046927SAndroid Build Coastguard Worker return;
403*61046927SAndroid Build Coastguard Worker
404*61046927SAndroid Build Coastguard Worker sprintf(filename, "%.*s-%d.%s", (int)strlen(infile) - 3, infile, n, ext);
405*61046927SAndroid Build Coastguard Worker fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT, 0644);
406*61046927SAndroid Build Coastguard Worker if (fd != -1) {
407*61046927SAndroid Build Coastguard Worker write(fd, dwords, sizedwords * 4);
408*61046927SAndroid Build Coastguard Worker close(fd);
409*61046927SAndroid Build Coastguard Worker }
410*61046927SAndroid Build Coastguard Worker }
411*61046927SAndroid Build Coastguard Worker
412*61046927SAndroid Build Coastguard Worker static void
dump_shaders_a2xx(struct state * state)413*61046927SAndroid Build Coastguard Worker dump_shaders_a2xx(struct state *state)
414*61046927SAndroid Build Coastguard Worker {
415*61046927SAndroid Build Coastguard Worker int i, sect_size;
416*61046927SAndroid Build Coastguard Worker uint8_t *ptr;
417*61046927SAndroid Build Coastguard Worker
418*61046927SAndroid Build Coastguard Worker /* dump vertex shaders: */
419*61046927SAndroid Build Coastguard Worker for (i = 0; i < 3; i++) {
420*61046927SAndroid Build Coastguard Worker struct vs_header *vs_hdr = next_sect(state, §_size);
421*61046927SAndroid Build Coastguard Worker struct constant *constants[32];
422*61046927SAndroid Build Coastguard Worker int j, level = 0;
423*61046927SAndroid Build Coastguard Worker
424*61046927SAndroid Build Coastguard Worker printf("\n");
425*61046927SAndroid Build Coastguard Worker
426*61046927SAndroid Build Coastguard Worker if (full_dump) {
427*61046927SAndroid Build Coastguard Worker printf("#######################################################\n");
428*61046927SAndroid Build Coastguard Worker printf("######## VS%d HEADER: (size %d)\n", i, sect_size);
429*61046927SAndroid Build Coastguard Worker dump_hex((void *)vs_hdr, sect_size);
430*61046927SAndroid Build Coastguard Worker }
431*61046927SAndroid Build Coastguard Worker
432*61046927SAndroid Build Coastguard Worker for (j = 0; j < (int)vs_hdr->unknown1 - 1; j++) {
433*61046927SAndroid Build Coastguard Worker constants[j] = next_sect(state, §_size);
434*61046927SAndroid Build Coastguard Worker if (full_dump) {
435*61046927SAndroid Build Coastguard Worker printf("######## VS%d CONST: (size=%d)\n", i, sect_size);
436*61046927SAndroid Build Coastguard Worker dump_constant(constants[j]);
437*61046927SAndroid Build Coastguard Worker dump_hex((char *)constants[j], sect_size);
438*61046927SAndroid Build Coastguard Worker }
439*61046927SAndroid Build Coastguard Worker }
440*61046927SAndroid Build Coastguard Worker
441*61046927SAndroid Build Coastguard Worker ptr = next_sect(state, §_size);
442*61046927SAndroid Build Coastguard Worker printf("######## VS%d SHADER: (size=%d)\n", i, sect_size);
443*61046927SAndroid Build Coastguard Worker if (full_dump) {
444*61046927SAndroid Build Coastguard Worker dump_hex(ptr, sect_size);
445*61046927SAndroid Build Coastguard Worker level = 1;
446*61046927SAndroid Build Coastguard Worker } else {
447*61046927SAndroid Build Coastguard Worker dump_short_summary(state, vs_hdr->unknown1 - 1, constants);
448*61046927SAndroid Build Coastguard Worker }
449*61046927SAndroid Build Coastguard Worker disasm_a2xx((uint32_t *)(ptr + 32), (sect_size - 32) / 4, level + 1,
450*61046927SAndroid Build Coastguard Worker MESA_SHADER_VERTEX);
451*61046927SAndroid Build Coastguard Worker dump_raw_shader((uint32_t *)(ptr + 32), (sect_size - 32) / 4, i, "vo");
452*61046927SAndroid Build Coastguard Worker free(ptr);
453*61046927SAndroid Build Coastguard Worker
454*61046927SAndroid Build Coastguard Worker for (j = 0; j < vs_hdr->unknown9; j++) {
455*61046927SAndroid Build Coastguard Worker ptr = next_sect(state, §_size);
456*61046927SAndroid Build Coastguard Worker if (full_dump) {
457*61046927SAndroid Build Coastguard Worker printf("######## VS%d CONST?: (size=%d)\n", i, sect_size);
458*61046927SAndroid Build Coastguard Worker dump_hex(ptr, sect_size);
459*61046927SAndroid Build Coastguard Worker }
460*61046927SAndroid Build Coastguard Worker free(ptr);
461*61046927SAndroid Build Coastguard Worker }
462*61046927SAndroid Build Coastguard Worker
463*61046927SAndroid Build Coastguard Worker for (j = 0; j < vs_hdr->unknown1 - 1; j++) {
464*61046927SAndroid Build Coastguard Worker free(constants[j]);
465*61046927SAndroid Build Coastguard Worker }
466*61046927SAndroid Build Coastguard Worker
467*61046927SAndroid Build Coastguard Worker free(vs_hdr);
468*61046927SAndroid Build Coastguard Worker }
469*61046927SAndroid Build Coastguard Worker
470*61046927SAndroid Build Coastguard Worker /* dump fragment shaders: */
471*61046927SAndroid Build Coastguard Worker for (i = 0; i < 1; i++) {
472*61046927SAndroid Build Coastguard Worker struct fs_header *fs_hdr = next_sect(state, §_size);
473*61046927SAndroid Build Coastguard Worker struct constant *constants[32];
474*61046927SAndroid Build Coastguard Worker int j, level = 0;
475*61046927SAndroid Build Coastguard Worker
476*61046927SAndroid Build Coastguard Worker printf("\n");
477*61046927SAndroid Build Coastguard Worker
478*61046927SAndroid Build Coastguard Worker if (full_dump) {
479*61046927SAndroid Build Coastguard Worker printf("#######################################################\n");
480*61046927SAndroid Build Coastguard Worker printf("######## FS%d HEADER: (size %d)\n", i, sect_size);
481*61046927SAndroid Build Coastguard Worker dump_hex((void *)fs_hdr, sect_size);
482*61046927SAndroid Build Coastguard Worker }
483*61046927SAndroid Build Coastguard Worker
484*61046927SAndroid Build Coastguard Worker for (j = 0; j < fs_hdr->unknown1 - 1; j++) {
485*61046927SAndroid Build Coastguard Worker constants[j] = next_sect(state, §_size);
486*61046927SAndroid Build Coastguard Worker if (full_dump) {
487*61046927SAndroid Build Coastguard Worker printf("######## FS%d CONST: (size=%d)\n", i, sect_size);
488*61046927SAndroid Build Coastguard Worker dump_constant(constants[j]);
489*61046927SAndroid Build Coastguard Worker dump_hex((char *)constants[j], sect_size);
490*61046927SAndroid Build Coastguard Worker }
491*61046927SAndroid Build Coastguard Worker }
492*61046927SAndroid Build Coastguard Worker
493*61046927SAndroid Build Coastguard Worker ptr = next_sect(state, §_size);
494*61046927SAndroid Build Coastguard Worker printf("######## FS%d SHADER: (size=%d)\n", i, sect_size);
495*61046927SAndroid Build Coastguard Worker if (full_dump) {
496*61046927SAndroid Build Coastguard Worker dump_hex(ptr, sect_size);
497*61046927SAndroid Build Coastguard Worker level = 1;
498*61046927SAndroid Build Coastguard Worker } else {
499*61046927SAndroid Build Coastguard Worker dump_short_summary(state, fs_hdr->unknown1 - 1, constants);
500*61046927SAndroid Build Coastguard Worker }
501*61046927SAndroid Build Coastguard Worker disasm_a2xx((uint32_t *)(ptr + 32), (sect_size - 32) / 4, level + 1,
502*61046927SAndroid Build Coastguard Worker MESA_SHADER_FRAGMENT);
503*61046927SAndroid Build Coastguard Worker dump_raw_shader((uint32_t *)(ptr + 32), (sect_size - 32) / 4, i, "fo");
504*61046927SAndroid Build Coastguard Worker free(ptr);
505*61046927SAndroid Build Coastguard Worker
506*61046927SAndroid Build Coastguard Worker for (j = 0; j < fs_hdr->unknown1 - 1; j++) {
507*61046927SAndroid Build Coastguard Worker free(constants[j]);
508*61046927SAndroid Build Coastguard Worker }
509*61046927SAndroid Build Coastguard Worker
510*61046927SAndroid Build Coastguard Worker free(fs_hdr);
511*61046927SAndroid Build Coastguard Worker }
512*61046927SAndroid Build Coastguard Worker }
513*61046927SAndroid Build Coastguard Worker
514*61046927SAndroid Build Coastguard Worker static void
dump_shaders_a3xx(struct state * state)515*61046927SAndroid Build Coastguard Worker dump_shaders_a3xx(struct state *state)
516*61046927SAndroid Build Coastguard Worker {
517*61046927SAndroid Build Coastguard Worker int i, j;
518*61046927SAndroid Build Coastguard Worker
519*61046927SAndroid Build Coastguard Worker /* dump vertex shaders: */
520*61046927SAndroid Build Coastguard Worker for (i = 0; i < 2; i++) {
521*61046927SAndroid Build Coastguard Worker int instrs_size, hdr_size, sect_size, nconsts = 0, level = 0, compact = 0;
522*61046927SAndroid Build Coastguard Worker uint8_t *vs_hdr;
523*61046927SAndroid Build Coastguard Worker struct constant *constants[32];
524*61046927SAndroid Build Coastguard Worker uint8_t *instrs = NULL;
525*61046927SAndroid Build Coastguard Worker
526*61046927SAndroid Build Coastguard Worker vs_hdr = next_sect(state, &hdr_size);
527*61046927SAndroid Build Coastguard Worker printf("hdr_size=%d\n", hdr_size);
528*61046927SAndroid Build Coastguard Worker
529*61046927SAndroid Build Coastguard Worker /* seems like there are two cases, either:
530*61046927SAndroid Build Coastguard Worker * 1) 152 byte header,
531*61046927SAndroid Build Coastguard Worker * 2) zero or more 32 byte compiler const sections
532*61046927SAndroid Build Coastguard Worker * 3) followed by shader instructions
533*61046927SAndroid Build Coastguard Worker * or, if there are no compiler consts, this can be
534*61046927SAndroid Build Coastguard Worker * all smashed in one large section
535*61046927SAndroid Build Coastguard Worker */
536*61046927SAndroid Build Coastguard Worker int n;
537*61046927SAndroid Build Coastguard Worker if (state->hdr->revision >= 0xb)
538*61046927SAndroid Build Coastguard Worker n = 160;
539*61046927SAndroid Build Coastguard Worker else if (state->hdr->revision >= 7)
540*61046927SAndroid Build Coastguard Worker n = 156;
541*61046927SAndroid Build Coastguard Worker else
542*61046927SAndroid Build Coastguard Worker n = 152;
543*61046927SAndroid Build Coastguard Worker if (hdr_size > n) {
544*61046927SAndroid Build Coastguard Worker instrs = &vs_hdr[n];
545*61046927SAndroid Build Coastguard Worker instrs_size = hdr_size - n;
546*61046927SAndroid Build Coastguard Worker hdr_size = n;
547*61046927SAndroid Build Coastguard Worker compact = 1;
548*61046927SAndroid Build Coastguard Worker } else {
549*61046927SAndroid Build Coastguard Worker while (1) {
550*61046927SAndroid Build Coastguard Worker void *ptr = next_sect(state, §_size);
551*61046927SAndroid Build Coastguard Worker
552*61046927SAndroid Build Coastguard Worker if ((sect_size != 32) && (sect_size != 44)) {
553*61046927SAndroid Build Coastguard Worker /* end of constants: */
554*61046927SAndroid Build Coastguard Worker instrs = ptr;
555*61046927SAndroid Build Coastguard Worker instrs_size = sect_size;
556*61046927SAndroid Build Coastguard Worker break;
557*61046927SAndroid Build Coastguard Worker }
558*61046927SAndroid Build Coastguard Worker dump_hex_ascii(ptr, sect_size, 0);
559*61046927SAndroid Build Coastguard Worker constants[nconsts++] = ptr;
560*61046927SAndroid Build Coastguard Worker }
561*61046927SAndroid Build Coastguard Worker }
562*61046927SAndroid Build Coastguard Worker
563*61046927SAndroid Build Coastguard Worker printf("\n");
564*61046927SAndroid Build Coastguard Worker
565*61046927SAndroid Build Coastguard Worker if (full_dump) {
566*61046927SAndroid Build Coastguard Worker printf("#######################################################\n");
567*61046927SAndroid Build Coastguard Worker printf("######## VS%d HEADER: (size %d)\n", i, hdr_size);
568*61046927SAndroid Build Coastguard Worker dump_hex((void *)vs_hdr, hdr_size);
569*61046927SAndroid Build Coastguard Worker for (j = 0; j < nconsts; j++) {
570*61046927SAndroid Build Coastguard Worker printf("######## VS%d CONST: (size=%d)\n", i,
571*61046927SAndroid Build Coastguard Worker (int)sizeof(constants[i]));
572*61046927SAndroid Build Coastguard Worker dump_constant(constants[j]);
573*61046927SAndroid Build Coastguard Worker dump_hex((char *)constants[j], sizeof(constants[j]));
574*61046927SAndroid Build Coastguard Worker }
575*61046927SAndroid Build Coastguard Worker }
576*61046927SAndroid Build Coastguard Worker
577*61046927SAndroid Build Coastguard Worker printf("######## VS%d SHADER: (size=%d)\n", i, instrs_size);
578*61046927SAndroid Build Coastguard Worker if (full_dump) {
579*61046927SAndroid Build Coastguard Worker dump_hex(instrs, instrs_size);
580*61046927SAndroid Build Coastguard Worker level = 1;
581*61046927SAndroid Build Coastguard Worker } else {
582*61046927SAndroid Build Coastguard Worker dump_short_summary(state, nconsts, constants);
583*61046927SAndroid Build Coastguard Worker }
584*61046927SAndroid Build Coastguard Worker
585*61046927SAndroid Build Coastguard Worker if (!compact) {
586*61046927SAndroid Build Coastguard Worker if (state->hdr->revision >= 7) {
587*61046927SAndroid Build Coastguard Worker instrs += ALIGN(instrs_size, 8) - instrs_size;
588*61046927SAndroid Build Coastguard Worker instrs_size = ALIGN(instrs_size, 8);
589*61046927SAndroid Build Coastguard Worker }
590*61046927SAndroid Build Coastguard Worker instrs += 32;
591*61046927SAndroid Build Coastguard Worker instrs_size -= 32;
592*61046927SAndroid Build Coastguard Worker }
593*61046927SAndroid Build Coastguard Worker
594*61046927SAndroid Build Coastguard Worker disasm_a3xx((uint32_t *)instrs, instrs_size / 4, level + 1, stdout,
595*61046927SAndroid Build Coastguard Worker gpu_id);
596*61046927SAndroid Build Coastguard Worker dump_raw_shader((uint32_t *)instrs, instrs_size / 4, i, "vo3");
597*61046927SAndroid Build Coastguard Worker free(vs_hdr);
598*61046927SAndroid Build Coastguard Worker }
599*61046927SAndroid Build Coastguard Worker
600*61046927SAndroid Build Coastguard Worker /* dump fragment shaders: */
601*61046927SAndroid Build Coastguard Worker for (i = 0; i < 1; i++) {
602*61046927SAndroid Build Coastguard Worker int instrs_size, hdr_size, sect_size, nconsts = 0, level = 0, compact = 0;
603*61046927SAndroid Build Coastguard Worker uint8_t *fs_hdr;
604*61046927SAndroid Build Coastguard Worker struct constant *constants[32];
605*61046927SAndroid Build Coastguard Worker uint8_t *instrs = NULL;
606*61046927SAndroid Build Coastguard Worker
607*61046927SAndroid Build Coastguard Worker fs_hdr = next_sect(state, &hdr_size);
608*61046927SAndroid Build Coastguard Worker
609*61046927SAndroid Build Coastguard Worker printf("hdr_size=%d\n", hdr_size);
610*61046927SAndroid Build Coastguard Worker /* two cases, similar to vertex shader, but magic # is 200
611*61046927SAndroid Build Coastguard Worker * (or 208 for newer?)..
612*61046927SAndroid Build Coastguard Worker */
613*61046927SAndroid Build Coastguard Worker int n;
614*61046927SAndroid Build Coastguard Worker if (state->hdr->revision >= 0xb)
615*61046927SAndroid Build Coastguard Worker n = 256;
616*61046927SAndroid Build Coastguard Worker else if (state->hdr->revision >= 8)
617*61046927SAndroid Build Coastguard Worker n = 208;
618*61046927SAndroid Build Coastguard Worker else if (state->hdr->revision == 7)
619*61046927SAndroid Build Coastguard Worker n = 204;
620*61046927SAndroid Build Coastguard Worker else
621*61046927SAndroid Build Coastguard Worker n = 200;
622*61046927SAndroid Build Coastguard Worker
623*61046927SAndroid Build Coastguard Worker if (hdr_size > n) {
624*61046927SAndroid Build Coastguard Worker instrs = &fs_hdr[n];
625*61046927SAndroid Build Coastguard Worker instrs_size = hdr_size - n;
626*61046927SAndroid Build Coastguard Worker hdr_size = n;
627*61046927SAndroid Build Coastguard Worker compact = 1;
628*61046927SAndroid Build Coastguard Worker } else {
629*61046927SAndroid Build Coastguard Worker while (1) {
630*61046927SAndroid Build Coastguard Worker void *ptr = next_sect(state, §_size);
631*61046927SAndroid Build Coastguard Worker
632*61046927SAndroid Build Coastguard Worker if ((sect_size != 32) && (sect_size != 44)) {
633*61046927SAndroid Build Coastguard Worker /* end of constants: */
634*61046927SAndroid Build Coastguard Worker instrs = ptr;
635*61046927SAndroid Build Coastguard Worker instrs_size = sect_size;
636*61046927SAndroid Build Coastguard Worker break;
637*61046927SAndroid Build Coastguard Worker }
638*61046927SAndroid Build Coastguard Worker
639*61046927SAndroid Build Coastguard Worker dump_hex_ascii(ptr, sect_size, 0);
640*61046927SAndroid Build Coastguard Worker constants[nconsts++] = ptr;
641*61046927SAndroid Build Coastguard Worker }
642*61046927SAndroid Build Coastguard Worker }
643*61046927SAndroid Build Coastguard Worker
644*61046927SAndroid Build Coastguard Worker printf("\n");
645*61046927SAndroid Build Coastguard Worker
646*61046927SAndroid Build Coastguard Worker if (full_dump) {
647*61046927SAndroid Build Coastguard Worker printf("#######################################################\n");
648*61046927SAndroid Build Coastguard Worker printf("######## FS%d HEADER: (size %d)\n", i, hdr_size);
649*61046927SAndroid Build Coastguard Worker dump_hex((void *)fs_hdr, hdr_size);
650*61046927SAndroid Build Coastguard Worker for (j = 0; j < nconsts; j++) {
651*61046927SAndroid Build Coastguard Worker printf("######## FS%d CONST: (size=%d)\n", i,
652*61046927SAndroid Build Coastguard Worker (int)sizeof(constants[i]));
653*61046927SAndroid Build Coastguard Worker dump_constant(constants[j]);
654*61046927SAndroid Build Coastguard Worker dump_hex((char *)constants[j], sizeof(constants[j]));
655*61046927SAndroid Build Coastguard Worker }
656*61046927SAndroid Build Coastguard Worker }
657*61046927SAndroid Build Coastguard Worker
658*61046927SAndroid Build Coastguard Worker printf("######## FS%d SHADER: (size=%d)\n", i, instrs_size);
659*61046927SAndroid Build Coastguard Worker if (full_dump) {
660*61046927SAndroid Build Coastguard Worker dump_hex(instrs, instrs_size);
661*61046927SAndroid Build Coastguard Worker level = 1;
662*61046927SAndroid Build Coastguard Worker } else {
663*61046927SAndroid Build Coastguard Worker dump_short_summary(state, nconsts, constants);
664*61046927SAndroid Build Coastguard Worker }
665*61046927SAndroid Build Coastguard Worker
666*61046927SAndroid Build Coastguard Worker if (!compact) {
667*61046927SAndroid Build Coastguard Worker if (state->hdr->revision >= 7) {
668*61046927SAndroid Build Coastguard Worker instrs += 44;
669*61046927SAndroid Build Coastguard Worker instrs_size -= 44;
670*61046927SAndroid Build Coastguard Worker } else {
671*61046927SAndroid Build Coastguard Worker instrs += 32;
672*61046927SAndroid Build Coastguard Worker instrs_size -= 32;
673*61046927SAndroid Build Coastguard Worker }
674*61046927SAndroid Build Coastguard Worker }
675*61046927SAndroid Build Coastguard Worker disasm_a3xx((uint32_t *)instrs, instrs_size / 4, level + 1, stdout,
676*61046927SAndroid Build Coastguard Worker gpu_id);
677*61046927SAndroid Build Coastguard Worker dump_raw_shader((uint32_t *)instrs, instrs_size / 4, i, "fo3");
678*61046927SAndroid Build Coastguard Worker free(fs_hdr);
679*61046927SAndroid Build Coastguard Worker }
680*61046927SAndroid Build Coastguard Worker }
681*61046927SAndroid Build Coastguard Worker
682*61046927SAndroid Build Coastguard Worker static void
dump_program(struct state * state)683*61046927SAndroid Build Coastguard Worker dump_program(struct state *state)
684*61046927SAndroid Build Coastguard Worker {
685*61046927SAndroid Build Coastguard Worker int i, sect_size;
686*61046927SAndroid Build Coastguard Worker uint8_t *ptr;
687*61046927SAndroid Build Coastguard Worker
688*61046927SAndroid Build Coastguard Worker state->hdr = next_sect(state, §_size);
689*61046927SAndroid Build Coastguard Worker
690*61046927SAndroid Build Coastguard Worker printf("######## HEADER: (size %d)\n", sect_size);
691*61046927SAndroid Build Coastguard Worker printf("\tsize: %d\n", state->hdr->size);
692*61046927SAndroid Build Coastguard Worker printf("\trevision: %d\n", state->hdr->revision);
693*61046927SAndroid Build Coastguard Worker printf("\tattributes: %d\n", state->hdr->num_attribs);
694*61046927SAndroid Build Coastguard Worker printf("\tuniforms: %d\n", state->hdr->num_uniforms);
695*61046927SAndroid Build Coastguard Worker printf("\tsamplers: %d\n", state->hdr->num_samplers);
696*61046927SAndroid Build Coastguard Worker printf("\tvaryings: %d\n", state->hdr->num_varyings);
697*61046927SAndroid Build Coastguard Worker printf("\tuniform blocks: %d\n", state->hdr->num_uniformblocks);
698*61046927SAndroid Build Coastguard Worker if (full_dump)
699*61046927SAndroid Build Coastguard Worker dump_hex((void *)state->hdr, sect_size);
700*61046927SAndroid Build Coastguard Worker printf("\n");
701*61046927SAndroid Build Coastguard Worker
702*61046927SAndroid Build Coastguard Worker /* there seems to be two 0xba5eba11's at the end of the header, possibly
703*61046927SAndroid Build Coastguard Worker * with some other stuff between them:
704*61046927SAndroid Build Coastguard Worker */
705*61046927SAndroid Build Coastguard Worker ptr = next_sect(state, §_size);
706*61046927SAndroid Build Coastguard Worker if (full_dump) {
707*61046927SAndroid Build Coastguard Worker dump_hex_ascii(ptr, sect_size, 0);
708*61046927SAndroid Build Coastguard Worker }
709*61046927SAndroid Build Coastguard Worker
710*61046927SAndroid Build Coastguard Worker for (i = 0; (i < state->hdr->num_attribs) && (state->sz > 0); i++) {
711*61046927SAndroid Build Coastguard Worker state->attribs[i] = next_sect(state, §_size);
712*61046927SAndroid Build Coastguard Worker
713*61046927SAndroid Build Coastguard Worker /* hmm, for a3xx (or maybe just newer driver version), we have some
714*61046927SAndroid Build Coastguard Worker * extra sections that don't seem useful, so skip these:
715*61046927SAndroid Build Coastguard Worker */
716*61046927SAndroid Build Coastguard Worker while (!valid_type(state->attribs[i]->type_info)) {
717*61046927SAndroid Build Coastguard Worker dump_hex_ascii(state->attribs[i], sect_size, 0);
718*61046927SAndroid Build Coastguard Worker state->attribs[i] = next_sect(state, §_size);
719*61046927SAndroid Build Coastguard Worker }
720*61046927SAndroid Build Coastguard Worker
721*61046927SAndroid Build Coastguard Worker clean_ascii(state->attribs[i]->name, sect_size - 28);
722*61046927SAndroid Build Coastguard Worker if (full_dump) {
723*61046927SAndroid Build Coastguard Worker printf("######## ATTRIBUTE: (size %d)\n", sect_size);
724*61046927SAndroid Build Coastguard Worker dump_attribute(state->attribs[i]);
725*61046927SAndroid Build Coastguard Worker dump_hex((char *)state->attribs[i], sect_size);
726*61046927SAndroid Build Coastguard Worker }
727*61046927SAndroid Build Coastguard Worker }
728*61046927SAndroid Build Coastguard Worker
729*61046927SAndroid Build Coastguard Worker for (i = 0; (i < state->hdr->num_uniforms) && (state->sz > 0); i++) {
730*61046927SAndroid Build Coastguard Worker state->uniforms[i] = next_sect(state, §_size);
731*61046927SAndroid Build Coastguard Worker
732*61046927SAndroid Build Coastguard Worker /* hmm, for a3xx (or maybe just newer driver version), we have some
733*61046927SAndroid Build Coastguard Worker * extra sections that don't seem useful, so skip these:
734*61046927SAndroid Build Coastguard Worker */
735*61046927SAndroid Build Coastguard Worker while (!valid_type(state->uniforms[i]->type_info)) {
736*61046927SAndroid Build Coastguard Worker dump_hex_ascii(state->uniforms[i], sect_size, 0);
737*61046927SAndroid Build Coastguard Worker state->uniforms[i] = next_sect(state, §_size);
738*61046927SAndroid Build Coastguard Worker }
739*61046927SAndroid Build Coastguard Worker
740*61046927SAndroid Build Coastguard Worker if (is_uniform_v2(state->uniforms[i])) {
741*61046927SAndroid Build Coastguard Worker clean_ascii(state->uniforms[i]->v2.name, sect_size - 53);
742*61046927SAndroid Build Coastguard Worker } else {
743*61046927SAndroid Build Coastguard Worker clean_ascii(state->uniforms[i]->v1.name, sect_size - 41);
744*61046927SAndroid Build Coastguard Worker }
745*61046927SAndroid Build Coastguard Worker
746*61046927SAndroid Build Coastguard Worker if (full_dump) {
747*61046927SAndroid Build Coastguard Worker printf("######## UNIFORM: (size %d)\n", sect_size);
748*61046927SAndroid Build Coastguard Worker dump_uniform(state->uniforms[i]);
749*61046927SAndroid Build Coastguard Worker dump_hex((char *)state->uniforms[i], sect_size);
750*61046927SAndroid Build Coastguard Worker }
751*61046927SAndroid Build Coastguard Worker }
752*61046927SAndroid Build Coastguard Worker
753*61046927SAndroid Build Coastguard Worker for (i = 0; (i < state->hdr->num_samplers) && (state->sz > 0); i++) {
754*61046927SAndroid Build Coastguard Worker state->samplers[i] = next_sect(state, §_size);
755*61046927SAndroid Build Coastguard Worker
756*61046927SAndroid Build Coastguard Worker /* hmm, for a3xx (or maybe just newer driver version), we have some
757*61046927SAndroid Build Coastguard Worker * extra sections that don't seem useful, so skip these:
758*61046927SAndroid Build Coastguard Worker */
759*61046927SAndroid Build Coastguard Worker while (!valid_type(state->samplers[i]->type_info)) {
760*61046927SAndroid Build Coastguard Worker dump_hex_ascii(state->samplers[i], sect_size, 0);
761*61046927SAndroid Build Coastguard Worker state->samplers[i] = next_sect(state, §_size);
762*61046927SAndroid Build Coastguard Worker }
763*61046927SAndroid Build Coastguard Worker
764*61046927SAndroid Build Coastguard Worker clean_ascii(state->samplers[i]->name, sect_size - 33);
765*61046927SAndroid Build Coastguard Worker if (full_dump) {
766*61046927SAndroid Build Coastguard Worker printf("######## SAMPLER: (size %d)\n", sect_size);
767*61046927SAndroid Build Coastguard Worker dump_sampler(state->samplers[i]);
768*61046927SAndroid Build Coastguard Worker dump_hex((char *)state->samplers[i], sect_size);
769*61046927SAndroid Build Coastguard Worker }
770*61046927SAndroid Build Coastguard Worker }
771*61046927SAndroid Build Coastguard Worker
772*61046927SAndroid Build Coastguard Worker // These sections show up after all of the other sampler sections
773*61046927SAndroid Build Coastguard Worker // Loops through them all since we don't deal with them
774*61046927SAndroid Build Coastguard Worker if (state->hdr->revision >= 7) {
775*61046927SAndroid Build Coastguard Worker for (i = 0; (i < state->hdr->num_samplers) && (state->sz > 0); i++) {
776*61046927SAndroid Build Coastguard Worker ptr = next_sect(state, §_size);
777*61046927SAndroid Build Coastguard Worker dump_hex_ascii(ptr, sect_size, 0);
778*61046927SAndroid Build Coastguard Worker }
779*61046927SAndroid Build Coastguard Worker }
780*61046927SAndroid Build Coastguard Worker
781*61046927SAndroid Build Coastguard Worker for (i = 0; (i < state->hdr->num_varyings) && (state->sz > 0); i++) {
782*61046927SAndroid Build Coastguard Worker state->varyings[i] = next_sect(state, §_size);
783*61046927SAndroid Build Coastguard Worker
784*61046927SAndroid Build Coastguard Worker /* hmm, for a3xx (or maybe just newer driver version), we have some
785*61046927SAndroid Build Coastguard Worker * extra sections that don't seem useful, so skip these:
786*61046927SAndroid Build Coastguard Worker */
787*61046927SAndroid Build Coastguard Worker while (!valid_type(state->varyings[i]->type_info)) {
788*61046927SAndroid Build Coastguard Worker dump_hex_ascii(state->varyings[i], sect_size, 0);
789*61046927SAndroid Build Coastguard Worker state->varyings[i] = next_sect(state, §_size);
790*61046927SAndroid Build Coastguard Worker }
791*61046927SAndroid Build Coastguard Worker
792*61046927SAndroid Build Coastguard Worker clean_ascii(state->varyings[i]->name, sect_size - 16);
793*61046927SAndroid Build Coastguard Worker if (full_dump) {
794*61046927SAndroid Build Coastguard Worker printf("######## VARYING: (size %d)\n", sect_size);
795*61046927SAndroid Build Coastguard Worker dump_varying(state->varyings[i]);
796*61046927SAndroid Build Coastguard Worker dump_hex((char *)state->varyings[i], sect_size);
797*61046927SAndroid Build Coastguard Worker }
798*61046927SAndroid Build Coastguard Worker }
799*61046927SAndroid Build Coastguard Worker
800*61046927SAndroid Build Coastguard Worker /* show up again for revision >= 14?? */
801*61046927SAndroid Build Coastguard Worker if (state->hdr->revision >= 14) {
802*61046927SAndroid Build Coastguard Worker for (i = 0; (i < state->hdr->num_varyings) && (state->sz > 0); i++) {
803*61046927SAndroid Build Coastguard Worker ptr = next_sect(state, §_size);
804*61046927SAndroid Build Coastguard Worker dump_hex_ascii(ptr, sect_size, 0);
805*61046927SAndroid Build Coastguard Worker }
806*61046927SAndroid Build Coastguard Worker }
807*61046927SAndroid Build Coastguard Worker
808*61046927SAndroid Build Coastguard Worker /* not sure exactly which revision started this, but seems at least
809*61046927SAndroid Build Coastguard Worker * rev7 and rev8 implicitly include a new section for gl_FragColor:
810*61046927SAndroid Build Coastguard Worker */
811*61046927SAndroid Build Coastguard Worker if (state->hdr->revision >= 7) {
812*61046927SAndroid Build Coastguard Worker /* I guess only one? */
813*61046927SAndroid Build Coastguard Worker state->outputs[0] = next_sect(state, §_size);
814*61046927SAndroid Build Coastguard Worker
815*61046927SAndroid Build Coastguard Worker clean_ascii(state->outputs[0]->name, sect_size - 32);
816*61046927SAndroid Build Coastguard Worker if (full_dump) {
817*61046927SAndroid Build Coastguard Worker printf("######## OUTPUT: (size %d)\n", sect_size);
818*61046927SAndroid Build Coastguard Worker dump_output(state->outputs[0]);
819*61046927SAndroid Build Coastguard Worker dump_hex((char *)state->outputs[0], sect_size);
820*61046927SAndroid Build Coastguard Worker }
821*61046927SAndroid Build Coastguard Worker }
822*61046927SAndroid Build Coastguard Worker
823*61046927SAndroid Build Coastguard Worker for (i = 0; (i < state->hdr->num_uniformblocks) && (state->sz > 0); i++) {
824*61046927SAndroid Build Coastguard Worker state->uniformblocks[i].header = next_sect(state, §_size);
825*61046927SAndroid Build Coastguard Worker
826*61046927SAndroid Build Coastguard Worker clean_ascii(state->uniformblocks[i].header->name, sect_size - 40);
827*61046927SAndroid Build Coastguard Worker if (full_dump) {
828*61046927SAndroid Build Coastguard Worker printf("######## UNIFORM BLOCK: (size %d)\n", sect_size);
829*61046927SAndroid Build Coastguard Worker dump_uniformblock(state->uniformblocks[i].header);
830*61046927SAndroid Build Coastguard Worker dump_hex((char *)state->uniformblocks[i].header, sect_size);
831*61046927SAndroid Build Coastguard Worker }
832*61046927SAndroid Build Coastguard Worker
833*61046927SAndroid Build Coastguard Worker /*
834*61046927SAndroid Build Coastguard Worker * OpenGL ES 3.0 spec mandates a minimum amount of 16K members supported
835*61046927SAndroid Build Coastguard Worker * a330 supports a minimum of 65K
836*61046927SAndroid Build Coastguard Worker */
837*61046927SAndroid Build Coastguard Worker state->uniformblocks[i].members =
838*61046927SAndroid Build Coastguard Worker malloc(state->uniformblocks[i].header->num_members * sizeof(void *));
839*61046927SAndroid Build Coastguard Worker
840*61046927SAndroid Build Coastguard Worker int member = 0;
841*61046927SAndroid Build Coastguard Worker for (member = 0; (member < state->uniformblocks[i].header->num_members) &&
842*61046927SAndroid Build Coastguard Worker (state->sz > 0);
843*61046927SAndroid Build Coastguard Worker member++) {
844*61046927SAndroid Build Coastguard Worker state->uniformblocks[i].members[member] = next_sect(state, §_size);
845*61046927SAndroid Build Coastguard Worker
846*61046927SAndroid Build Coastguard Worker clean_ascii(state->uniformblocks[i].members[member]->name,
847*61046927SAndroid Build Coastguard Worker sect_size - 56);
848*61046927SAndroid Build Coastguard Worker if (full_dump) {
849*61046927SAndroid Build Coastguard Worker printf("######## UNIFORM BLOCK MEMBER: (size %d)\n", sect_size);
850*61046927SAndroid Build Coastguard Worker dump_uniformblockmember(state->uniformblocks[i].members[member]);
851*61046927SAndroid Build Coastguard Worker dump_hex((char *)state->uniformblocks[i].members[member],
852*61046927SAndroid Build Coastguard Worker sect_size);
853*61046927SAndroid Build Coastguard Worker }
854*61046927SAndroid Build Coastguard Worker }
855*61046927SAndroid Build Coastguard Worker /*
856*61046927SAndroid Build Coastguard Worker * Qualcomm saves the UBO members twice for each UBO
857*61046927SAndroid Build Coastguard Worker * Don't ask me why
858*61046927SAndroid Build Coastguard Worker */
859*61046927SAndroid Build Coastguard Worker for (member = 0; (member < state->uniformblocks[i].header->num_members) &&
860*61046927SAndroid Build Coastguard Worker (state->sz > 0);
861*61046927SAndroid Build Coastguard Worker member++) {
862*61046927SAndroid Build Coastguard Worker state->uniformblocks[i].members[member] = next_sect(state, §_size);
863*61046927SAndroid Build Coastguard Worker
864*61046927SAndroid Build Coastguard Worker clean_ascii(state->uniformblocks[i].members[member]->name,
865*61046927SAndroid Build Coastguard Worker sect_size - 56);
866*61046927SAndroid Build Coastguard Worker if (full_dump) {
867*61046927SAndroid Build Coastguard Worker printf("######## UNIFORM BLOCK MEMBER2: (size %d)\n", sect_size);
868*61046927SAndroid Build Coastguard Worker dump_uniformblockmember(state->uniformblocks[i].members[member]);
869*61046927SAndroid Build Coastguard Worker dump_hex((char *)state->uniformblocks[i].members[member],
870*61046927SAndroid Build Coastguard Worker sect_size);
871*61046927SAndroid Build Coastguard Worker }
872*61046927SAndroid Build Coastguard Worker }
873*61046927SAndroid Build Coastguard Worker }
874*61046927SAndroid Build Coastguard Worker
875*61046927SAndroid Build Coastguard Worker if (gpu_id >= 300) {
876*61046927SAndroid Build Coastguard Worker dump_shaders_a3xx(state);
877*61046927SAndroid Build Coastguard Worker } else {
878*61046927SAndroid Build Coastguard Worker dump_shaders_a2xx(state);
879*61046927SAndroid Build Coastguard Worker }
880*61046927SAndroid Build Coastguard Worker
881*61046927SAndroid Build Coastguard Worker if (!full_dump)
882*61046927SAndroid Build Coastguard Worker return;
883*61046927SAndroid Build Coastguard Worker
884*61046927SAndroid Build Coastguard Worker /* dump ascii version of shader program: */
885*61046927SAndroid Build Coastguard Worker ptr = next_sect(state, §_size);
886*61046927SAndroid Build Coastguard Worker printf("\n#######################################################\n");
887*61046927SAndroid Build Coastguard Worker printf("######## SHADER SRC: (size=%d)\n", sect_size);
888*61046927SAndroid Build Coastguard Worker dump_ascii(ptr, sect_size);
889*61046927SAndroid Build Coastguard Worker free(ptr);
890*61046927SAndroid Build Coastguard Worker
891*61046927SAndroid Build Coastguard Worker /* dump remaining sections (there shouldn't be any): */
892*61046927SAndroid Build Coastguard Worker while (state->sz > 0) {
893*61046927SAndroid Build Coastguard Worker ptr = next_sect(state, §_size);
894*61046927SAndroid Build Coastguard Worker printf("######## section (size=%d)\n", sect_size);
895*61046927SAndroid Build Coastguard Worker printf("as hex:\n");
896*61046927SAndroid Build Coastguard Worker dump_hex(ptr, sect_size);
897*61046927SAndroid Build Coastguard Worker printf("as float:\n");
898*61046927SAndroid Build Coastguard Worker dump_float(ptr, sect_size);
899*61046927SAndroid Build Coastguard Worker printf("as ascii:\n");
900*61046927SAndroid Build Coastguard Worker dump_ascii(ptr, sect_size);
901*61046927SAndroid Build Coastguard Worker free(ptr);
902*61046927SAndroid Build Coastguard Worker }
903*61046927SAndroid Build Coastguard Worker /* cleanup the uniform buffer members we allocated */
904*61046927SAndroid Build Coastguard Worker if (state->hdr->num_uniformblocks > 0)
905*61046927SAndroid Build Coastguard Worker free(state->uniformblocks[i].members);
906*61046927SAndroid Build Coastguard Worker }
907*61046927SAndroid Build Coastguard Worker
908*61046927SAndroid Build Coastguard Worker int
main(int argc,char ** argv)909*61046927SAndroid Build Coastguard Worker main(int argc, char **argv)
910*61046927SAndroid Build Coastguard Worker {
911*61046927SAndroid Build Coastguard Worker enum rd_sect_type type = RD_NONE;
912*61046927SAndroid Build Coastguard Worker enum debug_t debug = PRINT_RAW | PRINT_STATS;
913*61046927SAndroid Build Coastguard Worker void *buf = NULL;
914*61046927SAndroid Build Coastguard Worker int sz;
915*61046927SAndroid Build Coastguard Worker struct io *io;
916*61046927SAndroid Build Coastguard Worker int raw_program = 0;
917*61046927SAndroid Build Coastguard Worker
918*61046927SAndroid Build Coastguard Worker /* lame argument parsing: */
919*61046927SAndroid Build Coastguard Worker
920*61046927SAndroid Build Coastguard Worker while (1) {
921*61046927SAndroid Build Coastguard Worker if ((argc > 1) && !strcmp(argv[1], "--verbose")) {
922*61046927SAndroid Build Coastguard Worker debug |= PRINT_RAW | PRINT_VERBOSE;
923*61046927SAndroid Build Coastguard Worker argv++;
924*61046927SAndroid Build Coastguard Worker argc--;
925*61046927SAndroid Build Coastguard Worker continue;
926*61046927SAndroid Build Coastguard Worker }
927*61046927SAndroid Build Coastguard Worker if ((argc > 1) && !strcmp(argv[1], "--expand")) {
928*61046927SAndroid Build Coastguard Worker debug |= EXPAND_REPEAT;
929*61046927SAndroid Build Coastguard Worker argv++;
930*61046927SAndroid Build Coastguard Worker argc--;
931*61046927SAndroid Build Coastguard Worker continue;
932*61046927SAndroid Build Coastguard Worker }
933*61046927SAndroid Build Coastguard Worker if ((argc > 1) && !strcmp(argv[1], "--short")) {
934*61046927SAndroid Build Coastguard Worker /* only short dump, original shader, symbol table, and disassembly */
935*61046927SAndroid Build Coastguard Worker full_dump = 0;
936*61046927SAndroid Build Coastguard Worker argv++;
937*61046927SAndroid Build Coastguard Worker argc--;
938*61046927SAndroid Build Coastguard Worker continue;
939*61046927SAndroid Build Coastguard Worker }
940*61046927SAndroid Build Coastguard Worker if ((argc > 1) && !strcmp(argv[1], "--dump-shaders")) {
941*61046927SAndroid Build Coastguard Worker dump_shaders = 1;
942*61046927SAndroid Build Coastguard Worker argv++;
943*61046927SAndroid Build Coastguard Worker argc--;
944*61046927SAndroid Build Coastguard Worker continue;
945*61046927SAndroid Build Coastguard Worker }
946*61046927SAndroid Build Coastguard Worker if ((argc > 1) && !strcmp(argv[1], "--raw")) {
947*61046927SAndroid Build Coastguard Worker raw_program = 1;
948*61046927SAndroid Build Coastguard Worker argv++;
949*61046927SAndroid Build Coastguard Worker argc--;
950*61046927SAndroid Build Coastguard Worker continue;
951*61046927SAndroid Build Coastguard Worker }
952*61046927SAndroid Build Coastguard Worker if ((argc > 1) && !strcmp(argv[1], "--gpu300")) {
953*61046927SAndroid Build Coastguard Worker gpu_id = 320;
954*61046927SAndroid Build Coastguard Worker argv++;
955*61046927SAndroid Build Coastguard Worker argc--;
956*61046927SAndroid Build Coastguard Worker continue;
957*61046927SAndroid Build Coastguard Worker }
958*61046927SAndroid Build Coastguard Worker break;
959*61046927SAndroid Build Coastguard Worker }
960*61046927SAndroid Build Coastguard Worker
961*61046927SAndroid Build Coastguard Worker if (argc != 2) {
962*61046927SAndroid Build Coastguard Worker fprintf(
963*61046927SAndroid Build Coastguard Worker stderr,
964*61046927SAndroid Build Coastguard Worker "usage: pgmdump [--verbose] [--short] [--dump-shaders] testlog.rd\n");
965*61046927SAndroid Build Coastguard Worker return -1;
966*61046927SAndroid Build Coastguard Worker }
967*61046927SAndroid Build Coastguard Worker
968*61046927SAndroid Build Coastguard Worker disasm_a2xx_set_debug(debug);
969*61046927SAndroid Build Coastguard Worker disasm_a3xx_set_debug(debug);
970*61046927SAndroid Build Coastguard Worker
971*61046927SAndroid Build Coastguard Worker infile = argv[1];
972*61046927SAndroid Build Coastguard Worker
973*61046927SAndroid Build Coastguard Worker io = io_open(infile);
974*61046927SAndroid Build Coastguard Worker if (!io) {
975*61046927SAndroid Build Coastguard Worker fprintf(stderr, "could not open: %s\n", infile);
976*61046927SAndroid Build Coastguard Worker return -1;
977*61046927SAndroid Build Coastguard Worker }
978*61046927SAndroid Build Coastguard Worker
979*61046927SAndroid Build Coastguard Worker if (raw_program) {
980*61046927SAndroid Build Coastguard Worker io_readn(io, &sz, 4);
981*61046927SAndroid Build Coastguard Worker free(buf);
982*61046927SAndroid Build Coastguard Worker
983*61046927SAndroid Build Coastguard Worker /* note: allow hex dumps to go a bit past the end of the buffer..
984*61046927SAndroid Build Coastguard Worker * might see some garbage, but better than missing the last few bytes..
985*61046927SAndroid Build Coastguard Worker */
986*61046927SAndroid Build Coastguard Worker buf = calloc(1, sz + 3);
987*61046927SAndroid Build Coastguard Worker io_readn(io, buf + 4, sz);
988*61046927SAndroid Build Coastguard Worker (*(int *)buf) = sz;
989*61046927SAndroid Build Coastguard Worker
990*61046927SAndroid Build Coastguard Worker struct state state = {
991*61046927SAndroid Build Coastguard Worker .buf = buf,
992*61046927SAndroid Build Coastguard Worker .sz = sz,
993*61046927SAndroid Build Coastguard Worker };
994*61046927SAndroid Build Coastguard Worker printf("############################################################\n");
995*61046927SAndroid Build Coastguard Worker printf("program:\n");
996*61046927SAndroid Build Coastguard Worker dump_program(&state);
997*61046927SAndroid Build Coastguard Worker printf("############################################################\n");
998*61046927SAndroid Build Coastguard Worker return 0;
999*61046927SAndroid Build Coastguard Worker }
1000*61046927SAndroid Build Coastguard Worker
1001*61046927SAndroid Build Coastguard Worker /* figure out what sort of input we are dealing with: */
1002*61046927SAndroid Build Coastguard Worker if (!(check_extension(infile, ".rd") || check_extension(infile, ".rd.gz"))) {
1003*61046927SAndroid Build Coastguard Worker gl_shader_stage shader = ~0;
1004*61046927SAndroid Build Coastguard Worker int ret;
1005*61046927SAndroid Build Coastguard Worker if (check_extension(infile, ".vo")) {
1006*61046927SAndroid Build Coastguard Worker shader = MESA_SHADER_VERTEX;
1007*61046927SAndroid Build Coastguard Worker } else if (check_extension(infile, ".fo")) {
1008*61046927SAndroid Build Coastguard Worker shader = MESA_SHADER_FRAGMENT;
1009*61046927SAndroid Build Coastguard Worker } else if (check_extension(infile, ".vo3")) {
1010*61046927SAndroid Build Coastguard Worker } else if (check_extension(infile, ".fo3")) {
1011*61046927SAndroid Build Coastguard Worker } else if (check_extension(infile, ".co3")) {
1012*61046927SAndroid Build Coastguard Worker } else {
1013*61046927SAndroid Build Coastguard Worker fprintf(stderr, "invalid input file: %s\n", infile);
1014*61046927SAndroid Build Coastguard Worker return -1;
1015*61046927SAndroid Build Coastguard Worker }
1016*61046927SAndroid Build Coastguard Worker buf = calloc(1, 100 * 1024);
1017*61046927SAndroid Build Coastguard Worker ret = io_readn(io, buf, 100 * 1024);
1018*61046927SAndroid Build Coastguard Worker if (ret < 0) {
1019*61046927SAndroid Build Coastguard Worker fprintf(stderr, "error: %m");
1020*61046927SAndroid Build Coastguard Worker return -1;
1021*61046927SAndroid Build Coastguard Worker }
1022*61046927SAndroid Build Coastguard Worker if (shader != ~0) {
1023*61046927SAndroid Build Coastguard Worker return disasm_a2xx(buf, ret / 4, 0, shader);
1024*61046927SAndroid Build Coastguard Worker } else {
1025*61046927SAndroid Build Coastguard Worker /* disassembly does not depend on shader stage on a3xx+: */
1026*61046927SAndroid Build Coastguard Worker return disasm_a3xx(buf, ret / 4, 0, stdout, gpu_id);
1027*61046927SAndroid Build Coastguard Worker }
1028*61046927SAndroid Build Coastguard Worker }
1029*61046927SAndroid Build Coastguard Worker
1030*61046927SAndroid Build Coastguard Worker while ((io_readn(io, &type, sizeof(type)) > 0) &&
1031*61046927SAndroid Build Coastguard Worker (io_readn(io, &sz, 4) > 0)) {
1032*61046927SAndroid Build Coastguard Worker free(buf);
1033*61046927SAndroid Build Coastguard Worker
1034*61046927SAndroid Build Coastguard Worker /* note: allow hex dumps to go a bit past the end of the buffer..
1035*61046927SAndroid Build Coastguard Worker * might see some garbage, but better than missing the last few bytes..
1036*61046927SAndroid Build Coastguard Worker */
1037*61046927SAndroid Build Coastguard Worker buf = calloc(1, sz + 3);
1038*61046927SAndroid Build Coastguard Worker io_readn(io, buf, sz);
1039*61046927SAndroid Build Coastguard Worker
1040*61046927SAndroid Build Coastguard Worker switch (type) {
1041*61046927SAndroid Build Coastguard Worker case RD_TEST:
1042*61046927SAndroid Build Coastguard Worker if (full_dump)
1043*61046927SAndroid Build Coastguard Worker printf("test: %s\n", (char *)buf);
1044*61046927SAndroid Build Coastguard Worker break;
1045*61046927SAndroid Build Coastguard Worker case RD_VERT_SHADER:
1046*61046927SAndroid Build Coastguard Worker printf("vertex shader:\n%s\n", (char *)buf);
1047*61046927SAndroid Build Coastguard Worker break;
1048*61046927SAndroid Build Coastguard Worker case RD_FRAG_SHADER:
1049*61046927SAndroid Build Coastguard Worker printf("fragment shader:\n%s\n", (char *)buf);
1050*61046927SAndroid Build Coastguard Worker break;
1051*61046927SAndroid Build Coastguard Worker case RD_PROGRAM: {
1052*61046927SAndroid Build Coastguard Worker struct state state = {
1053*61046927SAndroid Build Coastguard Worker .buf = buf,
1054*61046927SAndroid Build Coastguard Worker .sz = sz,
1055*61046927SAndroid Build Coastguard Worker };
1056*61046927SAndroid Build Coastguard Worker printf(
1057*61046927SAndroid Build Coastguard Worker "############################################################\n");
1058*61046927SAndroid Build Coastguard Worker printf("program:\n");
1059*61046927SAndroid Build Coastguard Worker dump_program(&state);
1060*61046927SAndroid Build Coastguard Worker printf(
1061*61046927SAndroid Build Coastguard Worker "############################################################\n");
1062*61046927SAndroid Build Coastguard Worker break;
1063*61046927SAndroid Build Coastguard Worker }
1064*61046927SAndroid Build Coastguard Worker case RD_GPU_ID:
1065*61046927SAndroid Build Coastguard Worker gpu_id = *((unsigned int *)buf);
1066*61046927SAndroid Build Coastguard Worker printf("gpu_id: %d\n", gpu_id);
1067*61046927SAndroid Build Coastguard Worker break;
1068*61046927SAndroid Build Coastguard Worker default:
1069*61046927SAndroid Build Coastguard Worker break;
1070*61046927SAndroid Build Coastguard Worker }
1071*61046927SAndroid Build Coastguard Worker }
1072*61046927SAndroid Build Coastguard Worker
1073*61046927SAndroid Build Coastguard Worker io_close(io);
1074*61046927SAndroid Build Coastguard Worker
1075*61046927SAndroid Build Coastguard Worker return 0;
1076*61046927SAndroid Build Coastguard Worker }
1077