GLES2N64 (from mupen64plus-ae) plugin. Compile and run on the OpenPandora
[mupen64plus-pandora.git] / source / gles2n64 / src / RDP.cpp
1 #include "N64.h"
2 #include "RSP.h"
3 #include "GBI.h"
4 #include "gDP.h"
5 #include "Types.h"
6 #include "Debug.h"
7 #include "Common.h"
8 #include "gSP.h"
9
10 void RDP_Unknown( u32 w0, u32 w1 )
11 {
12 }
13
14 void RDP_NoOp( u32 w0, u32 w1 )
15 {
16     gSPNoOp();
17 }
18
19 void RDP_SetCImg( u32 w0, u32 w1 )
20 {
21     gDPSetColorImage( _SHIFTR( w0, 21,  3 ),        // fmt
22                       _SHIFTR( w0, 19,  2 ),        // siz
23                       _SHIFTR( w0,  0, 12 ) + 1,    // width
24                       w1 );                         // img
25 }
26
27 void RDP_SetZImg( u32 w0, u32 w1 )
28 {
29     gDPSetDepthImage( w1 ); // img
30 }
31
32 void RDP_SetTImg( u32 w0, u32 w1 )
33 {
34     gDPSetTextureImage( _SHIFTR( w0, 21,  3),       // fmt
35                         _SHIFTR( w0, 19,  2 ),      // siz
36                         _SHIFTR( w0,  0, 12 ) + 1,  // width
37                         w1 );                       // img
38 }
39
40 void RDP_SetCombine( u32 w0, u32 w1 )
41 {
42     gDPSetCombine( _SHIFTR( w0, 0, 24 ),    // muxs0
43                    w1 );                    // muxs1
44 }
45
46 void RDP_SetEnvColor( u32 w0, u32 w1 )
47 {
48     gDPSetEnvColor( _SHIFTR( w1, 24, 8 ),       // r
49                     _SHIFTR( w1, 16, 8 ),       // g
50                     _SHIFTR( w1,  8, 8 ),       // b
51                     _SHIFTR( w1,  0, 8 ) );     // a
52 }
53
54 void RDP_SetPrimColor( u32 w0, u32 w1 )
55 {
56     gDPSetPrimColor( _SHIFTL( w0,  8, 8 ),      // m
57                      _SHIFTL( w0,  0, 8 ),      // l
58                      _SHIFTR( w1, 24, 8 ),      // r
59                      _SHIFTR( w1, 16, 8 ),      // g
60                      _SHIFTR( w1,  8, 8 ),      // b
61                      _SHIFTR( w1,  0, 8 ) );    // a
62
63 }
64
65 void RDP_SetBlendColor( u32 w0, u32 w1 )
66 {
67     gDPSetBlendColor( _SHIFTR( w1, 24, 8 ),     // r
68                       _SHIFTR( w1, 16, 8 ),     // g
69                       _SHIFTR( w1,  8, 8 ),     // b
70                       _SHIFTR( w1,  0, 8 ) );   // a
71 }
72
73 void RDP_SetFogColor( u32 w0, u32 w1 )
74 {
75     gDPSetFogColor( _SHIFTR( w1, 24, 8 ),       // r
76                     _SHIFTR( w1, 16, 8 ),       // g
77                     _SHIFTR( w1,  8, 8 ),       // b
78                     _SHIFTR( w1,  0, 8 ) );     // a
79 }
80
81 void RDP_SetFillColor( u32 w0, u32 w1 )
82 {
83     gDPSetFillColor( w1 );
84 }
85
86 void RDP_FillRect( u32 w0, u32 w1 )
87 {
88     gDPFillRectangle( _SHIFTR( w1, 14, 10 ),    // ulx
89                       _SHIFTR( w1,  2, 10 ),    // uly
90                       _SHIFTR( w0, 14, 10 ),    // lrx
91                       _SHIFTR( w0,  2, 10 ) );  // lry
92 }
93
94 void RDP_SetTile( u32 w0, u32 w1 )
95 {
96
97     gDPSetTile( _SHIFTR( w0, 21, 3 ),   // fmt
98                 _SHIFTR( w0, 19, 2 ),   // siz
99                 _SHIFTR( w0,  9, 9 ),   // line
100                 _SHIFTR( w0,  0, 9 ),   // tmem
101                 _SHIFTR( w1, 24, 3 ),   // tile
102                 _SHIFTR( w1, 20, 4 ),   // palette
103                 _SHIFTR( w1, 18, 2 ),   // cmt
104                 _SHIFTR( w1,  8, 2 ),   // cms
105                 _SHIFTR( w1, 14, 4 ),   // maskt
106                 _SHIFTR( w1,  4, 4 ),   // masks
107                 _SHIFTR( w1, 10, 4 ),   // shiftt
108                 _SHIFTR( w1,  0, 4 ) ); // shifts
109 }
110
111 void RDP_LoadTile( u32 w0, u32 w1 )
112 {
113     gDPLoadTile( _SHIFTR( w1, 24,  3 ),     // tile
114                  _SHIFTR( w0, 12, 12 ),     // uls
115                  _SHIFTR( w0,  0, 12 ),     // ult
116                  _SHIFTR( w1, 12, 12 ),     // lrs
117                  _SHIFTR( w1,  0, 12 ) );   // lrt
118 }
119
120 void RDP_LoadBlock( u32 w0, u32 w1 )
121 {
122     gDPLoadBlock( _SHIFTR( w1, 24,  3 ),    // tile
123                   _SHIFTR( w0, 12, 12 ),    // uls
124                   _SHIFTR( w0,  0, 12 ),    // ult
125                   _SHIFTR( w1, 12, 12 ),    // lrs
126                   _SHIFTR( w1,  0, 12 ) );  // dxt
127 }
128
129 void RDP_SetTileSize( u32 w0, u32 w1 )
130 {
131     gDPSetTileSize( _SHIFTR( w1, 24,  3 ),      // tile
132                     _SHIFTR( w0, 12, 12 ),      // uls
133                     _SHIFTR( w0,  0, 12 ),      // ult
134                     _SHIFTR( w1, 12, 12 ),      // lrs
135                     _SHIFTR( w1,  0, 12 ) );    // lrt
136 }
137
138 void RDP_LoadTLUT( u32 w0, u32 w1 )
139 {
140     gDPLoadTLUT( _SHIFTR( w1, 24,  3 ), // tile
141                   _SHIFTR( w0, 12, 12 ),    // uls
142                   _SHIFTR( w0,  0, 12 ),    // ult
143                   _SHIFTR( w1, 12, 12 ),    // lrs
144                   _SHIFTR( w1,  0, 12 ) );  // lrt
145 }
146
147 void RDP_SetOtherMode( u32 w0, u32 w1 )
148 {
149     gDPSetOtherMode( _SHIFTR( w0, 0, 24 ),  // mode0
150                      w1 );                  // mode1
151 }
152
153 void RDP_SetPrimDepth( u32 w0, u32 w1 )
154 {
155     gDPSetPrimDepth( _SHIFTR( w1, 16, 16 ),     // z
156                      _SHIFTR( w1,  0, 16 ) );   // dz
157 }
158
159 void RDP_SetScissor( u32 w0, u32 w1 )
160 {
161     gDPSetScissor( _SHIFTR( w1, 24, 2 ),                        // mode
162                    _FIXED2FLOAT( _SHIFTR( w0, 12, 12 ), 2 ),    // ulx
163                    _FIXED2FLOAT( _SHIFTR( w0,  0, 12 ), 2 ),    // uly
164                    _FIXED2FLOAT( _SHIFTR( w1, 12, 12 ), 2 ),    // lrx
165                    _FIXED2FLOAT( _SHIFTR( w1,  0, 12 ), 2 ) );  // lry
166 }
167
168 void RDP_SetConvert( u32 w0, u32 w1 )
169 {
170     gDPSetConvert( _SHIFTR( w0, 13, 9 ),    // k0
171                    _SHIFTR( w0,  4, 9 ),    // k1
172                    _SHIFTL( w0,  5, 4 ) | _SHIFTR( w1, 25, 5 ), // k2
173                    _SHIFTR( w1, 18, 9 ),    // k3
174                    _SHIFTR( w1,  9, 9 ),    // k4
175                    _SHIFTR( w1,  0, 9 ) );  // k5
176 }
177
178 void RDP_SetKeyR( u32 w0, u32 w1 )
179 {
180     gDPSetKeyR( _SHIFTR( w1,  8,  8 ),      // cR
181                 _SHIFTR( w1,  0,  8 ),      // sR
182                 _SHIFTR( w1, 16, 12 ) );    // wR
183 }
184
185 void RDP_SetKeyGB( u32 w0, u32 w1 )
186 {
187     gDPSetKeyGB( _SHIFTR( w1, 24,  8 ),     // cG
188                  _SHIFTR( w1, 16,  8 ),     // sG
189                  _SHIFTR( w0, 12, 12 ),     // wG
190                  _SHIFTR( w1,  8,  8 ),     // cB
191                  _SHIFTR( w1,  0,  8 ),     // SB
192                  _SHIFTR( w0,  0, 12 ) );   // wB
193 }
194
195 void RDP_FullSync( u32 w0, u32 w1 )
196 {
197     gDPFullSync();
198 }
199
200 void RDP_TileSync( u32 w0, u32 w1 )
201 {
202 //    gDPTileSync();
203 }
204
205 void RDP_PipeSync( u32 w0, u32 w1 )
206 {
207 //    gDPPipeSync();
208 }
209
210 void RDP_LoadSync( u32 w0, u32 w1 )
211 {
212 //    gDPLoadSync();
213 }
214
215 void RDP_TexRectFlip( u32 w0, u32 w1 )
216 {
217     u32 w2 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
218     RSP.PC[RSP.PCi] += 8;
219
220     u32 w3 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
221     RSP.PC[RSP.PCi] += 8;
222
223     gDPTextureRectangleFlip( _FIXED2FLOAT( _SHIFTR( w1, 12, 12 ), 2 ),          // ulx
224                              _FIXED2FLOAT( _SHIFTR( w1,  0, 12 ), 2 ),          // uly
225                              _FIXED2FLOAT( _SHIFTR( w0, 12, 12 ), 2 ),          // lrx
226                              _FIXED2FLOAT( _SHIFTR( w0,  0, 12 ), 2 ),          // lry
227                              _SHIFTR( w1, 24,  3 ),                             // tile
228                              _FIXED2FLOAT( (s16)_SHIFTR( w2, 16, 16 ), 5 ),     // s
229                              _FIXED2FLOAT( (s16)_SHIFTR( w2,  0, 16 ), 5 ),     // t
230                              _FIXED2FLOAT( (s16)_SHIFTR( w3, 16, 16 ), 10 ),    // dsdx
231                              _FIXED2FLOAT( (s16)_SHIFTR( w3,  0, 16 ), 10 ) );  // dsdy
232 }
233
234 void RDP_TexRect( u32 w0, u32 w1 )
235 {
236     u32 w2 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
237     RSP.PC[RSP.PCi] += 8;
238
239     u32 w3 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
240     RSP.PC[RSP.PCi] += 8;
241
242     gDPTextureRectangle( _FIXED2FLOAT( _SHIFTR( w1, 12, 12 ), 2 ),          // ulx
243                          _FIXED2FLOAT( _SHIFTR( w1,  0, 12 ), 2 ),          // uly
244                          _FIXED2FLOAT( _SHIFTR( w0, 12, 12 ), 2 ),          // lrx
245                          _FIXED2FLOAT( _SHIFTR( w0,  0, 12 ), 2 ),          // lry
246                          _SHIFTR( w1, 24,  3 ),                             // tile
247                          _FIXED2FLOAT( (s16)_SHIFTR( w2, 16, 16 ), 5 ),     // s
248                          _FIXED2FLOAT( (s16)_SHIFTR( w2,  0, 16 ), 5 ),     // t
249                          _FIXED2FLOAT( (s16)_SHIFTR( w3, 16, 16 ), 10 ),    // dsdx
250                          _FIXED2FLOAT( (s16)_SHIFTR( w3,  0, 16 ), 10 ) );  // dsdy
251 }
252
253
254 //Low Level RDP Drawing Commands:
255 void RDP_TriFill(u32 w0, u32 w1)
256 {
257     LOG(LOG_VERBOSE, "RSP_TRI_FILL Command\n");
258 }
259
260 void RDP_TriFillZBuff(u32 w0, u32 w1)
261 {
262     LOG(LOG_VERBOSE, "RSP_TRI_FILL_ZBUFF Command\n");
263 }
264
265 void RDP_TriTxtr(u32 w0, u32 w1)
266 {
267     LOG(LOG_VERBOSE, "RSP_TRI_TXTR Command\n");
268 }
269
270 void RDP_TriTxtrZBuff(u32 w0, u32 w1)
271 {
272     LOG(LOG_VERBOSE, "RSP_TRI_TXTR_ZBUFF Command\n");
273 }
274
275 void RDP_TriShade(u32 w0, u32 w1)
276 {
277     LOG(LOG_VERBOSE, "RSP_TRI_SHADE Command\n");
278 }
279
280 void RDP_TriShadeZBuff(u32 w0, u32 w1)
281 {
282     LOG(LOG_VERBOSE, "RSP_TRI_SHADE_ZBUFF Command\n");
283 }
284
285 void RDP_TriShadeTxtr(u32 w0, u32 w1)
286 {
287     LOG(LOG_VERBOSE, "RSP_TRI_SHADE_TXTR Command\n");
288 }
289
290 void RDP_TriShadeTxtrZBuff(u32 w0, u32 w1)
291 {
292     LOG(LOG_VERBOSE, "RSP_TRI_SHADE_TXTR_ZBUFF Command\n");
293 }
294
295 void RDP_Init()
296 {
297     // Initialize RDP commands to RDP_UNKNOWN
298     for (int i = 0xC8; i <= 0xCF; i++)
299         GBI.cmd[i] = RDP_Unknown;
300
301     // Initialize RDP commands to RDP_UNKNOWN
302     for (int i = 0xE4; i <= 0xFF; i++)
303         GBI.cmd[i] = RDP_Unknown;
304
305     // Set known GBI commands
306     GBI.cmd[G_NOOP]             = RDP_NoOp;
307     GBI.cmd[G_SETCIMG]          = RDP_SetCImg;
308     GBI.cmd[G_SETZIMG]          = RDP_SetZImg;
309     GBI.cmd[G_SETTIMG]          = RDP_SetTImg;
310     GBI.cmd[G_SETCOMBINE]       = RDP_SetCombine;
311     GBI.cmd[G_SETENVCOLOR]      = RDP_SetEnvColor;
312     GBI.cmd[G_SETPRIMCOLOR]     = RDP_SetPrimColor;
313     GBI.cmd[G_SETBLENDCOLOR]    = RDP_SetBlendColor;
314     GBI.cmd[G_SETFOGCOLOR]      = RDP_SetFogColor;
315     GBI.cmd[G_SETFILLCOLOR]     = RDP_SetFillColor;
316     GBI.cmd[G_FILLRECT]         = RDP_FillRect;
317     GBI.cmd[G_SETTILE]          = RDP_SetTile;
318     GBI.cmd[G_LOADTILE]         = RDP_LoadTile;
319     GBI.cmd[G_LOADBLOCK]        = RDP_LoadBlock;
320     GBI.cmd[G_SETTILESIZE]      = RDP_SetTileSize;
321     GBI.cmd[G_LOADTLUT]         = RDP_LoadTLUT;
322     GBI.cmd[G_RDPSETOTHERMODE]  = RDP_SetOtherMode;
323     GBI.cmd[G_SETPRIMDEPTH]     = RDP_SetPrimDepth;
324     GBI.cmd[G_SETSCISSOR]       = RDP_SetScissor;
325     GBI.cmd[G_SETCONVERT]       = RDP_SetConvert;
326     GBI.cmd[G_SETKEYR]          = RDP_SetKeyR;
327     GBI.cmd[G_SETKEYGB]         = RDP_SetKeyGB;
328     GBI.cmd[G_RDPFULLSYNC]      = RDP_FullSync;
329     GBI.cmd[G_RDPTILESYNC]      = RDP_TileSync;
330     GBI.cmd[G_RDPPIPESYNC]      = RDP_PipeSync;
331     GBI.cmd[G_RDPLOADSYNC]      = RDP_LoadSync;
332     GBI.cmd[G_TEXRECTFLIP]      = RDP_TexRectFlip;
333     GBI.cmd[G_TEXRECT]          = RDP_TexRect;
334
335     GBI.cmd[G_RDPNOOP]          = RDP_NoOp;
336
337     //Low Level RDP Drawing Commands:
338     GBI.cmd[G_TRI_FILL]             = RDP_TriFill;
339     GBI.cmd[G_TRI_FILL_ZBUFF]       = RDP_TriFillZBuff;
340     GBI.cmd[G_TRI_TXTR]             = RDP_TriTxtr;
341     GBI.cmd[G_TRI_TXTR_ZBUFF]       = RDP_TriTxtrZBuff;
342     GBI.cmd[G_TRI_SHADE]            = RDP_TriShade;
343     GBI.cmd[G_TRI_SHADE_TXTR]       = RDP_TriShadeTxtr;
344     GBI.cmd[G_TRI_SHADE_TXTR_ZBUFF] = RDP_TriShadeTxtrZBuff;
345
346 }
347