OSDN Git Service

vc4: Make scheduling of NOPs a separate step from QIR -> QPU translation.
[android-x86/external-mesa.git] / src / gallium / drivers / vc4 / vc4_qir.h
1 /*
2  * Copyright © 2014 Broadcom
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  */
23
24 #ifndef VC4_QIR_H
25 #define VC4_QIR_H
26
27 #include <stdint.h>
28
29 #include "util/u_simple_list.h"
30
31 enum qfile {
32         QFILE_NULL,
33         QFILE_TEMP,
34         QFILE_VARY,
35         QFILE_UNIF,
36 };
37
38 struct qreg {
39         enum qfile file;
40         uint32_t index;
41 };
42
43 enum qop {
44         QOP_UNDEF,
45         QOP_MOV,
46         QOP_FADD,
47         QOP_FSUB,
48         QOP_FMUL,
49         QOP_FMIN,
50         QOP_FMAX,
51         QOP_FMINABS,
52         QOP_FMAXABS,
53
54         QOP_SEQ,
55         QOP_SNE,
56         QOP_SGE,
57         QOP_SLT,
58
59         QOP_FTOI,
60         QOP_RCP,
61         QOP_RSQ,
62         QOP_EXP2,
63         QOP_LOG2,
64         QOP_VW_SETUP,
65         QOP_VR_SETUP,
66         QOP_PACK_SCALED,
67         QOP_PACK_COLORS,
68         QOP_VPM_WRITE,
69         QOP_VPM_READ,
70         QOP_TLB_COLOR_WRITE,
71         QOP_VARY_ADD_C,
72 };
73
74 struct simple_node {
75         struct simple_node *next;
76         struct simple_node *prev;
77 };
78
79 struct qinst {
80         struct simple_node link;
81
82         enum qop op;
83         struct qreg dst;
84         struct qreg *src;
85 };
86
87 enum qstage {
88         /**
89          * Coordinate shader, runs during binning, before the VS, and just
90          * outputs position.
91          */
92         QSTAGE_COORD,
93         QSTAGE_VERT,
94         QSTAGE_FRAG,
95 };
96
97 enum quniform_contents {
98         /**
99          * Indicates that a constant 32-bit value is copied from the program's
100          * uniform contents.
101          */
102         QUNIFORM_CONSTANT,
103         /**
104          * Indicates that the program's uniform contents are used as an index
105          * into the GL uniform storage.
106          */
107         QUNIFORM_UNIFORM,
108
109         /** @{
110          * Scaling factors from clip coordinates to relative to the viewport
111          * center.
112          *
113          * This is used by the coordinate and vertex shaders to produce the
114          * 32-bit entry consisting of 2 16-bit fields with 12.4 signed fixed
115          * point offsets from the viewport ccenter.
116          */
117         QUNIFORM_VIEWPORT_X_SCALE,
118         QUNIFORM_VIEWPORT_Y_SCALE,
119         /** @} */
120 };
121
122 struct qcompile {
123         struct qreg undef;
124         enum qstage stage;
125         uint32_t num_temps;
126         struct simple_node instructions;
127         uint32_t immediates[1024];
128
129         struct simple_node qpu_inst_list;
130         uint64_t *qpu_insts;
131         uint32_t qpu_inst_count;
132         uint32_t qpu_inst_size;
133 };
134
135 struct qcompile *qir_compile_init(void);
136 void qir_compile_destroy(struct qcompile *c);
137 struct qinst *qir_inst(enum qop op, struct qreg dst,
138                        struct qreg src0, struct qreg src1);
139 struct qinst *qir_inst4(enum qop op, struct qreg dst,
140                         struct qreg a,
141                         struct qreg b,
142                         struct qreg c,
143                         struct qreg d);
144 void qir_emit(struct qcompile *c, struct qinst *inst);
145 struct qreg qir_get_temp(struct qcompile *c);
146 int qir_get_op_nsrc(enum qop qop);
147
148 void qir_dump(struct qcompile *c);
149 void qir_dump_inst(struct qinst *inst);
150 const char *qir_get_stage_name(enum qstage stage);
151
152 #define QIR_ALU1(name)                                                   \
153 static inline struct qreg                                                \
154 qir_##name(struct qcompile *c, struct qreg a)                            \
155 {                                                                        \
156         struct qreg t = qir_get_temp(c);                                 \
157         qir_emit(c, qir_inst(QOP_##name, t, a, c->undef));               \
158         return t;                                                        \
159 }
160
161 #define QIR_ALU2(name)                                                   \
162 static inline struct qreg                                                \
163 qir_##name(struct qcompile *c, struct qreg a, struct qreg b)             \
164 {                                                                        \
165         struct qreg t = qir_get_temp(c);                                 \
166         qir_emit(c, qir_inst(QOP_##name, t, a, b));                      \
167         return t;                                                        \
168 }
169
170 QIR_ALU1(MOV)
171 QIR_ALU2(FADD)
172 QIR_ALU2(FSUB)
173 QIR_ALU2(FMUL)
174 QIR_ALU2(FMIN)
175 QIR_ALU2(FMAX)
176 QIR_ALU2(FMINABS)
177 QIR_ALU2(FMAXABS)
178 QIR_ALU1(FTOI)
179 QIR_ALU1(RCP)
180 QIR_ALU1(RSQ)
181 QIR_ALU1(EXP2)
182 QIR_ALU1(LOG2)
183 QIR_ALU2(PACK_SCALED)
184 QIR_ALU1(VARY_ADD_C)
185
186 static inline void
187 qir_VPM_WRITE(struct qcompile *c, struct qreg a)
188 {
189         qir_emit(c, qir_inst(QOP_VPM_WRITE, c->undef, a, c->undef));
190 }
191
192 #endif /* VC4_QIR_H */