1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2020 Google, Inc.
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker */
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Worker #include "ir3_assembler.h"
7*61046927SAndroid Build Coastguard Worker #include "ir3_parser.h"
8*61046927SAndroid Build Coastguard Worker #include "ir3_shader.h"
9*61046927SAndroid Build Coastguard Worker
10*61046927SAndroid Build Coastguard Worker /**
11*61046927SAndroid Build Coastguard Worker * A helper to go from ir3 assembly to assembled shader. The shader has a
12*61046927SAndroid Build Coastguard Worker * single variant.
13*61046927SAndroid Build Coastguard Worker */
14*61046927SAndroid Build Coastguard Worker struct ir3_shader *
ir3_parse_asm(struct ir3_compiler * c,struct ir3_kernel_info * info,FILE * in)15*61046927SAndroid Build Coastguard Worker ir3_parse_asm(struct ir3_compiler *c, struct ir3_kernel_info *info, FILE *in)
16*61046927SAndroid Build Coastguard Worker {
17*61046927SAndroid Build Coastguard Worker struct ir3_shader *shader = rzalloc_size(NULL, sizeof(*shader));
18*61046927SAndroid Build Coastguard Worker shader->compiler = c;
19*61046927SAndroid Build Coastguard Worker shader->type = MESA_SHADER_COMPUTE;
20*61046927SAndroid Build Coastguard Worker mtx_init(&shader->variants_lock, mtx_plain);
21*61046927SAndroid Build Coastguard Worker
22*61046927SAndroid Build Coastguard Worker struct ir3_shader_variant *v = rzalloc_size(shader, sizeof(*v));
23*61046927SAndroid Build Coastguard Worker v->type = MESA_SHADER_COMPUTE;
24*61046927SAndroid Build Coastguard Worker v->compiler = c;
25*61046927SAndroid Build Coastguard Worker v->const_state = rzalloc_size(v, sizeof(*v->const_state));
26*61046927SAndroid Build Coastguard Worker
27*61046927SAndroid Build Coastguard Worker v->shader_options.real_wavesize = IR3_SINGLE_OR_DOUBLE;
28*61046927SAndroid Build Coastguard Worker
29*61046927SAndroid Build Coastguard Worker if (c->gen >= 6)
30*61046927SAndroid Build Coastguard Worker v->mergedregs = true;
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker shader->variants = v;
33*61046927SAndroid Build Coastguard Worker shader->variant_count = 1;
34*61046927SAndroid Build Coastguard Worker
35*61046927SAndroid Build Coastguard Worker info->numwg = INVALID_REG;
36*61046927SAndroid Build Coastguard Worker
37*61046927SAndroid Build Coastguard Worker for (int i = 0; i < MAX_BUFS; i++) {
38*61046927SAndroid Build Coastguard Worker info->buf_addr_regs[i] = INVALID_REG;
39*61046927SAndroid Build Coastguard Worker }
40*61046927SAndroid Build Coastguard Worker
41*61046927SAndroid Build Coastguard Worker /* Provide a default local_size in case the shader doesn't set it, so that
42*61046927SAndroid Build Coastguard Worker * we don't crash at least.
43*61046927SAndroid Build Coastguard Worker */
44*61046927SAndroid Build Coastguard Worker v->local_size[0] = v->local_size[1] = v->local_size[2] = 1;
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker v->ir = ir3_parse(v, info, in);
47*61046927SAndroid Build Coastguard Worker if (!v->ir)
48*61046927SAndroid Build Coastguard Worker goto error;
49*61046927SAndroid Build Coastguard Worker
50*61046927SAndroid Build Coastguard Worker ir3_debug_print(v->ir, "AFTER PARSING");
51*61046927SAndroid Build Coastguard Worker
52*61046927SAndroid Build Coastguard Worker v->bin = ir3_shader_assemble(v);
53*61046927SAndroid Build Coastguard Worker if (!v->bin)
54*61046927SAndroid Build Coastguard Worker goto error;
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker return shader;
57*61046927SAndroid Build Coastguard Worker
58*61046927SAndroid Build Coastguard Worker error:
59*61046927SAndroid Build Coastguard Worker ralloc_free(shader);
60*61046927SAndroid Build Coastguard Worker return NULL;
61*61046927SAndroid Build Coastguard Worker }
62