34cf4058 |
1 | #include "gles2N64.h" |
2 | #include "Debug.h" |
3 | #include "F3D.h" |
4 | #include "N64.h" |
5 | #include "RSP.h" |
6 | #include "RDP.h" |
7 | #include "gSP.h" |
8 | #include "gDP.h" |
9 | #include "GBI.h" |
10 | #include "OpenGL.h" |
11 | #include "DepthBuffer.h" |
12 | |
13 | #include "Config.h" |
14 | |
15 | void F3D_SPNoOp( u32 w0, u32 w1 ) |
16 | { |
17 | gSPNoOp(); |
18 | } |
19 | |
20 | void F3D_Mtx( u32 w0, u32 w1 ) |
21 | { |
22 | if (_SHIFTR( w0, 0, 16 ) != 64) |
23 | { |
24 | // GBI_DetectUCode(); // Something's wrong |
25 | #ifdef DEBUG |
26 | DebugMsg( DEBUG_MEDIUM | DEBUG_HIGH | DEBUG_ERROR, "G_MTX: address = 0x%08X length = %i params = 0x%02X\n", w1, _SHIFTR( w0, 0, 16 ), _SHIFTR( w0, 16, 8 ) ); |
27 | #endif |
28 | return; |
29 | } |
30 | |
31 | gSPMatrix( w1, _SHIFTR( w0, 16, 8 ) ); |
32 | } |
33 | |
34 | void F3D_Reserved0( u32 w0, u32 w1 ) |
35 | { |
36 | #ifdef DEBUG |
37 | DebugMsg( DEBUG_MEDIUM | DEBUG_IGNORED | DEBUG_UNKNOWN, "G_RESERVED0: w0=0x%08lX w1=0x%08lX\n", w0, w1 ); |
38 | #endif |
39 | } |
40 | |
41 | void F3D_MoveMem( u32 w0, u32 w1 ) |
42 | { |
43 | #ifdef __TRIBUFFER_OPT |
44 | gSPFlushTriangles(); |
45 | #endif |
46 | switch (_SHIFTR( w0, 16, 8 )) |
47 | { |
48 | case F3D_MV_VIEWPORT://G_MV_VIEWPORT: |
49 | gSPViewport( w1 ); |
50 | break; |
51 | case G_MV_MATRIX_1: |
52 | gSPForceMatrix( w1 ); |
53 | // force matrix takes four commands |
54 | RSP.PC[RSP.PCi] += 24; |
55 | break; |
56 | case G_MV_L0: |
57 | gSPLight( w1, LIGHT_1 ); |
58 | break; |
59 | case G_MV_L1: |
60 | gSPLight( w1, LIGHT_2 ); |
61 | break; |
62 | case G_MV_L2: |
63 | gSPLight( w1, LIGHT_3 ); |
64 | break; |
65 | case G_MV_L3: |
66 | gSPLight( w1, LIGHT_4 ); |
67 | break; |
68 | case G_MV_L4: |
69 | gSPLight( w1, LIGHT_5 ); |
70 | break; |
71 | case G_MV_L5: |
72 | gSPLight( w1, LIGHT_6 ); |
73 | break; |
74 | case G_MV_L6: |
75 | gSPLight( w1, LIGHT_7 ); |
76 | break; |
77 | case G_MV_L7: |
78 | gSPLight( w1, LIGHT_8 ); |
79 | break; |
80 | case G_MV_LOOKATX: |
81 | break; |
82 | case G_MV_LOOKATY: |
83 | break; |
84 | } |
85 | } |
86 | |
87 | void F3D_Vtx( u32 w0, u32 w1 ) |
88 | { |
89 | gSPVertex( w1, _SHIFTR( w0, 20, 4 ) + 1, _SHIFTR( w0, 16, 4 ) ); |
90 | } |
91 | |
92 | void F3D_Reserved1( u32 w0, u32 w1 ) |
93 | { |
94 | } |
95 | |
96 | void F3D_DList( u32 w0, u32 w1 ) |
97 | { |
98 | switch (_SHIFTR( w0, 16, 8 )) |
99 | { |
100 | case G_DL_PUSH: |
101 | gSPDisplayList( w1 ); |
102 | break; |
103 | case G_DL_NOPUSH: |
104 | gSPBranchList( w1 ); |
105 | break; |
106 | } |
107 | |
108 | #ifdef __TRIBUFFER_OPT |
109 | //since PCi can be changed in gSPDisplayList |
110 | gSPFlushTriangles(); |
111 | #endif |
112 | } |
113 | |
114 | void F3D_Reserved2( u32 w0, u32 w1 ) |
115 | { |
116 | } |
117 | |
118 | void F3D_Reserved3( u32 w0, u32 w1 ) |
119 | { |
120 | } |
121 | |
122 | void F3D_Sprite2D_Base( u32 w0, u32 w1 ) |
123 | { |
124 | //gSPSprite2DBase( w1 ); |
125 | RSP.PC[RSP.PCi] += 8; |
126 | } |
127 | |
128 | |
129 | void F3D_Tri1( u32 w0, u32 w1 ) |
130 | { |
131 | gSP1Triangle( _SHIFTR( w1, 16, 8 ) / 10, _SHIFTR( w1, 8, 8 ) / 10, _SHIFTR( w1, 0, 8 ) / 10); |
132 | } |
133 | |
134 | void F3D_CullDL( u32 w0, u32 w1 ) |
135 | { |
136 | gSPCullDisplayList( _SHIFTR( w0, 0, 24 ) / 40, (w1 / 40) - 1 ); |
137 | } |
138 | |
139 | void F3D_PopMtx( u32 w0, u32 w1 ) |
140 | { |
141 | gSPPopMatrix( w1 ); |
142 | } |
143 | |
144 | void F3D_MoveWord( u32 w0, u32 w1 ) |
145 | { |
146 | switch (_SHIFTR( w0, 0, 8 )) |
147 | { |
148 | case G_MW_MATRIX: |
149 | gSPInsertMatrix( _SHIFTR( w0, 8, 16 ), w1 ); |
150 | break; |
151 | |
152 | case G_MW_NUMLIGHT: |
153 | gSPNumLights( ((w1 - 0x80000000) >> 5) - 1 ); |
154 | break; |
155 | |
156 | case G_MW_CLIP: |
157 | gSPClipRatio( w1 ); |
158 | break; |
159 | |
160 | case G_MW_SEGMENT: |
161 | gSPSegment( _SHIFTR( w0, 8, 16 ) >> 2, w1 & 0x00FFFFFF ); |
162 | break; |
163 | |
164 | case G_MW_FOG: |
165 | gSPFogFactor( (s16)_SHIFTR( w1, 16, 16 ), (s16)_SHIFTR( w1, 0, 16 ) ); |
166 | break; |
167 | |
168 | case G_MW_LIGHTCOL: |
169 | switch (_SHIFTR( w0, 8, 16 )) |
170 | { |
171 | case F3D_MWO_aLIGHT_1: |
172 | gSPLightColor( LIGHT_1, w1 ); |
173 | break; |
174 | case F3D_MWO_aLIGHT_2: |
175 | gSPLightColor( LIGHT_2, w1 ); |
176 | break; |
177 | case F3D_MWO_aLIGHT_3: |
178 | gSPLightColor( LIGHT_3, w1 ); |
179 | break; |
180 | case F3D_MWO_aLIGHT_4: |
181 | gSPLightColor( LIGHT_4, w1 ); |
182 | break; |
183 | case F3D_MWO_aLIGHT_5: |
184 | gSPLightColor( LIGHT_5, w1 ); |
185 | break; |
186 | case F3D_MWO_aLIGHT_6: |
187 | gSPLightColor( LIGHT_6, w1 ); |
188 | break; |
189 | case F3D_MWO_aLIGHT_7: |
190 | gSPLightColor( LIGHT_7, w1 ); |
191 | break; |
192 | case F3D_MWO_aLIGHT_8: |
193 | gSPLightColor( LIGHT_8, w1 ); |
194 | break; |
195 | } |
196 | break; |
197 | case G_MW_POINTS: |
198 | gSPModifyVertex( _SHIFTR( w0, 8, 16 ) / 40, _SHIFTR( w0, 0, 8 ) % 40, w1 ); |
199 | break; |
200 | case G_MW_PERSPNORM: |
201 | gSPPerspNormalize( w1 ); |
202 | break; |
203 | } |
204 | } |
205 | |
206 | void F3D_Texture( u32 w0, u32 w1 ) |
207 | { |
208 | gSPTexture( _FIXED2FLOAT( _SHIFTR( w1, 16, 16 ), 16 ), |
209 | _FIXED2FLOAT( _SHIFTR( w1, 0, 16 ), 16 ), |
210 | _SHIFTR( w0, 11, 3 ), |
211 | _SHIFTR( w0, 8, 3 ), |
212 | _SHIFTR( w0, 0, 8 ) ); |
213 | } |
214 | |
215 | void F3D_SetOtherMode_H( u32 w0, u32 w1 ) |
216 | { |
217 | switch (_SHIFTR( w0, 8, 8 )) |
218 | { |
219 | case G_MDSFT_PIPELINE: |
220 | gDPPipelineMode( w1 >> G_MDSFT_PIPELINE ); |
221 | break; |
222 | case G_MDSFT_CYCLETYPE: |
223 | gDPSetCycleType( w1 >> G_MDSFT_CYCLETYPE ); |
224 | break; |
225 | case G_MDSFT_TEXTPERSP: |
226 | gDPSetTexturePersp( w1 >> G_MDSFT_TEXTPERSP ); |
227 | break; |
228 | case G_MDSFT_TEXTDETAIL: |
229 | gDPSetTextureDetail( w1 >> G_MDSFT_TEXTDETAIL ); |
230 | break; |
231 | case G_MDSFT_TEXTLOD: |
232 | gDPSetTextureLOD( w1 >> G_MDSFT_TEXTLOD ); |
233 | break; |
234 | case G_MDSFT_TEXTLUT: |
235 | gDPSetTextureLUT( w1 >> G_MDSFT_TEXTLUT ); |
236 | break; |
237 | case G_MDSFT_TEXTFILT: |
238 | gDPSetTextureFilter( w1 >> G_MDSFT_TEXTFILT ); |
239 | break; |
240 | case G_MDSFT_TEXTCONV: |
241 | gDPSetTextureConvert( w1 >> G_MDSFT_TEXTCONV ); |
242 | break; |
243 | case G_MDSFT_COMBKEY: |
244 | gDPSetCombineKey( w1 >> G_MDSFT_COMBKEY ); |
245 | break; |
246 | case G_MDSFT_RGBDITHER: |
247 | gDPSetColorDither( w1 >> G_MDSFT_RGBDITHER ); |
248 | break; |
249 | case G_MDSFT_ALPHADITHER: |
250 | gDPSetAlphaDither( w1 >> G_MDSFT_ALPHADITHER ); |
251 | break; |
252 | default: |
253 | u32 shift = _SHIFTR( w0, 8, 8 ); |
254 | u32 length = _SHIFTR( w0, 0, 8 ); |
255 | u32 mask = ((1 << length) - 1) << shift; |
256 | |
257 | gDP.otherMode.h &= ~mask; |
258 | gDP.otherMode.h |= w1 & mask; |
259 | |
260 | gDP.changed |= CHANGED_CYCLETYPE; |
261 | break; |
262 | } |
263 | } |
264 | |
265 | void F3D_SetOtherMode_L( u32 w0, u32 w1 ) |
266 | { |
267 | switch (_SHIFTR( w0, 8, 8 )) |
268 | { |
269 | case G_MDSFT_ALPHACOMPARE: |
270 | gDPSetAlphaCompare( w1 >> G_MDSFT_ALPHACOMPARE ); |
271 | break; |
272 | case G_MDSFT_ZSRCSEL: |
273 | gDPSetDepthSource( w1 >> G_MDSFT_ZSRCSEL ); |
274 | break; |
275 | case G_MDSFT_RENDERMODE: |
276 | gDPSetRenderMode( w1 & 0xCCCCFFFF, w1 & 0x3333FFFF ); |
277 | break; |
278 | default: |
279 | u32 shift = _SHIFTR( w0, 8, 8 ); |
280 | u32 length = _SHIFTR( w0, 0, 8 ); |
281 | u32 mask = ((1 << length) - 1) << shift; |
282 | |
283 | gDP.otherMode.l &= ~mask; |
284 | gDP.otherMode.l |= w1 & mask; |
285 | |
286 | gDP.changed |= CHANGED_RENDERMODE | CHANGED_ALPHACOMPARE; |
287 | break; |
288 | } |
289 | } |
290 | |
291 | void F3D_EndDL( u32 w0, u32 w1 ) |
292 | { |
293 | gSPEndDisplayList(); |
294 | } |
295 | |
296 | void F3D_SetGeometryMode( u32 w0, u32 w1 ) |
297 | { |
298 | gSPSetGeometryMode( w1 ); |
299 | } |
300 | |
301 | void F3D_ClearGeometryMode( u32 w0, u32 w1 ) |
302 | { |
303 | gSPClearGeometryMode( w1 ); |
304 | } |
305 | |
306 | void F3D_Line3D( u32 w0, u32 w1 ) |
307 | { |
308 | // Hmmm... |
309 | } |
310 | |
311 | void F3D_Quad( u32 w0, u32 w1 ) |
312 | { |
313 | gSP1Quadrangle( _SHIFTR( w1, 24, 8 ) / 10, _SHIFTR( w1, 16, 8 ) / 10, _SHIFTR( w1, 8, 8 ) / 10, _SHIFTR( w1, 0, 8 ) / 10 ); |
314 | } |
315 | |
316 | void F3D_RDPHalf_1( u32 w0, u32 w1 ) |
317 | { |
318 | gDP.half_1 = w1; |
319 | } |
320 | |
321 | void F3D_RDPHalf_2( u32 w0, u32 w1 ) |
322 | { |
323 | gDP.half_2 = w1; |
324 | } |
325 | |
326 | void F3D_RDPHalf_Cont( u32 w0, u32 w1 ) |
327 | { |
328 | } |
329 | |
330 | void F3D_Tri4( u32 w0, u32 w1 ) |
331 | { |
332 | gSP4Triangles( _SHIFTR( w0, 0, 4 ), _SHIFTR( w1, 0, 4 ), _SHIFTR( w1, 4, 4 ), |
333 | _SHIFTR( w0, 4, 4 ), _SHIFTR( w1, 8, 4 ), _SHIFTR( w1, 12, 4 ), |
334 | _SHIFTR( w0, 8, 4 ), _SHIFTR( w1, 16, 4 ), _SHIFTR( w1, 20, 4 ), |
335 | _SHIFTR( w0, 12, 4 ), _SHIFTR( w1, 24, 4 ), _SHIFTR( w1, 28, 4 ) ); |
336 | } |
337 | |
338 | void F3D_Init() |
339 | { |
340 | // Set GeometryMode flags |
341 | GBI_InitFlags( F3D ); |
342 | |
343 | GBI.PCStackSize = 10; |
344 | |
345 | // GBI Command Command Value Command Function |
346 | GBI_SetGBI( G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp ); |
347 | GBI_SetGBI( G_MTX, F3D_MTX, F3D_Mtx ); |
348 | GBI_SetGBI( G_RESERVED0, F3D_RESERVED0, F3D_Reserved0 ); |
349 | GBI_SetGBI( G_MOVEMEM, F3D_MOVEMEM, F3D_MoveMem ); |
350 | GBI_SetGBI( G_VTX, F3D_VTX, F3D_Vtx ); |
351 | GBI_SetGBI( G_RESERVED1, F3D_RESERVED1, F3D_Reserved1 ); |
352 | GBI_SetGBI( G_DL, F3D_DL, F3D_DList ); |
353 | GBI_SetGBI( G_RESERVED2, F3D_RESERVED2, F3D_Reserved2 ); |
354 | GBI_SetGBI( G_RESERVED3, F3D_RESERVED3, F3D_Reserved3 ); |
355 | GBI_SetGBI( G_SPRITE2D_BASE, F3D_SPRITE2D_BASE, F3D_Sprite2D_Base ); |
356 | |
357 | GBI_SetGBI( G_TRI1, F3D_TRI1, F3D_Tri1 ); |
358 | GBI_SetGBI( G_CULLDL, F3D_CULLDL, F3D_CullDL ); |
359 | GBI_SetGBI( G_POPMTX, F3D_POPMTX, F3D_PopMtx ); |
360 | GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, F3D_MoveWord ); |
361 | GBI_SetGBI( G_TEXTURE, F3D_TEXTURE, F3D_Texture ); |
362 | GBI_SetGBI( G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, F3D_SetOtherMode_H ); |
363 | GBI_SetGBI( G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, F3D_SetOtherMode_L ); |
364 | GBI_SetGBI( G_ENDDL, F3D_ENDDL, F3D_EndDL ); |
365 | GBI_SetGBI( G_SETGEOMETRYMODE, F3D_SETGEOMETRYMODE, F3D_SetGeometryMode ); |
366 | GBI_SetGBI( G_CLEARGEOMETRYMODE, F3D_CLEARGEOMETRYMODE, F3D_ClearGeometryMode ); |
367 | GBI_SetGBI( G_QUAD, F3D_QUAD, F3D_Quad ); |
368 | GBI_SetGBI( G_RDPHALF_1, F3D_RDPHALF_1, F3D_RDPHalf_1 ); |
369 | GBI_SetGBI( G_RDPHALF_2, F3D_RDPHALF_2, F3D_RDPHalf_2 ); |
370 | GBI_SetGBI( G_RDPHALF_CONT, F3D_RDPHALF_CONT, F3D_RDPHalf_Cont ); |
371 | GBI_SetGBI( G_TRI4, F3D_TRI4, F3D_Tri4 ); |
372 | |
373 | } |
374 | |