OSDN Git Service

8c647d0c66c7f047ea1c1e9f604b394eb146bd6e
[android-x86/external-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