xref: /aosp_15_r20/external/mesa3d/src/freedreno/ir3/ir3_assembler.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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