nvc0: add ARB_shader_draw_parameters support
[mesa.git] / src / gallium / drivers / nouveau / nvc0 / mme / com9097.mme
1 /* extrinsrt r1, r2, src, size, dst: replace bits [dst:dst+size) in r1
2 * with bits [src:src+size) in r2
3 *
4 * bra(n)z annul: no delay slot
5 */
6
7 /* Bitfield version of NVC0_3D_VERTEX_ARRAY_PER_INSTANCE[].
8 * Args: size, bitfield
9 */
10 .section #mme9097_per_instance_bf
11 parm $r3
12 mov $r2 0x0
13 maddr 0x1620
14 loop:
15 mov $r1 (add $r1 -1)
16 send (extrshl $r3 $r2 0x1 0x0)
17 exit branz $r1 #loop
18 mov $r2 (add $r2 0x1)
19
20 /* The comments above the macros describe what they *should* be doing,
21 * but we use less functionality for now.
22 */
23
24 /*
25 * for (i = 0; i < 8; ++i)
26 * [NVC0_3D_BLEND_ENABLE(i)] = BIT(i of arg);
27 *
28 * [3428] = arg;
29 *
30 * if (arg == 0 || [NVC0_3D_MULTISAMPLE_ENABLE] == 0)
31 * [0d9c] = 0;
32 * else
33 * [0d9c] = [342c];
34 */
35 .section #mme9097_blend_enables
36 maddr 0x14d8
37 send (extrinsrt 0x0 $r1 0x0 0x1 0x0)
38 send (extrinsrt 0x0 $r1 0x1 0x1 0x0)
39 send (extrinsrt 0x0 $r1 0x2 0x1 0x0)
40 send (extrinsrt 0x0 $r1 0x3 0x1 0x0)
41 send (extrinsrt 0x0 $r1 0x4 0x1 0x0)
42 send (extrinsrt 0x0 $r1 0x5 0x1 0x0)
43 exit send (extrinsrt 0x0 $r1 0x6 0x1 0x0)
44 send (extrinsrt 0x0 $r1 0x7 0x1 0x0)
45
46 /*
47 * uint64 limit = (parm(0) << 32) | parm(1);
48 * uint64 start = (parm(2) << 32);
49 *
50 * if (limit) {
51 * start |= parm(3);
52 * --limit;
53 * } else {
54 * start |= 1;
55 * }
56 *
57 * [0x1c04 + (arg & 0xf) * 16 + 0] = (start >> 32) & 0xff;
58 * [0x1c04 + (arg & 0xf) * 16 + 4] = start & 0xffffffff;
59 * [0x1f00 + (arg & 0xf) * 8 + 0] = (limit >> 32) & 0xff;
60 * [0x1f00 + (arg & 0xf) * 8 + 4] = limit & 0xffffffff;
61 */
62 .section #mme9097_vertex_array_select
63 parm $r2
64 parm $r3
65 parm $r4
66 parm $r5
67 mov $r6 (extrinsrt 0x0 $r1 0x0 0x4 0x2)
68 mov $r7 (extrinsrt 0x0 $r1 0x0 0x4 0x1)
69 maddr $r6 (add $r6 0x1701)
70 send $r4
71 send $r5
72 maddr $r7 (add $r7 0x17c0)
73 exit send $r2
74 send $r3
75
76 /*
77 * [GL_POLYGON_MODE_FRONT] = arg;
78 *
79 * if (BIT(31 of [0x3410]))
80 * [1a24] = 0x7353;
81 *
82 * if ([NVC0_3D_SP_SELECT(3)] == 0x31 || [NVC0_3D_SP_SELECT(4)] == 0x41)
83 * [02ec] = 0;
84 * else
85 * if ([GL_POLYGON_MODE_BACK] == GL_LINE || arg == GL_LINE)
86 * [02ec] = BYTE(1 of [0x3410]) << 4;
87 * else
88 * [02ec] = BYTE(0 of [0x3410]) << 4;
89 */
90 .section #mme9097_poly_mode_front
91 read $r2 0x36c
92 read $r3 0x830
93 mov $r7 (or $r1 $r2)
94 read $r4 0x840
95 mov $r2 0x1
96 mov $r6 0x60
97 mov $r7 (and $r7 $r2)
98 braz $r7 #locn_0a_pmf
99 maddr 0x36b
100 mov $r6 0x200
101 locn_0a_pmf:
102 mov $r7 (or $r3 $r4)
103 mov $r7 (and $r7 $r2)
104 braz $r7 #locn_0f_pmf
105 send $r1
106 mov $r6 0x0
107 locn_0f_pmf:
108 exit maddr 0xbb
109 send $r6
110
111 /*
112 * [GL_POLYGON_MODE_BACK] = arg;
113 *
114 * if (BIT(31 of [0x3410]))
115 * [1a24] = 0x7353;
116 *
117 * if ([NVC0_3D_SP_SELECT(3)] == 0x31 || [NVC0_3D_SP_SELECT(4)] == 0x41)
118 * [02ec] = 0;
119 * else
120 * if ([GL_POLYGON_MODE_FRONT] == GL_LINE || arg == GL_LINE)
121 * [02ec] = BYTE(1 of [0x3410]) << 4;
122 * else
123 * [02ec] = BYTE(0 of [0x3410]) << 4;
124 */
125 /* NOTE: 0x3410 = 0x80002006 by default,
126 * POLYGON_MODE == GL_LINE check replaced by (MODE & 1)
127 * SP_SELECT(i) == (i << 4) | 1 check replaced by SP_SELECT(i) & 1
128 */
129 .section #mme9097_poly_mode_back
130 read $r2 0x36b
131 read $r3 0x830
132 mov $r7 (or $r1 $r2)
133 read $r4 0x840
134 mov $r2 0x1
135 mov $r6 0x60
136 mov $r7 (and $r7 $r2)
137 braz $r7 #locn_0a_pmb
138 maddr 0x36c
139 mov $r6 0x200
140 locn_0a_pmb:
141 mov $r7 (or $r3 $r4)
142 mov $r7 (and $r7 $r2)
143 braz $r7 #locn_0f_pmb
144 send $r1
145 mov $r6 0x0
146 locn_0f_pmb:
147 exit maddr 0xbb
148 send $r6
149
150 /*
151 * [NVC0_3D_SP_SELECT(4)] = arg
152 *
153 * if BIT(31 of [0x3410]) == 0
154 * [1a24] = 0x7353;
155 *
156 * if ([NVC0_3D_SP_SELECT(3)] == 0x31 || arg == 0x41)
157 * [02ec] = 0
158 * else
159 * if (any POLYGON MODE == LINE)
160 * [02ec] = BYTE(1 of [3410]) << 4;
161 * else
162 * [02ec] = BYTE(0 of [3410]) << 4; // 02ec valid bits are 0xff1
163 */
164 .section #mme9097_gp_select
165 read $r2 0x36b
166 read $r3 0x36c
167 mov $r7 (or $r2 $r3)
168 read $r4 0x830
169 mov $r2 0x1
170 mov $r6 0x60
171 mov $r7 (and $r7 $r2)
172 braz $r7 #locn_0a_gs
173 maddr 0x840
174 mov $r6 0x200
175 locn_0a_gs:
176 mov $r7 (or $r1 $r4)
177 mov $r7 (and $r7 $r2)
178 braz $r7 #locn_0f_gs
179 send $r1
180 mov $r6 0x0
181 locn_0f_gs:
182 exit maddr 0xbb
183 send $r6
184
185 /*
186 * [NVC0_3D_SP_SELECT(3)] = arg
187 *
188 * if BIT(31 of [0x3410]) == 0
189 * [1a24] = 0x7353;
190 *
191 * if (arg == 0x31) {
192 * if (BIT(2 of [0x3430])) {
193 * int i = 15; do { --i; } while(i);
194 * [0x1a2c] = 0;
195 * }
196 * }
197 *
198 * if ([NVC0_3D_SP_SELECT(4)] == 0x41 || arg == 0x31)
199 * [02ec] = 0
200 * else
201 * if ([any POLYGON_MODE] == GL_LINE)
202 * [02ec] = BYTE(1 of [3410]) << 4;
203 * else
204 * [02ec] = BYTE(0 of [3410]) << 4;
205 */
206 .section #mme9097_tep_select
207 read $r2 0x36b
208 read $r3 0x36c
209 mov $r7 (or $r2 $r3)
210 read $r4 0x840
211 mov $r2 0x1
212 mov $r6 0x60
213 mov $r7 (and $r7 $r2)
214 braz $r7 #locn_0a_ts
215 maddr 0x830
216 mov $r6 0x200
217 locn_0a_ts:
218 mov $r7 (or $r1 $r4)
219 mov $r7 (and $r7 $r2)
220 braz $r7 #locn_0f_ts
221 send $r1
222 mov $r6 0x0
223 locn_0f_ts:
224 exit maddr 0xbb
225 send $r6
226
227 /* NVC0_3D_MACRO_DRAW_ELEMENTS_INDIRECT
228 *
229 * NOTE: Saves and restores VB_ELEMENT,INSTANCE_BASE.
230 * Forcefully sets VERTEX_ID_BASE to the value of VB_ELEMENT_BASE.
231 *
232 * arg = mode
233 * parm[0] = count
234 * parm[1] = instance_count
235 * parm[2] = start
236 * parm[3] = index_bias
237 * parm[4] = start_instance
238 */
239 .section #mme9097_draw_elts_indirect
240 parm $r3 /* count */
241 parm $r2 /* instance_count */
242 parm $r4 maddr 0x5f7 /* INDEX_BATCH_FIRST, start */
243 parm $r4 send $r4 /* index_bias, send start */
244 maddr 0x8e4 /* CB_DATA */
245 braz $r2 #dei_end
246 parm $r5 send $r4 /* start_instance, send index_bias */
247 send $r5 /* send start_instance */
248 read $r6 0x50d /* VB_ELEMENT_BASE */
249 read $r7 0x50e /* VB_INSTANCE_BASE */
250 maddr 0x150d /* VB_ELEMENT,INSTANCE_BASE */
251 send $r4
252 send $r5
253 maddr 0x446
254 send $r4
255 mov $r4 0x1
256 dei_again:
257 maddr 0x586 /* VERTEX_BEGIN_GL */
258 send $r1 /* mode */
259 maddr 0x5f8 /* INDEX_BATCH_COUNT */
260 send $r3 /* count */
261 mov $r2 (sub $r2 $r4)
262 maddrsend 0x585 /* VERTEX_END_GL */
263 branz $r2 #dei_again
264 mov $r1 (extrinsrt $r1 $r4 0 1 26) /* set INSTANCE_NEXT */
265 maddr 0x150d /* VB_ELEMENT,INSTANCE_BASE */
266 send $r6
267 send $r7
268 exit maddr 0x446
269 send $r6
270 dei_end:
271 exit
272 nop
273
274 /* NVC0_3D_MACRO_DRAW_ARRAYS_INDIRECT:
275 *
276 * NOTE: Saves and restores VB_INSTANCE_BASE.
277 *
278 * arg = mode
279 * parm[0] = count
280 * parm[1] = instance_count
281 * parm[2] = start
282 * parm[3] = start_instance
283 */
284 .section #mme9097_draw_arrays_indirect
285 parm $r2 /* count */
286 parm $r3 /* instance_count */
287 parm $r4 maddr 0x35d /* VERTEX_BUFFER_FIRST, start */
288 braz $r3 #dai_end
289 parm $r4 send $r4 /* start_instance */
290 maddrsend 0x8e4 /* CB_DATA, send 0 as base_vertex */
291 send $r4 /* send start_instance */
292 read $r6 0x50e /* VB_INSTANCE_BASE */
293 maddr 0x50e /* VB_INSTANCE_BASE */
294 mov $r5 0x1
295 send $r4
296 dai_again:
297 maddr 0x586 /* VERTEX_BEGIN_GL */
298 send $r1 /* mode */
299 maddr 0x35e /* VERTEX_BUFFER_COUNT */
300 send $r2
301 mov $r3 (sub $r3 $r5)
302 maddrsend 0x585 /* VERTEX_END_GL */
303 branz $r3 #dai_again
304 mov $r1 (extrinsrt $r1 $r5 0 1 26) /* set INSTANCE_NEXT */
305 exit maddr 0x50e /* VB_INSTANCE_BASE to restore */
306 send $r6
307 dai_end:
308 exit
309 nop