1 /* extrinsrt r1, r2, src, size, dst: replace bits [dst:dst+size) in r1
2 * with bits [src:src+size) in r2
4 * bra(n)z annul: no delay slot
7 /* Bitfield version of NVC0_3D_VERTEX_ARRAY_PER_INSTANCE[].
10 .section #mme9097_per_instance_bf
16 send (extrshl $r3 $r2 0x1 0x0)
20 /* The comments above the macros describe what they *should* be doing,
21 * but we use less functionality for now.
25 * for (i = 0; i < 8; ++i)
26 * [NVC0_3D_BLEND_ENABLE(i)] = BIT(i of arg);
30 * if (arg == 0 || [NVC0_3D_MULTISAMPLE_ENABLE] == 0)
35 .section #mme9097_blend_enables
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)
47 * uint64 limit = (parm(0) << 32) | parm(1);
48 * uint64 start = (parm(2) << 32);
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;
62 .section #mme9097_vertex_array_select
67 mov $r6 (extrinsrt 0x0 $r1 0x0 0x4 0x2)
68 mov $r7 (extrinsrt 0x0 $r1 0x0 0x4 0x1)
69 maddr $r6 (add $r6 0x1701)
72 maddr $r7 (add $r7 0x17c0)
77 * [GL_POLYGON_MODE_FRONT] = arg;
79 * if (BIT(31 of [0x3410]))
82 * if ([NVC0_3D_SP_SELECT(3)] == 0x31 || [NVC0_3D_SP_SELECT(4)] == 0x41)
85 * if ([GL_POLYGON_MODE_BACK] == GL_LINE || arg == GL_LINE)
86 * [02ec] = BYTE(1 of [0x3410]) << 4;
88 * [02ec] = BYTE(0 of [0x3410]) << 4;
90 .section #mme9097_poly_mode_front
103 mov $r7 (and $r7 $r2)
104 braz $r7 #locn_0f_pmf
112 * [GL_POLYGON_MODE_BACK] = arg;
114 * if (BIT(31 of [0x3410]))
117 * if ([NVC0_3D_SP_SELECT(3)] == 0x31 || [NVC0_3D_SP_SELECT(4)] == 0x41)
120 * if ([GL_POLYGON_MODE_FRONT] == GL_LINE || arg == GL_LINE)
121 * [02ec] = BYTE(1 of [0x3410]) << 4;
123 * [02ec] = BYTE(0 of [0x3410]) << 4;
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
129 .section #mme9097_poly_mode_back
136 mov $r7 (and $r7 $r2)
137 braz $r7 #locn_0a_pmb
142 mov $r7 (and $r7 $r2)
143 braz $r7 #locn_0f_pmb
151 * [NVC0_3D_SP_SELECT(4)] = arg
153 * if BIT(31 of [0x3410]) == 0
156 * if ([NVC0_3D_SP_SELECT(3)] == 0x31 || arg == 0x41)
159 * if (any POLYGON MODE == LINE)
160 * [02ec] = BYTE(1 of [3410]) << 4;
162 * [02ec] = BYTE(0 of [3410]) << 4; // 02ec valid bits are 0xff1
164 .section #mme9097_gp_select
171 mov $r7 (and $r7 $r2)
177 mov $r7 (and $r7 $r2)
186 * [NVC0_3D_SP_SELECT(3)] = arg
188 * if BIT(31 of [0x3410]) == 0
192 * if (BIT(2 of [0x3430])) {
193 * int i = 15; do { --i; } while(i);
198 * if ([NVC0_3D_SP_SELECT(4)] == 0x41 || arg == 0x31)
201 * if ([any POLYGON_MODE] == GL_LINE)
202 * [02ec] = BYTE(1 of [3410]) << 4;
204 * [02ec] = BYTE(0 of [3410]) << 4;
206 .section #mme9097_tep_select
213 mov $r7 (and $r7 $r2)
219 mov $r7 (and $r7 $r2)
227 /* NVC0_3D_MACRO_DRAW_ELEMENTS_INDIRECT
229 * NOTE: Saves and restores VB_ELEMENT,INSTANCE_BASE.
230 * Forcefully sets VERTEX_ID_BASE to the value of VB_ELEMENT_BASE.
234 * parm[1] = instance_count
236 * parm[3] = index_bias
237 * parm[4] = start_instance
239 .section #mme9097_draw_elts_indirect
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 */
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 */
257 maddr 0x586 /* VERTEX_BEGIN_GL */
259 maddr 0x5f8 /* INDEX_BATCH_COUNT */
261 mov $r2 (sub $r2 $r4)
262 maddrsend 0x585 /* VERTEX_END_GL */
264 mov $r1 (extrinsrt $r1 $r4 0 1 26) /* set INSTANCE_NEXT */
265 maddr 0x150d /* VB_ELEMENT,INSTANCE_BASE */
274 /* NVC0_3D_MACRO_DRAW_ARRAYS_INDIRECT:
276 * NOTE: Saves and restores VB_INSTANCE_BASE.
280 * parm[1] = instance_count
282 * parm[3] = start_instance
284 .section #mme9097_draw_arrays_indirect
286 parm $r3 /* instance_count */
287 parm $r4 maddr 0x35d /* VERTEX_BUFFER_FIRST, start */
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 */
297 maddr 0x586 /* VERTEX_BEGIN_GL */
299 maddr 0x35e /* VERTEX_BUFFER_COUNT */
301 mov $r3 (sub $r3 $r5)
302 maddrsend 0x585 /* VERTEX_END_GL */
304 mov $r1 (extrinsrt $r1 $r5 0 1 26) /* set INSTANCE_NEXT */
305 exit maddr 0x50e /* VB_INSTANCE_BASE to restore */