1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © Microsoft Corporation
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker *
11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker * Software.
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker */
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Worker #include "dxil_dump.h"
25*61046927SAndroid Build Coastguard Worker #include "dxil_internal.h"
26*61046927SAndroid Build Coastguard Worker
27*61046927SAndroid Build Coastguard Worker #define DIXL_DUMP_DECL
28*61046927SAndroid Build Coastguard Worker #include "dxil_dump_decls.h"
29*61046927SAndroid Build Coastguard Worker
30*61046927SAndroid Build Coastguard Worker #include "dxil_module.h"
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard Worker #include "util/string_buffer.h"
34*61046927SAndroid Build Coastguard Worker #include "util/list.h"
35*61046927SAndroid Build Coastguard Worker
36*61046927SAndroid Build Coastguard Worker #include <stdio.h>
37*61046927SAndroid Build Coastguard Worker
38*61046927SAndroid Build Coastguard Worker struct dxil_dumper {
39*61046927SAndroid Build Coastguard Worker struct _mesa_string_buffer *buf;
40*61046927SAndroid Build Coastguard Worker int current_indent;
41*61046927SAndroid Build Coastguard Worker };
42*61046927SAndroid Build Coastguard Worker
dxil_dump_create(void)43*61046927SAndroid Build Coastguard Worker struct dxil_dumper *dxil_dump_create(void)
44*61046927SAndroid Build Coastguard Worker {
45*61046927SAndroid Build Coastguard Worker struct dxil_dumper *d = calloc(1, sizeof(struct dxil_dumper));
46*61046927SAndroid Build Coastguard Worker d->buf = _mesa_string_buffer_create(NULL, 1024);
47*61046927SAndroid Build Coastguard Worker d->current_indent = 0;
48*61046927SAndroid Build Coastguard Worker return d;
49*61046927SAndroid Build Coastguard Worker }
50*61046927SAndroid Build Coastguard Worker
dxil_dump_free(struct dxil_dumper * d)51*61046927SAndroid Build Coastguard Worker void dxil_dump_free(struct dxil_dumper *d)
52*61046927SAndroid Build Coastguard Worker {
53*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_destroy(d->buf);
54*61046927SAndroid Build Coastguard Worker d->buf = 0;
55*61046927SAndroid Build Coastguard Worker free(d);
56*61046927SAndroid Build Coastguard Worker }
57*61046927SAndroid Build Coastguard Worker
dxil_dump_buf_to_file(struct dxil_dumper * d,FILE * f)58*61046927SAndroid Build Coastguard Worker void dxil_dump_buf_to_file(struct dxil_dumper *d, FILE *f)
59*61046927SAndroid Build Coastguard Worker {
60*61046927SAndroid Build Coastguard Worker assert(f);
61*61046927SAndroid Build Coastguard Worker assert(d);
62*61046927SAndroid Build Coastguard Worker assert(d->buf);
63*61046927SAndroid Build Coastguard Worker fprintf(f, "%s", d->buf->buf);
64*61046927SAndroid Build Coastguard Worker }
65*61046927SAndroid Build Coastguard Worker
66*61046927SAndroid Build Coastguard Worker static
dxil_dump_indention_inc(struct dxil_dumper * d)67*61046927SAndroid Build Coastguard Worker void dxil_dump_indention_inc(struct dxil_dumper *d)
68*61046927SAndroid Build Coastguard Worker {
69*61046927SAndroid Build Coastguard Worker ++d->current_indent;
70*61046927SAndroid Build Coastguard Worker }
71*61046927SAndroid Build Coastguard Worker
72*61046927SAndroid Build Coastguard Worker static
dxil_dump_indention_dec(struct dxil_dumper * d)73*61046927SAndroid Build Coastguard Worker void dxil_dump_indention_dec(struct dxil_dumper *d)
74*61046927SAndroid Build Coastguard Worker {
75*61046927SAndroid Build Coastguard Worker --d->current_indent;
76*61046927SAndroid Build Coastguard Worker assert(d->current_indent >= 0);
77*61046927SAndroid Build Coastguard Worker }
78*61046927SAndroid Build Coastguard Worker
79*61046927SAndroid Build Coastguard Worker static
dxil_dump_indent(struct dxil_dumper * d)80*61046927SAndroid Build Coastguard Worker void dxil_dump_indent(struct dxil_dumper *d)
81*61046927SAndroid Build Coastguard Worker {
82*61046927SAndroid Build Coastguard Worker for (int i = 0; i < 2 * d->current_indent; ++i)
83*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append_char(d->buf, ' ');
84*61046927SAndroid Build Coastguard Worker }
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Worker void
dxil_dump_module(struct dxil_dumper * d,struct dxil_module * m)87*61046927SAndroid Build Coastguard Worker dxil_dump_module(struct dxil_dumper *d, struct dxil_module *m)
88*61046927SAndroid Build Coastguard Worker {
89*61046927SAndroid Build Coastguard Worker assert(m);
90*61046927SAndroid Build Coastguard Worker assert(d);
91*61046927SAndroid Build Coastguard Worker
92*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "DXIL MODULE:\n");
93*61046927SAndroid Build Coastguard Worker dump_metadata(d, m);
94*61046927SAndroid Build Coastguard Worker dump_shader_info(d, &m->info);
95*61046927SAndroid Build Coastguard Worker dump_types(d, &m->type_list);
96*61046927SAndroid Build Coastguard Worker dump_gvars(d, &m->gvar_list);
97*61046927SAndroid Build Coastguard Worker dump_funcs(d, &m->func_list);
98*61046927SAndroid Build Coastguard Worker dump_attr_set_list(d, &m->attr_set_list);
99*61046927SAndroid Build Coastguard Worker dump_constants(d, &m->const_list);
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard Worker struct dxil_func_def *func_def;
102*61046927SAndroid Build Coastguard Worker LIST_FOR_EACH_ENTRY(func_def, &m->func_def_list, head) {
103*61046927SAndroid Build Coastguard Worker dump_instrs(d, &func_def->instr_list);
104*61046927SAndroid Build Coastguard Worker }
105*61046927SAndroid Build Coastguard Worker
106*61046927SAndroid Build Coastguard Worker dump_mdnodes(d, &m->mdnode_list);
107*61046927SAndroid Build Coastguard Worker dump_named_nodes(d, &m->md_named_node_list);
108*61046927SAndroid Build Coastguard Worker dump_io_signatures(d->buf, m);
109*61046927SAndroid Build Coastguard Worker dump_psv(d->buf, m);
110*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "END DXIL MODULE\n");
111*61046927SAndroid Build Coastguard Worker }
112*61046927SAndroid Build Coastguard Worker
113*61046927SAndroid Build Coastguard Worker static void
dump_metadata(struct dxil_dumper * d,struct dxil_module * m)114*61046927SAndroid Build Coastguard Worker dump_metadata(struct dxil_dumper *d, struct dxil_module *m)
115*61046927SAndroid Build Coastguard Worker {
116*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "Shader: %s\n",
117*61046927SAndroid Build Coastguard Worker dump_shader_string(m->shader_kind));
118*61046927SAndroid Build Coastguard Worker
119*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "Version: %d.%d\n",
120*61046927SAndroid Build Coastguard Worker m->major_version, m->minor_version);
121*61046927SAndroid Build Coastguard Worker
122*61046927SAndroid Build Coastguard Worker dump_features(d->buf, &m->feats);
123*61046927SAndroid Build Coastguard Worker }
124*61046927SAndroid Build Coastguard Worker
125*61046927SAndroid Build Coastguard Worker static void
dump_shader_info(struct dxil_dumper * d,struct dxil_shader_info * info)126*61046927SAndroid Build Coastguard Worker dump_shader_info(struct dxil_dumper *d, struct dxil_shader_info *info)
127*61046927SAndroid Build Coastguard Worker {
128*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "Shader Info:\n");
129*61046927SAndroid Build Coastguard Worker if (info->has_out_position)
130*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, " has_out_position\n");
131*61046927SAndroid Build Coastguard Worker }
132*61046927SAndroid Build Coastguard Worker
133*61046927SAndroid Build Coastguard Worker static const char *
dump_shader_string(enum dxil_shader_kind kind)134*61046927SAndroid Build Coastguard Worker dump_shader_string(enum dxil_shader_kind kind)
135*61046927SAndroid Build Coastguard Worker {
136*61046927SAndroid Build Coastguard Worker #define SHADER_STR(X) case DXIL_ ## X ## _SHADER: return #X
137*61046927SAndroid Build Coastguard Worker
138*61046927SAndroid Build Coastguard Worker switch (kind) {
139*61046927SAndroid Build Coastguard Worker SHADER_STR(VERTEX);
140*61046927SAndroid Build Coastguard Worker SHADER_STR(PIXEL);
141*61046927SAndroid Build Coastguard Worker SHADER_STR(GEOMETRY);
142*61046927SAndroid Build Coastguard Worker SHADER_STR(COMPUTE);
143*61046927SAndroid Build Coastguard Worker default:
144*61046927SAndroid Build Coastguard Worker return "UNSUPPORTED";
145*61046927SAndroid Build Coastguard Worker }
146*61046927SAndroid Build Coastguard Worker #undef SHADER_STR
147*61046927SAndroid Build Coastguard Worker }
148*61046927SAndroid Build Coastguard Worker
149*61046927SAndroid Build Coastguard Worker static void
dump_features(struct _mesa_string_buffer * buf,struct dxil_features * feat)150*61046927SAndroid Build Coastguard Worker dump_features(struct _mesa_string_buffer *buf, struct dxil_features *feat)
151*61046927SAndroid Build Coastguard Worker {
152*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(buf, "Features:\n");
153*61046927SAndroid Build Coastguard Worker #define PRINT_FEAT(F) if (feat->F) _mesa_string_buffer_printf(buf, " %s\n", #F)
154*61046927SAndroid Build Coastguard Worker PRINT_FEAT(doubles);
155*61046927SAndroid Build Coastguard Worker PRINT_FEAT(cs_4x_raw_sb);
156*61046927SAndroid Build Coastguard Worker PRINT_FEAT(uavs_at_every_stage);
157*61046927SAndroid Build Coastguard Worker PRINT_FEAT(use_64uavs);
158*61046927SAndroid Build Coastguard Worker PRINT_FEAT(min_precision);
159*61046927SAndroid Build Coastguard Worker PRINT_FEAT(dx11_1_double_extensions);
160*61046927SAndroid Build Coastguard Worker PRINT_FEAT(dx11_1_shader_extensions);
161*61046927SAndroid Build Coastguard Worker PRINT_FEAT(dx9_comparison_filtering);
162*61046927SAndroid Build Coastguard Worker PRINT_FEAT(tiled_resources);
163*61046927SAndroid Build Coastguard Worker PRINT_FEAT(stencil_ref);
164*61046927SAndroid Build Coastguard Worker PRINT_FEAT(inner_coverage);
165*61046927SAndroid Build Coastguard Worker PRINT_FEAT(typed_uav_load_additional_formats);
166*61046927SAndroid Build Coastguard Worker PRINT_FEAT(rovs);
167*61046927SAndroid Build Coastguard Worker PRINT_FEAT(array_layer_from_vs_or_ds);
168*61046927SAndroid Build Coastguard Worker PRINT_FEAT(wave_ops);
169*61046927SAndroid Build Coastguard Worker PRINT_FEAT(int64_ops);
170*61046927SAndroid Build Coastguard Worker PRINT_FEAT(view_id);
171*61046927SAndroid Build Coastguard Worker PRINT_FEAT(barycentrics);
172*61046927SAndroid Build Coastguard Worker PRINT_FEAT(native_low_precision);
173*61046927SAndroid Build Coastguard Worker PRINT_FEAT(shading_rate);
174*61046927SAndroid Build Coastguard Worker PRINT_FEAT(raytracing_tier_1_1);
175*61046927SAndroid Build Coastguard Worker PRINT_FEAT(sampler_feedback);
176*61046927SAndroid Build Coastguard Worker #undef PRINT_FEAT
177*61046927SAndroid Build Coastguard Worker }
178*61046927SAndroid Build Coastguard Worker
179*61046927SAndroid Build Coastguard Worker static void
dump_types(struct dxil_dumper * d,struct list_head * list)180*61046927SAndroid Build Coastguard Worker dump_types(struct dxil_dumper *d, struct list_head *list)
181*61046927SAndroid Build Coastguard Worker {
182*61046927SAndroid Build Coastguard Worker if (!list_length(list))
183*61046927SAndroid Build Coastguard Worker return;
184*61046927SAndroid Build Coastguard Worker
185*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "Types:\n");
186*61046927SAndroid Build Coastguard Worker dxil_dump_indention_inc(d);
187*61046927SAndroid Build Coastguard Worker list_for_each_entry(struct dxil_type, type, list, head) {
188*61046927SAndroid Build Coastguard Worker dxil_dump_indent(d);
189*61046927SAndroid Build Coastguard Worker dump_type(d, type);
190*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "\n");
191*61046927SAndroid Build Coastguard Worker }
192*61046927SAndroid Build Coastguard Worker dxil_dump_indention_dec(d);
193*61046927SAndroid Build Coastguard Worker }
194*61046927SAndroid Build Coastguard Worker
dump_type_name(struct dxil_dumper * d,const struct dxil_type * type)195*61046927SAndroid Build Coastguard Worker static void dump_type_name(struct dxil_dumper *d, const struct dxil_type *type)
196*61046927SAndroid Build Coastguard Worker {
197*61046927SAndroid Build Coastguard Worker if (!type) {
198*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "(type error)");
199*61046927SAndroid Build Coastguard Worker return;
200*61046927SAndroid Build Coastguard Worker }
201*61046927SAndroid Build Coastguard Worker
202*61046927SAndroid Build Coastguard Worker switch (type->type) {
203*61046927SAndroid Build Coastguard Worker case TYPE_VOID:
204*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "void");
205*61046927SAndroid Build Coastguard Worker break;
206*61046927SAndroid Build Coastguard Worker case TYPE_INTEGER:
207*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "int%d", type->int_bits);
208*61046927SAndroid Build Coastguard Worker break;
209*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT:
210*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "float%d", type->float_bits);
211*61046927SAndroid Build Coastguard Worker break;
212*61046927SAndroid Build Coastguard Worker case TYPE_POINTER:
213*61046927SAndroid Build Coastguard Worker dump_type_name(d, type->ptr_target_type);
214*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "*");
215*61046927SAndroid Build Coastguard Worker break;
216*61046927SAndroid Build Coastguard Worker case TYPE_STRUCT:
217*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "struct %s", type->struct_def.name);
218*61046927SAndroid Build Coastguard Worker break;
219*61046927SAndroid Build Coastguard Worker case TYPE_ARRAY:
220*61046927SAndroid Build Coastguard Worker dump_type_name(d, type->array_or_vector_def.elem_type);
221*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "[%zu]", type->array_or_vector_def.num_elems);
222*61046927SAndroid Build Coastguard Worker break;
223*61046927SAndroid Build Coastguard Worker case TYPE_FUNCTION:
224*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "(");
225*61046927SAndroid Build Coastguard Worker dump_type_name(d, type->function_def.ret_type);
226*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, ")(");
227*61046927SAndroid Build Coastguard Worker for (size_t i = 0; i < type->function_def.args.num_types; ++i) {
228*61046927SAndroid Build Coastguard Worker if (i > 0)
229*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, ", ");
230*61046927SAndroid Build Coastguard Worker dump_type_name(d, type->function_def.args.types[i]);
231*61046927SAndroid Build Coastguard Worker }
232*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, ")");
233*61046927SAndroid Build Coastguard Worker break;
234*61046927SAndroid Build Coastguard Worker case TYPE_VECTOR:
235*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "vector<");
236*61046927SAndroid Build Coastguard Worker dump_type_name(d, type->array_or_vector_def.elem_type);
237*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, ", %zu>", type->array_or_vector_def.num_elems);
238*61046927SAndroid Build Coastguard Worker break;
239*61046927SAndroid Build Coastguard Worker default:
240*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "unknown type %d", type->type);
241*61046927SAndroid Build Coastguard Worker }
242*61046927SAndroid Build Coastguard Worker }
243*61046927SAndroid Build Coastguard Worker
244*61046927SAndroid Build Coastguard Worker static void
dump_type(struct dxil_dumper * d,const struct dxil_type * type)245*61046927SAndroid Build Coastguard Worker dump_type(struct dxil_dumper *d, const struct dxil_type *type)
246*61046927SAndroid Build Coastguard Worker {
247*61046927SAndroid Build Coastguard Worker switch (type->type) {
248*61046927SAndroid Build Coastguard Worker case TYPE_STRUCT:
249*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "struct %s {\n", type->struct_def.name);
250*61046927SAndroid Build Coastguard Worker dxil_dump_indention_inc(d);
251*61046927SAndroid Build Coastguard Worker
252*61046927SAndroid Build Coastguard Worker for (size_t i = 0; i < type->struct_def.elem.num_types; ++i) {
253*61046927SAndroid Build Coastguard Worker dxil_dump_indent(d);
254*61046927SAndroid Build Coastguard Worker dump_type(d, type->struct_def.elem.types[i]);
255*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "\n");
256*61046927SAndroid Build Coastguard Worker }
257*61046927SAndroid Build Coastguard Worker dxil_dump_indention_dec(d);
258*61046927SAndroid Build Coastguard Worker dxil_dump_indent(d);
259*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "}\n");
260*61046927SAndroid Build Coastguard Worker break;
261*61046927SAndroid Build Coastguard Worker default:
262*61046927SAndroid Build Coastguard Worker dump_type_name(d, type);
263*61046927SAndroid Build Coastguard Worker break;
264*61046927SAndroid Build Coastguard Worker }
265*61046927SAndroid Build Coastguard Worker }
266*61046927SAndroid Build Coastguard Worker
267*61046927SAndroid Build Coastguard Worker static void
dump_gvars(struct dxil_dumper * d,struct list_head * list)268*61046927SAndroid Build Coastguard Worker dump_gvars(struct dxil_dumper *d, struct list_head *list)
269*61046927SAndroid Build Coastguard Worker {
270*61046927SAndroid Build Coastguard Worker if (!list_length(list))
271*61046927SAndroid Build Coastguard Worker return;
272*61046927SAndroid Build Coastguard Worker
273*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "Global variables:\n");
274*61046927SAndroid Build Coastguard Worker dxil_dump_indention_inc(d);
275*61046927SAndroid Build Coastguard Worker list_for_each_entry(struct dxil_gvar, gvar, list, head) {
276*61046927SAndroid Build Coastguard Worker dxil_dump_indent(d);
277*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "address_space(%d) ", gvar->as);
278*61046927SAndroid Build Coastguard Worker if (gvar->constant)
279*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "const ");
280*61046927SAndroid Build Coastguard Worker if (gvar->align)
281*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "align ");
282*61046927SAndroid Build Coastguard Worker if (gvar->initializer)
283*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "init_id:%d\n", gvar->initializer->id);
284*61046927SAndroid Build Coastguard Worker dump_type_name(d, gvar->type);
285*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, " val_id:%d\n", gvar->value.id);
286*61046927SAndroid Build Coastguard Worker }
287*61046927SAndroid Build Coastguard Worker dxil_dump_indention_dec(d);
288*61046927SAndroid Build Coastguard Worker }
289*61046927SAndroid Build Coastguard Worker
290*61046927SAndroid Build Coastguard Worker static void
dump_funcs(struct dxil_dumper * d,struct list_head * list)291*61046927SAndroid Build Coastguard Worker dump_funcs(struct dxil_dumper *d, struct list_head *list)
292*61046927SAndroid Build Coastguard Worker {
293*61046927SAndroid Build Coastguard Worker if (!list_length(list))
294*61046927SAndroid Build Coastguard Worker return;
295*61046927SAndroid Build Coastguard Worker
296*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "Functions:\n");
297*61046927SAndroid Build Coastguard Worker dxil_dump_indention_inc(d);
298*61046927SAndroid Build Coastguard Worker list_for_each_entry(struct dxil_func, func, list, head) {
299*61046927SAndroid Build Coastguard Worker dxil_dump_indent(d);
300*61046927SAndroid Build Coastguard Worker if (func->decl)
301*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "declare ");
302*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, func->name);
303*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append_char(d->buf, ' ');
304*61046927SAndroid Build Coastguard Worker dump_type_name(d, func->type);
305*61046927SAndroid Build Coastguard Worker if (func->attr_set)
306*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, " #%d", func->attr_set);
307*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append_char(d->buf, '\n');
308*61046927SAndroid Build Coastguard Worker }
309*61046927SAndroid Build Coastguard Worker dxil_dump_indention_dec(d);
310*61046927SAndroid Build Coastguard Worker }
311*61046927SAndroid Build Coastguard Worker
312*61046927SAndroid Build Coastguard Worker static void
dump_attr_set_list(struct dxil_dumper * d,struct list_head * list)313*61046927SAndroid Build Coastguard Worker dump_attr_set_list(struct dxil_dumper *d, struct list_head *list)
314*61046927SAndroid Build Coastguard Worker {
315*61046927SAndroid Build Coastguard Worker if (!list_length(list))
316*61046927SAndroid Build Coastguard Worker return;
317*61046927SAndroid Build Coastguard Worker
318*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "Attribute set:\n");
319*61046927SAndroid Build Coastguard Worker dxil_dump_indention_inc(d);
320*61046927SAndroid Build Coastguard Worker int attr_id = 1;
321*61046927SAndroid Build Coastguard Worker list_for_each_entry(struct attrib_set, attr, list, head) {
322*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, " #%d: {", attr_id++);
323*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < attr->num_attrs; ++i) {
324*61046927SAndroid Build Coastguard Worker if (i > 0)
325*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append_char(d->buf, ' ');
326*61046927SAndroid Build Coastguard Worker
327*61046927SAndroid Build Coastguard Worker if (attr->attrs[i].type == DXIL_ATTR_ENUM) {
328*61046927SAndroid Build Coastguard Worker const char *value = "";
329*61046927SAndroid Build Coastguard Worker switch (attr->attrs[i].key.kind) {
330*61046927SAndroid Build Coastguard Worker case DXIL_ATTR_KIND_NONE: value = "none"; break;
331*61046927SAndroid Build Coastguard Worker case DXIL_ATTR_KIND_NO_UNWIND: value = "nounwind"; break;
332*61046927SAndroid Build Coastguard Worker case DXIL_ATTR_KIND_READ_NONE: value = "readnone"; break;
333*61046927SAndroid Build Coastguard Worker case DXIL_ATTR_KIND_READ_ONLY: value = "readonly"; break;
334*61046927SAndroid Build Coastguard Worker case DXIL_ATTR_KIND_NO_DUPLICATE: value = "noduplicate"; break;
335*61046927SAndroid Build Coastguard Worker }
336*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, value);
337*61046927SAndroid Build Coastguard Worker } else if (attr->attrs[i].type == DXIL_ATTR_STRING) {
338*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append_char(d->buf, '"');
339*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, attr->attrs[i].key.str);
340*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append_char(d->buf, '"');
341*61046927SAndroid Build Coastguard Worker } else if (attr->attrs[i].type == DXIL_ATTR_STRING_VALUE) {
342*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append_char(d->buf, '"');
343*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, attr->attrs[i].key.str);
344*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "\"=\"");
345*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, attr->attrs[i].value.str);
346*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append_char(d->buf, '"');
347*61046927SAndroid Build Coastguard Worker }
348*61046927SAndroid Build Coastguard Worker }
349*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "}\n");
350*61046927SAndroid Build Coastguard Worker }
351*61046927SAndroid Build Coastguard Worker dxil_dump_indention_dec(d);
352*61046927SAndroid Build Coastguard Worker }
353*61046927SAndroid Build Coastguard Worker
354*61046927SAndroid Build Coastguard Worker static void
dump_constants(struct dxil_dumper * d,struct list_head * list)355*61046927SAndroid Build Coastguard Worker dump_constants(struct dxil_dumper *d, struct list_head *list)
356*61046927SAndroid Build Coastguard Worker {
357*61046927SAndroid Build Coastguard Worker if (!list_length(list))
358*61046927SAndroid Build Coastguard Worker return;
359*61046927SAndroid Build Coastguard Worker
360*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "Constants:\n");
361*61046927SAndroid Build Coastguard Worker dxil_dump_indention_inc(d);
362*61046927SAndroid Build Coastguard Worker list_for_each_entry(struct dxil_const, cnst, list, head) {
363*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append_char(d->buf, ' ');
364*61046927SAndroid Build Coastguard Worker dump_value(d, &cnst->value);
365*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, " = ");
366*61046927SAndroid Build Coastguard Worker dump_type_name(d, cnst->value.type);
367*61046927SAndroid Build Coastguard Worker if (!cnst->undef) {
368*61046927SAndroid Build Coastguard Worker switch (cnst->value.type->type) {
369*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT:
370*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, " %10.5f\n", cnst->float_value);
371*61046927SAndroid Build Coastguard Worker break;
372*61046927SAndroid Build Coastguard Worker case TYPE_INTEGER:
373*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, " %" PRIdMAX "\n", cnst->int_value);
374*61046927SAndroid Build Coastguard Worker break;
375*61046927SAndroid Build Coastguard Worker case TYPE_ARRAY:
376*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "{");
377*61046927SAndroid Build Coastguard Worker for (unsigned i = 0;
378*61046927SAndroid Build Coastguard Worker i < cnst->value.type->array_or_vector_def.num_elems; i++) {
379*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, " %%%d",
380*61046927SAndroid Build Coastguard Worker cnst->array_values[i]->id);
381*61046927SAndroid Build Coastguard Worker dump_type_name(d, cnst->value.type);
382*61046927SAndroid Build Coastguard Worker if (i != cnst->value.type->array_or_vector_def.num_elems - 1)
383*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, ",");
384*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, " ");
385*61046927SAndroid Build Coastguard Worker }
386*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "}\n");
387*61046927SAndroid Build Coastguard Worker break;
388*61046927SAndroid Build Coastguard Worker case TYPE_STRUCT:
389*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "{");
390*61046927SAndroid Build Coastguard Worker for (unsigned i = 0;
391*61046927SAndroid Build Coastguard Worker i < cnst->value.type->struct_def.elem.num_types; i++) {
392*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, " %%%d",
393*61046927SAndroid Build Coastguard Worker cnst->struct_values[i]->id);
394*61046927SAndroid Build Coastguard Worker dump_type_name(d, cnst->struct_values[i]->type);
395*61046927SAndroid Build Coastguard Worker if (i != cnst->value.type->struct_def.elem.num_types - 1)
396*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, ",");
397*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, " ");
398*61046927SAndroid Build Coastguard Worker }
399*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "}\n");
400*61046927SAndroid Build Coastguard Worker break;
401*61046927SAndroid Build Coastguard Worker default:
402*61046927SAndroid Build Coastguard Worker unreachable("Unsupported const type");
403*61046927SAndroid Build Coastguard Worker }
404*61046927SAndroid Build Coastguard Worker } else
405*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, " undef\n");
406*61046927SAndroid Build Coastguard Worker }
407*61046927SAndroid Build Coastguard Worker dxil_dump_indention_dec(d);
408*61046927SAndroid Build Coastguard Worker }
409*61046927SAndroid Build Coastguard Worker
410*61046927SAndroid Build Coastguard Worker static void
dump_instrs(struct dxil_dumper * d,struct list_head * list)411*61046927SAndroid Build Coastguard Worker dump_instrs(struct dxil_dumper *d, struct list_head *list)
412*61046927SAndroid Build Coastguard Worker {
413*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "Shader body:\n");
414*61046927SAndroid Build Coastguard Worker dxil_dump_indention_inc(d);
415*61046927SAndroid Build Coastguard Worker
416*61046927SAndroid Build Coastguard Worker list_for_each_entry(struct dxil_instr, instr, list, head) {
417*61046927SAndroid Build Coastguard Worker
418*61046927SAndroid Build Coastguard Worker dxil_dump_indent(d);
419*61046927SAndroid Build Coastguard Worker if (instr->has_value) {
420*61046927SAndroid Build Coastguard Worker dump_value(d, &instr->value);
421*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, " = ");
422*61046927SAndroid Build Coastguard Worker } else {
423*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append_char(d->buf, ' ');
424*61046927SAndroid Build Coastguard Worker }
425*61046927SAndroid Build Coastguard Worker
426*61046927SAndroid Build Coastguard Worker switch (instr->type) {
427*61046927SAndroid Build Coastguard Worker case INSTR_BINOP: dump_instr_binop(d, &instr->binop); break;
428*61046927SAndroid Build Coastguard Worker case INSTR_CMP: dump_instr_cmp(d, &instr->cmp);break;
429*61046927SAndroid Build Coastguard Worker case INSTR_SELECT:dump_instr_select(d, &instr->select); break;
430*61046927SAndroid Build Coastguard Worker case INSTR_CAST: dump_instr_cast(d, &instr->cast); break;
431*61046927SAndroid Build Coastguard Worker case INSTR_CALL: dump_instr_call(d, &instr->call); break;
432*61046927SAndroid Build Coastguard Worker case INSTR_RET: dump_instr_ret(d, &instr->ret); break;
433*61046927SAndroid Build Coastguard Worker case INSTR_EXTRACTVAL: dump_instr_extractval(d, &instr->extractval); break;
434*61046927SAndroid Build Coastguard Worker case INSTR_BR: dump_instr_branch(d, &instr->br); break;
435*61046927SAndroid Build Coastguard Worker case INSTR_PHI: dump_instr_phi(d, &instr->phi); break;
436*61046927SAndroid Build Coastguard Worker case INSTR_ALLOCA: dump_instr_alloca(d, &instr->alloca); break;
437*61046927SAndroid Build Coastguard Worker case INSTR_GEP: dump_instr_gep(d, &instr->gep); break;
438*61046927SAndroid Build Coastguard Worker case INSTR_LOAD: dump_instr_load(d, &instr->load); break;
439*61046927SAndroid Build Coastguard Worker case INSTR_STORE: dump_instr_store(d, &instr->store); break;
440*61046927SAndroid Build Coastguard Worker case INSTR_ATOMICRMW: dump_instr_atomicrmw(d, &instr->atomicrmw); break;
441*61046927SAndroid Build Coastguard Worker default:
442*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "unknown instruction type %d", instr->type);
443*61046927SAndroid Build Coastguard Worker }
444*61046927SAndroid Build Coastguard Worker
445*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "\n");
446*61046927SAndroid Build Coastguard Worker }
447*61046927SAndroid Build Coastguard Worker dxil_dump_indention_dec(d);
448*61046927SAndroid Build Coastguard Worker }
449*61046927SAndroid Build Coastguard Worker
450*61046927SAndroid Build Coastguard Worker static void
dump_instr_binop(struct dxil_dumper * d,struct dxil_instr_binop * binop)451*61046927SAndroid Build Coastguard Worker dump_instr_binop(struct dxil_dumper *d, struct dxil_instr_binop *binop)
452*61046927SAndroid Build Coastguard Worker {
453*61046927SAndroid Build Coastguard Worker const char *str = binop->opcode < DXIL_BINOP_INSTR_COUNT ?
454*61046927SAndroid Build Coastguard Worker binop_strings[binop->opcode] : "INVALID";
455*61046927SAndroid Build Coastguard Worker
456*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "%s ", str);
457*61046927SAndroid Build Coastguard Worker dump_instr_print_operands(d, 2, binop->operands);
458*61046927SAndroid Build Coastguard Worker }
459*61046927SAndroid Build Coastguard Worker
460*61046927SAndroid Build Coastguard Worker static void
dump_instr_cmp(struct dxil_dumper * d,struct dxil_instr_cmp * cmp)461*61046927SAndroid Build Coastguard Worker dump_instr_cmp(struct dxil_dumper *d, struct dxil_instr_cmp *cmp)
462*61046927SAndroid Build Coastguard Worker {
463*61046927SAndroid Build Coastguard Worker const char *str = cmp->pred < DXIL_CMP_INSTR_COUNT ?
464*61046927SAndroid Build Coastguard Worker pred_strings[cmp->pred] : "INVALID";
465*61046927SAndroid Build Coastguard Worker
466*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "%s ", str);
467*61046927SAndroid Build Coastguard Worker dump_instr_print_operands(d, 2, cmp->operands);
468*61046927SAndroid Build Coastguard Worker }
469*61046927SAndroid Build Coastguard Worker
470*61046927SAndroid Build Coastguard Worker static void
dump_instr_select(struct dxil_dumper * d,struct dxil_instr_select * select)471*61046927SAndroid Build Coastguard Worker dump_instr_select(struct dxil_dumper *d, struct dxil_instr_select *select)
472*61046927SAndroid Build Coastguard Worker {
473*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "sel ");
474*61046927SAndroid Build Coastguard Worker dump_instr_print_operands(d, 3, select->operands);
475*61046927SAndroid Build Coastguard Worker }
476*61046927SAndroid Build Coastguard Worker
477*61046927SAndroid Build Coastguard Worker static void
dump_instr_cast(struct dxil_dumper * d,struct dxil_instr_cast * cast)478*61046927SAndroid Build Coastguard Worker dump_instr_cast(struct dxil_dumper *d, struct dxil_instr_cast *cast)
479*61046927SAndroid Build Coastguard Worker {
480*61046927SAndroid Build Coastguard Worker const char *str = cast->opcode < DXIL_CAST_INSTR_COUNT ?
481*61046927SAndroid Build Coastguard Worker cast_opcode_strings[cast->opcode] : "INVALID";
482*61046927SAndroid Build Coastguard Worker
483*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "%s.", str);
484*61046927SAndroid Build Coastguard Worker dump_type_name(d, cast->type);
485*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append_char(d->buf, ' ');
486*61046927SAndroid Build Coastguard Worker dump_value(d, cast->value);
487*61046927SAndroid Build Coastguard Worker }
488*61046927SAndroid Build Coastguard Worker
489*61046927SAndroid Build Coastguard Worker static void
dump_instr_call(struct dxil_dumper * d,struct dxil_instr_call * call)490*61046927SAndroid Build Coastguard Worker dump_instr_call(struct dxil_dumper *d, struct dxil_instr_call *call)
491*61046927SAndroid Build Coastguard Worker {
492*61046927SAndroid Build Coastguard Worker assert(call->num_args == call->func->type->function_def.args.num_types);
493*61046927SAndroid Build Coastguard Worker struct dxil_type **func_arg_types = call->func->type->function_def.args.types;
494*61046927SAndroid Build Coastguard Worker
495*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "%s(", call->func->name);
496*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < call->num_args; ++i) {
497*61046927SAndroid Build Coastguard Worker if (i > 0)
498*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, ", ");
499*61046927SAndroid Build Coastguard Worker dump_type_name(d, func_arg_types[i]);
500*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append_char(d->buf, ' ');
501*61046927SAndroid Build Coastguard Worker dump_value(d, call->args[i]);
502*61046927SAndroid Build Coastguard Worker }
503*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append_char(d->buf, ')');
504*61046927SAndroid Build Coastguard Worker }
505*61046927SAndroid Build Coastguard Worker
506*61046927SAndroid Build Coastguard Worker static void
dump_instr_ret(struct dxil_dumper * d,struct dxil_instr_ret * ret)507*61046927SAndroid Build Coastguard Worker dump_instr_ret(struct dxil_dumper *d, struct dxil_instr_ret *ret)
508*61046927SAndroid Build Coastguard Worker {
509*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "ret ");
510*61046927SAndroid Build Coastguard Worker if (ret->value)
511*61046927SAndroid Build Coastguard Worker dump_value(d, ret->value);
512*61046927SAndroid Build Coastguard Worker }
513*61046927SAndroid Build Coastguard Worker
514*61046927SAndroid Build Coastguard Worker static void
dump_instr_extractval(struct dxil_dumper * d,struct dxil_instr_extractval * extr)515*61046927SAndroid Build Coastguard Worker dump_instr_extractval(struct dxil_dumper *d, struct dxil_instr_extractval *extr)
516*61046927SAndroid Build Coastguard Worker {
517*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "extractvalue ");
518*61046927SAndroid Build Coastguard Worker dump_type_name(d, extr->type);
519*61046927SAndroid Build Coastguard Worker dump_value(d, extr->src);
520*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, ", %d", extr->idx);
521*61046927SAndroid Build Coastguard Worker }
522*61046927SAndroid Build Coastguard Worker
523*61046927SAndroid Build Coastguard Worker static void
dump_instr_branch(struct dxil_dumper * d,struct dxil_instr_br * br)524*61046927SAndroid Build Coastguard Worker dump_instr_branch(struct dxil_dumper *d, struct dxil_instr_br *br)
525*61046927SAndroid Build Coastguard Worker {
526*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "branch ");
527*61046927SAndroid Build Coastguard Worker if (br->cond)
528*61046927SAndroid Build Coastguard Worker dump_value(d, br->cond);
529*61046927SAndroid Build Coastguard Worker else
530*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, " (uncond)");
531*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, " %d %d", br->succ[0], br->succ[1]);
532*61046927SAndroid Build Coastguard Worker }
533*61046927SAndroid Build Coastguard Worker
534*61046927SAndroid Build Coastguard Worker static void
dump_instr_phi(struct dxil_dumper * d,struct dxil_instr_phi * phi)535*61046927SAndroid Build Coastguard Worker dump_instr_phi(struct dxil_dumper *d, struct dxil_instr_phi *phi)
536*61046927SAndroid Build Coastguard Worker {
537*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "phi ");
538*61046927SAndroid Build Coastguard Worker dump_type_name(d, phi->type);
539*61046927SAndroid Build Coastguard Worker struct dxil_phi_src *src = phi->incoming;
540*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < phi->num_incoming; ++i, ++src) {
541*61046927SAndroid Build Coastguard Worker if (i > 0)
542*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, ", ");
543*61046927SAndroid Build Coastguard Worker dump_value(d, src->value);
544*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "(%d)", src->block);
545*61046927SAndroid Build Coastguard Worker }
546*61046927SAndroid Build Coastguard Worker }
547*61046927SAndroid Build Coastguard Worker
548*61046927SAndroid Build Coastguard Worker static void
dump_instr_alloca(struct dxil_dumper * d,struct dxil_instr_alloca * alloca)549*61046927SAndroid Build Coastguard Worker dump_instr_alloca(struct dxil_dumper *d, struct dxil_instr_alloca *alloca)
550*61046927SAndroid Build Coastguard Worker {
551*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "alloca ");
552*61046927SAndroid Build Coastguard Worker dump_type_name(d, alloca->alloc_type);
553*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, ", ");
554*61046927SAndroid Build Coastguard Worker dump_type_name(d, alloca->size_type);
555*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, ", ");
556*61046927SAndroid Build Coastguard Worker dump_value(d, alloca->size);
557*61046927SAndroid Build Coastguard Worker unsigned align_mask = (1 << 6 ) - 1;
558*61046927SAndroid Build Coastguard Worker unsigned align = alloca->align & align_mask;
559*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, ", %d", 1 << (align - 1));
560*61046927SAndroid Build Coastguard Worker }
561*61046927SAndroid Build Coastguard Worker
562*61046927SAndroid Build Coastguard Worker static void
dump_instr_gep(struct dxil_dumper * d,struct dxil_instr_gep * gep)563*61046927SAndroid Build Coastguard Worker dump_instr_gep(struct dxil_dumper *d, struct dxil_instr_gep *gep)
564*61046927SAndroid Build Coastguard Worker {
565*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "getelementptr ");
566*61046927SAndroid Build Coastguard Worker if (gep->inbounds)
567*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "inbounds ");
568*61046927SAndroid Build Coastguard Worker dump_type_name(d, gep->source_elem_type);
569*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, ", ");
570*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < gep->num_operands; ++i) {
571*61046927SAndroid Build Coastguard Worker if (i > 0)
572*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, ", ");
573*61046927SAndroid Build Coastguard Worker dump_value(d, gep->operands[i]);
574*61046927SAndroid Build Coastguard Worker }
575*61046927SAndroid Build Coastguard Worker }
576*61046927SAndroid Build Coastguard Worker
577*61046927SAndroid Build Coastguard Worker static void
dump_instr_load(struct dxil_dumper * d,struct dxil_instr_load * load)578*61046927SAndroid Build Coastguard Worker dump_instr_load(struct dxil_dumper *d, struct dxil_instr_load *load)
579*61046927SAndroid Build Coastguard Worker {
580*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "load ");
581*61046927SAndroid Build Coastguard Worker if (load->is_volatile)
582*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, " volatile");
583*61046927SAndroid Build Coastguard Worker dump_type_name(d, load->type);
584*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, ", ");
585*61046927SAndroid Build Coastguard Worker dump_value(d, load->ptr);
586*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, ", %d", load->align);
587*61046927SAndroid Build Coastguard Worker }
588*61046927SAndroid Build Coastguard Worker
589*61046927SAndroid Build Coastguard Worker static void
dump_instr_store(struct dxil_dumper * d,struct dxil_instr_store * store)590*61046927SAndroid Build Coastguard Worker dump_instr_store(struct dxil_dumper *d, struct dxil_instr_store *store)
591*61046927SAndroid Build Coastguard Worker {
592*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "store ");
593*61046927SAndroid Build Coastguard Worker if (store->is_volatile)
594*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, " volatile");
595*61046927SAndroid Build Coastguard Worker dump_value(d, store->value);
596*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, ", ");
597*61046927SAndroid Build Coastguard Worker dump_value(d, store->ptr);
598*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, ", %d", store->align);
599*61046927SAndroid Build Coastguard Worker }
600*61046927SAndroid Build Coastguard Worker
601*61046927SAndroid Build Coastguard Worker static const char *rmworder_str[] = {
602*61046927SAndroid Build Coastguard Worker [DXIL_ATOMIC_ORDERING_NOTATOMIC] = "not-atomic",
603*61046927SAndroid Build Coastguard Worker [DXIL_ATOMIC_ORDERING_UNORDERED] = "unordered",
604*61046927SAndroid Build Coastguard Worker [DXIL_ATOMIC_ORDERING_MONOTONIC] = "monotonic",
605*61046927SAndroid Build Coastguard Worker [DXIL_ATOMIC_ORDERING_ACQUIRE] = "acquire",
606*61046927SAndroid Build Coastguard Worker [DXIL_ATOMIC_ORDERING_RELEASE] = "release",
607*61046927SAndroid Build Coastguard Worker [DXIL_ATOMIC_ORDERING_ACQREL] = "acqrel",
608*61046927SAndroid Build Coastguard Worker [DXIL_ATOMIC_ORDERING_SEQCST] = "seqcst",
609*61046927SAndroid Build Coastguard Worker };
610*61046927SAndroid Build Coastguard Worker
611*61046927SAndroid Build Coastguard Worker static const char *rmwsync_str[] = {
612*61046927SAndroid Build Coastguard Worker [DXIL_SYNC_SCOPE_SINGLETHREAD] = "single-thread",
613*61046927SAndroid Build Coastguard Worker [DXIL_SYNC_SCOPE_CROSSTHREAD] = "cross-thread",
614*61046927SAndroid Build Coastguard Worker };
615*61046927SAndroid Build Coastguard Worker
616*61046927SAndroid Build Coastguard Worker static const char *rmwop_str[] = {
617*61046927SAndroid Build Coastguard Worker [DXIL_RMWOP_XCHG] = "xchg",
618*61046927SAndroid Build Coastguard Worker [DXIL_RMWOP_ADD] = "add",
619*61046927SAndroid Build Coastguard Worker [DXIL_RMWOP_SUB] = "sub",
620*61046927SAndroid Build Coastguard Worker [DXIL_RMWOP_AND] = "and",
621*61046927SAndroid Build Coastguard Worker [DXIL_RMWOP_NAND] = "nand",
622*61046927SAndroid Build Coastguard Worker [DXIL_RMWOP_OR] = "or",
623*61046927SAndroid Build Coastguard Worker [DXIL_RMWOP_XOR] = "xor",
624*61046927SAndroid Build Coastguard Worker [DXIL_RMWOP_MAX] = "max",
625*61046927SAndroid Build Coastguard Worker [DXIL_RMWOP_MIN] = "min",
626*61046927SAndroid Build Coastguard Worker [DXIL_RMWOP_UMAX] = "umax",
627*61046927SAndroid Build Coastguard Worker [DXIL_RMWOP_UMIN] = "umin",
628*61046927SAndroid Build Coastguard Worker };
629*61046927SAndroid Build Coastguard Worker
630*61046927SAndroid Build Coastguard Worker static void
dump_instr_atomicrmw(struct dxil_dumper * d,struct dxil_instr_atomicrmw * rmw)631*61046927SAndroid Build Coastguard Worker dump_instr_atomicrmw(struct dxil_dumper *d, struct dxil_instr_atomicrmw *rmw)
632*61046927SAndroid Build Coastguard Worker {
633*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "atomicrmw.%s ", rmwop_str[rmw->op]);
634*61046927SAndroid Build Coastguard Worker
635*61046927SAndroid Build Coastguard Worker if (rmw->is_volatile)
636*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, " volatile");
637*61046927SAndroid Build Coastguard Worker dump_value(d, rmw->value);
638*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, ", ");
639*61046927SAndroid Build Coastguard Worker dump_value(d, rmw->ptr);
640*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, ", ordering(%s)", rmworder_str[rmw->ordering]);
641*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, ", sync_scope(%s)", rmwsync_str[rmw->syncscope]);
642*61046927SAndroid Build Coastguard Worker }
643*61046927SAndroid Build Coastguard Worker
644*61046927SAndroid Build Coastguard Worker static void
dump_instr_print_operands(struct dxil_dumper * d,int num,const struct dxil_value * val[])645*61046927SAndroid Build Coastguard Worker dump_instr_print_operands(struct dxil_dumper *d, int num,
646*61046927SAndroid Build Coastguard Worker const struct dxil_value *val[])
647*61046927SAndroid Build Coastguard Worker {
648*61046927SAndroid Build Coastguard Worker for (int i = 0; i < num; ++i) {
649*61046927SAndroid Build Coastguard Worker if (i > 0)
650*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, ", ");
651*61046927SAndroid Build Coastguard Worker dump_value(d, val[i]);
652*61046927SAndroid Build Coastguard Worker }
653*61046927SAndroid Build Coastguard Worker }
654*61046927SAndroid Build Coastguard Worker
655*61046927SAndroid Build Coastguard Worker static void
dump_value(struct dxil_dumper * d,const struct dxil_value * val)656*61046927SAndroid Build Coastguard Worker dump_value(struct dxil_dumper *d, const struct dxil_value *val)
657*61046927SAndroid Build Coastguard Worker {
658*61046927SAndroid Build Coastguard Worker if (val->id < 10)
659*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, " ");
660*61046927SAndroid Build Coastguard Worker if (val->id < 100)
661*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, " ");
662*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "%%%d", val->id);
663*61046927SAndroid Build Coastguard Worker dump_type_name(d, val->type);
664*61046927SAndroid Build Coastguard Worker }
665*61046927SAndroid Build Coastguard Worker
666*61046927SAndroid Build Coastguard Worker static void
dump_mdnodes(struct dxil_dumper * d,struct list_head * list)667*61046927SAndroid Build Coastguard Worker dump_mdnodes(struct dxil_dumper *d, struct list_head *list)
668*61046927SAndroid Build Coastguard Worker {
669*61046927SAndroid Build Coastguard Worker if (!list_length(list))
670*61046927SAndroid Build Coastguard Worker return;
671*61046927SAndroid Build Coastguard Worker
672*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "MD-Nodes:\n");
673*61046927SAndroid Build Coastguard Worker dxil_dump_indention_inc(d);
674*61046927SAndroid Build Coastguard Worker list_for_each_entry(struct dxil_mdnode, node, list, head) {
675*61046927SAndroid Build Coastguard Worker dump_mdnode(d, node);
676*61046927SAndroid Build Coastguard Worker }
677*61046927SAndroid Build Coastguard Worker dxil_dump_indention_dec(d);
678*61046927SAndroid Build Coastguard Worker }
679*61046927SAndroid Build Coastguard Worker
680*61046927SAndroid Build Coastguard Worker static void
dump_mdnode(struct dxil_dumper * d,const struct dxil_mdnode * node)681*61046927SAndroid Build Coastguard Worker dump_mdnode(struct dxil_dumper *d, const struct dxil_mdnode *node)
682*61046927SAndroid Build Coastguard Worker {
683*61046927SAndroid Build Coastguard Worker dxil_dump_indent(d);
684*61046927SAndroid Build Coastguard Worker switch (node->type) {
685*61046927SAndroid Build Coastguard Worker case MD_STRING:
686*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "S:%s\n", node->string);
687*61046927SAndroid Build Coastguard Worker break;
688*61046927SAndroid Build Coastguard Worker case MD_VALUE:
689*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "V:");
690*61046927SAndroid Build Coastguard Worker dump_type_name(d, node->value.type);
691*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append_char(d->buf, ' ');
692*61046927SAndroid Build Coastguard Worker dump_value(d, node->value.value);
693*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append_char(d->buf, '\n');
694*61046927SAndroid Build Coastguard Worker break;
695*61046927SAndroid Build Coastguard Worker case MD_NODE:
696*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, " \\\n");
697*61046927SAndroid Build Coastguard Worker dxil_dump_indention_inc(d);
698*61046927SAndroid Build Coastguard Worker for (size_t i = 0; i < node->node.num_subnodes; ++i) {
699*61046927SAndroid Build Coastguard Worker if (node->node.subnodes[i])
700*61046927SAndroid Build Coastguard Worker dump_mdnode(d, node->node.subnodes[i]);
701*61046927SAndroid Build Coastguard Worker else {
702*61046927SAndroid Build Coastguard Worker dxil_dump_indent(d);
703*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "(nullptr)\n");
704*61046927SAndroid Build Coastguard Worker }
705*61046927SAndroid Build Coastguard Worker }
706*61046927SAndroid Build Coastguard Worker dxil_dump_indention_dec(d);
707*61046927SAndroid Build Coastguard Worker break;
708*61046927SAndroid Build Coastguard Worker }
709*61046927SAndroid Build Coastguard Worker }
710*61046927SAndroid Build Coastguard Worker
711*61046927SAndroid Build Coastguard Worker static void
dump_named_nodes(struct dxil_dumper * d,struct list_head * list)712*61046927SAndroid Build Coastguard Worker dump_named_nodes(struct dxil_dumper *d, struct list_head *list)
713*61046927SAndroid Build Coastguard Worker {
714*61046927SAndroid Build Coastguard Worker if (!list_length(list))
715*61046927SAndroid Build Coastguard Worker return;
716*61046927SAndroid Build Coastguard Worker
717*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "Named Nodes:\n");
718*61046927SAndroid Build Coastguard Worker dxil_dump_indention_inc(d);
719*61046927SAndroid Build Coastguard Worker list_for_each_entry(struct dxil_named_node, node, list, head) {
720*61046927SAndroid Build Coastguard Worker dxil_dump_indent(d);
721*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(d->buf, "%s:\n", node->name);
722*61046927SAndroid Build Coastguard Worker dxil_dump_indention_inc(d);
723*61046927SAndroid Build Coastguard Worker for (size_t i = 0; i < node->num_subnodes; ++i) {
724*61046927SAndroid Build Coastguard Worker if (node->subnodes[i])
725*61046927SAndroid Build Coastguard Worker dump_mdnode(d, node->subnodes[i]);
726*61046927SAndroid Build Coastguard Worker else {
727*61046927SAndroid Build Coastguard Worker dxil_dump_indent(d);
728*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(d->buf, "(nullptr)\n");
729*61046927SAndroid Build Coastguard Worker }
730*61046927SAndroid Build Coastguard Worker }
731*61046927SAndroid Build Coastguard Worker dxil_dump_indention_dec(d);
732*61046927SAndroid Build Coastguard Worker }
733*61046927SAndroid Build Coastguard Worker dxil_dump_indention_dec(d);
734*61046927SAndroid Build Coastguard Worker }
735*61046927SAndroid Build Coastguard Worker
736*61046927SAndroid Build Coastguard Worker static void
mask_to_string(uint32_t mask,char str[5])737*61046927SAndroid Build Coastguard Worker mask_to_string(uint32_t mask, char str[5])
738*61046927SAndroid Build Coastguard Worker {
739*61046927SAndroid Build Coastguard Worker const char *mc = "xyzw";
740*61046927SAndroid Build Coastguard Worker for (int i = 0; i < 4 && mask; ++i) {
741*61046927SAndroid Build Coastguard Worker str[i] = (mask & (1 << i)) ? mc[i] : '_';
742*61046927SAndroid Build Coastguard Worker }
743*61046927SAndroid Build Coastguard Worker str[4] = 0;
744*61046927SAndroid Build Coastguard Worker }
745*61046927SAndroid Build Coastguard Worker
dump_io_signatures(struct _mesa_string_buffer * buf,struct dxil_module * m)746*61046927SAndroid Build Coastguard Worker static void dump_io_signatures(struct _mesa_string_buffer *buf, struct dxil_module *m)
747*61046927SAndroid Build Coastguard Worker {
748*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(buf, "\nInput signature:\n");
749*61046927SAndroid Build Coastguard Worker dump_io_signature(buf, m->num_sig_inputs, m->inputs);
750*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(buf, "\nOutput signature:\n");
751*61046927SAndroid Build Coastguard Worker dump_io_signature(buf, m->num_sig_outputs, m->outputs);
752*61046927SAndroid Build Coastguard Worker }
753*61046927SAndroid Build Coastguard Worker
dump_io_signature(struct _mesa_string_buffer * buf,unsigned num,struct dxil_signature_record * io)754*61046927SAndroid Build Coastguard Worker static void dump_io_signature(struct _mesa_string_buffer *buf, unsigned num,
755*61046927SAndroid Build Coastguard Worker struct dxil_signature_record *io)
756*61046927SAndroid Build Coastguard Worker {
757*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(buf, " SEMANTIC-NAME Index Mask Reg SysValue Format\n");
758*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(buf, "----------------------------------------------\n");
759*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < num; ++i, ++io) {
760*61046927SAndroid Build Coastguard Worker for (unsigned j = 0; j < io->num_elements; ++j) {
761*61046927SAndroid Build Coastguard Worker char mask[5] = "";
762*61046927SAndroid Build Coastguard Worker mask_to_string(io->elements[j].mask, mask);
763*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(buf, "%-15s %3d %4s %3d %-8s %-7s\n",
764*61046927SAndroid Build Coastguard Worker io->name, io->elements[j].semantic_index,
765*61046927SAndroid Build Coastguard Worker mask, io->elements[j].reg, io->sysvalue,
766*61046927SAndroid Build Coastguard Worker component_type_as_string(io->elements[j].comp_type));
767*61046927SAndroid Build Coastguard Worker }
768*61046927SAndroid Build Coastguard Worker }
769*61046927SAndroid Build Coastguard Worker }
770*61046927SAndroid Build Coastguard Worker
component_type_as_string(uint32_t type)771*61046927SAndroid Build Coastguard Worker static const char *component_type_as_string(uint32_t type)
772*61046927SAndroid Build Coastguard Worker {
773*61046927SAndroid Build Coastguard Worker return (type < DXIL_PROG_SIG_COMP_TYPE_COUNT) ?
774*61046927SAndroid Build Coastguard Worker dxil_type_strings[type] : "invalid";
775*61046927SAndroid Build Coastguard Worker }
776*61046927SAndroid Build Coastguard Worker
dump_psv(struct _mesa_string_buffer * buf,struct dxil_module * m)777*61046927SAndroid Build Coastguard Worker static void dump_psv(struct _mesa_string_buffer *buf,
778*61046927SAndroid Build Coastguard Worker struct dxil_module *m)
779*61046927SAndroid Build Coastguard Worker {
780*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(buf, "\nPipeline State Validation\nInputs:\n");
781*61046927SAndroid Build Coastguard Worker dump_psv_io(buf, m, m->num_sig_inputs, m->psv_inputs);
782*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(buf, "\nOutputs:\n");
783*61046927SAndroid Build Coastguard Worker dump_psv_io(buf, m, m->num_sig_outputs, m->psv_outputs);
784*61046927SAndroid Build Coastguard Worker }
785*61046927SAndroid Build Coastguard Worker
dump_psv_io(struct _mesa_string_buffer * buf,struct dxil_module * m,unsigned num,struct dxil_psv_signature_element * io)786*61046927SAndroid Build Coastguard Worker static void dump_psv_io(struct _mesa_string_buffer *buf, struct dxil_module *m,
787*61046927SAndroid Build Coastguard Worker unsigned num, struct dxil_psv_signature_element *io)
788*61046927SAndroid Build Coastguard Worker {
789*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(buf, " SEMANTIC-NAME Rows Cols Kind Comp-Type Interp dynmask+stream Indices\n");
790*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(buf, "----------------------------------------------\n");
791*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < num; ++i, ++io) {
792*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(buf, "%-14s %d+%d %d+%d %4d %-7s %-4d %-9d [",
793*61046927SAndroid Build Coastguard Worker m->sem_string_table->buf + io->semantic_name_offset,
794*61046927SAndroid Build Coastguard Worker (int)io->start_row, (int)io->rows,
795*61046927SAndroid Build Coastguard Worker (int)((io->cols_and_start & 0xf) >> 4),
796*61046927SAndroid Build Coastguard Worker (int)(io->cols_and_start & 0xf),
797*61046927SAndroid Build Coastguard Worker (int)io->semantic_kind,
798*61046927SAndroid Build Coastguard Worker component_type_as_string(io->component_type),
799*61046927SAndroid Build Coastguard Worker (int)io->interpolation_mode,
800*61046927SAndroid Build Coastguard Worker (int)io->dynamic_mask_and_stream);
801*61046927SAndroid Build Coastguard Worker for (int k = 0; k < io->rows; ++k) {
802*61046927SAndroid Build Coastguard Worker if (k > 0)
803*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(buf, ", ");
804*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_printf(buf,"%d ", m->sem_index_table.data[io->start_row + k]);
805*61046927SAndroid Build Coastguard Worker }
806*61046927SAndroid Build Coastguard Worker _mesa_string_buffer_append(buf, "]\n");
807*61046927SAndroid Build Coastguard Worker }
808*61046927SAndroid Build Coastguard Worker }
809