GLES2N64: Enabled Framebuffer (and lowres) rendering
[mupen64plus-pandora.git] / source / gles2n64 / src / F3DEX2.cpp
CommitLineData
34cf4058 1#include "gles2N64.h"
2#include "Debug.h"
3#include "F3D.h"
4#include "F3DEX.h"
5#include "F3DEX2.h"
6#include "N64.h"
7#include "RSP.h"
8#include "RDP.h"
9#include "gSP.h"
10#include "gDP.h"
11#include "GBI.h"
12#include "OpenGL.h"
13
14#include "Config.h"
15
16void F3DEX2_Mtx( u32 w0, u32 w1 )
17{
18 gSPMatrix( w1, _SHIFTR( w0, 0, 8 ) ^ G_MTX_PUSH );
19}
20
21void F3DEX2_MoveMem( u32 w0, u32 w1 )
22{
23#ifdef __TRIBUFFER_OPT
24 gSPFlushTriangles();
25#endif
26 switch (_SHIFTR( w0, 0, 8 ))
27 {
28 case F3DEX2_MV_VIEWPORT:
29 gSPViewport( w1 );
30 break;
31
32 case G_MV_MATRIX:
33 gSPForceMatrix( w1 );
34 RSP.PC[RSP.PCi] += 8; // force matrix takes two commands
35 break;
36
37 case G_MV_LIGHT:
38 u32 offset = _SHIFTR( w0, 8, 8 ) << 3;
39 if (offset >= 48)
40 {
41 gSPLight( w1, (offset - 24) / 24);
42 }
43 break;
44 }
45}
46
47void F3DEX2_Vtx( u32 w0, u32 w1 )
48{
49 u32 n = _SHIFTR( w0, 12, 8 );
50
51 gSPVertex( w1, n, _SHIFTR( w0, 1, 7 ) - n );
52}
53
54void F3DEX2_Reserved1( u32 w0, u32 w1 )
55{
56}
57
58void F3DEX2_Tri1( u32 w0, u32 w1 )
59{
60 gSP1Triangle( _SHIFTR( w0, 17, 7 ),
61 _SHIFTR( w0, 9, 7 ),
62 _SHIFTR( w0, 1, 7 ));
63}
64
65void F3DEX2_PopMtx( u32 w0, u32 w1 )
66{
67 gSPPopMatrixN( 0, w1 >> 6 );
68}
69
70void F3DEX2_MoveWord( u32 w0, u32 w1 )
71{
72 switch (_SHIFTR( w0, 16, 8 ))
73 {
74 case G_MW_FORCEMTX:
75 // Handled in movemem
76 break;
77 case G_MW_MATRIX:
78 gSPInsertMatrix( _SHIFTR( w0, 0, 16 ), w1 );
79 break;
80 case G_MW_NUMLIGHT:
81 gSPNumLights( w1 / 24 );
82 break;
83 case G_MW_CLIP:
84 gSPClipRatio( w1 );
85 break;
86 case G_MW_SEGMENT:
87 gSPSegment( _SHIFTR( w0, 0, 16 ) >> 2, w1 & 0x00FFFFFF );
88 break;
89 case G_MW_FOG:
90 gSPFogFactor( (s16)_SHIFTR( w1, 16, 16 ), (s16)_SHIFTR( w1, 0, 16 ) );
91 break;
92 case G_MW_LIGHTCOL:
93 gSPLightColor((_SHIFTR( w0, 0, 16 ) / 24) + 1, w1 );
94 break;
95 case G_MW_PERSPNORM:
96 gSPPerspNormalize( w1 );
97 break;
98 }
99}
100
101void F3DEX2_Texture( u32 w0, u32 w1 )
102{
103 gSPTexture( _FIXED2FLOAT( _SHIFTR( w1, 16, 16 ), 16 ),
104 _FIXED2FLOAT( _SHIFTR( w1, 0, 16 ), 16 ),
105 _SHIFTR( w0, 11, 3 ),
106 _SHIFTR( w0, 8, 3 ),
107 _SHIFTR( w0, 1, 7 ) );
108}
109
110void F3DEX2_SetOtherMode_H( u32 w0, u32 w1 )
111{
112 switch (32 - _SHIFTR( w0, 8, 8 ) - (_SHIFTR( w0, 0, 8 ) + 1))
113 {
114 case G_MDSFT_PIPELINE:
115 gDPPipelineMode( w1 >> G_MDSFT_PIPELINE );
116 break;
117 case G_MDSFT_CYCLETYPE:
118 gDPSetCycleType( w1 >> G_MDSFT_CYCLETYPE );
119 break;
120 case G_MDSFT_TEXTPERSP:
121 gDPSetTexturePersp( w1 >> G_MDSFT_TEXTPERSP );
122 break;
123 case G_MDSFT_TEXTDETAIL:
124 gDPSetTextureDetail( w1 >> G_MDSFT_TEXTDETAIL );
125 break;
126 case G_MDSFT_TEXTLOD:
127 gDPSetTextureLOD( w1 >> G_MDSFT_TEXTLOD );
128 break;
129 case G_MDSFT_TEXTLUT:
130 gDPSetTextureLUT( w1 >> G_MDSFT_TEXTLUT );
131 break;
132 case G_MDSFT_TEXTFILT:
133 gDPSetTextureFilter( w1 >> G_MDSFT_TEXTFILT );
134 break;
135 case G_MDSFT_TEXTCONV:
136 gDPSetTextureConvert( w1 >> G_MDSFT_TEXTCONV );
137 break;
138 case G_MDSFT_COMBKEY:
139 gDPSetCombineKey( w1 >> G_MDSFT_COMBKEY );
140 break;
141 case G_MDSFT_RGBDITHER:
142 gDPSetColorDither( w1 >> G_MDSFT_RGBDITHER );
143 break;
144 case G_MDSFT_ALPHADITHER:
145 gDPSetAlphaDither( w1 >> G_MDSFT_ALPHADITHER );
146 break;
147 default:
148 u32 length = _SHIFTR( w0, 0, 8 ) + 1;
149 u32 shift = 32 - _SHIFTR( w0, 8, 8 ) - length;
150 u32 mask = ((1 << length) - 1) << shift;
151
152 gDP.otherMode.h &= ~mask;
153 gDP.otherMode.h |= w1 & mask;
154
155 gDP.changed |= CHANGED_CYCLETYPE;
156 break;
157 }
158}
159
160void F3DEX2_SetOtherMode_L( u32 w0, u32 w1 )
161{
162 switch (32 - _SHIFTR( w0, 8, 8 ) - (_SHIFTR( w0, 0, 8 ) + 1))
163 {
164 case G_MDSFT_ALPHACOMPARE:
165 gDPSetAlphaCompare( w1 >> G_MDSFT_ALPHACOMPARE );
166 break;
167 case G_MDSFT_ZSRCSEL:
168 gDPSetDepthSource( w1 >> G_MDSFT_ZSRCSEL );
169 break;
170 case G_MDSFT_RENDERMODE:
171 gDPSetRenderMode( w1 & 0xCCCCFFFF, w1 & 0x3333FFFF );
172 break;
173 default:
174 u32 length = _SHIFTR( w0, 0, 8 ) + 1;
175 u32 shift = 32 - _SHIFTR( w0, 8, 8 ) - length;
176 u32 mask = ((1 << length) - 1) << shift;
177
178 gDP.otherMode.l &= ~mask;
179 gDP.otherMode.l |= w1 & mask;
180
181 gDP.changed |= CHANGED_RENDERMODE | CHANGED_ALPHACOMPARE;
182 break;
183 }
184}
185
186void F3DEX2_GeometryMode( u32 w0, u32 w1 )
187{
188 gSPGeometryMode( ~_SHIFTR( w0, 0, 24 ), w1 );
189}
190
191void F3DEX2_DMAIO( u32 w0, u32 w1 )
192{
193}
194
195void F3DEX2_Special_1( u32 w0, u32 w1 )
196{
197}
198
199void F3DEX2_Special_2( u32 w0, u32 w1 )
200{
201}
202
203void F3DEX2_Special_3( u32 w0, u32 w1 )
204{
205}
206
207void F3DEX2_Quad( u32 w0, u32 w1 )
208{
209 gSP2Triangles( _SHIFTR( w0, 17, 7 ),
210 _SHIFTR( w0, 9, 7 ),
211 _SHIFTR( w0, 1, 7 ),
212 0,
213 _SHIFTR( w1, 17, 7 ),
214 _SHIFTR( w1, 9, 7 ),
215 _SHIFTR( w1, 1, 7 ),
216 0 );
217}
218
219void F3DEX2_Init()
220{
221 // Set GeometryMode flags
222 GBI_InitFlags( F3DEX2 );
223
224 GBI.PCStackSize = 18;
225
226 // GBI Command Command Value Command Function
227 GBI_SetGBI( G_RDPHALF_2, F3DEX2_RDPHALF_2, F3D_RDPHalf_2 );
228 GBI_SetGBI( G_SETOTHERMODE_H, F3DEX2_SETOTHERMODE_H, F3DEX2_SetOtherMode_H );
229 GBI_SetGBI( G_SETOTHERMODE_L, F3DEX2_SETOTHERMODE_L, F3DEX2_SetOtherMode_L );
230 GBI_SetGBI( G_RDPHALF_1, F3DEX2_RDPHALF_1, F3D_RDPHalf_1 );
231 GBI_SetGBI( G_SPNOOP, F3DEX2_SPNOOP, F3D_SPNoOp );
232 GBI_SetGBI( G_ENDDL, F3DEX2_ENDDL, F3D_EndDL );
233 GBI_SetGBI( G_DL, F3DEX2_DL, F3D_DList );
234 GBI_SetGBI( G_LOAD_UCODE, F3DEX2_LOAD_UCODE, F3DEX_Load_uCode );
235 GBI_SetGBI( G_MOVEMEM, F3DEX2_MOVEMEM, F3DEX2_MoveMem );
236 GBI_SetGBI( G_MOVEWORD, F3DEX2_MOVEWORD, F3DEX2_MoveWord );
237 GBI_SetGBI( G_MTX, F3DEX2_MTX, F3DEX2_Mtx );
238 GBI_SetGBI( G_GEOMETRYMODE, F3DEX2_GEOMETRYMODE, F3DEX2_GeometryMode );
239 GBI_SetGBI( G_POPMTX, F3DEX2_POPMTX, F3DEX2_PopMtx );
240 GBI_SetGBI( G_TEXTURE, F3DEX2_TEXTURE, F3DEX2_Texture );
241 GBI_SetGBI( G_DMA_IO, F3DEX2_DMA_IO, F3DEX2_DMAIO );
242 GBI_SetGBI( G_SPECIAL_1, F3DEX2_SPECIAL_1, F3DEX2_Special_1 );
243 GBI_SetGBI( G_SPECIAL_2, F3DEX2_SPECIAL_2, F3DEX2_Special_2 );
244 GBI_SetGBI( G_SPECIAL_3, F3DEX2_SPECIAL_3, F3DEX2_Special_3 );
245
246 GBI_SetGBI( G_VTX, F3DEX2_VTX, F3DEX2_Vtx );
247 GBI_SetGBI( G_MODIFYVTX, F3DEX2_MODIFYVTX, F3DEX_ModifyVtx );
248 GBI_SetGBI( G_CULLDL, F3DEX2_CULLDL, F3DEX_CullDL );
249 GBI_SetGBI( G_BRANCH_Z, F3DEX2_BRANCH_Z, F3DEX_Branch_Z );
250 GBI_SetGBI( G_TRI1, F3DEX2_TRI1, F3DEX2_Tri1 );
251 GBI_SetGBI( G_TRI2, F3DEX2_TRI2, F3DEX_Tri2 );
252 GBI_SetGBI( G_QUAD, F3DEX2_QUAD, F3DEX2_Quad );
253// GBI_SetGBI( G_LINE3D, F3DEX2_LINE3D, F3DEX2_Line3D );
254}
255