GLES2N64: Enabled Framebuffer (and lowres) rendering
[mupen64plus-pandora.git] / source / gles2n64 / src / RDP.cpp
CommitLineData
34cf4058 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
10void RDP_Unknown( u32 w0, u32 w1 )
11{
12}
13
14void RDP_NoOp( u32 w0, u32 w1 )
15{
16 gSPNoOp();
17}
18
19void 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
27void RDP_SetZImg( u32 w0, u32 w1 )
28{
29 gDPSetDepthImage( w1 ); // img
30}
31
32void 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
40void RDP_SetCombine( u32 w0, u32 w1 )
41{
42 gDPSetCombine( _SHIFTR( w0, 0, 24 ), // muxs0
43 w1 ); // muxs1
44}
45
46void 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
54void 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
65void 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
73void 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
81void RDP_SetFillColor( u32 w0, u32 w1 )
82{
83 gDPSetFillColor( w1 );
84}
85
86void 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
94void 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
111void 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
120void 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
129void 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
138void 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
147void RDP_SetOtherMode( u32 w0, u32 w1 )
148{
149 gDPSetOtherMode( _SHIFTR( w0, 0, 24 ), // mode0
150 w1 ); // mode1
151}
152
153void RDP_SetPrimDepth( u32 w0, u32 w1 )
154{
155 gDPSetPrimDepth( _SHIFTR( w1, 16, 16 ), // z
156 _SHIFTR( w1, 0, 16 ) ); // dz
157}
158
159void 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
168void 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
178void 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
185void 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
195void RDP_FullSync( u32 w0, u32 w1 )
196{
197 gDPFullSync();
198}
199
200void RDP_TileSync( u32 w0, u32 w1 )
201{
202// gDPTileSync();
203}
204
205void RDP_PipeSync( u32 w0, u32 w1 )
206{
207// gDPPipeSync();
208}
209
210void RDP_LoadSync( u32 w0, u32 w1 )
211{
212// gDPLoadSync();
213}
214
215void 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
234void 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:
255void RDP_TriFill(u32 w0, u32 w1)
256{
257 LOG(LOG_VERBOSE, "RSP_TRI_FILL Command\n");
258}
259
260void RDP_TriFillZBuff(u32 w0, u32 w1)
261{
262 LOG(LOG_VERBOSE, "RSP_TRI_FILL_ZBUFF Command\n");
263}
264
265void RDP_TriTxtr(u32 w0, u32 w1)
266{
267 LOG(LOG_VERBOSE, "RSP_TRI_TXTR Command\n");
268}
269
270void RDP_TriTxtrZBuff(u32 w0, u32 w1)
271{
272 LOG(LOG_VERBOSE, "RSP_TRI_TXTR_ZBUFF Command\n");
273}
274
275void RDP_TriShade(u32 w0, u32 w1)
276{
277 LOG(LOG_VERBOSE, "RSP_TRI_SHADE Command\n");
278}
279
280void RDP_TriShadeZBuff(u32 w0, u32 w1)
281{
282 LOG(LOG_VERBOSE, "RSP_TRI_SHADE_ZBUFF Command\n");
283}
284
285void RDP_TriShadeTxtr(u32 w0, u32 w1)
286{
287 LOG(LOG_VERBOSE, "RSP_TRI_SHADE_TXTR Command\n");
288}
289
290void RDP_TriShadeTxtrZBuff(u32 w0, u32 w1)
291{
292 LOG(LOG_VERBOSE, "RSP_TRI_SHADE_TXTR_ZBUFF Command\n");
293}
294
295void 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