xref: /aosp_15_r20/external/mesa3d/src/imagination/rogue/rogue_builder.h (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 #ifndef ROGUE_BUILDER_H
25*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_H
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker /**
28*61046927SAndroid Build Coastguard Worker  * \file rogue_builder.h
29*61046927SAndroid Build Coastguard Worker  *
30*61046927SAndroid Build Coastguard Worker  * \brief Contains helper functions for building Rogue shaders.
31*61046927SAndroid Build Coastguard Worker  */
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker #include "rogue.h"
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker /** Rogue builder context. */
36*61046927SAndroid Build Coastguard Worker typedef struct rogue_builder {
37*61046927SAndroid Build Coastguard Worker    rogue_shader *shader; /** The shader being built. */
38*61046927SAndroid Build Coastguard Worker    rogue_cursor cursor; /** The current position in the shader. */
39*61046927SAndroid Build Coastguard Worker } rogue_builder;
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker /**
42*61046927SAndroid Build Coastguard Worker  * \brief Initialises a Rogue builder context.
43*61046927SAndroid Build Coastguard Worker  *
44*61046927SAndroid Build Coastguard Worker  * \param[in] b The builder context.
45*61046927SAndroid Build Coastguard Worker  * \param[in] shader The shader.
46*61046927SAndroid Build Coastguard Worker  */
rogue_builder_init(rogue_builder * b,rogue_shader * shader)47*61046927SAndroid Build Coastguard Worker static inline void rogue_builder_init(rogue_builder *b, rogue_shader *shader)
48*61046927SAndroid Build Coastguard Worker {
49*61046927SAndroid Build Coastguard Worker    b->shader = shader;
50*61046927SAndroid Build Coastguard Worker    b->cursor = rogue_cursor_before_shader(shader);
51*61046927SAndroid Build Coastguard Worker }
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker /**
54*61046927SAndroid Build Coastguard Worker  * \brief Inserts a basic block at the current builder context position.
55*61046927SAndroid Build Coastguard Worker  *
56*61046927SAndroid Build Coastguard Worker  * \param[in] b The builder context.
57*61046927SAndroid Build Coastguard Worker  * \param[in] block The basic block to insert.
58*61046927SAndroid Build Coastguard Worker  */
rogue_builder_insert_block(rogue_builder * b,rogue_block * block)59*61046927SAndroid Build Coastguard Worker static inline void rogue_builder_insert_block(rogue_builder *b,
60*61046927SAndroid Build Coastguard Worker                                               rogue_block *block)
61*61046927SAndroid Build Coastguard Worker {
62*61046927SAndroid Build Coastguard Worker    rogue_block_insert(block, b->cursor);
63*61046927SAndroid Build Coastguard Worker    b->cursor = rogue_cursor_after_block(block);
64*61046927SAndroid Build Coastguard Worker }
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker /**
67*61046927SAndroid Build Coastguard Worker  * \brief Inserts a new basic block at the current builder context position.
68*61046927SAndroid Build Coastguard Worker  *
69*61046927SAndroid Build Coastguard Worker  * \param[in] b The builder context.
70*61046927SAndroid Build Coastguard Worker  * \param[in] label The (optional) basic block label.
71*61046927SAndroid Build Coastguard Worker  * \return The new block.
72*61046927SAndroid Build Coastguard Worker  */
rogue_push_block_labelled(rogue_builder * b,const char * label)73*61046927SAndroid Build Coastguard Worker static inline rogue_block *rogue_push_block_labelled(rogue_builder *b,
74*61046927SAndroid Build Coastguard Worker                                                      const char *label)
75*61046927SAndroid Build Coastguard Worker {
76*61046927SAndroid Build Coastguard Worker    rogue_block *block = rogue_block_create(b->shader, label);
77*61046927SAndroid Build Coastguard Worker    rogue_builder_insert_block(b, block);
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker    return block;
80*61046927SAndroid Build Coastguard Worker }
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker /**
83*61046927SAndroid Build Coastguard Worker  * \brief Inserts a new basic block at the current builder context position.
84*61046927SAndroid Build Coastguard Worker  *
85*61046927SAndroid Build Coastguard Worker  * \param[in] b The builder context.
86*61046927SAndroid Build Coastguard Worker  * \return The new block.
87*61046927SAndroid Build Coastguard Worker  */
rogue_push_block(rogue_builder * b)88*61046927SAndroid Build Coastguard Worker static inline rogue_block *rogue_push_block(rogue_builder *b)
89*61046927SAndroid Build Coastguard Worker {
90*61046927SAndroid Build Coastguard Worker    return rogue_push_block_labelled(b, NULL);
91*61046927SAndroid Build Coastguard Worker }
92*61046927SAndroid Build Coastguard Worker 
93*61046927SAndroid Build Coastguard Worker /* ALU instructions. */
94*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_ALU11(op)           \
95*61046927SAndroid Build Coastguard Worker    rogue_alu_instr *rogue_##op(rogue_builder *b, \
96*61046927SAndroid Build Coastguard Worker                                rogue_ref dst0,   \
97*61046927SAndroid Build Coastguard Worker                                rogue_ref src0);
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_ALU12(op)           \
100*61046927SAndroid Build Coastguard Worker    rogue_alu_instr *rogue_##op(rogue_builder *b, \
101*61046927SAndroid Build Coastguard Worker                                rogue_ref dst0,   \
102*61046927SAndroid Build Coastguard Worker                                rogue_ref src0,   \
103*61046927SAndroid Build Coastguard Worker                                rogue_ref src1);
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_ALU13(op)           \
106*61046927SAndroid Build Coastguard Worker    rogue_alu_instr *rogue_##op(rogue_builder *b, \
107*61046927SAndroid Build Coastguard Worker                                rogue_ref dst0,   \
108*61046927SAndroid Build Coastguard Worker                                rogue_ref src0,   \
109*61046927SAndroid Build Coastguard Worker                                rogue_ref src1,   \
110*61046927SAndroid Build Coastguard Worker                                rogue_ref src2);
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_ALU22(op)           \
113*61046927SAndroid Build Coastguard Worker    rogue_alu_instr *rogue_##op(rogue_builder *b, \
114*61046927SAndroid Build Coastguard Worker                                rogue_ref dst0,   \
115*61046927SAndroid Build Coastguard Worker                                rogue_ref dst1,   \
116*61046927SAndroid Build Coastguard Worker                                rogue_ref src0,   \
117*61046927SAndroid Build Coastguard Worker                                rogue_ref src1);
118*61046927SAndroid Build Coastguard Worker 
119*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_ALU23(op)           \
120*61046927SAndroid Build Coastguard Worker    rogue_alu_instr *rogue_##op(rogue_builder *b, \
121*61046927SAndroid Build Coastguard Worker                                rogue_ref dst0,   \
122*61046927SAndroid Build Coastguard Worker                                rogue_ref dst1,   \
123*61046927SAndroid Build Coastguard Worker                                rogue_ref src0,   \
124*61046927SAndroid Build Coastguard Worker                                rogue_ref src1,   \
125*61046927SAndroid Build Coastguard Worker                                rogue_ref src2);
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_ALU35(op)           \
128*61046927SAndroid Build Coastguard Worker    rogue_alu_instr *rogue_##op(rogue_builder *b, \
129*61046927SAndroid Build Coastguard Worker                                rogue_ref dst0,   \
130*61046927SAndroid Build Coastguard Worker                                rogue_ref dst1,   \
131*61046927SAndroid Build Coastguard Worker                                rogue_ref dst2,   \
132*61046927SAndroid Build Coastguard Worker                                rogue_ref src0,   \
133*61046927SAndroid Build Coastguard Worker                                rogue_ref src1,   \
134*61046927SAndroid Build Coastguard Worker                                rogue_ref src2,   \
135*61046927SAndroid Build Coastguard Worker                                rogue_ref src3,   \
136*61046927SAndroid Build Coastguard Worker                                rogue_ref src4);
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker #include "rogue_alu_instrs.def"
139*61046927SAndroid Build Coastguard Worker 
140*61046927SAndroid Build Coastguard Worker /* Backend instructions. */
141*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_BACKEND00(op) \
142*61046927SAndroid Build Coastguard Worker    rogue_backend_instr *rogue_##op(rogue_builder *b);
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_BACKEND02(op)           \
145*61046927SAndroid Build Coastguard Worker    rogue_backend_instr *rogue_##op(rogue_builder *b, \
146*61046927SAndroid Build Coastguard Worker                                    rogue_ref src0,   \
147*61046927SAndroid Build Coastguard Worker                                    rogue_ref src1);
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_BACKEND11(op)           \
150*61046927SAndroid Build Coastguard Worker    rogue_backend_instr *rogue_##op(rogue_builder *b, \
151*61046927SAndroid Build Coastguard Worker                                    rogue_ref dst0,   \
152*61046927SAndroid Build Coastguard Worker                                    rogue_ref src0);
153*61046927SAndroid Build Coastguard Worker 
154*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_BACKEND13(op)           \
155*61046927SAndroid Build Coastguard Worker    rogue_backend_instr *rogue_##op(rogue_builder *b, \
156*61046927SAndroid Build Coastguard Worker                                    rogue_ref dst0,   \
157*61046927SAndroid Build Coastguard Worker                                    rogue_ref src0,   \
158*61046927SAndroid Build Coastguard Worker                                    rogue_ref src1,   \
159*61046927SAndroid Build Coastguard Worker                                    rogue_ref src2);
160*61046927SAndroid Build Coastguard Worker 
161*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_BACKEND14(op)           \
162*61046927SAndroid Build Coastguard Worker    rogue_backend_instr *rogue_##op(rogue_builder *b, \
163*61046927SAndroid Build Coastguard Worker                                    rogue_ref dst0,   \
164*61046927SAndroid Build Coastguard Worker                                    rogue_ref src0,   \
165*61046927SAndroid Build Coastguard Worker                                    rogue_ref src1,   \
166*61046927SAndroid Build Coastguard Worker                                    rogue_ref src2,   \
167*61046927SAndroid Build Coastguard Worker                                    rogue_ref src3);
168*61046927SAndroid Build Coastguard Worker 
169*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_BACKEND06(op)           \
170*61046927SAndroid Build Coastguard Worker    rogue_backend_instr *rogue_##op(rogue_builder *b, \
171*61046927SAndroid Build Coastguard Worker                                    rogue_ref src0,   \
172*61046927SAndroid Build Coastguard Worker                                    rogue_ref src1,   \
173*61046927SAndroid Build Coastguard Worker                                    rogue_ref src2,   \
174*61046927SAndroid Build Coastguard Worker                                    rogue_ref src3,   \
175*61046927SAndroid Build Coastguard Worker                                    rogue_ref src4,   \
176*61046927SAndroid Build Coastguard Worker                                    rogue_ref src5);
177*61046927SAndroid Build Coastguard Worker 
178*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_BACKEND16(op)           \
179*61046927SAndroid Build Coastguard Worker    rogue_backend_instr *rogue_##op(rogue_builder *b, \
180*61046927SAndroid Build Coastguard Worker                                    rogue_ref dst0,   \
181*61046927SAndroid Build Coastguard Worker                                    rogue_ref src0,   \
182*61046927SAndroid Build Coastguard Worker                                    rogue_ref src1,   \
183*61046927SAndroid Build Coastguard Worker                                    rogue_ref src2,   \
184*61046927SAndroid Build Coastguard Worker                                    rogue_ref src3,   \
185*61046927SAndroid Build Coastguard Worker                                    rogue_ref src4,   \
186*61046927SAndroid Build Coastguard Worker                                    rogue_ref src5);
187*61046927SAndroid Build Coastguard Worker 
188*61046927SAndroid Build Coastguard Worker #include "rogue_backend_instrs.def"
189*61046927SAndroid Build Coastguard Worker 
190*61046927SAndroid Build Coastguard Worker /* Ctrl instructions. */
191*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_CTRLB(op) \
192*61046927SAndroid Build Coastguard Worker    rogue_ctrl_instr *rogue_##op(rogue_builder *b, rogue_block *block);
193*61046927SAndroid Build Coastguard Worker 
194*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_CTRL00(op) \
195*61046927SAndroid Build Coastguard Worker    rogue_ctrl_instr *rogue_##op(rogue_builder *b);
196*61046927SAndroid Build Coastguard Worker 
197*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_CTRL01(op) \
198*61046927SAndroid Build Coastguard Worker    rogue_ctrl_instr *rogue_##op(rogue_builder *b, rogue_ref src0);
199*61046927SAndroid Build Coastguard Worker 
200*61046927SAndroid Build Coastguard Worker #include "rogue_ctrl_instrs.def"
201*61046927SAndroid Build Coastguard Worker 
202*61046927SAndroid Build Coastguard Worker /* Bitwise instructions. */
203*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_BITWISE22(op)           \
204*61046927SAndroid Build Coastguard Worker    rogue_bitwise_instr *rogue_##op(rogue_builder *b, \
205*61046927SAndroid Build Coastguard Worker                                    rogue_ref dst0,   \
206*61046927SAndroid Build Coastguard Worker                                    rogue_ref dst1,   \
207*61046927SAndroid Build Coastguard Worker                                    rogue_ref src0,   \
208*61046927SAndroid Build Coastguard Worker                                    rogue_ref src1);
209*61046927SAndroid Build Coastguard Worker 
210*61046927SAndroid Build Coastguard Worker #include "rogue_bitwise_instrs.def"
211*61046927SAndroid Build Coastguard Worker 
212*61046927SAndroid Build Coastguard Worker #endif /* ROGUE_BUILDER_H */
213