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 237