Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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