xref: /aosp_15_r20/external/mesa3d/src/imagination/rogue/rogue_compile.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2022 Imagination Technologies Ltd.
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a copy
5*61046927SAndroid Build Coastguard Worker  * of this software and associated documentation files (the "Software"), to deal
6*61046927SAndroid Build Coastguard Worker  * in the Software without restriction, including without limitation the rights
7*61046927SAndroid Build Coastguard Worker  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8*61046927SAndroid Build Coastguard Worker  * copies of the Software, and to permit persons to whom the Software is
9*61046927SAndroid Build Coastguard Worker  * 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 THE
18*61046927SAndroid Build Coastguard Worker  * 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 FROM,
20*61046927SAndroid Build Coastguard Worker  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*61046927SAndroid Build Coastguard Worker  * SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #include "compiler/shader_enums.h"
25*61046927SAndroid Build Coastguard Worker #include "compiler/spirv/nir_spirv.h"
26*61046927SAndroid Build Coastguard Worker #include "nir/nir.h"
27*61046927SAndroid Build Coastguard Worker #include "rogue.h"
28*61046927SAndroid Build Coastguard Worker #include "rogue_builder.h"
29*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
30*61046927SAndroid Build Coastguard Worker /* FIXME: Remove once the compiler/driver interface is finalised. */
31*61046927SAndroid Build Coastguard Worker #include "vulkan/vulkan_core.h"
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker /**
34*61046927SAndroid Build Coastguard Worker  * \file rogue_compile.c
35*61046927SAndroid Build Coastguard Worker  *
36*61046927SAndroid Build Coastguard Worker  * \brief Contains NIR to Rogue translation functions, and Rogue passes.
37*61046927SAndroid Build Coastguard Worker  */
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker /* For ALU scalars */
40*61046927SAndroid Build Coastguard Worker /* TODO: expand and use these helpers. */
nir_ssa_reg(rogue_shader * shader,unsigned index,unsigned num_components,unsigned component)41*61046927SAndroid Build Coastguard Worker static rogue_ref nir_ssa_reg(rogue_shader *shader,
42*61046927SAndroid Build Coastguard Worker                              unsigned index,
43*61046927SAndroid Build Coastguard Worker                              unsigned num_components,
44*61046927SAndroid Build Coastguard Worker                              unsigned component)
45*61046927SAndroid Build Coastguard Worker {
46*61046927SAndroid Build Coastguard Worker    if (num_components > 1) {
47*61046927SAndroid Build Coastguard Worker       return rogue_ref_regarray(
48*61046927SAndroid Build Coastguard Worker          rogue_ssa_vec_regarray(shader, 1, index, component));
49*61046927SAndroid Build Coastguard Worker    }
50*61046927SAndroid Build Coastguard Worker 
51*61046927SAndroid Build Coastguard Worker    return rogue_ref_reg(rogue_ssa_reg(shader, index));
52*61046927SAndroid Build Coastguard Worker }
53*61046927SAndroid Build Coastguard Worker 
nir_ssa_regarray(rogue_shader * shader,unsigned index,unsigned num_components,unsigned component)54*61046927SAndroid Build Coastguard Worker static rogue_ref nir_ssa_regarray(rogue_shader *shader,
55*61046927SAndroid Build Coastguard Worker                                   unsigned index,
56*61046927SAndroid Build Coastguard Worker                                   unsigned num_components,
57*61046927SAndroid Build Coastguard Worker                                   unsigned component)
58*61046927SAndroid Build Coastguard Worker {
59*61046927SAndroid Build Coastguard Worker    return rogue_ref_regarray(
60*61046927SAndroid Build Coastguard Worker       rogue_ssa_vec_regarray(shader, num_components, index, component));
61*61046927SAndroid Build Coastguard Worker }
62*61046927SAndroid Build Coastguard Worker 
nir_ssa_reg_alu_src(rogue_shader * shader,const nir_alu_instr * alu,unsigned src_num,bool vec)63*61046927SAndroid Build Coastguard Worker static rogue_ref nir_ssa_reg_alu_src(rogue_shader *shader,
64*61046927SAndroid Build Coastguard Worker                                      const nir_alu_instr *alu,
65*61046927SAndroid Build Coastguard Worker                                      unsigned src_num,
66*61046927SAndroid Build Coastguard Worker                                      bool vec)
67*61046927SAndroid Build Coastguard Worker {
68*61046927SAndroid Build Coastguard Worker    unsigned index = alu->src[src_num].src.ssa->index;
69*61046927SAndroid Build Coastguard Worker    unsigned num_components = alu->src[src_num].src.ssa->num_components;
70*61046927SAndroid Build Coastguard Worker    unsigned component = alu->src[src_num].swizzle[0];
71*61046927SAndroid Build Coastguard Worker 
72*61046927SAndroid Build Coastguard Worker    assert(num_components == 1);
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker    return vec ? nir_ssa_regarray(shader, index, num_components, component)
75*61046927SAndroid Build Coastguard Worker               : nir_ssa_reg(shader, index, num_components, component);
76*61046927SAndroid Build Coastguard Worker }
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker static rogue_ref
nir_ssa_reg_alu_dst(rogue_shader * shader,const nir_alu_instr * alu,bool vec)79*61046927SAndroid Build Coastguard Worker nir_ssa_reg_alu_dst(rogue_shader *shader, const nir_alu_instr *alu, bool vec)
80*61046927SAndroid Build Coastguard Worker {
81*61046927SAndroid Build Coastguard Worker    unsigned num_components = alu->def.num_components;
82*61046927SAndroid Build Coastguard Worker    unsigned index = alu->def.index;
83*61046927SAndroid Build Coastguard Worker 
84*61046927SAndroid Build Coastguard Worker    assert(num_components == 1);
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker    return vec ? nir_ssa_regarray(shader, index, num_components, 0)
87*61046927SAndroid Build Coastguard Worker               : nir_ssa_reg(shader, index, num_components, 0);
88*61046927SAndroid Build Coastguard Worker }
89*61046927SAndroid Build Coastguard Worker 
trans_nir_jump_return(rogue_builder * b,nir_jump_instr * jump)90*61046927SAndroid Build Coastguard Worker static void trans_nir_jump_return(rogue_builder *b, nir_jump_instr *jump)
91*61046927SAndroid Build Coastguard Worker {
92*61046927SAndroid Build Coastguard Worker    rogue_END(b);
93*61046927SAndroid Build Coastguard Worker }
94*61046927SAndroid Build Coastguard Worker 
trans_nir_jump(rogue_builder * b,nir_jump_instr * jump)95*61046927SAndroid Build Coastguard Worker static void trans_nir_jump(rogue_builder *b, nir_jump_instr *jump)
96*61046927SAndroid Build Coastguard Worker {
97*61046927SAndroid Build Coastguard Worker    switch (jump->type) {
98*61046927SAndroid Build Coastguard Worker    case nir_jump_return:
99*61046927SAndroid Build Coastguard Worker       return trans_nir_jump_return(b, jump);
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker    default:
102*61046927SAndroid Build Coastguard Worker       break;
103*61046927SAndroid Build Coastguard Worker    }
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker    unreachable("Unimplemented NIR jump instruction type.");
106*61046927SAndroid Build Coastguard Worker }
107*61046927SAndroid Build Coastguard Worker 
trans_nir_load_const(rogue_builder * b,nir_load_const_instr * load_const)108*61046927SAndroid Build Coastguard Worker static void trans_nir_load_const(rogue_builder *b,
109*61046927SAndroid Build Coastguard Worker                                  nir_load_const_instr *load_const)
110*61046927SAndroid Build Coastguard Worker {
111*61046927SAndroid Build Coastguard Worker    unsigned dst_index = load_const->def.index;
112*61046927SAndroid Build Coastguard Worker    unsigned bit_size = load_const->def.bit_size;
113*61046927SAndroid Build Coastguard Worker    switch (bit_size) {
114*61046927SAndroid Build Coastguard Worker    case 32: {
115*61046927SAndroid Build Coastguard Worker       rogue_reg *dst = rogue_ssa_reg(b->shader, dst_index);
116*61046927SAndroid Build Coastguard Worker       uint32_t imm = nir_const_value_as_uint(load_const->value[0], 32);
117*61046927SAndroid Build Coastguard Worker       rogue_MOV(b, rogue_ref_reg(dst), rogue_ref_imm(imm));
118*61046927SAndroid Build Coastguard Worker 
119*61046927SAndroid Build Coastguard Worker       break;
120*61046927SAndroid Build Coastguard Worker    }
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker    case 64: {
123*61046927SAndroid Build Coastguard Worker       uint64_t imm = nir_const_value_as_uint(load_const->value[0], 64);
124*61046927SAndroid Build Coastguard Worker       uint32_t imm_2x32[2] = { imm & 0xffffffff, (imm >> 32) & 0xffffffff };
125*61046927SAndroid Build Coastguard Worker 
126*61046927SAndroid Build Coastguard Worker       rogue_regarray *dst[2] = {
127*61046927SAndroid Build Coastguard Worker          rogue_ssa_vec_regarray(b->shader, 1, dst_index, 0),
128*61046927SAndroid Build Coastguard Worker          rogue_ssa_vec_regarray(b->shader, 1, dst_index, 1),
129*61046927SAndroid Build Coastguard Worker       };
130*61046927SAndroid Build Coastguard Worker 
131*61046927SAndroid Build Coastguard Worker       rogue_MOV(b, rogue_ref_regarray(dst[0]), rogue_ref_imm(imm_2x32[0]));
132*61046927SAndroid Build Coastguard Worker       rogue_MOV(b, rogue_ref_regarray(dst[1]), rogue_ref_imm(imm_2x32[1]));
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker       break;
135*61046927SAndroid Build Coastguard Worker    }
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker    default:
138*61046927SAndroid Build Coastguard Worker       unreachable("Unimplemented NIR load_const bit size.");
139*61046927SAndroid Build Coastguard Worker    }
140*61046927SAndroid Build Coastguard Worker }
141*61046927SAndroid Build Coastguard Worker 
trans_nir_intrinsic_load_input_fs(rogue_builder * b,nir_intrinsic_instr * intr)142*61046927SAndroid Build Coastguard Worker static void trans_nir_intrinsic_load_input_fs(rogue_builder *b,
143*61046927SAndroid Build Coastguard Worker                                               nir_intrinsic_instr *intr)
144*61046927SAndroid Build Coastguard Worker {
145*61046927SAndroid Build Coastguard Worker    struct rogue_fs_build_data *fs_data = &b->shader->ctx->stage_data.fs;
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker    unsigned load_size = intr->def.num_components;
148*61046927SAndroid Build Coastguard Worker    assert(load_size == 1); /* TODO: We can support larger load sizes. */
149*61046927SAndroid Build Coastguard Worker 
150*61046927SAndroid Build Coastguard Worker    rogue_reg *dst = rogue_ssa_reg(b->shader, intr->def.index);
151*61046927SAndroid Build Coastguard Worker 
152*61046927SAndroid Build Coastguard Worker    struct nir_io_semantics io_semantics = nir_intrinsic_io_semantics(intr);
153*61046927SAndroid Build Coastguard Worker    unsigned component = nir_intrinsic_component(intr);
154*61046927SAndroid Build Coastguard Worker    unsigned coeff_index = rogue_coeff_index_fs(&fs_data->iterator_args,
155*61046927SAndroid Build Coastguard Worker                                                io_semantics.location,
156*61046927SAndroid Build Coastguard Worker                                                component);
157*61046927SAndroid Build Coastguard Worker    unsigned wcoeff_index = rogue_coeff_index_fs(&fs_data->iterator_args, ~0, 0);
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker    rogue_regarray *coeffs = rogue_coeff_regarray(b->shader,
160*61046927SAndroid Build Coastguard Worker                                                  ROGUE_COEFF_ALIGN * load_size,
161*61046927SAndroid Build Coastguard Worker                                                  coeff_index);
162*61046927SAndroid Build Coastguard Worker    rogue_regarray *wcoeffs =
163*61046927SAndroid Build Coastguard Worker       rogue_coeff_regarray(b->shader, ROGUE_COEFF_ALIGN, wcoeff_index);
164*61046927SAndroid Build Coastguard Worker 
165*61046927SAndroid Build Coastguard Worker    rogue_instr *instr = &rogue_FITRP_PIXEL(b,
166*61046927SAndroid Build Coastguard Worker                                            rogue_ref_reg(dst),
167*61046927SAndroid Build Coastguard Worker                                            rogue_ref_drc(0),
168*61046927SAndroid Build Coastguard Worker                                            rogue_ref_regarray(coeffs),
169*61046927SAndroid Build Coastguard Worker                                            rogue_ref_regarray(wcoeffs),
170*61046927SAndroid Build Coastguard Worker                                            rogue_ref_val(load_size))
171*61046927SAndroid Build Coastguard Worker                             ->instr;
172*61046927SAndroid Build Coastguard Worker    rogue_add_instr_comment(instr, "load_input_fs");
173*61046927SAndroid Build Coastguard Worker }
174*61046927SAndroid Build Coastguard Worker 
trans_nir_intrinsic_load_input_vs(rogue_builder * b,nir_intrinsic_instr * intr)175*61046927SAndroid Build Coastguard Worker static void trans_nir_intrinsic_load_input_vs(rogue_builder *b,
176*61046927SAndroid Build Coastguard Worker                                               nir_intrinsic_instr *intr)
177*61046927SAndroid Build Coastguard Worker {
178*61046927SAndroid Build Coastguard Worker    struct pvr_pipeline_layout *pipeline_layout =
179*61046927SAndroid Build Coastguard Worker       b->shader->ctx->pipeline_layout;
180*61046927SAndroid Build Coastguard Worker 
181*61046927SAndroid Build Coastguard Worker    ASSERTED unsigned load_size = intr->def.num_components;
182*61046927SAndroid Build Coastguard Worker    assert(load_size == 1); /* TODO: We can support larger load sizes. */
183*61046927SAndroid Build Coastguard Worker 
184*61046927SAndroid Build Coastguard Worker    rogue_reg *dst = rogue_ssa_reg(b->shader, intr->def.index);
185*61046927SAndroid Build Coastguard Worker 
186*61046927SAndroid Build Coastguard Worker    struct nir_io_semantics io_semantics = nir_intrinsic_io_semantics(intr);
187*61046927SAndroid Build Coastguard Worker    unsigned input = io_semantics.location - VERT_ATTRIB_GENERIC0;
188*61046927SAndroid Build Coastguard Worker    unsigned component = nir_intrinsic_component(intr);
189*61046927SAndroid Build Coastguard Worker    unsigned vtxin_index = ~0U;
190*61046927SAndroid Build Coastguard Worker 
191*61046927SAndroid Build Coastguard Worker    if (pipeline_layout) {
192*61046927SAndroid Build Coastguard Worker       rogue_vertex_inputs *vs_inputs = &b->shader->ctx->stage_data.vs.inputs;
193*61046927SAndroid Build Coastguard Worker       assert(input < vs_inputs->num_input_vars);
194*61046927SAndroid Build Coastguard Worker       assert(component < vs_inputs->components[input]);
195*61046927SAndroid Build Coastguard Worker 
196*61046927SAndroid Build Coastguard Worker       vtxin_index = vs_inputs->base[input] + component;
197*61046927SAndroid Build Coastguard Worker    } else {
198*61046927SAndroid Build Coastguard Worker       /* Dummy defaults for offline compiler. */
199*61046927SAndroid Build Coastguard Worker       /* TODO: Load these from an offline description
200*61046927SAndroid Build Coastguard Worker        * if using the offline compiler.
201*61046927SAndroid Build Coastguard Worker        */
202*61046927SAndroid Build Coastguard Worker 
203*61046927SAndroid Build Coastguard Worker       nir_shader *nir = b->shader->ctx->nir[MESA_SHADER_VERTEX];
204*61046927SAndroid Build Coastguard Worker       vtxin_index = 0;
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker       /* Process inputs. */
207*61046927SAndroid Build Coastguard Worker       nir_foreach_shader_in_variable (var, nir) {
208*61046927SAndroid Build Coastguard Worker          unsigned input_components = glsl_get_components(var->type);
209*61046927SAndroid Build Coastguard Worker          unsigned bit_size =
210*61046927SAndroid Build Coastguard Worker             glsl_base_type_bit_size(glsl_get_base_type(var->type));
211*61046927SAndroid Build Coastguard Worker          assert(bit_size >= 32); /* TODO: Support smaller bit sizes. */
212*61046927SAndroid Build Coastguard Worker          unsigned reg_count = bit_size / 32;
213*61046927SAndroid Build Coastguard Worker 
214*61046927SAndroid Build Coastguard Worker          /* Check input location. */
215*61046927SAndroid Build Coastguard Worker          assert(var->data.location >= VERT_ATTRIB_GENERIC0 &&
216*61046927SAndroid Build Coastguard Worker                 var->data.location <= VERT_ATTRIB_GENERIC15);
217*61046927SAndroid Build Coastguard Worker 
218*61046927SAndroid Build Coastguard Worker          if (var->data.location == io_semantics.location) {
219*61046927SAndroid Build Coastguard Worker             assert(component < input_components);
220*61046927SAndroid Build Coastguard Worker             vtxin_index += reg_count * component;
221*61046927SAndroid Build Coastguard Worker             break;
222*61046927SAndroid Build Coastguard Worker          }
223*61046927SAndroid Build Coastguard Worker 
224*61046927SAndroid Build Coastguard Worker          vtxin_index += reg_count * input_components;
225*61046927SAndroid Build Coastguard Worker       }
226*61046927SAndroid Build Coastguard Worker    }
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker    assert(vtxin_index != ~0U);
229*61046927SAndroid Build Coastguard Worker 
230*61046927SAndroid Build Coastguard Worker    rogue_reg *src = rogue_vtxin_reg(b->shader, vtxin_index);
231*61046927SAndroid Build Coastguard Worker    rogue_instr *instr =
232*61046927SAndroid Build Coastguard Worker       &rogue_MOV(b, rogue_ref_reg(dst), rogue_ref_reg(src))->instr;
233*61046927SAndroid Build Coastguard Worker    rogue_add_instr_comment(instr, "load_input_vs");
234*61046927SAndroid Build Coastguard Worker }
235*61046927SAndroid Build Coastguard Worker 
trans_nir_intrinsic_load_input(rogue_builder * b,nir_intrinsic_instr * intr)236*61046927SAndroid Build Coastguard Worker static void trans_nir_intrinsic_load_input(rogue_builder *b,
237*61046927SAndroid Build Coastguard Worker                                            nir_intrinsic_instr *intr)
238*61046927SAndroid Build Coastguard Worker {
239*61046927SAndroid Build Coastguard Worker    switch (b->shader->stage) {
240*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_FRAGMENT:
241*61046927SAndroid Build Coastguard Worker       return trans_nir_intrinsic_load_input_fs(b, intr);
242*61046927SAndroid Build Coastguard Worker 
243*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_VERTEX:
244*61046927SAndroid Build Coastguard Worker       return trans_nir_intrinsic_load_input_vs(b, intr);
245*61046927SAndroid Build Coastguard Worker 
246*61046927SAndroid Build Coastguard Worker    default:
247*61046927SAndroid Build Coastguard Worker       break;
248*61046927SAndroid Build Coastguard Worker    }
249*61046927SAndroid Build Coastguard Worker 
250*61046927SAndroid Build Coastguard Worker    unreachable("Unimplemented NIR load_input variant.");
251*61046927SAndroid Build Coastguard Worker }
252*61046927SAndroid Build Coastguard Worker 
trans_nir_intrinsic_store_output_fs(rogue_builder * b,nir_intrinsic_instr * intr)253*61046927SAndroid Build Coastguard Worker static void trans_nir_intrinsic_store_output_fs(rogue_builder *b,
254*61046927SAndroid Build Coastguard Worker                                                 nir_intrinsic_instr *intr)
255*61046927SAndroid Build Coastguard Worker {
256*61046927SAndroid Build Coastguard Worker    ASSERTED unsigned store_size = nir_src_num_components(intr->src[0]);
257*61046927SAndroid Build Coastguard Worker    assert(store_size == 1);
258*61046927SAndroid Build Coastguard Worker 
259*61046927SAndroid Build Coastguard Worker    /* TODO: When hoisting I/O allocation to the driver, check if this is
260*61046927SAndroid Build Coastguard Worker     * correct.
261*61046927SAndroid Build Coastguard Worker     */
262*61046927SAndroid Build Coastguard Worker    unsigned pixout_index = nir_src_as_uint(intr->src[1]);
263*61046927SAndroid Build Coastguard Worker 
264*61046927SAndroid Build Coastguard Worker    rogue_reg *dst = rogue_pixout_reg(b->shader, pixout_index);
265*61046927SAndroid Build Coastguard Worker    rogue_reg *src = rogue_ssa_reg(b->shader, intr->src[0].ssa->index);
266*61046927SAndroid Build Coastguard Worker 
267*61046927SAndroid Build Coastguard Worker    rogue_instr *instr =
268*61046927SAndroid Build Coastguard Worker       &rogue_MOV(b, rogue_ref_reg(dst), rogue_ref_reg(src))->instr;
269*61046927SAndroid Build Coastguard Worker    rogue_add_instr_comment(instr, "store_output_fs");
270*61046927SAndroid Build Coastguard Worker }
271*61046927SAndroid Build Coastguard Worker 
trans_nir_intrinsic_store_output_vs(rogue_builder * b,nir_intrinsic_instr * intr)272*61046927SAndroid Build Coastguard Worker static void trans_nir_intrinsic_store_output_vs(rogue_builder *b,
273*61046927SAndroid Build Coastguard Worker                                                 nir_intrinsic_instr *intr)
274*61046927SAndroid Build Coastguard Worker {
275*61046927SAndroid Build Coastguard Worker    struct rogue_vs_build_data *vs_data = &b->shader->ctx->stage_data.vs;
276*61046927SAndroid Build Coastguard Worker 
277*61046927SAndroid Build Coastguard Worker    ASSERTED unsigned store_size = nir_src_num_components(intr->src[0]);
278*61046927SAndroid Build Coastguard Worker    assert(store_size == 1);
279*61046927SAndroid Build Coastguard Worker 
280*61046927SAndroid Build Coastguard Worker    struct nir_io_semantics io_semantics = nir_intrinsic_io_semantics(intr);
281*61046927SAndroid Build Coastguard Worker    unsigned component = nir_intrinsic_component(intr);
282*61046927SAndroid Build Coastguard Worker    unsigned vtxout_index = rogue_output_index_vs(&vs_data->outputs,
283*61046927SAndroid Build Coastguard Worker                                                  io_semantics.location,
284*61046927SAndroid Build Coastguard Worker                                                  component);
285*61046927SAndroid Build Coastguard Worker 
286*61046927SAndroid Build Coastguard Worker    rogue_reg *dst = rogue_vtxout_reg(b->shader, vtxout_index);
287*61046927SAndroid Build Coastguard Worker    rogue_reg *src = rogue_ssa_reg(b->shader, intr->src[0].ssa->index);
288*61046927SAndroid Build Coastguard Worker 
289*61046927SAndroid Build Coastguard Worker    rogue_instr *instr =
290*61046927SAndroid Build Coastguard Worker       &rogue_MOV(b, rogue_ref_reg(dst), rogue_ref_reg(src))->instr;
291*61046927SAndroid Build Coastguard Worker    rogue_add_instr_comment(instr, "store_output_vs");
292*61046927SAndroid Build Coastguard Worker }
293*61046927SAndroid Build Coastguard Worker 
trans_nir_intrinsic_store_output(rogue_builder * b,nir_intrinsic_instr * intr)294*61046927SAndroid Build Coastguard Worker static void trans_nir_intrinsic_store_output(rogue_builder *b,
295*61046927SAndroid Build Coastguard Worker                                              nir_intrinsic_instr *intr)
296*61046927SAndroid Build Coastguard Worker {
297*61046927SAndroid Build Coastguard Worker    switch (b->shader->stage) {
298*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_FRAGMENT:
299*61046927SAndroid Build Coastguard Worker       return trans_nir_intrinsic_store_output_fs(b, intr);
300*61046927SAndroid Build Coastguard Worker 
301*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_VERTEX:
302*61046927SAndroid Build Coastguard Worker       return trans_nir_intrinsic_store_output_vs(b, intr);
303*61046927SAndroid Build Coastguard Worker 
304*61046927SAndroid Build Coastguard Worker    default:
305*61046927SAndroid Build Coastguard Worker       break;
306*61046927SAndroid Build Coastguard Worker    }
307*61046927SAndroid Build Coastguard Worker 
308*61046927SAndroid Build Coastguard Worker    unreachable("Unimplemented NIR store_output variant.");
309*61046927SAndroid Build Coastguard Worker }
310*61046927SAndroid Build Coastguard Worker 
311*61046927SAndroid Build Coastguard Worker static inline gl_shader_stage
pvr_stage_to_mesa(enum pvr_stage_allocation pvr_stage)312*61046927SAndroid Build Coastguard Worker pvr_stage_to_mesa(enum pvr_stage_allocation pvr_stage)
313*61046927SAndroid Build Coastguard Worker {
314*61046927SAndroid Build Coastguard Worker    switch (pvr_stage) {
315*61046927SAndroid Build Coastguard Worker    case PVR_STAGE_ALLOCATION_VERTEX_GEOMETRY:
316*61046927SAndroid Build Coastguard Worker       return MESA_SHADER_VERTEX;
317*61046927SAndroid Build Coastguard Worker 
318*61046927SAndroid Build Coastguard Worker    case PVR_STAGE_ALLOCATION_FRAGMENT:
319*61046927SAndroid Build Coastguard Worker       return MESA_SHADER_FRAGMENT;
320*61046927SAndroid Build Coastguard Worker 
321*61046927SAndroid Build Coastguard Worker    case PVR_STAGE_ALLOCATION_COMPUTE:
322*61046927SAndroid Build Coastguard Worker       return MESA_SHADER_COMPUTE;
323*61046927SAndroid Build Coastguard Worker 
324*61046927SAndroid Build Coastguard Worker    default:
325*61046927SAndroid Build Coastguard Worker       break;
326*61046927SAndroid Build Coastguard Worker    }
327*61046927SAndroid Build Coastguard Worker 
328*61046927SAndroid Build Coastguard Worker    unreachable("Unsupported pvr_stage_allocation.");
329*61046927SAndroid Build Coastguard Worker }
330*61046927SAndroid Build Coastguard Worker 
331*61046927SAndroid Build Coastguard Worker static inline enum pvr_stage_allocation
mesa_stage_to_pvr(gl_shader_stage mesa_stage)332*61046927SAndroid Build Coastguard Worker mesa_stage_to_pvr(gl_shader_stage mesa_stage)
333*61046927SAndroid Build Coastguard Worker {
334*61046927SAndroid Build Coastguard Worker    switch (mesa_stage) {
335*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_VERTEX:
336*61046927SAndroid Build Coastguard Worker       return PVR_STAGE_ALLOCATION_VERTEX_GEOMETRY;
337*61046927SAndroid Build Coastguard Worker 
338*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_FRAGMENT:
339*61046927SAndroid Build Coastguard Worker       return PVR_STAGE_ALLOCATION_FRAGMENT;
340*61046927SAndroid Build Coastguard Worker 
341*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_COMPUTE:
342*61046927SAndroid Build Coastguard Worker       return PVR_STAGE_ALLOCATION_COMPUTE;
343*61046927SAndroid Build Coastguard Worker 
344*61046927SAndroid Build Coastguard Worker    default:
345*61046927SAndroid Build Coastguard Worker       break;
346*61046927SAndroid Build Coastguard Worker    }
347*61046927SAndroid Build Coastguard Worker 
348*61046927SAndroid Build Coastguard Worker    unreachable("Unsupported gl_shader_stage.");
349*61046927SAndroid Build Coastguard Worker }
descriptor_is_dynamic(VkDescriptorType type)350*61046927SAndroid Build Coastguard Worker static bool descriptor_is_dynamic(VkDescriptorType type)
351*61046927SAndroid Build Coastguard Worker {
352*61046927SAndroid Build Coastguard Worker    return (type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC ||
353*61046927SAndroid Build Coastguard Worker            type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC);
354*61046927SAndroid Build Coastguard Worker }
355*61046927SAndroid Build Coastguard Worker 
356*61046927SAndroid Build Coastguard Worker static void
trans_nir_intrinsic_load_vulkan_descriptor(rogue_builder * b,nir_intrinsic_instr * intr)357*61046927SAndroid Build Coastguard Worker trans_nir_intrinsic_load_vulkan_descriptor(rogue_builder *b,
358*61046927SAndroid Build Coastguard Worker                                            nir_intrinsic_instr *intr)
359*61046927SAndroid Build Coastguard Worker {
360*61046927SAndroid Build Coastguard Worker    rogue_instr *instr;
361*61046927SAndroid Build Coastguard Worker    unsigned desc_set = nir_src_comp_as_uint(intr->src[0], 0);
362*61046927SAndroid Build Coastguard Worker    unsigned binding = nir_src_comp_as_uint(intr->src[0], 1);
363*61046927SAndroid Build Coastguard Worker    ASSERTED VkDescriptorType desc_type = nir_src_comp_as_uint(intr->src[0], 2);
364*61046927SAndroid Build Coastguard Worker    assert(desc_type == nir_intrinsic_desc_type(intr));
365*61046927SAndroid Build Coastguard Worker 
366*61046927SAndroid Build Coastguard Worker    struct pvr_pipeline_layout *pipeline_layout =
367*61046927SAndroid Build Coastguard Worker       b->shader->ctx->pipeline_layout;
368*61046927SAndroid Build Coastguard Worker 
369*61046927SAndroid Build Coastguard Worker    unsigned desc_set_table_sh_reg;
370*61046927SAndroid Build Coastguard Worker    unsigned desc_set_offset;
371*61046927SAndroid Build Coastguard Worker    unsigned desc_offset;
372*61046927SAndroid Build Coastguard Worker 
373*61046927SAndroid Build Coastguard Worker    if (pipeline_layout) {
374*61046927SAndroid Build Coastguard Worker       /* Fetch shared registers containing descriptor set table address. */
375*61046927SAndroid Build Coastguard Worker       enum pvr_stage_allocation pvr_stage = mesa_stage_to_pvr(b->shader->stage);
376*61046927SAndroid Build Coastguard Worker       assert(pipeline_layout->sh_reg_layout_per_stage[pvr_stage]
377*61046927SAndroid Build Coastguard Worker                 .descriptor_set_addrs_table.present);
378*61046927SAndroid Build Coastguard Worker       desc_set_table_sh_reg =
379*61046927SAndroid Build Coastguard Worker          pipeline_layout->sh_reg_layout_per_stage[pvr_stage]
380*61046927SAndroid Build Coastguard Worker             .descriptor_set_addrs_table.offset;
381*61046927SAndroid Build Coastguard Worker 
382*61046927SAndroid Build Coastguard Worker       /* Calculate offset for the descriptor set. */
383*61046927SAndroid Build Coastguard Worker       assert(desc_set < pipeline_layout->set_count);
384*61046927SAndroid Build Coastguard Worker       desc_set_offset = desc_set * sizeof(pvr_dev_addr_t); /* Table is an array
385*61046927SAndroid Build Coastguard Worker                                                               of addresses. */
386*61046927SAndroid Build Coastguard Worker 
387*61046927SAndroid Build Coastguard Worker       const struct pvr_descriptor_set_layout *set_layout =
388*61046927SAndroid Build Coastguard Worker          pipeline_layout->set_layout[desc_set];
389*61046927SAndroid Build Coastguard Worker       const struct pvr_descriptor_set_layout_mem_layout *mem_layout =
390*61046927SAndroid Build Coastguard Worker          &set_layout->memory_layout_in_dwords_per_stage[pvr_stage];
391*61046927SAndroid Build Coastguard Worker 
392*61046927SAndroid Build Coastguard Worker       /* Calculate offset for the descriptor/binding. */
393*61046927SAndroid Build Coastguard Worker       assert(binding < set_layout->binding_count);
394*61046927SAndroid Build Coastguard Worker 
395*61046927SAndroid Build Coastguard Worker       const struct pvr_descriptor_set_layout_binding *binding_layout =
396*61046927SAndroid Build Coastguard Worker          pvr_get_descriptor_binding(set_layout, binding);
397*61046927SAndroid Build Coastguard Worker       assert(binding_layout);
398*61046927SAndroid Build Coastguard Worker 
399*61046927SAndroid Build Coastguard Worker       /* TODO: Handle secondaries. */
400*61046927SAndroid Build Coastguard Worker       /* TODO: Handle bindings having multiple descriptors
401*61046927SAndroid Build Coastguard Worker        * (VkDescriptorSetLayoutBinding->descriptorCount).
402*61046927SAndroid Build Coastguard Worker        */
403*61046927SAndroid Build Coastguard Worker 
404*61046927SAndroid Build Coastguard Worker       if (descriptor_is_dynamic(binding_layout->type))
405*61046927SAndroid Build Coastguard Worker          desc_offset = set_layout->total_size_in_dwords;
406*61046927SAndroid Build Coastguard Worker       else
407*61046927SAndroid Build Coastguard Worker          desc_offset = mem_layout->primary_offset;
408*61046927SAndroid Build Coastguard Worker 
409*61046927SAndroid Build Coastguard Worker       desc_offset +=
410*61046927SAndroid Build Coastguard Worker          binding_layout->per_stage_offset_in_dwords[pvr_stage].primary;
411*61046927SAndroid Build Coastguard Worker 
412*61046927SAndroid Build Coastguard Worker       desc_offset *= sizeof(uint32_t); /* DWORDs to bytes. */
413*61046927SAndroid Build Coastguard Worker    } else {
414*61046927SAndroid Build Coastguard Worker       /* Dummy defaults for offline compiler. */
415*61046927SAndroid Build Coastguard Worker       /* TODO: Load these from an offline pipeline description
416*61046927SAndroid Build Coastguard Worker        * if using the offline compiler.
417*61046927SAndroid Build Coastguard Worker        */
418*61046927SAndroid Build Coastguard Worker       desc_set_table_sh_reg = 0;
419*61046927SAndroid Build Coastguard Worker       desc_set_offset = desc_set * sizeof(pvr_dev_addr_t);
420*61046927SAndroid Build Coastguard Worker       desc_offset = binding * sizeof(pvr_dev_addr_t);
421*61046927SAndroid Build Coastguard Worker    }
422*61046927SAndroid Build Coastguard Worker 
423*61046927SAndroid Build Coastguard Worker    unsigned desc_set_table_addr_idx = b->shader->ctx->next_ssa_idx++;
424*61046927SAndroid Build Coastguard Worker    rogue_ssa_vec_regarray(b->shader, 2, desc_set_table_addr_idx, 0);
425*61046927SAndroid Build Coastguard Worker    rogue_regarray *desc_set_table_addr_2x32[2] = {
426*61046927SAndroid Build Coastguard Worker       rogue_ssa_vec_regarray(b->shader, 1, desc_set_table_addr_idx, 0),
427*61046927SAndroid Build Coastguard Worker       rogue_ssa_vec_regarray(b->shader, 1, desc_set_table_addr_idx, 1),
428*61046927SAndroid Build Coastguard Worker    };
429*61046927SAndroid Build Coastguard Worker 
430*61046927SAndroid Build Coastguard Worker    instr = &rogue_MOV(b,
431*61046927SAndroid Build Coastguard Worker                       rogue_ref_regarray(desc_set_table_addr_2x32[0]),
432*61046927SAndroid Build Coastguard Worker                       rogue_ref_reg(
433*61046927SAndroid Build Coastguard Worker                          rogue_shared_reg(b->shader, desc_set_table_sh_reg)))
434*61046927SAndroid Build Coastguard Worker                ->instr;
435*61046927SAndroid Build Coastguard Worker    rogue_add_instr_comment(instr, "desc_set_table_addr_lo");
436*61046927SAndroid Build Coastguard Worker    instr =
437*61046927SAndroid Build Coastguard Worker       &rogue_MOV(
438*61046927SAndroid Build Coastguard Worker           b,
439*61046927SAndroid Build Coastguard Worker           rogue_ref_regarray(desc_set_table_addr_2x32[1]),
440*61046927SAndroid Build Coastguard Worker           rogue_ref_reg(rogue_shared_reg(b->shader, desc_set_table_sh_reg + 1)))
441*61046927SAndroid Build Coastguard Worker           ->instr;
442*61046927SAndroid Build Coastguard Worker    rogue_add_instr_comment(instr, "desc_set_table_addr_hi");
443*61046927SAndroid Build Coastguard Worker 
444*61046927SAndroid Build Coastguard Worker    /* Offset the descriptor set table address to access the descriptor set. */
445*61046927SAndroid Build Coastguard Worker    unsigned desc_set_table_addr_offset_idx = b->shader->ctx->next_ssa_idx++;
446*61046927SAndroid Build Coastguard Worker    rogue_regarray *desc_set_table_addr_offset_64 =
447*61046927SAndroid Build Coastguard Worker       rogue_ssa_vec_regarray(b->shader, 2, desc_set_table_addr_offset_idx, 0);
448*61046927SAndroid Build Coastguard Worker    rogue_regarray *desc_set_table_addr_offset_2x32[2] = {
449*61046927SAndroid Build Coastguard Worker       rogue_ssa_vec_regarray(b->shader, 1, desc_set_table_addr_offset_idx, 0),
450*61046927SAndroid Build Coastguard Worker       rogue_ssa_vec_regarray(b->shader, 1, desc_set_table_addr_offset_idx, 1),
451*61046927SAndroid Build Coastguard Worker    };
452*61046927SAndroid Build Coastguard Worker 
453*61046927SAndroid Build Coastguard Worker    unsigned desc_set_table_addr_offset_lo_idx = b->shader->ctx->next_ssa_idx++;
454*61046927SAndroid Build Coastguard Worker    unsigned desc_set_table_addr_offset_hi_idx = b->shader->ctx->next_ssa_idx++;
455*61046927SAndroid Build Coastguard Worker 
456*61046927SAndroid Build Coastguard Worker    rogue_reg *desc_set_table_addr_offset_lo =
457*61046927SAndroid Build Coastguard Worker       rogue_ssa_reg(b->shader, desc_set_table_addr_offset_lo_idx);
458*61046927SAndroid Build Coastguard Worker    rogue_reg *desc_set_table_addr_offset_hi =
459*61046927SAndroid Build Coastguard Worker       rogue_ssa_reg(b->shader, desc_set_table_addr_offset_hi_idx);
460*61046927SAndroid Build Coastguard Worker 
461*61046927SAndroid Build Coastguard Worker    rogue_MOV(b,
462*61046927SAndroid Build Coastguard Worker              rogue_ref_reg(desc_set_table_addr_offset_lo),
463*61046927SAndroid Build Coastguard Worker              rogue_ref_imm(desc_set_offset));
464*61046927SAndroid Build Coastguard Worker    rogue_MOV(b, rogue_ref_reg(desc_set_table_addr_offset_hi), rogue_ref_imm(0));
465*61046927SAndroid Build Coastguard Worker 
466*61046927SAndroid Build Coastguard Worker    rogue_ADD64(b,
467*61046927SAndroid Build Coastguard Worker                rogue_ref_regarray(desc_set_table_addr_offset_2x32[0]),
468*61046927SAndroid Build Coastguard Worker                rogue_ref_regarray(desc_set_table_addr_offset_2x32[1]),
469*61046927SAndroid Build Coastguard Worker                rogue_ref_io(ROGUE_IO_NONE),
470*61046927SAndroid Build Coastguard Worker                rogue_ref_regarray(desc_set_table_addr_2x32[0]),
471*61046927SAndroid Build Coastguard Worker                rogue_ref_regarray(desc_set_table_addr_2x32[1]),
472*61046927SAndroid Build Coastguard Worker                rogue_ref_reg(desc_set_table_addr_offset_lo),
473*61046927SAndroid Build Coastguard Worker                rogue_ref_reg(desc_set_table_addr_offset_hi),
474*61046927SAndroid Build Coastguard Worker                rogue_ref_io(ROGUE_IO_NONE));
475*61046927SAndroid Build Coastguard Worker 
476*61046927SAndroid Build Coastguard Worker    unsigned desc_set_addr_idx = b->shader->ctx->next_ssa_idx++;
477*61046927SAndroid Build Coastguard Worker    rogue_regarray *desc_set_addr_64 =
478*61046927SAndroid Build Coastguard Worker       rogue_ssa_vec_regarray(b->shader, 2, desc_set_addr_idx, 0);
479*61046927SAndroid Build Coastguard Worker    rogue_regarray *desc_set_addr_2x32[2] = {
480*61046927SAndroid Build Coastguard Worker       rogue_ssa_vec_regarray(b->shader, 1, desc_set_addr_idx, 0),
481*61046927SAndroid Build Coastguard Worker       rogue_ssa_vec_regarray(b->shader, 1, desc_set_addr_idx, 1),
482*61046927SAndroid Build Coastguard Worker    };
483*61046927SAndroid Build Coastguard Worker    instr = &rogue_LD(b,
484*61046927SAndroid Build Coastguard Worker                      rogue_ref_regarray(desc_set_addr_64),
485*61046927SAndroid Build Coastguard Worker                      rogue_ref_drc(0),
486*61046927SAndroid Build Coastguard Worker                      rogue_ref_val(2),
487*61046927SAndroid Build Coastguard Worker                      rogue_ref_regarray(desc_set_table_addr_offset_64))
488*61046927SAndroid Build Coastguard Worker                ->instr;
489*61046927SAndroid Build Coastguard Worker    rogue_add_instr_comment(instr, "load descriptor set");
490*61046927SAndroid Build Coastguard Worker 
491*61046927SAndroid Build Coastguard Worker    /* Offset the descriptor set address to access the descriptor. */
492*61046927SAndroid Build Coastguard Worker    unsigned desc_addr_offset_idx = b->shader->ctx->next_ssa_idx++;
493*61046927SAndroid Build Coastguard Worker    rogue_regarray *desc_addr_offset_64 =
494*61046927SAndroid Build Coastguard Worker       rogue_ssa_vec_regarray(b->shader, 2, desc_addr_offset_idx, 0);
495*61046927SAndroid Build Coastguard Worker    rogue_regarray *desc_addr_offset_2x32[2] = {
496*61046927SAndroid Build Coastguard Worker       rogue_ssa_vec_regarray(b->shader, 1, desc_addr_offset_idx, 0),
497*61046927SAndroid Build Coastguard Worker       rogue_ssa_vec_regarray(b->shader, 1, desc_addr_offset_idx, 1),
498*61046927SAndroid Build Coastguard Worker    };
499*61046927SAndroid Build Coastguard Worker 
500*61046927SAndroid Build Coastguard Worker    unsigned desc_addr_offset_lo_idx = b->shader->ctx->next_ssa_idx++;
501*61046927SAndroid Build Coastguard Worker    unsigned desc_addr_offset_hi_idx = b->shader->ctx->next_ssa_idx++;
502*61046927SAndroid Build Coastguard Worker 
503*61046927SAndroid Build Coastguard Worker    rogue_reg *desc_addr_offset_val_lo =
504*61046927SAndroid Build Coastguard Worker       rogue_ssa_reg(b->shader, desc_addr_offset_lo_idx);
505*61046927SAndroid Build Coastguard Worker    rogue_reg *desc_addr_offset_val_hi =
506*61046927SAndroid Build Coastguard Worker       rogue_ssa_reg(b->shader, desc_addr_offset_hi_idx);
507*61046927SAndroid Build Coastguard Worker 
508*61046927SAndroid Build Coastguard Worker    rogue_MOV(b,
509*61046927SAndroid Build Coastguard Worker              rogue_ref_reg(desc_addr_offset_val_lo),
510*61046927SAndroid Build Coastguard Worker              rogue_ref_imm(desc_offset));
511*61046927SAndroid Build Coastguard Worker    rogue_MOV(b, rogue_ref_reg(desc_addr_offset_val_hi), rogue_ref_imm(0));
512*61046927SAndroid Build Coastguard Worker 
513*61046927SAndroid Build Coastguard Worker    rogue_ADD64(b,
514*61046927SAndroid Build Coastguard Worker                rogue_ref_regarray(desc_addr_offset_2x32[0]),
515*61046927SAndroid Build Coastguard Worker                rogue_ref_regarray(desc_addr_offset_2x32[1]),
516*61046927SAndroid Build Coastguard Worker                rogue_ref_io(ROGUE_IO_NONE),
517*61046927SAndroid Build Coastguard Worker                rogue_ref_regarray(desc_set_addr_2x32[0]),
518*61046927SAndroid Build Coastguard Worker                rogue_ref_regarray(desc_set_addr_2x32[1]),
519*61046927SAndroid Build Coastguard Worker                rogue_ref_reg(desc_addr_offset_val_lo),
520*61046927SAndroid Build Coastguard Worker                rogue_ref_reg(desc_addr_offset_val_hi),
521*61046927SAndroid Build Coastguard Worker                rogue_ref_io(ROGUE_IO_NONE));
522*61046927SAndroid Build Coastguard Worker 
523*61046927SAndroid Build Coastguard Worker    unsigned desc_addr_idx = intr->def.index;
524*61046927SAndroid Build Coastguard Worker    rogue_regarray *desc_addr_64 =
525*61046927SAndroid Build Coastguard Worker       rogue_ssa_vec_regarray(b->shader, 2, desc_addr_idx, 0);
526*61046927SAndroid Build Coastguard Worker    instr = &rogue_LD(b,
527*61046927SAndroid Build Coastguard Worker                      rogue_ref_regarray(desc_addr_64),
528*61046927SAndroid Build Coastguard Worker                      rogue_ref_drc(0),
529*61046927SAndroid Build Coastguard Worker                      rogue_ref_val(2),
530*61046927SAndroid Build Coastguard Worker                      rogue_ref_regarray(desc_addr_offset_64))
531*61046927SAndroid Build Coastguard Worker                ->instr;
532*61046927SAndroid Build Coastguard Worker    rogue_add_instr_comment(instr, "load descriptor");
533*61046927SAndroid Build Coastguard Worker }
534*61046927SAndroid Build Coastguard Worker 
trans_nir_intrinsic_load_global_constant(rogue_builder * b,nir_intrinsic_instr * intr)535*61046927SAndroid Build Coastguard Worker static void trans_nir_intrinsic_load_global_constant(rogue_builder *b,
536*61046927SAndroid Build Coastguard Worker                                                      nir_intrinsic_instr *intr)
537*61046927SAndroid Build Coastguard Worker {
538*61046927SAndroid Build Coastguard Worker    /* 64-bit source address. */
539*61046927SAndroid Build Coastguard Worker    unsigned src_index = intr->src[0].ssa->index;
540*61046927SAndroid Build Coastguard Worker    rogue_regarray *src = rogue_ssa_vec_regarray(b->shader, 2, src_index, 0);
541*61046927SAndroid Build Coastguard Worker 
542*61046927SAndroid Build Coastguard Worker    /*** TODO NEXT: this could be either a reg or regarray. ***/
543*61046927SAndroid Build Coastguard Worker    rogue_reg *dst = rogue_ssa_reg(b->shader, intr->def.index);
544*61046927SAndroid Build Coastguard Worker 
545*61046927SAndroid Build Coastguard Worker    /* TODO NEXT: src[1] should be depending on ssa vec size for burst loads */
546*61046927SAndroid Build Coastguard Worker    rogue_instr *instr = &rogue_LD(b,
547*61046927SAndroid Build Coastguard Worker                                   rogue_ref_reg(dst),
548*61046927SAndroid Build Coastguard Worker                                   rogue_ref_drc(0),
549*61046927SAndroid Build Coastguard Worker                                   rogue_ref_val(1),
550*61046927SAndroid Build Coastguard Worker                                   rogue_ref_regarray(src))
551*61046927SAndroid Build Coastguard Worker                             ->instr;
552*61046927SAndroid Build Coastguard Worker    rogue_add_instr_comment(instr, "load_global_constant");
553*61046927SAndroid Build Coastguard Worker }
554*61046927SAndroid Build Coastguard Worker 
trans_nir_intrinsic(rogue_builder * b,nir_intrinsic_instr * intr)555*61046927SAndroid Build Coastguard Worker static void trans_nir_intrinsic(rogue_builder *b, nir_intrinsic_instr *intr)
556*61046927SAndroid Build Coastguard Worker {
557*61046927SAndroid Build Coastguard Worker    switch (intr->intrinsic) {
558*61046927SAndroid Build Coastguard Worker    case nir_intrinsic_load_input:
559*61046927SAndroid Build Coastguard Worker       return trans_nir_intrinsic_load_input(b, intr);
560*61046927SAndroid Build Coastguard Worker 
561*61046927SAndroid Build Coastguard Worker    case nir_intrinsic_store_output:
562*61046927SAndroid Build Coastguard Worker       return trans_nir_intrinsic_store_output(b, intr);
563*61046927SAndroid Build Coastguard Worker 
564*61046927SAndroid Build Coastguard Worker    case nir_intrinsic_load_vulkan_descriptor:
565*61046927SAndroid Build Coastguard Worker       return trans_nir_intrinsic_load_vulkan_descriptor(b, intr);
566*61046927SAndroid Build Coastguard Worker 
567*61046927SAndroid Build Coastguard Worker    case nir_intrinsic_load_global_constant:
568*61046927SAndroid Build Coastguard Worker       return trans_nir_intrinsic_load_global_constant(b, intr);
569*61046927SAndroid Build Coastguard Worker 
570*61046927SAndroid Build Coastguard Worker    default:
571*61046927SAndroid Build Coastguard Worker       break;
572*61046927SAndroid Build Coastguard Worker    }
573*61046927SAndroid Build Coastguard Worker 
574*61046927SAndroid Build Coastguard Worker    unreachable("Unimplemented NIR intrinsic instruction.");
575*61046927SAndroid Build Coastguard Worker }
576*61046927SAndroid Build Coastguard Worker 
trans_nir_alu_pack_unorm_4x8(rogue_builder * b,nir_alu_instr * alu)577*61046927SAndroid Build Coastguard Worker static void trans_nir_alu_pack_unorm_4x8(rogue_builder *b, nir_alu_instr *alu)
578*61046927SAndroid Build Coastguard Worker {
579*61046927SAndroid Build Coastguard Worker    rogue_ref dst = nir_ssa_reg_alu_dst(b->shader, alu, false);
580*61046927SAndroid Build Coastguard Worker    rogue_ref src = nir_ssa_reg_alu_src(b->shader, alu, 0, true);
581*61046927SAndroid Build Coastguard Worker 
582*61046927SAndroid Build Coastguard Worker    rogue_alu_instr *pck_u8888 = rogue_PCK_U8888(b, dst, src);
583*61046927SAndroid Build Coastguard Worker    rogue_set_instr_repeat(&pck_u8888->instr, 4);
584*61046927SAndroid Build Coastguard Worker    rogue_set_alu_op_mod(pck_u8888, ROGUE_ALU_OP_MOD_SCALE);
585*61046927SAndroid Build Coastguard Worker }
586*61046927SAndroid Build Coastguard Worker 
trans_nir_alu_fmul(rogue_builder * b,nir_alu_instr * alu)587*61046927SAndroid Build Coastguard Worker static void trans_nir_alu_fmul(rogue_builder *b, nir_alu_instr *alu)
588*61046927SAndroid Build Coastguard Worker {
589*61046927SAndroid Build Coastguard Worker    rogue_ref dst = nir_ssa_reg_alu_dst(b->shader, alu, false);
590*61046927SAndroid Build Coastguard Worker    rogue_ref src0 = nir_ssa_reg_alu_src(b->shader, alu, 0, false);
591*61046927SAndroid Build Coastguard Worker    rogue_ref src1 = nir_ssa_reg_alu_src(b->shader, alu, 1, false);
592*61046927SAndroid Build Coastguard Worker 
593*61046927SAndroid Build Coastguard Worker    rogue_FMUL(b, dst, src0, src1);
594*61046927SAndroid Build Coastguard Worker }
595*61046927SAndroid Build Coastguard Worker 
trans_nir_alu_ffma(rogue_builder * b,nir_alu_instr * alu)596*61046927SAndroid Build Coastguard Worker static void trans_nir_alu_ffma(rogue_builder *b, nir_alu_instr *alu)
597*61046927SAndroid Build Coastguard Worker {
598*61046927SAndroid Build Coastguard Worker    rogue_ref dst = nir_ssa_reg_alu_dst(b->shader, alu, false);
599*61046927SAndroid Build Coastguard Worker    rogue_ref src0 = nir_ssa_reg_alu_src(b->shader, alu, 0, false);
600*61046927SAndroid Build Coastguard Worker    rogue_ref src1 = nir_ssa_reg_alu_src(b->shader, alu, 1, false);
601*61046927SAndroid Build Coastguard Worker    rogue_ref src2 = nir_ssa_reg_alu_src(b->shader, alu, 2, false);
602*61046927SAndroid Build Coastguard Worker 
603*61046927SAndroid Build Coastguard Worker    rogue_FMAD(b, dst, src0, src1, src2);
604*61046927SAndroid Build Coastguard Worker }
605*61046927SAndroid Build Coastguard Worker 
trans_nir_alu_vecN(rogue_builder * b,nir_alu_instr * alu,unsigned n)606*61046927SAndroid Build Coastguard Worker static void trans_nir_alu_vecN(rogue_builder *b, nir_alu_instr *alu, unsigned n)
607*61046927SAndroid Build Coastguard Worker {
608*61046927SAndroid Build Coastguard Worker    unsigned dst_index = alu->def.index;
609*61046927SAndroid Build Coastguard Worker    rogue_regarray *dst;
610*61046927SAndroid Build Coastguard Worker    rogue_reg *src;
611*61046927SAndroid Build Coastguard Worker 
612*61046927SAndroid Build Coastguard Worker    for (unsigned u = 0; u < n; ++u) {
613*61046927SAndroid Build Coastguard Worker       dst = rogue_ssa_vec_regarray(b->shader, 1, dst_index, u);
614*61046927SAndroid Build Coastguard Worker       src = rogue_ssa_reg(b->shader, alu->src[u].src.ssa->index);
615*61046927SAndroid Build Coastguard Worker       rogue_MOV(b, rogue_ref_regarray(dst), rogue_ref_reg(src));
616*61046927SAndroid Build Coastguard Worker    }
617*61046927SAndroid Build Coastguard Worker }
618*61046927SAndroid Build Coastguard Worker 
trans_nir_alu_iadd64(rogue_builder * b,nir_alu_instr * alu)619*61046927SAndroid Build Coastguard Worker static void trans_nir_alu_iadd64(rogue_builder *b, nir_alu_instr *alu)
620*61046927SAndroid Build Coastguard Worker {
621*61046927SAndroid Build Coastguard Worker    unsigned dst_index = alu->def.index;
622*61046927SAndroid Build Coastguard Worker    rogue_regarray *dst[2] = {
623*61046927SAndroid Build Coastguard Worker       rogue_ssa_vec_regarray(b->shader, 1, dst_index, 0),
624*61046927SAndroid Build Coastguard Worker       rogue_ssa_vec_regarray(b->shader, 1, dst_index, 1),
625*61046927SAndroid Build Coastguard Worker    };
626*61046927SAndroid Build Coastguard Worker 
627*61046927SAndroid Build Coastguard Worker    unsigned src_index[2] = { alu->src[0].src.ssa->index,
628*61046927SAndroid Build Coastguard Worker                              alu->src[1].src.ssa->index };
629*61046927SAndroid Build Coastguard Worker    rogue_regarray *src[2][2] = {
630*61046927SAndroid Build Coastguard Worker       [0] = {
631*61046927SAndroid Build Coastguard Worker          rogue_ssa_vec_regarray(b->shader, 1, src_index[0], 0),
632*61046927SAndroid Build Coastguard Worker          rogue_ssa_vec_regarray(b->shader, 1, src_index[0], 1),
633*61046927SAndroid Build Coastguard Worker       },
634*61046927SAndroid Build Coastguard Worker       [1] = {
635*61046927SAndroid Build Coastguard Worker          rogue_ssa_vec_regarray(b->shader, 1, src_index[1], 0),
636*61046927SAndroid Build Coastguard Worker          rogue_ssa_vec_regarray(b->shader, 1, src_index[1], 1),
637*61046927SAndroid Build Coastguard Worker       },
638*61046927SAndroid Build Coastguard Worker    };
639*61046927SAndroid Build Coastguard Worker 
640*61046927SAndroid Build Coastguard Worker    rogue_ADD64(b,
641*61046927SAndroid Build Coastguard Worker                rogue_ref_regarray(dst[0]),
642*61046927SAndroid Build Coastguard Worker                rogue_ref_regarray(dst[1]),
643*61046927SAndroid Build Coastguard Worker                rogue_ref_io(ROGUE_IO_NONE),
644*61046927SAndroid Build Coastguard Worker                rogue_ref_regarray(src[0][0]),
645*61046927SAndroid Build Coastguard Worker                rogue_ref_regarray(src[0][1]),
646*61046927SAndroid Build Coastguard Worker                rogue_ref_regarray(src[1][0]),
647*61046927SAndroid Build Coastguard Worker                rogue_ref_regarray(src[1][1]),
648*61046927SAndroid Build Coastguard Worker                rogue_ref_io(ROGUE_IO_NONE));
649*61046927SAndroid Build Coastguard Worker }
650*61046927SAndroid Build Coastguard Worker 
trans_nir_alu_iadd(rogue_builder * b,nir_alu_instr * alu)651*61046927SAndroid Build Coastguard Worker static void trans_nir_alu_iadd(rogue_builder *b, nir_alu_instr *alu)
652*61046927SAndroid Build Coastguard Worker {
653*61046927SAndroid Build Coastguard Worker    unsigned bit_size = alu->def.bit_size;
654*61046927SAndroid Build Coastguard Worker 
655*61046927SAndroid Build Coastguard Worker    switch (bit_size) {
656*61046927SAndroid Build Coastguard Worker       /* TODO: case 32: */
657*61046927SAndroid Build Coastguard Worker 
658*61046927SAndroid Build Coastguard Worker    case 64:
659*61046927SAndroid Build Coastguard Worker       return trans_nir_alu_iadd64(b, alu);
660*61046927SAndroid Build Coastguard Worker 
661*61046927SAndroid Build Coastguard Worker    default:
662*61046927SAndroid Build Coastguard Worker       break;
663*61046927SAndroid Build Coastguard Worker    }
664*61046927SAndroid Build Coastguard Worker 
665*61046927SAndroid Build Coastguard Worker    unreachable("Unsupported bit size.");
666*61046927SAndroid Build Coastguard Worker }
667*61046927SAndroid Build Coastguard Worker 
trans_nir_alu(rogue_builder * b,nir_alu_instr * alu)668*61046927SAndroid Build Coastguard Worker static void trans_nir_alu(rogue_builder *b, nir_alu_instr *alu)
669*61046927SAndroid Build Coastguard Worker {
670*61046927SAndroid Build Coastguard Worker    switch (alu->op) {
671*61046927SAndroid Build Coastguard Worker    case nir_op_pack_unorm_4x8:
672*61046927SAndroid Build Coastguard Worker       return trans_nir_alu_pack_unorm_4x8(b, alu);
673*61046927SAndroid Build Coastguard Worker       return;
674*61046927SAndroid Build Coastguard Worker 
675*61046927SAndroid Build Coastguard Worker    case nir_op_fmul:
676*61046927SAndroid Build Coastguard Worker       return trans_nir_alu_fmul(b, alu);
677*61046927SAndroid Build Coastguard Worker 
678*61046927SAndroid Build Coastguard Worker    case nir_op_ffma:
679*61046927SAndroid Build Coastguard Worker       return trans_nir_alu_ffma(b, alu);
680*61046927SAndroid Build Coastguard Worker 
681*61046927SAndroid Build Coastguard Worker    case nir_op_vec4:
682*61046927SAndroid Build Coastguard Worker       return trans_nir_alu_vecN(b, alu, 4);
683*61046927SAndroid Build Coastguard Worker 
684*61046927SAndroid Build Coastguard Worker    case nir_op_iadd:
685*61046927SAndroid Build Coastguard Worker       return trans_nir_alu_iadd(b, alu);
686*61046927SAndroid Build Coastguard Worker 
687*61046927SAndroid Build Coastguard Worker    default:
688*61046927SAndroid Build Coastguard Worker       break;
689*61046927SAndroid Build Coastguard Worker    }
690*61046927SAndroid Build Coastguard Worker 
691*61046927SAndroid Build Coastguard Worker    unreachable("Unimplemented NIR ALU instruction.");
692*61046927SAndroid Build Coastguard Worker }
693*61046927SAndroid Build Coastguard Worker 
694*61046927SAndroid Build Coastguard Worker PUBLIC
rogue_count_used_regs(const rogue_shader * shader,enum rogue_reg_class class)695*61046927SAndroid Build Coastguard Worker unsigned rogue_count_used_regs(const rogue_shader *shader,
696*61046927SAndroid Build Coastguard Worker                                enum rogue_reg_class class)
697*61046927SAndroid Build Coastguard Worker {
698*61046927SAndroid Build Coastguard Worker    unsigned reg_count;
699*61046927SAndroid Build Coastguard Worker    if (rogue_reg_infos[class].num) {
700*61046927SAndroid Build Coastguard Worker       reg_count = __bitset_count(shader->regs_used[class],
701*61046927SAndroid Build Coastguard Worker                                  BITSET_WORDS(rogue_reg_infos[class].num));
702*61046927SAndroid Build Coastguard Worker    } else {
703*61046927SAndroid Build Coastguard Worker       reg_count = list_length(&shader->regs[class]);
704*61046927SAndroid Build Coastguard Worker    }
705*61046927SAndroid Build Coastguard Worker 
706*61046927SAndroid Build Coastguard Worker #ifndef NDEBUG
707*61046927SAndroid Build Coastguard Worker    /* Check that registers are contiguous. */
708*61046927SAndroid Build Coastguard Worker    rogue_foreach_reg (reg, shader, class) {
709*61046927SAndroid Build Coastguard Worker       assert(reg->index < reg_count);
710*61046927SAndroid Build Coastguard Worker    }
711*61046927SAndroid Build Coastguard Worker #endif /* NDEBUG */
712*61046927SAndroid Build Coastguard Worker 
713*61046927SAndroid Build Coastguard Worker    return reg_count;
714*61046927SAndroid Build Coastguard Worker }
715*61046927SAndroid Build Coastguard Worker 
rogue_feedback_used_regs(rogue_build_ctx * ctx,const rogue_shader * shader)716*61046927SAndroid Build Coastguard Worker static inline void rogue_feedback_used_regs(rogue_build_ctx *ctx,
717*61046927SAndroid Build Coastguard Worker                                             const rogue_shader *shader)
718*61046927SAndroid Build Coastguard Worker {
719*61046927SAndroid Build Coastguard Worker    /* TODO NEXT: Use this counting method elsewhere as well. */
720*61046927SAndroid Build Coastguard Worker    ctx->common_data[shader->stage].temps =
721*61046927SAndroid Build Coastguard Worker       rogue_count_used_regs(shader, ROGUE_REG_CLASS_TEMP);
722*61046927SAndroid Build Coastguard Worker    ctx->common_data[shader->stage].internals =
723*61046927SAndroid Build Coastguard Worker       rogue_count_used_regs(shader, ROGUE_REG_CLASS_INTERNAL);
724*61046927SAndroid Build Coastguard Worker }
725*61046927SAndroid Build Coastguard Worker 
ssa_def_cb(nir_def * ssa,void * state)726*61046927SAndroid Build Coastguard Worker static bool ssa_def_cb(nir_def *ssa, void *state)
727*61046927SAndroid Build Coastguard Worker {
728*61046927SAndroid Build Coastguard Worker    rogue_shader *shader = (rogue_shader *)state;
729*61046927SAndroid Build Coastguard Worker 
730*61046927SAndroid Build Coastguard Worker    if (ssa->num_components == 1) {
731*61046927SAndroid Build Coastguard Worker       if (ssa->bit_size == 32) {
732*61046927SAndroid Build Coastguard Worker          rogue_ssa_reg(shader, ssa->index);
733*61046927SAndroid Build Coastguard Worker       } else if (ssa->bit_size == 64) {
734*61046927SAndroid Build Coastguard Worker          rogue_ssa_vec_regarray(shader, 2, ssa->index, 0);
735*61046927SAndroid Build Coastguard Worker       }
736*61046927SAndroid Build Coastguard Worker    } else {
737*61046927SAndroid Build Coastguard Worker       rogue_ssa_vec_regarray(shader, ssa->num_components, ssa->index, 0);
738*61046927SAndroid Build Coastguard Worker    }
739*61046927SAndroid Build Coastguard Worker 
740*61046927SAndroid Build Coastguard Worker    /* Keep track of the last SSA index so we can use more. */
741*61046927SAndroid Build Coastguard Worker    shader->ctx->next_ssa_idx = MAX2(shader->ctx->next_ssa_idx, ssa->index);
742*61046927SAndroid Build Coastguard Worker 
743*61046927SAndroid Build Coastguard Worker    return true;
744*61046927SAndroid Build Coastguard Worker }
745*61046927SAndroid Build Coastguard Worker 
746*61046927SAndroid Build Coastguard Worker /**
747*61046927SAndroid Build Coastguard Worker  * \brief Translates a NIR shader to Rogue.
748*61046927SAndroid Build Coastguard Worker  *
749*61046927SAndroid Build Coastguard Worker  * \param[in] ctx Shared multi-stage build context.
750*61046927SAndroid Build Coastguard Worker  * \param[in] nir NIR shader.
751*61046927SAndroid Build Coastguard Worker  * \return A rogue_shader* if successful, or NULL if unsuccessful.
752*61046927SAndroid Build Coastguard Worker  */
753*61046927SAndroid Build Coastguard Worker PUBLIC
rogue_nir_to_rogue(rogue_build_ctx * ctx,const nir_shader * nir)754*61046927SAndroid Build Coastguard Worker rogue_shader *rogue_nir_to_rogue(rogue_build_ctx *ctx, const nir_shader *nir)
755*61046927SAndroid Build Coastguard Worker {
756*61046927SAndroid Build Coastguard Worker    gl_shader_stage stage = nir->info.stage;
757*61046927SAndroid Build Coastguard Worker    rogue_shader *shader = rogue_shader_create(ctx, stage);
758*61046927SAndroid Build Coastguard Worker    if (!shader)
759*61046927SAndroid Build Coastguard Worker       return NULL;
760*61046927SAndroid Build Coastguard Worker 
761*61046927SAndroid Build Coastguard Worker    shader->ctx = ctx;
762*61046927SAndroid Build Coastguard Worker 
763*61046927SAndroid Build Coastguard Worker    /* Make sure we only have a single function. */
764*61046927SAndroid Build Coastguard Worker    assert(exec_list_length(&nir->functions) == 1);
765*61046927SAndroid Build Coastguard Worker 
766*61046927SAndroid Build Coastguard Worker    rogue_builder b;
767*61046927SAndroid Build Coastguard Worker    rogue_builder_init(&b, shader);
768*61046927SAndroid Build Coastguard Worker 
769*61046927SAndroid Build Coastguard Worker    nir_function_impl *entry = nir_shader_get_entrypoint((nir_shader *)nir);
770*61046927SAndroid Build Coastguard Worker 
771*61046927SAndroid Build Coastguard Worker    /* Go through SSA used by NIR and "reserve" them so that sub-arrays won't be
772*61046927SAndroid Build Coastguard Worker     * declared before the parent arrays. */
773*61046927SAndroid Build Coastguard Worker    nir_foreach_block_unstructured (block, entry) {
774*61046927SAndroid Build Coastguard Worker       nir_foreach_instr (instr, block) {
775*61046927SAndroid Build Coastguard Worker          if (instr->type == nir_instr_type_load_const) {
776*61046927SAndroid Build Coastguard Worker             nir_load_const_instr *load_const = nir_instr_as_load_const(instr);
777*61046927SAndroid Build Coastguard Worker             if (load_const->def.num_components > 1)
778*61046927SAndroid Build Coastguard Worker                continue;
779*61046927SAndroid Build Coastguard Worker          }
780*61046927SAndroid Build Coastguard Worker          nir_foreach_def(instr, ssa_def_cb, shader);
781*61046927SAndroid Build Coastguard Worker       }
782*61046927SAndroid Build Coastguard Worker    }
783*61046927SAndroid Build Coastguard Worker    ++shader->ctx->next_ssa_idx;
784*61046927SAndroid Build Coastguard Worker 
785*61046927SAndroid Build Coastguard Worker    /* Translate shader entrypoint. */
786*61046927SAndroid Build Coastguard Worker    nir_foreach_block (block, entry) {
787*61046927SAndroid Build Coastguard Worker       rogue_push_block(&b);
788*61046927SAndroid Build Coastguard Worker 
789*61046927SAndroid Build Coastguard Worker       nir_foreach_instr (instr, block) {
790*61046927SAndroid Build Coastguard Worker          switch (instr->type) {
791*61046927SAndroid Build Coastguard Worker          case nir_instr_type_alu:
792*61046927SAndroid Build Coastguard Worker             trans_nir_alu(&b, nir_instr_as_alu(instr));
793*61046927SAndroid Build Coastguard Worker             break;
794*61046927SAndroid Build Coastguard Worker 
795*61046927SAndroid Build Coastguard Worker          case nir_instr_type_intrinsic:
796*61046927SAndroid Build Coastguard Worker             trans_nir_intrinsic(&b, nir_instr_as_intrinsic(instr));
797*61046927SAndroid Build Coastguard Worker             break;
798*61046927SAndroid Build Coastguard Worker 
799*61046927SAndroid Build Coastguard Worker          case nir_instr_type_load_const:
800*61046927SAndroid Build Coastguard Worker             trans_nir_load_const(&b, nir_instr_as_load_const(instr));
801*61046927SAndroid Build Coastguard Worker             break;
802*61046927SAndroid Build Coastguard Worker 
803*61046927SAndroid Build Coastguard Worker          case nir_instr_type_jump:
804*61046927SAndroid Build Coastguard Worker             trans_nir_jump(&b, nir_instr_as_jump(instr));
805*61046927SAndroid Build Coastguard Worker             break;
806*61046927SAndroid Build Coastguard Worker 
807*61046927SAndroid Build Coastguard Worker          default:
808*61046927SAndroid Build Coastguard Worker             unreachable("Unimplemented NIR instruction type.");
809*61046927SAndroid Build Coastguard Worker          }
810*61046927SAndroid Build Coastguard Worker       }
811*61046927SAndroid Build Coastguard Worker    }
812*61046927SAndroid Build Coastguard Worker 
813*61046927SAndroid Build Coastguard Worker    /* Apply passes. */
814*61046927SAndroid Build Coastguard Worker    rogue_shader_passes(shader);
815*61046927SAndroid Build Coastguard Worker 
816*61046927SAndroid Build Coastguard Worker    rogue_feedback_used_regs(ctx, shader);
817*61046927SAndroid Build Coastguard Worker 
818*61046927SAndroid Build Coastguard Worker    return shader;
819*61046927SAndroid Build Coastguard Worker }
820*61046927SAndroid Build Coastguard Worker 
821*61046927SAndroid Build Coastguard Worker /**
822*61046927SAndroid Build Coastguard Worker  * \brief Performs Rogue passes on a shader.
823*61046927SAndroid Build Coastguard Worker  *
824*61046927SAndroid Build Coastguard Worker  * \param[in] shader The shader.
825*61046927SAndroid Build Coastguard Worker  */
826*61046927SAndroid Build Coastguard Worker PUBLIC
rogue_shader_passes(rogue_shader * shader)827*61046927SAndroid Build Coastguard Worker void rogue_shader_passes(rogue_shader *shader)
828*61046927SAndroid Build Coastguard Worker {
829*61046927SAndroid Build Coastguard Worker    rogue_validate_shader(shader, "before passes");
830*61046927SAndroid Build Coastguard Worker 
831*61046927SAndroid Build Coastguard Worker    if (ROGUE_DEBUG(IR_PASSES))
832*61046927SAndroid Build Coastguard Worker       rogue_print_pass_debug(shader, "before passes", stdout);
833*61046927SAndroid Build Coastguard Worker 
834*61046927SAndroid Build Coastguard Worker    /* Passes */
835*61046927SAndroid Build Coastguard Worker    ROGUE_PASS_V(shader, rogue_constreg);
836*61046927SAndroid Build Coastguard Worker    ROGUE_PASS_V(shader, rogue_copy_prop);
837*61046927SAndroid Build Coastguard Worker    ROGUE_PASS_V(shader, rogue_dce);
838*61046927SAndroid Build Coastguard Worker    ROGUE_PASS_V(shader, rogue_lower_pseudo_ops);
839*61046927SAndroid Build Coastguard Worker    ROGUE_PASS_V(shader, rogue_schedule_wdf, false);
840*61046927SAndroid Build Coastguard Worker    ROGUE_PASS_V(shader, rogue_schedule_uvsw, false);
841*61046927SAndroid Build Coastguard Worker    ROGUE_PASS_V(shader, rogue_trim);
842*61046927SAndroid Build Coastguard Worker    ROGUE_PASS_V(shader, rogue_regalloc);
843*61046927SAndroid Build Coastguard Worker    ROGUE_PASS_V(shader, rogue_lower_late_ops);
844*61046927SAndroid Build Coastguard Worker    ROGUE_PASS_V(shader, rogue_dce);
845*61046927SAndroid Build Coastguard Worker    ROGUE_PASS_V(shader, rogue_schedule_instr_groups, false);
846*61046927SAndroid Build Coastguard Worker 
847*61046927SAndroid Build Coastguard Worker    if (ROGUE_DEBUG(IR))
848*61046927SAndroid Build Coastguard Worker       rogue_print_pass_debug(shader, "after passes", stdout);
849*61046927SAndroid Build Coastguard Worker }
850