1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2021 Intel 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 "brw_compiler.h"
25*61046927SAndroid Build Coastguard Worker #include "brw_kernel.h"
26*61046927SAndroid Build Coastguard Worker #include "compiler/brw_disasm.h"
27*61046927SAndroid Build Coastguard Worker #include "compiler/clc/clc.h"
28*61046927SAndroid Build Coastguard Worker #include "compiler/glsl_types.h"
29*61046927SAndroid Build Coastguard Worker #include "compiler/nir/nir_serialize.h"
30*61046927SAndroid Build Coastguard Worker #include "compiler/spirv/spirv_info.h"
31*61046927SAndroid Build Coastguard Worker #include "dev/intel_debug.h"
32*61046927SAndroid Build Coastguard Worker #include "util/build_id.h"
33*61046927SAndroid Build Coastguard Worker #include "util/disk_cache.h"
34*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
35*61046927SAndroid Build Coastguard Worker #include "util/mesa-sha1.h"
36*61046927SAndroid Build Coastguard Worker #include "util/u_dynarray.h"
37*61046927SAndroid Build Coastguard Worker
38*61046927SAndroid Build Coastguard Worker #include <errno.h>
39*61046927SAndroid Build Coastguard Worker #include <fcntl.h>
40*61046927SAndroid Build Coastguard Worker #include <getopt.h>
41*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
42*61046927SAndroid Build Coastguard Worker #include <stdio.h>
43*61046927SAndroid Build Coastguard Worker #include <string.h>
44*61046927SAndroid Build Coastguard Worker #include <sys/mman.h>
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker /* Shader functions */
47*61046927SAndroid Build Coastguard Worker #define SPIR_V_MAGIC_NUMBER 0x07230203
48*61046927SAndroid Build Coastguard Worker
49*61046927SAndroid Build Coastguard Worker static struct disk_cache *
get_disk_cache(struct brw_compiler * compiler)50*61046927SAndroid Build Coastguard Worker get_disk_cache(struct brw_compiler *compiler)
51*61046927SAndroid Build Coastguard Worker {
52*61046927SAndroid Build Coastguard Worker #ifdef ENABLE_SHADER_CACHE
53*61046927SAndroid Build Coastguard Worker char renderer[14];
54*61046927SAndroid Build Coastguard Worker ASSERTED int len = snprintf(renderer, sizeof(renderer), "brw_clc_%04x",
55*61046927SAndroid Build Coastguard Worker compiler->devinfo->pci_device_id);
56*61046927SAndroid Build Coastguard Worker assert(len == sizeof(renderer) - 2);
57*61046927SAndroid Build Coastguard Worker
58*61046927SAndroid Build Coastguard Worker const struct build_id_note *note =
59*61046927SAndroid Build Coastguard Worker build_id_find_nhdr_for_addr(get_disk_cache);
60*61046927SAndroid Build Coastguard Worker if (note == NULL) {
61*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Failed to find build-id\n");
62*61046927SAndroid Build Coastguard Worker abort();
63*61046927SAndroid Build Coastguard Worker }
64*61046927SAndroid Build Coastguard Worker
65*61046927SAndroid Build Coastguard Worker unsigned build_id_len = build_id_length(note);
66*61046927SAndroid Build Coastguard Worker if (build_id_len < 20) {
67*61046927SAndroid Build Coastguard Worker fprintf(stderr, "build-id too short. It needs to be a SHA\n");
68*61046927SAndroid Build Coastguard Worker abort();
69*61046927SAndroid Build Coastguard Worker }
70*61046927SAndroid Build Coastguard Worker
71*61046927SAndroid Build Coastguard Worker struct mesa_sha1 sha1_ctx;
72*61046927SAndroid Build Coastguard Worker uint8_t sha1[20];
73*61046927SAndroid Build Coastguard Worker _mesa_sha1_init(&sha1_ctx);
74*61046927SAndroid Build Coastguard Worker _mesa_sha1_update(&sha1_ctx, build_id_data(note), build_id_len);
75*61046927SAndroid Build Coastguard Worker _mesa_sha1_final(&sha1_ctx, sha1);
76*61046927SAndroid Build Coastguard Worker
77*61046927SAndroid Build Coastguard Worker char timestamp[41];
78*61046927SAndroid Build Coastguard Worker _mesa_sha1_format(timestamp, sha1);
79*61046927SAndroid Build Coastguard Worker
80*61046927SAndroid Build Coastguard Worker const uint64_t driver_flags = brw_get_compiler_config_value(compiler);
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker return disk_cache_create(renderer, timestamp, driver_flags);
83*61046927SAndroid Build Coastguard Worker #endif
84*61046927SAndroid Build Coastguard Worker return NULL;
85*61046927SAndroid Build Coastguard Worker }
86*61046927SAndroid Build Coastguard Worker
87*61046927SAndroid Build Coastguard Worker static void
compiler_log(void * data,unsigned * id,const char * fmt,...)88*61046927SAndroid Build Coastguard Worker compiler_log(void *data, unsigned *id, const char *fmt, ...)
89*61046927SAndroid Build Coastguard Worker {
90*61046927SAndroid Build Coastguard Worker va_list args;
91*61046927SAndroid Build Coastguard Worker va_start(args, fmt);
92*61046927SAndroid Build Coastguard Worker if (INTEL_DEBUG(DEBUG_CS))
93*61046927SAndroid Build Coastguard Worker vfprintf(stderr, fmt, args);
94*61046927SAndroid Build Coastguard Worker va_end(args);
95*61046927SAndroid Build Coastguard Worker }
96*61046927SAndroid Build Coastguard Worker
97*61046927SAndroid Build Coastguard Worker static void
msg_callback(void * priv,const char * msg)98*61046927SAndroid Build Coastguard Worker msg_callback(void *priv, const char *msg)
99*61046927SAndroid Build Coastguard Worker {
100*61046927SAndroid Build Coastguard Worker (void)priv;
101*61046927SAndroid Build Coastguard Worker fprintf(stderr, "%s", msg);
102*61046927SAndroid Build Coastguard Worker }
103*61046927SAndroid Build Coastguard Worker
104*61046927SAndroid Build Coastguard Worker static void
print_u32_data(FILE * fp,const char * prefix,const char * arr_name,const uint32_t * data,size_t len)105*61046927SAndroid Build Coastguard Worker print_u32_data(FILE *fp, const char *prefix, const char *arr_name,
106*61046927SAndroid Build Coastguard Worker const uint32_t *data, size_t len)
107*61046927SAndroid Build Coastguard Worker {
108*61046927SAndroid Build Coastguard Worker assert(len % 4 == 0);
109*61046927SAndroid Build Coastguard Worker fprintf(fp, "static const uint32_t %s_%s[] = {", prefix, arr_name);
110*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < (len / 4); i++) {
111*61046927SAndroid Build Coastguard Worker if (i % 4 == 0)
112*61046927SAndroid Build Coastguard Worker fprintf(fp,"\n ");
113*61046927SAndroid Build Coastguard Worker
114*61046927SAndroid Build Coastguard Worker fprintf(fp, " 0x%08" PRIx32 ",", data[i]);
115*61046927SAndroid Build Coastguard Worker }
116*61046927SAndroid Build Coastguard Worker fprintf(fp, "\n};\n");
117*61046927SAndroid Build Coastguard Worker }
118*61046927SAndroid Build Coastguard Worker
119*61046927SAndroid Build Coastguard Worker static void
print_u8_data(FILE * fp,const char * prefix,const char * arr_name,const uint8_t * data,size_t len)120*61046927SAndroid Build Coastguard Worker print_u8_data(FILE *fp, const char *prefix, const char *arr_name,
121*61046927SAndroid Build Coastguard Worker const uint8_t *data, size_t len)
122*61046927SAndroid Build Coastguard Worker {
123*61046927SAndroid Build Coastguard Worker fprintf(fp, "static const uint8_t %s_%s[] = {", prefix, arr_name);
124*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < len; i++) {
125*61046927SAndroid Build Coastguard Worker if (i % 16 == 0)
126*61046927SAndroid Build Coastguard Worker fprintf(fp,"\n ");
127*61046927SAndroid Build Coastguard Worker
128*61046927SAndroid Build Coastguard Worker fprintf(fp, " 0x%02" PRIx8 ",", data[i]);
129*61046927SAndroid Build Coastguard Worker }
130*61046927SAndroid Build Coastguard Worker fprintf(fp, "\n};\n");
131*61046927SAndroid Build Coastguard Worker }
132*61046927SAndroid Build Coastguard Worker
133*61046927SAndroid Build Coastguard Worker static const char *
reloc_type_str(enum brw_shader_reloc_type type)134*61046927SAndroid Build Coastguard Worker reloc_type_str(enum brw_shader_reloc_type type)
135*61046927SAndroid Build Coastguard Worker {
136*61046927SAndroid Build Coastguard Worker switch (type) {
137*61046927SAndroid Build Coastguard Worker #define CASE(e) case e: return #e;
138*61046927SAndroid Build Coastguard Worker CASE(BRW_SHADER_RELOC_TYPE_U32)
139*61046927SAndroid Build Coastguard Worker CASE(BRW_SHADER_RELOC_TYPE_MOV_IMM)
140*61046927SAndroid Build Coastguard Worker #undef CASE
141*61046927SAndroid Build Coastguard Worker default:
142*61046927SAndroid Build Coastguard Worker unreachable("Unknown relocation type");
143*61046927SAndroid Build Coastguard Worker }
144*61046927SAndroid Build Coastguard Worker }
145*61046927SAndroid Build Coastguard Worker
146*61046927SAndroid Build Coastguard Worker static void
print_cs_prog_data_fields(FILE * fp,const char * prefix,const char * pad,const struct brw_cs_prog_data * cs_prog_data)147*61046927SAndroid Build Coastguard Worker print_cs_prog_data_fields(FILE *fp, const char *prefix, const char *pad,
148*61046927SAndroid Build Coastguard Worker const struct brw_cs_prog_data *cs_prog_data)
149*61046927SAndroid Build Coastguard Worker {
150*61046927SAndroid Build Coastguard Worker #define PROG_DATA_FIELD(fmt, field) \
151*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s." #field " = " fmt ",\n", pad, cs_prog_data->field)
152*61046927SAndroid Build Coastguard Worker
153*61046927SAndroid Build Coastguard Worker #define PROG_DATA_BOOL_FIELD(field) \
154*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s." #field " = %s,\n", pad, \
155*61046927SAndroid Build Coastguard Worker cs_prog_data->field ? "true" : "false")
156*61046927SAndroid Build Coastguard Worker
157*61046927SAndroid Build Coastguard Worker PROG_DATA_FIELD("%u", base.nr_params);
158*61046927SAndroid Build Coastguard Worker assert(cs_prog_data->base.stage == MESA_SHADER_COMPUTE);
159*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s.base.stage = MESA_SHADER_COMPUTE,\n", pad);
160*61046927SAndroid Build Coastguard Worker assert(cs_prog_data->base.zero_push_reg == 0);
161*61046927SAndroid Build Coastguard Worker assert(cs_prog_data->base.push_reg_mask_param == 0);
162*61046927SAndroid Build Coastguard Worker PROG_DATA_FIELD("%u", base.curb_read_length);
163*61046927SAndroid Build Coastguard Worker PROG_DATA_FIELD("%u", base.total_scratch);
164*61046927SAndroid Build Coastguard Worker PROG_DATA_FIELD("%u", base.total_shared);
165*61046927SAndroid Build Coastguard Worker PROG_DATA_FIELD("%u", base.program_size);
166*61046927SAndroid Build Coastguard Worker PROG_DATA_FIELD("%u", base.const_data_size);
167*61046927SAndroid Build Coastguard Worker PROG_DATA_FIELD("%u", base.const_data_offset);
168*61046927SAndroid Build Coastguard Worker PROG_DATA_FIELD("%u", base.num_relocs);
169*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s.base.relocs = %s_relocs,\n", pad, prefix);
170*61046927SAndroid Build Coastguard Worker PROG_DATA_FIELD("%u", base.printf_info_count);
171*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s.base.printf_info = (u_printf_info *)%s_printfs,\n", pad, prefix);
172*61046927SAndroid Build Coastguard Worker assert(!cs_prog_data->base.has_ubo_pull);
173*61046927SAndroid Build Coastguard Worker assert(cs_prog_data->base.dispatch_grf_start_reg == 0);
174*61046927SAndroid Build Coastguard Worker assert(!cs_prog_data->base.use_alt_mode);
175*61046927SAndroid Build Coastguard Worker assert(cs_prog_data->base.param == 0);
176*61046927SAndroid Build Coastguard Worker PROG_DATA_BOOL_FIELD(base.uses_atomic_load_store);
177*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s.local_size = { %u, %u, %u },\n", pad,
178*61046927SAndroid Build Coastguard Worker cs_prog_data->local_size[0],
179*61046927SAndroid Build Coastguard Worker cs_prog_data->local_size[1],
180*61046927SAndroid Build Coastguard Worker cs_prog_data->local_size[2]);
181*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s.prog_offset = { %u, %u, %u },\n", pad,
182*61046927SAndroid Build Coastguard Worker cs_prog_data->prog_offset[0],
183*61046927SAndroid Build Coastguard Worker cs_prog_data->prog_offset[1],
184*61046927SAndroid Build Coastguard Worker cs_prog_data->prog_offset[2]);
185*61046927SAndroid Build Coastguard Worker PROG_DATA_FIELD("%u", prog_mask);
186*61046927SAndroid Build Coastguard Worker PROG_DATA_FIELD("%u", prog_spilled);
187*61046927SAndroid Build Coastguard Worker PROG_DATA_BOOL_FIELD(uses_barrier);
188*61046927SAndroid Build Coastguard Worker PROG_DATA_BOOL_FIELD(uses_num_work_groups);
189*61046927SAndroid Build Coastguard Worker assert(!cs_prog_data->uses_inline_data);
190*61046927SAndroid Build Coastguard Worker assert(!cs_prog_data->uses_btd_stack_ids);
191*61046927SAndroid Build Coastguard Worker PROG_DATA_FIELD("%u", push.per_thread.dwords);
192*61046927SAndroid Build Coastguard Worker PROG_DATA_FIELD("%u", push.per_thread.regs);
193*61046927SAndroid Build Coastguard Worker PROG_DATA_FIELD("%u", push.per_thread.size);
194*61046927SAndroid Build Coastguard Worker PROG_DATA_FIELD("%u", push.cross_thread.dwords);
195*61046927SAndroid Build Coastguard Worker PROG_DATA_FIELD("%u", push.cross_thread.regs);
196*61046927SAndroid Build Coastguard Worker PROG_DATA_FIELD("%u", push.cross_thread.size);
197*61046927SAndroid Build Coastguard Worker
198*61046927SAndroid Build Coastguard Worker #undef PROG_DATA_FIELD
199*61046927SAndroid Build Coastguard Worker #undef PROG_DATA_BOOL_FIELD
200*61046927SAndroid Build Coastguard Worker }
201*61046927SAndroid Build Coastguard Worker
202*61046927SAndroid Build Coastguard Worker static void
print_kernel(FILE * fp,const char * prefix,const struct brw_kernel * kernel,const struct brw_isa_info * isa)203*61046927SAndroid Build Coastguard Worker print_kernel(FILE *fp, const char *prefix,
204*61046927SAndroid Build Coastguard Worker const struct brw_kernel *kernel,
205*61046927SAndroid Build Coastguard Worker const struct brw_isa_info *isa)
206*61046927SAndroid Build Coastguard Worker {
207*61046927SAndroid Build Coastguard Worker struct mesa_sha1 sha1_ctx;
208*61046927SAndroid Build Coastguard Worker _mesa_sha1_init(&sha1_ctx);
209*61046927SAndroid Build Coastguard Worker
210*61046927SAndroid Build Coastguard Worker #define SHA1_UPDATE_VALUE(val) \
211*61046927SAndroid Build Coastguard Worker _mesa_sha1_update(&sha1_ctx, &val, sizeof(val))
212*61046927SAndroid Build Coastguard Worker
213*61046927SAndroid Build Coastguard Worker fprintf(fp, "#include \"intel/compiler/brw_kernel.h\"\n");
214*61046927SAndroid Build Coastguard Worker fprintf(fp, "\n");
215*61046927SAndroid Build Coastguard Worker
216*61046927SAndroid Build Coastguard Worker fprintf(fp, "static const struct brw_shader_reloc %s_relocs[] = {\n",
217*61046927SAndroid Build Coastguard Worker prefix);
218*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < kernel->prog_data.base.num_relocs; i++) {
219*61046927SAndroid Build Coastguard Worker const struct brw_shader_reloc *reloc = &kernel->prog_data.base.relocs[i];
220*61046927SAndroid Build Coastguard Worker fprintf(fp, " { %"PRIu32", %s, %"PRIu32", %"PRIu32" },\n",
221*61046927SAndroid Build Coastguard Worker reloc->id, reloc_type_str(reloc->type),
222*61046927SAndroid Build Coastguard Worker reloc->offset, reloc->delta);
223*61046927SAndroid Build Coastguard Worker }
224*61046927SAndroid Build Coastguard Worker fprintf(fp, "};\n");
225*61046927SAndroid Build Coastguard Worker _mesa_sha1_update(&sha1_ctx, kernel->prog_data.base.relocs,
226*61046927SAndroid Build Coastguard Worker kernel->prog_data.base.num_relocs *
227*61046927SAndroid Build Coastguard Worker sizeof(kernel->prog_data.base.relocs[0]));
228*61046927SAndroid Build Coastguard Worker
229*61046927SAndroid Build Coastguard Worker fprintf(fp, "static const u_printf_info %s_printfs[] = {\n",
230*61046927SAndroid Build Coastguard Worker prefix);
231*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < kernel->prog_data.base.printf_info_count; i++) {
232*61046927SAndroid Build Coastguard Worker const u_printf_info *printf_info = &kernel->prog_data.base.printf_info[i];
233*61046927SAndroid Build Coastguard Worker fprintf(fp, " {\n");
234*61046927SAndroid Build Coastguard Worker fprintf(fp, " .num_args = %"PRIu32",\n", printf_info->num_args);
235*61046927SAndroid Build Coastguard Worker fprintf(fp, " .arg_sizes = (unsigned []) {\n");
236*61046927SAndroid Build Coastguard Worker for (unsigned a = 0; a < printf_info->num_args; a++)
237*61046927SAndroid Build Coastguard Worker fprintf(fp, " %"PRIu32",\n", printf_info->arg_sizes[a]);
238*61046927SAndroid Build Coastguard Worker fprintf(fp, " },\n");
239*61046927SAndroid Build Coastguard Worker fprintf(fp, " .string_size = %"PRIu32",\n", printf_info->string_size);
240*61046927SAndroid Build Coastguard Worker fprintf(fp, " .strings = (char []) {");
241*61046927SAndroid Build Coastguard Worker for (unsigned c = 0; c < printf_info->string_size; c++) {
242*61046927SAndroid Build Coastguard Worker if (c % 8 == 0 )
243*61046927SAndroid Build Coastguard Worker fprintf(fp, "\n ");
244*61046927SAndroid Build Coastguard Worker fprintf(fp, "0x%02hhx, ", printf_info->strings[c]);
245*61046927SAndroid Build Coastguard Worker }
246*61046927SAndroid Build Coastguard Worker fprintf(fp, "\n },\n");
247*61046927SAndroid Build Coastguard Worker fprintf(fp, " },\n");
248*61046927SAndroid Build Coastguard Worker }
249*61046927SAndroid Build Coastguard Worker fprintf(fp, "};\n");
250*61046927SAndroid Build Coastguard Worker
251*61046927SAndroid Build Coastguard Worker /* Get rid of the pointers before we hash */
252*61046927SAndroid Build Coastguard Worker struct brw_cs_prog_data cs_prog_data = kernel->prog_data;
253*61046927SAndroid Build Coastguard Worker cs_prog_data.base.relocs = NULL;
254*61046927SAndroid Build Coastguard Worker assert(cs_prog_data.base.param == NULL);
255*61046927SAndroid Build Coastguard Worker _mesa_sha1_update(&sha1_ctx, &cs_prog_data, sizeof(cs_prog_data));
256*61046927SAndroid Build Coastguard Worker
257*61046927SAndroid Build Coastguard Worker SHA1_UPDATE_VALUE(kernel->args_size);
258*61046927SAndroid Build Coastguard Worker SHA1_UPDATE_VALUE(kernel->arg_count);
259*61046927SAndroid Build Coastguard Worker _mesa_sha1_update(&sha1_ctx, kernel->args,
260*61046927SAndroid Build Coastguard Worker kernel->arg_count * sizeof(kernel->args[0]));
261*61046927SAndroid Build Coastguard Worker
262*61046927SAndroid Build Coastguard Worker fprintf(fp, "static const struct brw_kernel_arg_desc %s_args[] = {\n",
263*61046927SAndroid Build Coastguard Worker prefix);
264*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < kernel->arg_count; i++) {
265*61046927SAndroid Build Coastguard Worker fprintf(fp, " { %d, %d },\n",
266*61046927SAndroid Build Coastguard Worker kernel->args[i].offset, kernel->args[i].size);
267*61046927SAndroid Build Coastguard Worker }
268*61046927SAndroid Build Coastguard Worker fprintf(fp, "};\n\n");
269*61046927SAndroid Build Coastguard Worker
270*61046927SAndroid Build Coastguard Worker _mesa_sha1_update(&sha1_ctx, kernel->code,
271*61046927SAndroid Build Coastguard Worker kernel->prog_data.base.program_size);
272*61046927SAndroid Build Coastguard Worker
273*61046927SAndroid Build Coastguard Worker fprintf(fp, "#if 0 /* BEGIN KERNEL ASSEMBLY */\n");
274*61046927SAndroid Build Coastguard Worker fprintf(fp, "\n");
275*61046927SAndroid Build Coastguard Worker brw_disassemble_with_errors(isa, kernel->code, 0, fp);
276*61046927SAndroid Build Coastguard Worker fprintf(fp, "\n");
277*61046927SAndroid Build Coastguard Worker fprintf(fp, "#endif /* END KERNEL ASSEMBLY */\n");
278*61046927SAndroid Build Coastguard Worker print_u32_data(fp, prefix, "code", kernel->code,
279*61046927SAndroid Build Coastguard Worker kernel->prog_data.base.program_size);
280*61046927SAndroid Build Coastguard Worker
281*61046927SAndroid Build Coastguard Worker fprintf(fp, "static const struct brw_kernel %s = {\n", prefix);
282*61046927SAndroid Build Coastguard Worker fprintf(fp, " .prog_data = {\n");
283*61046927SAndroid Build Coastguard Worker print_cs_prog_data_fields(fp, prefix, " ", &kernel->prog_data);
284*61046927SAndroid Build Coastguard Worker fprintf(fp, " },\n");
285*61046927SAndroid Build Coastguard Worker fprintf(fp, " .args_size = %d,\n", (int)kernel->args_size);
286*61046927SAndroid Build Coastguard Worker fprintf(fp, " .arg_count = %d,\n", (int)kernel->arg_count);
287*61046927SAndroid Build Coastguard Worker fprintf(fp, " .args = %s_args,\n", prefix);
288*61046927SAndroid Build Coastguard Worker fprintf(fp, " .code = %s_code,\n", prefix);
289*61046927SAndroid Build Coastguard Worker fprintf(fp, "};\n");
290*61046927SAndroid Build Coastguard Worker
291*61046927SAndroid Build Coastguard Worker unsigned char sha1[20];
292*61046927SAndroid Build Coastguard Worker _mesa_sha1_final(&sha1_ctx, sha1);
293*61046927SAndroid Build Coastguard Worker char sha1_str[41];
294*61046927SAndroid Build Coastguard Worker _mesa_sha1_format(sha1_str, sha1);
295*61046927SAndroid Build Coastguard Worker fprintf(fp, "const char *%s_sha1 = \"%s\";\n", prefix, sha1_str);
296*61046927SAndroid Build Coastguard Worker }
297*61046927SAndroid Build Coastguard Worker
298*61046927SAndroid Build Coastguard Worker static void
print_usage(char * exec_name,FILE * f)299*61046927SAndroid Build Coastguard Worker print_usage(char *exec_name, FILE *f)
300*61046927SAndroid Build Coastguard Worker {
301*61046927SAndroid Build Coastguard Worker fprintf(f,
302*61046927SAndroid Build Coastguard Worker "Usage: %s [options] -- [clang args]\n"
303*61046927SAndroid Build Coastguard Worker "Options:\n"
304*61046927SAndroid Build Coastguard Worker " -h --help Print this help.\n"
305*61046927SAndroid Build Coastguard Worker " -e, --entrypoint <name> Specify the entry-point name.\n"
306*61046927SAndroid Build Coastguard Worker " -L, --llvm17-wa Enable LLVM 17 workarounds for opaque pointers"
307*61046927SAndroid Build Coastguard Worker " -p, --platform <name> Specify the target platform name.\n"
308*61046927SAndroid Build Coastguard Worker " --prefix <prefix> Prefix for variable names in generated C code.\n"
309*61046927SAndroid Build Coastguard Worker " -o, --out <filename> Specify the output filename.\n"
310*61046927SAndroid Build Coastguard Worker " -i, --in <filename> Specify one input filename. Accepted multiple times.\n"
311*61046927SAndroid Build Coastguard Worker " -s, --spv <filename> Specify the output filename for spirv.\n"
312*61046927SAndroid Build Coastguard Worker " -n, --nir Specify whether to output serialized NIR instead of ISA.\n"
313*61046927SAndroid Build Coastguard Worker " -g, --gfx-version <ver> Specify the Gfx version used for NIR output.\n"
314*61046927SAndroid Build Coastguard Worker " -t, --text <filename> Specify the output filename for the parsed text\n"
315*61046927SAndroid Build Coastguard Worker " -v, --verbose Print more information during compilation.\n"
316*61046927SAndroid Build Coastguard Worker " -M, --llvm-version Print LLVM version.\n"
317*61046927SAndroid Build Coastguard Worker , exec_name);
318*61046927SAndroid Build Coastguard Worker }
319*61046927SAndroid Build Coastguard Worker
320*61046927SAndroid Build Coastguard Worker #define OPT_PREFIX 1000
321*61046927SAndroid Build Coastguard Worker
322*61046927SAndroid Build Coastguard Worker struct intel_clc_params {
323*61046927SAndroid Build Coastguard Worker char *entry_point;
324*61046927SAndroid Build Coastguard Worker char *platform;
325*61046927SAndroid Build Coastguard Worker char *outfile;
326*61046927SAndroid Build Coastguard Worker char *spv_outfile;
327*61046927SAndroid Build Coastguard Worker char *txt_outfile;
328*61046927SAndroid Build Coastguard Worker char *prefix;
329*61046927SAndroid Build Coastguard Worker
330*61046927SAndroid Build Coastguard Worker unsigned gfx_version;
331*61046927SAndroid Build Coastguard Worker
332*61046927SAndroid Build Coastguard Worker bool output_nir;
333*61046927SAndroid Build Coastguard Worker bool print_info;
334*61046927SAndroid Build Coastguard Worker bool llvm17_wa;
335*61046927SAndroid Build Coastguard Worker
336*61046927SAndroid Build Coastguard Worker void *mem_ctx;
337*61046927SAndroid Build Coastguard Worker
338*61046927SAndroid Build Coastguard Worker struct intel_device_info devinfo;
339*61046927SAndroid Build Coastguard Worker };
340*61046927SAndroid Build Coastguard Worker
341*61046927SAndroid Build Coastguard Worker #include "compiler/spirv/nir_spirv.h"
342*61046927SAndroid Build Coastguard Worker
343*61046927SAndroid Build Coastguard Worker static int
output_nir(const struct intel_clc_params * params,struct clc_binary * binary)344*61046927SAndroid Build Coastguard Worker output_nir(const struct intel_clc_params *params, struct clc_binary *binary)
345*61046927SAndroid Build Coastguard Worker {
346*61046927SAndroid Build Coastguard Worker const struct spirv_capabilities spirv_caps = {
347*61046927SAndroid Build Coastguard Worker .Addresses = true,
348*61046927SAndroid Build Coastguard Worker .Groups = true,
349*61046927SAndroid Build Coastguard Worker .StorageImageWriteWithoutFormat = true,
350*61046927SAndroid Build Coastguard Worker .Int8 = true,
351*61046927SAndroid Build Coastguard Worker .Int16 = true,
352*61046927SAndroid Build Coastguard Worker .Int64 = true,
353*61046927SAndroid Build Coastguard Worker .Int64Atomics = true,
354*61046927SAndroid Build Coastguard Worker .Kernel = true,
355*61046927SAndroid Build Coastguard Worker .Linkage = true, /* We receive linked kernel from clc */
356*61046927SAndroid Build Coastguard Worker .GenericPointer = true,
357*61046927SAndroid Build Coastguard Worker .GroupNonUniform = true,
358*61046927SAndroid Build Coastguard Worker .GroupNonUniformArithmetic = true,
359*61046927SAndroid Build Coastguard Worker .GroupNonUniformBallot = true,
360*61046927SAndroid Build Coastguard Worker .GroupNonUniformQuad = true,
361*61046927SAndroid Build Coastguard Worker .GroupNonUniformShuffle = true,
362*61046927SAndroid Build Coastguard Worker .GroupNonUniformVote = true,
363*61046927SAndroid Build Coastguard Worker .SubgroupDispatch = true,
364*61046927SAndroid Build Coastguard Worker
365*61046927SAndroid Build Coastguard Worker .SubgroupShuffleINTEL = true,
366*61046927SAndroid Build Coastguard Worker .SubgroupBufferBlockIOINTEL = true,
367*61046927SAndroid Build Coastguard Worker };
368*61046927SAndroid Build Coastguard Worker
369*61046927SAndroid Build Coastguard Worker struct spirv_to_nir_options spirv_options = {
370*61046927SAndroid Build Coastguard Worker .environment = NIR_SPIRV_OPENCL,
371*61046927SAndroid Build Coastguard Worker .capabilities = &spirv_caps,
372*61046927SAndroid Build Coastguard Worker .printf = true,
373*61046927SAndroid Build Coastguard Worker .shared_addr_format = nir_address_format_62bit_generic,
374*61046927SAndroid Build Coastguard Worker .global_addr_format = nir_address_format_62bit_generic,
375*61046927SAndroid Build Coastguard Worker .temp_addr_format = nir_address_format_62bit_generic,
376*61046927SAndroid Build Coastguard Worker .constant_addr_format = nir_address_format_64bit_global,
377*61046927SAndroid Build Coastguard Worker .create_library = true,
378*61046927SAndroid Build Coastguard Worker };
379*61046927SAndroid Build Coastguard Worker
380*61046927SAndroid Build Coastguard Worker FILE *fp = params->outfile != NULL ?
381*61046927SAndroid Build Coastguard Worker fopen(params->outfile, "w") : stdout;
382*61046927SAndroid Build Coastguard Worker if (!fp) {
383*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Failed to open %s\n", params->outfile);
384*61046927SAndroid Build Coastguard Worker return -1;
385*61046927SAndroid Build Coastguard Worker }
386*61046927SAndroid Build Coastguard Worker
387*61046927SAndroid Build Coastguard Worker spirv_library_to_nir_builder(fp, binary->data, binary->size / 4,
388*61046927SAndroid Build Coastguard Worker &spirv_options);
389*61046927SAndroid Build Coastguard Worker
390*61046927SAndroid Build Coastguard Worker nir_shader *nir = brw_nir_from_spirv(params->mem_ctx, params->gfx_version,
391*61046927SAndroid Build Coastguard Worker binary->data, binary->size,
392*61046927SAndroid Build Coastguard Worker params->llvm17_wa);
393*61046927SAndroid Build Coastguard Worker if (!nir) {
394*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Failed to generate NIR out of SPIRV\n");
395*61046927SAndroid Build Coastguard Worker fclose(fp);
396*61046927SAndroid Build Coastguard Worker return -1;
397*61046927SAndroid Build Coastguard Worker }
398*61046927SAndroid Build Coastguard Worker
399*61046927SAndroid Build Coastguard Worker struct blob blob;
400*61046927SAndroid Build Coastguard Worker blob_init(&blob);
401*61046927SAndroid Build Coastguard Worker nir_serialize(&blob, nir, false /* strip */);
402*61046927SAndroid Build Coastguard Worker print_u8_data(fp, params->prefix, "nir", blob.data, blob.size);
403*61046927SAndroid Build Coastguard Worker blob_finish(&blob);
404*61046927SAndroid Build Coastguard Worker
405*61046927SAndroid Build Coastguard Worker if (params->outfile)
406*61046927SAndroid Build Coastguard Worker fclose(fp);
407*61046927SAndroid Build Coastguard Worker
408*61046927SAndroid Build Coastguard Worker return 0;
409*61046927SAndroid Build Coastguard Worker }
410*61046927SAndroid Build Coastguard Worker
411*61046927SAndroid Build Coastguard Worker static int
output_isa(const struct intel_clc_params * params,struct clc_binary * binary)412*61046927SAndroid Build Coastguard Worker output_isa(const struct intel_clc_params *params, struct clc_binary *binary)
413*61046927SAndroid Build Coastguard Worker {
414*61046927SAndroid Build Coastguard Worker struct brw_kernel kernel = {};
415*61046927SAndroid Build Coastguard Worker char *error_str;
416*61046927SAndroid Build Coastguard Worker int ret = 0;
417*61046927SAndroid Build Coastguard Worker
418*61046927SAndroid Build Coastguard Worker struct brw_isa_info _isa, *isa = &_isa;
419*61046927SAndroid Build Coastguard Worker brw_init_isa_info(isa, ¶ms->devinfo);
420*61046927SAndroid Build Coastguard Worker
421*61046927SAndroid Build Coastguard Worker struct brw_compiler *compiler = brw_compiler_create(params->mem_ctx,
422*61046927SAndroid Build Coastguard Worker ¶ms->devinfo);
423*61046927SAndroid Build Coastguard Worker compiler->shader_debug_log = compiler_log;
424*61046927SAndroid Build Coastguard Worker compiler->shader_perf_log = compiler_log;
425*61046927SAndroid Build Coastguard Worker struct disk_cache *disk_cache = get_disk_cache(compiler);
426*61046927SAndroid Build Coastguard Worker
427*61046927SAndroid Build Coastguard Worker if (!brw_kernel_from_spirv(compiler, disk_cache, &kernel, NULL, params->mem_ctx,
428*61046927SAndroid Build Coastguard Worker binary->data, binary->size,
429*61046927SAndroid Build Coastguard Worker params->entry_point, &error_str)) {
430*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Compile failed: %s\n", error_str);
431*61046927SAndroid Build Coastguard Worker ret = -1;
432*61046927SAndroid Build Coastguard Worker goto exit;
433*61046927SAndroid Build Coastguard Worker }
434*61046927SAndroid Build Coastguard Worker
435*61046927SAndroid Build Coastguard Worker if (params->print_info) {
436*61046927SAndroid Build Coastguard Worker fprintf(stdout, "kernel info:\n");
437*61046927SAndroid Build Coastguard Worker fprintf(stdout, " uses_barrier : %u\n", kernel.prog_data.uses_barrier);
438*61046927SAndroid Build Coastguard Worker fprintf(stdout, " uses_num_work_groups : %u\n", kernel.prog_data.uses_num_work_groups);
439*61046927SAndroid Build Coastguard Worker fprintf(stdout, " uses_inline_data : %u\n", kernel.prog_data.uses_inline_data);
440*61046927SAndroid Build Coastguard Worker fprintf(stdout, " local_size : %ux%ux%u\n",
441*61046927SAndroid Build Coastguard Worker kernel.prog_data.local_size[0],
442*61046927SAndroid Build Coastguard Worker kernel.prog_data.local_size[1],
443*61046927SAndroid Build Coastguard Worker kernel.prog_data.local_size[2]);
444*61046927SAndroid Build Coastguard Worker fprintf(stdout, " curb_read_length : %u\n", kernel.prog_data.base.curb_read_length);
445*61046927SAndroid Build Coastguard Worker fprintf(stdout, " total_scratch : %u\n", kernel.prog_data.base.total_scratch);
446*61046927SAndroid Build Coastguard Worker fprintf(stdout, " total_shared : %u\n", kernel.prog_data.base.total_shared);
447*61046927SAndroid Build Coastguard Worker fprintf(stdout, " program_size : %u\n", kernel.prog_data.base.program_size);
448*61046927SAndroid Build Coastguard Worker fprintf(stdout, " const_data_size : %u\n", kernel.prog_data.base.const_data_size);
449*61046927SAndroid Build Coastguard Worker fprintf(stdout, " uses_atomic_load_store : %u\n", kernel.prog_data.base.uses_atomic_load_store);
450*61046927SAndroid Build Coastguard Worker fprintf(stdout, " dispatch_grf_start_reg : %u\n", kernel.prog_data.base.dispatch_grf_start_reg);
451*61046927SAndroid Build Coastguard Worker }
452*61046927SAndroid Build Coastguard Worker
453*61046927SAndroid Build Coastguard Worker char *prefix = params->prefix;
454*61046927SAndroid Build Coastguard Worker char prefix_tmp[256];
455*61046927SAndroid Build Coastguard Worker if (prefix == NULL) {
456*61046927SAndroid Build Coastguard Worker bool is_pt_5 = (params->devinfo.verx10 % 10) == 5;
457*61046927SAndroid Build Coastguard Worker snprintf(prefix_tmp, sizeof(prefix_tmp), "gfx%d%s_clc_%s",
458*61046927SAndroid Build Coastguard Worker params->devinfo.ver, is_pt_5 ? "5" : "", params->entry_point);
459*61046927SAndroid Build Coastguard Worker prefix = prefix_tmp;
460*61046927SAndroid Build Coastguard Worker }
461*61046927SAndroid Build Coastguard Worker
462*61046927SAndroid Build Coastguard Worker if (params->outfile != NULL) {
463*61046927SAndroid Build Coastguard Worker FILE *fp = fopen(params->outfile, "w");
464*61046927SAndroid Build Coastguard Worker print_kernel(fp, prefix, &kernel, isa);
465*61046927SAndroid Build Coastguard Worker fclose(fp);
466*61046927SAndroid Build Coastguard Worker } else {
467*61046927SAndroid Build Coastguard Worker print_kernel(stdout, prefix, &kernel, isa);
468*61046927SAndroid Build Coastguard Worker }
469*61046927SAndroid Build Coastguard Worker
470*61046927SAndroid Build Coastguard Worker exit:
471*61046927SAndroid Build Coastguard Worker disk_cache_destroy(disk_cache);
472*61046927SAndroid Build Coastguard Worker return ret;
473*61046927SAndroid Build Coastguard Worker }
474*61046927SAndroid Build Coastguard Worker
475*61046927SAndroid Build Coastguard Worker static void
print_llvm_version(FILE * out)476*61046927SAndroid Build Coastguard Worker print_llvm_version(FILE *out)
477*61046927SAndroid Build Coastguard Worker {
478*61046927SAndroid Build Coastguard Worker fprintf(out, "%s\n", MESA_LLVM_VERSION_STRING);
479*61046927SAndroid Build Coastguard Worker }
480*61046927SAndroid Build Coastguard Worker
main(int argc,char ** argv)481*61046927SAndroid Build Coastguard Worker int main(int argc, char **argv)
482*61046927SAndroid Build Coastguard Worker {
483*61046927SAndroid Build Coastguard Worker int exit_code = 0;
484*61046927SAndroid Build Coastguard Worker
485*61046927SAndroid Build Coastguard Worker process_intel_debug_variable();
486*61046927SAndroid Build Coastguard Worker
487*61046927SAndroid Build Coastguard Worker static struct option long_options[] ={
488*61046927SAndroid Build Coastguard Worker {"help", no_argument, 0, 'h'},
489*61046927SAndroid Build Coastguard Worker {"entrypoint", required_argument, 0, 'e'},
490*61046927SAndroid Build Coastguard Worker {"platform", required_argument, 0, 'p'},
491*61046927SAndroid Build Coastguard Worker {"prefix", required_argument, 0, OPT_PREFIX},
492*61046927SAndroid Build Coastguard Worker {"in", required_argument, 0, 'i'},
493*61046927SAndroid Build Coastguard Worker {"out", required_argument, 0, 'o'},
494*61046927SAndroid Build Coastguard Worker {"spv", required_argument, 0, 's'},
495*61046927SAndroid Build Coastguard Worker {"text", required_argument, 0, 't'},
496*61046927SAndroid Build Coastguard Worker {"gfx-version", required_argument, 0, 'g'},
497*61046927SAndroid Build Coastguard Worker {"nir", no_argument, 0, 'n'},
498*61046927SAndroid Build Coastguard Worker {"llvm17-wa", no_argument, 0, 'L'},
499*61046927SAndroid Build Coastguard Worker {"llvm-version", no_argument, 0, 'M'},
500*61046927SAndroid Build Coastguard Worker {"verbose", no_argument, 0, 'v'},
501*61046927SAndroid Build Coastguard Worker {0, 0, 0, 0}
502*61046927SAndroid Build Coastguard Worker };
503*61046927SAndroid Build Coastguard Worker
504*61046927SAndroid Build Coastguard Worker struct intel_clc_params params = {};
505*61046927SAndroid Build Coastguard Worker
506*61046927SAndroid Build Coastguard Worker struct util_dynarray clang_args;
507*61046927SAndroid Build Coastguard Worker struct util_dynarray input_files;
508*61046927SAndroid Build Coastguard Worker
509*61046927SAndroid Build Coastguard Worker struct clc_binary spirv_obj = {0};
510*61046927SAndroid Build Coastguard Worker struct clc_parsed_spirv parsed_spirv_data = {0};
511*61046927SAndroid Build Coastguard Worker struct disk_cache *disk_cache = NULL;
512*61046927SAndroid Build Coastguard Worker
513*61046927SAndroid Build Coastguard Worker params.mem_ctx = ralloc_context(NULL);
514*61046927SAndroid Build Coastguard Worker
515*61046927SAndroid Build Coastguard Worker util_dynarray_init(&clang_args, params.mem_ctx);
516*61046927SAndroid Build Coastguard Worker util_dynarray_init(&input_files, params.mem_ctx);
517*61046927SAndroid Build Coastguard Worker
518*61046927SAndroid Build Coastguard Worker int ch;
519*61046927SAndroid Build Coastguard Worker while ((ch = getopt_long(argc, argv, "he:p:s:t:i:no:MLvg:", long_options, NULL)) != -1)
520*61046927SAndroid Build Coastguard Worker {
521*61046927SAndroid Build Coastguard Worker switch (ch)
522*61046927SAndroid Build Coastguard Worker {
523*61046927SAndroid Build Coastguard Worker case 'h':
524*61046927SAndroid Build Coastguard Worker print_usage(argv[0], stdout);
525*61046927SAndroid Build Coastguard Worker goto end;
526*61046927SAndroid Build Coastguard Worker case 'e':
527*61046927SAndroid Build Coastguard Worker params.entry_point = optarg;
528*61046927SAndroid Build Coastguard Worker break;
529*61046927SAndroid Build Coastguard Worker case 'p':
530*61046927SAndroid Build Coastguard Worker params.platform = optarg;
531*61046927SAndroid Build Coastguard Worker break;
532*61046927SAndroid Build Coastguard Worker case 'o':
533*61046927SAndroid Build Coastguard Worker params.outfile = optarg;
534*61046927SAndroid Build Coastguard Worker break;
535*61046927SAndroid Build Coastguard Worker case 'i':
536*61046927SAndroid Build Coastguard Worker util_dynarray_append(&input_files, char *, optarg);
537*61046927SAndroid Build Coastguard Worker break;
538*61046927SAndroid Build Coastguard Worker case 'n':
539*61046927SAndroid Build Coastguard Worker params.output_nir = true;
540*61046927SAndroid Build Coastguard Worker break;
541*61046927SAndroid Build Coastguard Worker case 's':
542*61046927SAndroid Build Coastguard Worker params.spv_outfile = optarg;
543*61046927SAndroid Build Coastguard Worker break;
544*61046927SAndroid Build Coastguard Worker case 't':
545*61046927SAndroid Build Coastguard Worker params.txt_outfile = optarg;
546*61046927SAndroid Build Coastguard Worker break;
547*61046927SAndroid Build Coastguard Worker case 'v':
548*61046927SAndroid Build Coastguard Worker params.print_info = true;
549*61046927SAndroid Build Coastguard Worker break;
550*61046927SAndroid Build Coastguard Worker case 'L':
551*61046927SAndroid Build Coastguard Worker params.llvm17_wa = true;
552*61046927SAndroid Build Coastguard Worker break;
553*61046927SAndroid Build Coastguard Worker case 'M':
554*61046927SAndroid Build Coastguard Worker print_llvm_version(stdout);
555*61046927SAndroid Build Coastguard Worker return EXIT_SUCCESS;
556*61046927SAndroid Build Coastguard Worker case 'g':
557*61046927SAndroid Build Coastguard Worker params.gfx_version = strtoul(optarg, NULL, 10);
558*61046927SAndroid Build Coastguard Worker break;
559*61046927SAndroid Build Coastguard Worker case OPT_PREFIX:
560*61046927SAndroid Build Coastguard Worker params.prefix = optarg;
561*61046927SAndroid Build Coastguard Worker break;
562*61046927SAndroid Build Coastguard Worker default:
563*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Unrecognized option \"%s\".\n", optarg);
564*61046927SAndroid Build Coastguard Worker print_usage(argv[0], stderr);
565*61046927SAndroid Build Coastguard Worker goto fail;
566*61046927SAndroid Build Coastguard Worker }
567*61046927SAndroid Build Coastguard Worker }
568*61046927SAndroid Build Coastguard Worker
569*61046927SAndroid Build Coastguard Worker for (int i = optind; i < argc; i++) {
570*61046927SAndroid Build Coastguard Worker util_dynarray_append(&clang_args, char *, argv[i]);
571*61046927SAndroid Build Coastguard Worker }
572*61046927SAndroid Build Coastguard Worker
573*61046927SAndroid Build Coastguard Worker if (util_dynarray_num_elements(&input_files, char *) == 0) {
574*61046927SAndroid Build Coastguard Worker fprintf(stderr, "No input file(s).\n");
575*61046927SAndroid Build Coastguard Worker print_usage(argv[0], stderr);
576*61046927SAndroid Build Coastguard Worker goto fail;
577*61046927SAndroid Build Coastguard Worker }
578*61046927SAndroid Build Coastguard Worker
579*61046927SAndroid Build Coastguard Worker struct clc_logger logger = {
580*61046927SAndroid Build Coastguard Worker .error = msg_callback,
581*61046927SAndroid Build Coastguard Worker .warning = msg_callback,
582*61046927SAndroid Build Coastguard Worker };
583*61046927SAndroid Build Coastguard Worker
584*61046927SAndroid Build Coastguard Worker size_t total_size = 0;
585*61046927SAndroid Build Coastguard Worker char *all_inputs = NULL;
586*61046927SAndroid Build Coastguard Worker util_dynarray_foreach(&input_files, char *, infile) {
587*61046927SAndroid Build Coastguard Worker int fd = open(*infile, O_RDONLY);
588*61046927SAndroid Build Coastguard Worker if (fd < 0) {
589*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Failed to open %s\n", *infile);
590*61046927SAndroid Build Coastguard Worker goto fail;
591*61046927SAndroid Build Coastguard Worker }
592*61046927SAndroid Build Coastguard Worker
593*61046927SAndroid Build Coastguard Worker off_t len = lseek(fd, 0, SEEK_END);
594*61046927SAndroid Build Coastguard Worker size_t new_size = total_size + len;
595*61046927SAndroid Build Coastguard Worker all_inputs = reralloc_size(params.mem_ctx, all_inputs, new_size + 1);
596*61046927SAndroid Build Coastguard Worker if (!all_inputs) {
597*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Failed to allocate memory\n");
598*61046927SAndroid Build Coastguard Worker goto fail;
599*61046927SAndroid Build Coastguard Worker }
600*61046927SAndroid Build Coastguard Worker lseek(fd, 0, SEEK_SET);
601*61046927SAndroid Build Coastguard Worker read(fd, all_inputs + total_size, len);
602*61046927SAndroid Build Coastguard Worker close(fd);
603*61046927SAndroid Build Coastguard Worker total_size = new_size;
604*61046927SAndroid Build Coastguard Worker all_inputs[total_size] = '\0';
605*61046927SAndroid Build Coastguard Worker }
606*61046927SAndroid Build Coastguard Worker
607*61046927SAndroid Build Coastguard Worker if (params.txt_outfile) {
608*61046927SAndroid Build Coastguard Worker FILE *fp = fopen(params.txt_outfile, "w");
609*61046927SAndroid Build Coastguard Worker fwrite(all_inputs, total_size, 1, fp);
610*61046927SAndroid Build Coastguard Worker fclose(fp);
611*61046927SAndroid Build Coastguard Worker }
612*61046927SAndroid Build Coastguard Worker
613*61046927SAndroid Build Coastguard Worker const char *allowed_spirv_extensions[] = {
614*61046927SAndroid Build Coastguard Worker "SPV_EXT_shader_atomic_float_add",
615*61046927SAndroid Build Coastguard Worker "SPV_EXT_shader_atomic_float_min_max",
616*61046927SAndroid Build Coastguard Worker "SPV_KHR_float_controls",
617*61046927SAndroid Build Coastguard Worker "SPV_INTEL_subgroups",
618*61046927SAndroid Build Coastguard Worker NULL,
619*61046927SAndroid Build Coastguard Worker };
620*61046927SAndroid Build Coastguard Worker
621*61046927SAndroid Build Coastguard Worker struct clc_compile_args clc_args = {
622*61046927SAndroid Build Coastguard Worker .source = {
623*61046927SAndroid Build Coastguard Worker .name = "intel_clc_files",
624*61046927SAndroid Build Coastguard Worker .value = all_inputs,
625*61046927SAndroid Build Coastguard Worker },
626*61046927SAndroid Build Coastguard Worker .features = {
627*61046927SAndroid Build Coastguard Worker .fp16 = true,
628*61046927SAndroid Build Coastguard Worker .intel_subgroups = true,
629*61046927SAndroid Build Coastguard Worker .subgroups = true,
630*61046927SAndroid Build Coastguard Worker .subgroups_ifp = true,
631*61046927SAndroid Build Coastguard Worker },
632*61046927SAndroid Build Coastguard Worker .args = util_dynarray_begin(&clang_args),
633*61046927SAndroid Build Coastguard Worker .num_args = util_dynarray_num_elements(&clang_args, char *),
634*61046927SAndroid Build Coastguard Worker .allowed_spirv_extensions = allowed_spirv_extensions,
635*61046927SAndroid Build Coastguard Worker };
636*61046927SAndroid Build Coastguard Worker
637*61046927SAndroid Build Coastguard Worker if (!clc_compile_c_to_spirv(&clc_args, &logger, &spirv_obj)) {
638*61046927SAndroid Build Coastguard Worker goto fail;
639*61046927SAndroid Build Coastguard Worker }
640*61046927SAndroid Build Coastguard Worker
641*61046927SAndroid Build Coastguard Worker if (params.spv_outfile) {
642*61046927SAndroid Build Coastguard Worker FILE *fp = fopen(params.spv_outfile, "w");
643*61046927SAndroid Build Coastguard Worker fwrite(spirv_obj.data, spirv_obj.size, 1, fp);
644*61046927SAndroid Build Coastguard Worker fclose(fp);
645*61046927SAndroid Build Coastguard Worker }
646*61046927SAndroid Build Coastguard Worker
647*61046927SAndroid Build Coastguard Worker glsl_type_singleton_init_or_ref();
648*61046927SAndroid Build Coastguard Worker
649*61046927SAndroid Build Coastguard Worker if (params.output_nir) {
650*61046927SAndroid Build Coastguard Worker if (params.gfx_version == 0) {
651*61046927SAndroid Build Coastguard Worker fprintf(stderr, "No target Gfx version specified.\n");
652*61046927SAndroid Build Coastguard Worker print_usage(argv[0], stderr);
653*61046927SAndroid Build Coastguard Worker goto fail;
654*61046927SAndroid Build Coastguard Worker }
655*61046927SAndroid Build Coastguard Worker
656*61046927SAndroid Build Coastguard Worker exit_code = output_nir(¶ms, &spirv_obj);
657*61046927SAndroid Build Coastguard Worker } else {
658*61046927SAndroid Build Coastguard Worker if (params.platform == NULL) {
659*61046927SAndroid Build Coastguard Worker fprintf(stderr, "No target platform name specified.\n");
660*61046927SAndroid Build Coastguard Worker print_usage(argv[0], stderr);
661*61046927SAndroid Build Coastguard Worker goto fail;
662*61046927SAndroid Build Coastguard Worker }
663*61046927SAndroid Build Coastguard Worker
664*61046927SAndroid Build Coastguard Worker int pci_id = intel_device_name_to_pci_device_id(params.platform);
665*61046927SAndroid Build Coastguard Worker if (pci_id < 0) {
666*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Invalid target platform name: %s\n", params.platform);
667*61046927SAndroid Build Coastguard Worker goto fail;
668*61046927SAndroid Build Coastguard Worker }
669*61046927SAndroid Build Coastguard Worker
670*61046927SAndroid Build Coastguard Worker if (!intel_get_device_info_for_build(pci_id, ¶ms.devinfo)) {
671*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Failed to get device information.\n");
672*61046927SAndroid Build Coastguard Worker goto fail;
673*61046927SAndroid Build Coastguard Worker }
674*61046927SAndroid Build Coastguard Worker
675*61046927SAndroid Build Coastguard Worker if (params.devinfo.verx10 < 125) {
676*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Platform currently not supported.\n");
677*61046927SAndroid Build Coastguard Worker goto fail;
678*61046927SAndroid Build Coastguard Worker }
679*61046927SAndroid Build Coastguard Worker
680*61046927SAndroid Build Coastguard Worker if (params.gfx_version) {
681*61046927SAndroid Build Coastguard Worker fprintf(stderr, "WARNING: Ignorining unnecessary parameter for "
682*61046927SAndroid Build Coastguard Worker "gfx version, using version based on platform.\n");
683*61046927SAndroid Build Coastguard Worker /* Keep going. */
684*61046927SAndroid Build Coastguard Worker }
685*61046927SAndroid Build Coastguard Worker
686*61046927SAndroid Build Coastguard Worker if (params.entry_point == NULL) {
687*61046927SAndroid Build Coastguard Worker fprintf(stderr, "No entry-point name specified.\n");
688*61046927SAndroid Build Coastguard Worker print_usage(argv[0], stderr);
689*61046927SAndroid Build Coastguard Worker goto fail;
690*61046927SAndroid Build Coastguard Worker }
691*61046927SAndroid Build Coastguard Worker
692*61046927SAndroid Build Coastguard Worker if (!clc_parse_spirv(&spirv_obj, &logger, &parsed_spirv_data))
693*61046927SAndroid Build Coastguard Worker goto fail;
694*61046927SAndroid Build Coastguard Worker
695*61046927SAndroid Build Coastguard Worker const struct clc_kernel_info *kernel_info = NULL;
696*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < parsed_spirv_data.num_kernels; i++) {
697*61046927SAndroid Build Coastguard Worker if (strcmp(parsed_spirv_data.kernels[i].name, params.entry_point) == 0) {
698*61046927SAndroid Build Coastguard Worker kernel_info = &parsed_spirv_data.kernels[i];
699*61046927SAndroid Build Coastguard Worker break;
700*61046927SAndroid Build Coastguard Worker }
701*61046927SAndroid Build Coastguard Worker }
702*61046927SAndroid Build Coastguard Worker if (kernel_info == NULL) {
703*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Kernel entrypoint %s not found\n", params.entry_point);
704*61046927SAndroid Build Coastguard Worker goto fail;
705*61046927SAndroid Build Coastguard Worker }
706*61046927SAndroid Build Coastguard Worker
707*61046927SAndroid Build Coastguard Worker exit_code = output_isa(¶ms, &spirv_obj);
708*61046927SAndroid Build Coastguard Worker }
709*61046927SAndroid Build Coastguard Worker
710*61046927SAndroid Build Coastguard Worker glsl_type_singleton_decref();
711*61046927SAndroid Build Coastguard Worker
712*61046927SAndroid Build Coastguard Worker goto end;
713*61046927SAndroid Build Coastguard Worker
714*61046927SAndroid Build Coastguard Worker fail:
715*61046927SAndroid Build Coastguard Worker exit_code = 1;
716*61046927SAndroid Build Coastguard Worker
717*61046927SAndroid Build Coastguard Worker end:
718*61046927SAndroid Build Coastguard Worker disk_cache_destroy(disk_cache);
719*61046927SAndroid Build Coastguard Worker clc_free_parsed_spirv(&parsed_spirv_data);
720*61046927SAndroid Build Coastguard Worker clc_free_spirv(&spirv_obj);
721*61046927SAndroid Build Coastguard Worker ralloc_free(params.mem_ctx);
722*61046927SAndroid Build Coastguard Worker
723*61046927SAndroid Build Coastguard Worker return exit_code;
724*61046927SAndroid Build Coastguard Worker }
725