Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5563 | serge | 1 | /* |
2 | * Copyright (C) 2005 Ben Skeggs. |
||
3 | * |
||
4 | * All Rights Reserved. |
||
5 | * |
||
6 | * Permission is hereby granted, free of charge, to any person obtaining |
||
7 | * a copy of this software and associated documentation files (the |
||
8 | * "Software"), to deal in the Software without restriction, including |
||
9 | * without limitation the rights to use, copy, modify, merge, publish, |
||
10 | * distribute, sublicense, and/or sell copies of the Software, and to |
||
11 | * permit persons to whom the Software is furnished to do so, subject to |
||
12 | * the following conditions: |
||
13 | * |
||
14 | * The above copyright notice and this permission notice (including the |
||
15 | * next paragraph) shall be included in all copies or substantial |
||
16 | * portions of the Software. |
||
17 | * |
||
18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
||
19 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||
20 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
||
21 | * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE |
||
22 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
||
23 | * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
||
24 | * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||
25 | * |
||
26 | */ |
||
27 | |||
28 | #include "r300_fragprog.h" |
||
29 | |||
30 | #include |
||
31 | |||
32 | #include "../r300_reg.h" |
||
33 | |||
34 | static void presub_string(char out[10], unsigned int inst) |
||
35 | { |
||
36 | switch(inst & 0x600000){ |
||
37 | case R300_ALU_SRCP_1_MINUS_2_SRC0: |
||
38 | sprintf(out, "bias"); |
||
39 | break; |
||
40 | case R300_ALU_SRCP_SRC1_MINUS_SRC0: |
||
41 | sprintf(out, "sub"); |
||
42 | break; |
||
43 | case R300_ALU_SRCP_SRC1_PLUS_SRC0: |
||
44 | sprintf(out, "add"); |
||
45 | break; |
||
46 | case R300_ALU_SRCP_1_MINUS_SRC0: |
||
47 | sprintf(out, "inv "); |
||
48 | break; |
||
49 | } |
||
50 | } |
||
51 | |||
52 | static int get_msb(unsigned int bit, unsigned int r400_ext_addr) |
||
53 | { |
||
54 | return (r400_ext_addr & bit) ? 1 << 5 : 0; |
||
55 | } |
||
56 | |||
57 | /* just some random things... */ |
||
58 | void r300FragmentProgramDump(struct radeon_compiler *c, void *user) |
||
59 | { |
||
60 | struct r300_fragment_program_compiler *compiler = (struct r300_fragment_program_compiler*)c; |
||
61 | struct r300_fragment_program_code *code = &compiler->code->code.r300; |
||
62 | int n, i, j; |
||
63 | static int pc = 0; |
||
64 | |||
65 | fprintf(stderr, "pc=%d*************************************\n", pc++); |
||
66 | |||
67 | fprintf(stderr, "Hardware program\n"); |
||
68 | fprintf(stderr, "----------------\n"); |
||
69 | if (c->is_r400) { |
||
70 | fprintf(stderr, "code_offset_ext: %08x\n", code->r400_code_offset_ext); |
||
71 | } |
||
72 | |||
73 | for (n = 0; n <= (code->config & 3); n++) { |
||
74 | uint32_t code_addr = code->code_addr[3 - (code->config & 3) + n]; |
||
75 | unsigned int alu_offset = ((code_addr & R300_ALU_START_MASK) >> R300_ALU_START_SHIFT) + |
||
76 | (((code->r400_code_offset_ext >> (24 - (n * 6))) & 0x7) << 6); |
||
77 | unsigned int alu_end = ((code_addr & R300_ALU_SIZE_MASK) >> R300_ALU_SIZE_SHIFT) + |
||
78 | (((code->r400_code_offset_ext >> (27 - (n * 6))) & 0x7) << 6); |
||
79 | int tex_offset = (code_addr & R300_TEX_START_MASK) >> R300_TEX_START_SHIFT; |
||
80 | int tex_end = (code_addr & R300_TEX_SIZE_MASK) >> R300_TEX_SIZE_SHIFT; |
||
81 | |||
82 | fprintf(stderr, "NODE %d: alu_offset: %u, tex_offset: %d, " |
||
83 | "alu_end: %u, tex_end: %d (code_addr: %08x)\n", n, |
||
84 | alu_offset, tex_offset, alu_end, tex_end, code_addr); |
||
85 | |||
86 | if (n > 0 || (code->config & R300_PFS_CNTL_FIRST_NODE_HAS_TEX)) { |
||
87 | fprintf(stderr, " TEX:\n"); |
||
88 | for (i = tex_offset; |
||
89 | i <= tex_offset + tex_end; |
||
90 | ++i) { |
||
91 | const char *instr; |
||
92 | |||
93 | switch ((code->tex. |
||
94 | inst[i] >> R300_TEX_INST_SHIFT) & |
||
95 | 15) { |
||
96 | case R300_TEX_OP_LD: |
||
97 | instr = "TEX"; |
||
98 | break; |
||
99 | case R300_TEX_OP_KIL: |
||
100 | instr = "KIL"; |
||
101 | break; |
||
102 | case R300_TEX_OP_TXP: |
||
103 | instr = "TXP"; |
||
104 | break; |
||
105 | case R300_TEX_OP_TXB: |
||
106 | instr = "TXB"; |
||
107 | break; |
||
108 | default: |
||
109 | instr = "UNKNOWN"; |
||
110 | } |
||
111 | |||
112 | fprintf(stderr, |
||
113 | " %s t%i, %c%i, texture[%i] (%08x)\n", |
||
114 | instr, |
||
115 | (code->tex. |
||
116 | inst[i] >> R300_DST_ADDR_SHIFT) & 31, |
||
117 | 't', |
||
118 | (code->tex. |
||
119 | inst[i] >> R300_SRC_ADDR_SHIFT) & 31, |
||
120 | (code->tex. |
||
121 | inst[i] & R300_TEX_ID_MASK) >> |
||
122 | R300_TEX_ID_SHIFT, |
||
123 | code->tex.inst[i]); |
||
124 | } |
||
125 | } |
||
126 | |||
127 | for (i = alu_offset; |
||
128 | i <= alu_offset + alu_end; ++i) { |
||
129 | char srcc[4][10], dstc[20]; |
||
130 | char srca[4][10], dsta[20]; |
||
131 | char argc[3][20]; |
||
132 | char arga[3][20]; |
||
133 | char flags[5], tmp[10]; |
||
134 | |||
135 | for (j = 0; j < 3; ++j) { |
||
136 | int regc = code->alu.inst[i].rgb_addr >> (j * 6); |
||
137 | int rega = code->alu.inst[i].alpha_addr >> (j * 6); |
||
138 | int msbc = get_msb(R400_ADDR_EXT_RGB_MSB_BIT(j), |
||
139 | code->alu.inst[i].r400_ext_addr); |
||
140 | int msba = get_msb(R400_ADDR_EXT_A_MSB_BIT(j), |
||
141 | code->alu.inst[i].r400_ext_addr); |
||
142 | |||
143 | sprintf(srcc[j], "%c%i", |
||
144 | (regc & 32) ? 'c' : 't', (regc & 31) | msbc); |
||
145 | sprintf(srca[j], "%c%i", |
||
146 | (rega & 32) ? 'c' : 't', (rega & 31) | msba); |
||
147 | } |
||
148 | |||
149 | dstc[0] = 0; |
||
150 | sprintf(flags, "%s%s%s", |
||
151 | (code->alu.inst[i]. |
||
152 | rgb_addr & R300_ALU_DSTC_REG_X) ? "x" : "", |
||
153 | (code->alu.inst[i]. |
||
154 | rgb_addr & R300_ALU_DSTC_REG_Y) ? "y" : "", |
||
155 | (code->alu.inst[i]. |
||
156 | rgb_addr & R300_ALU_DSTC_REG_Z) ? "z" : ""); |
||
157 | if (flags[0] != 0) { |
||
158 | unsigned int msb = get_msb( |
||
159 | R400_ADDRD_EXT_RGB_MSB_BIT, |
||
160 | code->alu.inst[i].r400_ext_addr); |
||
161 | |||
162 | sprintf(dstc, "t%i.%s ", |
||
163 | ((code->alu.inst[i]. |
||
164 | rgb_addr >> R300_ALU_DSTC_SHIFT) |
||
165 | & 31) | msb, |
||
166 | flags); |
||
167 | } |
||
168 | sprintf(flags, "%s%s%s", |
||
169 | (code->alu.inst[i]. |
||
170 | rgb_addr & R300_ALU_DSTC_OUTPUT_X) ? "x" : "", |
||
171 | (code->alu.inst[i]. |
||
172 | rgb_addr & R300_ALU_DSTC_OUTPUT_Y) ? "y" : "", |
||
173 | (code->alu.inst[i]. |
||
174 | rgb_addr & R300_ALU_DSTC_OUTPUT_Z) ? "z" : ""); |
||
175 | if (flags[0] != 0) { |
||
176 | sprintf(tmp, "o%i.%s", |
||
177 | (code->alu.inst[i]. |
||
178 | rgb_addr >> 29) & 3, |
||
179 | flags); |
||
180 | strcat(dstc, tmp); |
||
181 | } |
||
182 | /* Presub */ |
||
183 | presub_string(srcc[3], code->alu.inst[i].rgb_inst); |
||
184 | presub_string(srca[3], code->alu.inst[i].alpha_inst); |
||
185 | |||
186 | dsta[0] = 0; |
||
187 | if (code->alu.inst[i].alpha_addr & R300_ALU_DSTA_REG) { |
||
188 | unsigned int msb = get_msb( |
||
189 | R400_ADDRD_EXT_A_MSB_BIT, |
||
190 | code->alu.inst[i].r400_ext_addr); |
||
191 | sprintf(dsta, "t%i.w ", |
||
192 | ((code->alu.inst[i]. |
||
193 | alpha_addr >> R300_ALU_DSTA_SHIFT) & 31) |
||
194 | | msb); |
||
195 | } |
||
196 | if (code->alu.inst[i].alpha_addr & R300_ALU_DSTA_OUTPUT) { |
||
197 | sprintf(tmp, "o%i.w ", |
||
198 | (code->alu.inst[i]. |
||
199 | alpha_addr >> 25) & 3); |
||
200 | strcat(dsta, tmp); |
||
201 | } |
||
202 | if (code->alu.inst[i].alpha_addr & R300_ALU_DSTA_DEPTH) { |
||
203 | strcat(dsta, "Z"); |
||
204 | } |
||
205 | |||
206 | fprintf(stderr, |
||
207 | "%3i: xyz: %3s %3s %3s %5s-> %-20s (%08x)\n" |
||
208 | " w: %3s %3s %3s %5s-> %-20s (%08x)\n", i, |
||
209 | srcc[0], srcc[1], srcc[2], srcc[3], dstc, |
||
210 | code->alu.inst[i].rgb_addr, srca[0], srca[1], |
||
211 | srca[2], srca[3], dsta, |
||
212 | code->alu.inst[i].alpha_addr); |
||
213 | |||
214 | for (j = 0; j < 3; ++j) { |
||
215 | int regc = code->alu.inst[i].rgb_inst >> (j * 7); |
||
216 | int rega = code->alu.inst[i].alpha_inst >> (j * 7); |
||
217 | int d; |
||
218 | char buf[20]; |
||
219 | |||
220 | d = regc & 31; |
||
221 | if (d < 12) { |
||
222 | switch (d % 4) { |
||
223 | case R300_ALU_ARGC_SRC0C_XYZ: |
||
224 | sprintf(buf, "%s.xyz", |
||
225 | srcc[d / 4]); |
||
226 | break; |
||
227 | case R300_ALU_ARGC_SRC0C_XXX: |
||
228 | sprintf(buf, "%s.xxx", |
||
229 | srcc[d / 4]); |
||
230 | break; |
||
231 | case R300_ALU_ARGC_SRC0C_YYY: |
||
232 | sprintf(buf, "%s.yyy", |
||
233 | srcc[d / 4]); |
||
234 | break; |
||
235 | case R300_ALU_ARGC_SRC0C_ZZZ: |
||
236 | sprintf(buf, "%s.zzz", |
||
237 | srcc[d / 4]); |
||
238 | break; |
||
239 | } |
||
240 | } else if (d < 15) { |
||
241 | sprintf(buf, "%s.www", srca[d - 12]); |
||
242 | } else if (d < 20 ) { |
||
243 | switch(d) { |
||
244 | case R300_ALU_ARGC_SRCP_XYZ: |
||
245 | sprintf(buf, "srcp.xyz"); |
||
246 | break; |
||
247 | case R300_ALU_ARGC_SRCP_XXX: |
||
248 | sprintf(buf, "srcp.xxx"); |
||
249 | break; |
||
250 | case R300_ALU_ARGC_SRCP_YYY: |
||
251 | sprintf(buf, "srcp.yyy"); |
||
252 | break; |
||
253 | case R300_ALU_ARGC_SRCP_ZZZ: |
||
254 | sprintf(buf, "srcp.zzz"); |
||
255 | break; |
||
256 | case R300_ALU_ARGC_SRCP_WWW: |
||
257 | sprintf(buf, "srcp.www"); |
||
258 | break; |
||
259 | } |
||
260 | } else if (d == 20) { |
||
261 | sprintf(buf, "0.0"); |
||
262 | } else if (d == 21) { |
||
263 | sprintf(buf, "1.0"); |
||
264 | } else if (d == 22) { |
||
265 | sprintf(buf, "0.5"); |
||
266 | } else if (d >= 23 && d < 32) { |
||
267 | d -= 23; |
||
268 | switch (d / 3) { |
||
269 | case 0: |
||
270 | sprintf(buf, "%s.yzx", |
||
271 | srcc[d % 3]); |
||
272 | break; |
||
273 | case 1: |
||
274 | sprintf(buf, "%s.zxy", |
||
275 | srcc[d % 3]); |
||
276 | break; |
||
277 | case 2: |
||
278 | sprintf(buf, "%s.Wzy", |
||
279 | srcc[d % 3]); |
||
280 | break; |
||
281 | } |
||
282 | } else { |
||
283 | sprintf(buf, "%i", d); |
||
284 | } |
||
285 | |||
286 | sprintf(argc[j], "%s%s%s%s", |
||
287 | (regc & 32) ? "-" : "", |
||
288 | (regc & 64) ? "|" : "", |
||
289 | buf, (regc & 64) ? "|" : ""); |
||
290 | |||
291 | d = rega & 31; |
||
292 | if (d < 9) { |
||
293 | sprintf(buf, "%s.%c", srcc[d / 3], |
||
294 | 'x' + (char)(d % 3)); |
||
295 | } else if (d < 12) { |
||
296 | sprintf(buf, "%s.w", srca[d - 9]); |
||
297 | } else if (d < 16) { |
||
298 | switch(d) { |
||
299 | case R300_ALU_ARGA_SRCP_X: |
||
300 | sprintf(buf, "srcp.x"); |
||
301 | break; |
||
302 | case R300_ALU_ARGA_SRCP_Y: |
||
303 | sprintf(buf, "srcp.y"); |
||
304 | break; |
||
305 | case R300_ALU_ARGA_SRCP_Z: |
||
306 | sprintf(buf, "srcp.z"); |
||
307 | break; |
||
308 | case R300_ALU_ARGA_SRCP_W: |
||
309 | sprintf(buf, "srcp.w"); |
||
310 | break; |
||
311 | } |
||
312 | } else if (d == 16) { |
||
313 | sprintf(buf, "0.0"); |
||
314 | } else if (d == 17) { |
||
315 | sprintf(buf, "1.0"); |
||
316 | } else if (d == 18) { |
||
317 | sprintf(buf, "0.5"); |
||
318 | } else { |
||
319 | sprintf(buf, "%i", d); |
||
320 | } |
||
321 | |||
322 | sprintf(arga[j], "%s%s%s%s", |
||
323 | (rega & 32) ? "-" : "", |
||
324 | (rega & 64) ? "|" : "", |
||
325 | buf, (rega & 64) ? "|" : ""); |
||
326 | } |
||
327 | |||
328 | fprintf(stderr, " xyz: %8s %8s %8s op: %08x %s\n" |
||
329 | " w: %8s %8s %8s op: %08x\n", |
||
330 | argc[0], argc[1], argc[2], |
||
331 | code->alu.inst[i].rgb_inst, |
||
332 | code->alu.inst[i].rgb_inst & R300_ALU_INSERT_NOP ? |
||
333 | "NOP" : "", |
||
334 | arga[0], arga[1],arga[2], |
||
335 | code->alu.inst[i].alpha_inst); |
||
336 | } |
||
337 | } |
||
338 | }>>>>>>>>>=>=>><>><>=>><> |