gallium: Replace gl_rasterization_rules with lower_left_origin and half_pixel_center.
[mesa.git] / src / gallium / drivers / nvc0 / nvc0_graph_macros.h
1
2 #ifndef __NVC0_PGRAPH_MACROS_H__
3 #define __NVC0_PGRAPH_MACROS_H__
4
5 /* extrinsrt r1, r2, src, size, dst: replace bits [dst:dst+size) in r1
6 * with bits [src:src+size) in r2
7 *
8 * bra(n)z annul: no delay slot
9 */
10
11 /* Bitfield version of NVC0_3D_VERTEX_ARRAY_PER_INSTANCE[].
12 * Args: size, bitfield
13 */
14 static const uint32_t nvc0_9097_per_instance_bf[] =
15 {
16 0x00000301, /* parm $r3 (the bitfield) */
17 0x00000211, /* mov $r2 0 */
18 0x05880021, /* maddr [NVC0_3D_VERTEX_ARRAY_PER_INSTANCE(0), increment = 4] */
19 0xffffc911, /* mov $r1 (add $r1 -0x1) */
20 0x0040d043, /* send (extrshl $r3 $r2 0x1 0) */
21 0xffff8897, /* exit branz $r1 0x3 */
22 0x00005211 /* mov $r2 (add $r2 0x1) */
23 };
24
25 /* The comments above the macros describe what they *should* be doing,
26 * but we use less functionality for now.
27 */
28
29 /*
30 * for (i = 0; i < 8; ++i)
31 * [NVC0_3D_BLEND_ENABLE(i)] = BIT(i of arg);
32 *
33 * [3428] = arg;
34 *
35 * if (arg == 0 || [NVC0_3D_MULTISAMPLE_ENABLE] == 0)
36 * [0d9c] = 0;
37 * else
38 * [0d9c] = [342c];
39 */
40 static const uint32_t nvc0_9097_blend_enables[] =
41 {
42 0x05360021, /* 0x00: maddr [NVC0_3D_BLEND_ENABLE(0), increment = 4] */
43 0x00404042, /* 0x01: send extrinsrt 0 $r1 0 0x1 0 */
44 0x00424042, /* 0x02: send extrinsrt 0 $r1 0x1 0x1 0 */
45 0x00444042, /* 0x03: send extrinsrt 0 $r1 0x2 0x1 0 */
46 0x00464042, /* 0x04: send extrinsrt 0 $r1 0x3 0x1 0 */
47 0x00484042, /* 0x05: send extrinsrt 0 $r1 0x4 0x1 0 */
48 0x004a4042, /* 0x06: send extrinsrt 0 $r1 0x5 0x1 0 */
49 0x004c40c2, /* 0x07: exit send extrinsrt 0 $r1 0x6 0x1 0 */
50 0x004e4042, /* 0x08: send extrinsrt 0 $r1 0x7 0x1 0 */
51 };
52
53 /*
54 * uint64 limit = (parm(0) << 32) | parm(1);
55 * uint64 start = (parm(2) << 32);
56 *
57 * if (limit) {
58 * start |= parm(3);
59 * --limit;
60 * } else {
61 * start |= 1;
62 * }
63 *
64 * [0x1c04 + (arg & 0xf) * 16 + 0] = (start >> 32) & 0xff;
65 * [0x1c04 + (arg & 0xf) * 16 + 4] = start & 0xffffffff;
66 * [0x1f00 + (arg & 0xf) * 8 + 0] = (limit >> 32) & 0xff;
67 * [0x1f00 + (arg & 0xf) * 8 + 4] = limit & 0xffffffff;
68 */
69 static const uint32_t nvc0_9097_vertex_array_select[] =
70 {
71 0x00000201, /* 0x00: parm $r2 */
72 0x00000301, /* 0x01: parm $r3 */
73 0x00000401, /* 0x02: parm $r4 */
74 0x00000501, /* 0x03: parm $r5 */
75 0x11004612, /* 0x04: mov $r6 extrinsrt 0 $r1 0 4 2 */
76 0x09004712, /* 0x05: mov $r7 extrinsrt 0 $r1 0 4 1 */
77 0x05c07621, /* 0x06: maddr $r6 add $6 0x1701 */
78 0x00002041, /* 0x07: send $r4 */
79 0x00002841, /* 0x08: send $r5 */
80 0x05f03f21, /* 0x09: maddr $r7 add $7 0x17c0 */
81 0x000010c1, /* 0x0a: exit send $r2 */
82 0x00001841, /* 0x0b: send $r3 */
83 };
84
85 /*
86 * [GL_POLYGON_MODE_FRONT] = arg;
87 *
88 * if (BIT(31 of [0x3410]))
89 * [1a24] = 0x7353;
90 *
91 * if ([NVC0_3D_SP_SELECT(3)] == 0x31 || [NVC0_3D_SP_SELECT(4)] == 0x41)
92 * [02ec] = 0;
93 * else
94 * if ([GL_POLYGON_MODE_BACK] == GL_LINE || arg == GL_LINE)
95 * [02ec] = BYTE(1 of [0x3410]) << 4;
96 * else
97 * [02ec] = BYTE(0 of [0x3410]) << 4;
98 */
99 static const uint32_t nvc0_9097_poly_mode_front[] =
100 {
101 0x00db0215, /* 0x00: read $r2 [NVC0_3D_POLYGON_MODE_BACK] */
102 0x020c0315, /* 0x01: read $r3 [NVC0_3D_SP_SELECT(3)] */
103 0x00128f10, /* 0x02: mov $r7 or $r1 $r2 */
104 0x02100415, /* 0x03: read $r4 [NVC0_3D_SP_SELECT(4)] */
105 0x00004211, /* 0x04: mov $r2 0x1 */
106 0x00180611, /* 0x05: mov $r6 0x60 */
107 0x0014bf10, /* 0x06: mov $r7 and $r7 $r2 */
108 0x0000f807, /* 0x07: braz $r7 0xa */
109 0x00dac021, /* 0x08: maddr 0x36b */
110 0x00800611, /* 0x09: mov $r6 0x200 */
111 0x00131f10, /* 0x0a: mov $r7 or $r3 $r4 */
112 0x0014bf10, /* 0x0b: mov $r7 and $r7 $r2 */
113 0x0000f807, /* 0x0c: braz $r7 0xf */
114 0x00000841, /* 0x0d: send $r1 */
115 0x00000611, /* 0x0e: mov $r6 0 */
116 0x002ec0a1, /* 0x0f: exit maddr [02ec] */
117 0x00003041 /* 0x10: send $r6 */
118 };
119
120 /*
121 * [GL_POLYGON_MODE_BACK] = arg;
122 *
123 * if (BIT(31 of [0x3410]))
124 * [1a24] = 0x7353;
125 *
126 * if ([NVC0_3D_SP_SELECT(3)] == 0x31 || [NVC0_3D_SP_SELECT(4)] == 0x41)
127 * [02ec] = 0;
128 * else
129 * if ([GL_POLYGON_MODE_FRONT] == GL_LINE || arg == GL_LINE)
130 * [02ec] = BYTE(1 of [0x3410]) << 4;
131 * else
132 * [02ec] = BYTE(0 of [0x3410]) << 4;
133 */
134 /* NOTE: 0x3410 = 0x80002006 by default,
135 * POLYGON_MODE == GL_LINE check replaced by (MODE & 1)
136 * SP_SELECT(i) == (i << 4) | 1 check replaced by SP_SELECT(i) & 1
137 */
138 static const uint32_t nvc0_9097_poly_mode_back[] =
139 {
140 0x00dac215, /* 0x00: read $r2 [NVC0_3D_POLYGON_MODE_FRONT] */
141 0x020c0315, /* 0x01: read $r3 [NVC0_3D_SP_SELECT(3)] */
142 0x00128f10, /* 0x02: mov $r7 or $r1 $r2 */
143 0x02100415, /* 0x03: read $r4 [NVC0_3D_SP_SELECT(4)] */
144 0x00004211, /* 0x04: mov $r2 0x1 */
145 0x00180611, /* 0x05: mov $r6 0x60 */
146 0x0014bf10, /* 0x06: mov $r7 and $r7 $r2 */
147 0x0000f807, /* 0x07: braz $r7 0xa */
148 0x00db0021, /* 0x08: maddr 0x36c */
149 0x00800611, /* 0x09: mov $r6 0x200 */
150 0x00131f10, /* 0x0a: mov $r7 or $r3 $r4 */
151 0x0014bf10, /* 0x0b: mov $r7 and $r7 $r2 */
152 0x0000f807, /* 0x0c: braz $r7 0xf */
153 0x00000841, /* 0x0d: send $r1 */
154 0x00000611, /* 0x0e: mov $r6 0 */
155 0x002ec0a1, /* 0x0f: exit maddr [02ec] */
156 0x00003041 /* 0x10: send $r6 */
157 };
158
159 /*
160 * [NVC0_3D_SP_SELECT(4)] = arg
161 *
162 * if BIT(31 of [0x3410]) == 0
163 * [1a24] = 0x7353;
164 *
165 * if ([NVC0_3D_SP_SELECT(3)] == 0x31 || arg == 0x41)
166 * [02ec] = 0
167 * else
168 * if (any POLYGON MODE == LINE)
169 * [02ec] = BYTE(1 of [3410]) << 4;
170 * else
171 * [02ec] = BYTE(0 of [3410]) << 4; // 02ec valid bits are 0xff1
172 */
173 static const uint32_t nvc0_9097_gp_select[] = /* 0x0f */
174 {
175 0x00dac215, /* 0x00: read $r2 0x36b */
176 0x00db0315, /* 0x01: read $r3 0x36c */
177 0x0012d710, /* 0x02: mov $r7 or $r2 $r3 */
178 0x020c0415, /* 0x03: read $r4 0x830 */
179 0x00004211, /* 0x04: mov $r2 0x1 */
180 0x00180611, /* 0x05: mov $r6 0x60 */
181 0x0014bf10, /* 0x06: mov $r7 and $r7 $r2 */
182 0x0000f807, /* 0x07: braz $r7 0xa */
183 0x02100021, /* 0x08: maddr 0x840 */
184 0x00800611, /* 0x09: mov $r6 0x200 */
185 0x00130f10, /* 0x0a: mov $r7 or $r1 $r4 */
186 0x0014bf10, /* 0x0b: mov $r7 and $r7 $r2 */
187 0x0000f807, /* 0x0c: braz $r7 0xf */
188 0x00000841, /* 0x0d: send $r1 */
189 0x00000611, /* 0x0e: mov $r6 0 */
190 0x002ec0a1, /* 0x0f: exit maddr 0xbb */
191 0x00003041, /* 0x10: send $r6 */
192 };
193
194 /*
195 * [NVC0_3D_SP_SELECT(3)] = arg
196 *
197 * if BIT(31 of [0x3410]) == 0
198 * [1a24] = 0x7353;
199 *
200 * if (arg == 0x31) {
201 * if (BIT(2 of [0x3430])) {
202 * int i = 15; do { --i; } while(i);
203 * [0x1a2c] = 0;
204 * }
205 * }
206 *
207 * if ([NVC0_3D_SP_SELECT(4)] == 0x41 || arg == 0x31)
208 * [02ec] = 0
209 * else
210 * if ([any POLYGON_MODE] == GL_LINE)
211 * [02ec] = BYTE(1 of [3410]) << 4;
212 * else
213 * [02ec] = BYTE(0 of [3410]) << 4;
214 */
215 static const uint32_t nvc0_9097_tep_select[] = /* 0x10 */
216 {
217 0x00dac215, /* 0x00: read $r2 0x36b */
218 0x00db0315, /* 0x01: read $r3 0x36c */
219 0x0012d710, /* 0x02: mov $r7 or $r2 $r3 */
220 0x02100415, /* 0x03: read $r4 0x840 */
221 0x00004211, /* 0x04: mov $r2 0x1 */
222 0x00180611, /* 0x05: mov $r6 0x60 */
223 0x0014bf10, /* 0x06: mov $r7 and $r7 $r2 */
224 0x0000f807, /* 0x07: braz $r7 0xa */
225 0x020c0021, /* 0x08: maddr 0x830 */
226 0x00800611, /* 0x09: mov $r6 0x200 */
227 0x00130f10, /* 0x0a: mov $r7 or $r1 $r4 */
228 0x0014bf10, /* 0x0b: mov $r7 and $r7 $r2 */
229 0x0000f807, /* 0x0c: braz $r7 0xf */
230 0x00000841, /* 0x0d: send $r1 */
231 0x00000611, /* 0x0e: mov $r6 0 */
232 0x002ec0a1, /* 0x0f: exit maddr 0xbb */
233 0x00003041, /* 0x10: send $r6 */
234 };
235
236 #endif