GLES2N64 (from mupen64plus-ae) plugin. Compile and run on the OpenPandora
[mupen64plus-pandora.git] / source / gles2n64 / src / RDP.cpp
diff --git a/source/gles2n64/src/RDP.cpp b/source/gles2n64/src/RDP.cpp
new file mode 100644 (file)
index 0000000..d3ffdd9
--- /dev/null
@@ -0,0 +1,347 @@
+#include "N64.h"
+#include "RSP.h"
+#include "GBI.h"
+#include "gDP.h"
+#include "Types.h"
+#include "Debug.h"
+#include "Common.h"
+#include "gSP.h"
+
+void RDP_Unknown( u32 w0, u32 w1 )
+{
+}
+
+void RDP_NoOp( u32 w0, u32 w1 )
+{
+    gSPNoOp();
+}
+
+void RDP_SetCImg( u32 w0, u32 w1 )
+{
+    gDPSetColorImage( _SHIFTR( w0, 21,  3 ),        // fmt
+                      _SHIFTR( w0, 19,  2 ),        // siz
+                      _SHIFTR( w0,  0, 12 ) + 1,    // width
+                      w1 );                         // img
+}
+
+void RDP_SetZImg( u32 w0, u32 w1 )
+{
+    gDPSetDepthImage( w1 ); // img
+}
+
+void RDP_SetTImg( u32 w0, u32 w1 )
+{
+    gDPSetTextureImage( _SHIFTR( w0, 21,  3),       // fmt
+                        _SHIFTR( w0, 19,  2 ),      // siz
+                        _SHIFTR( w0,  0, 12 ) + 1,  // width
+                        w1 );                       // img
+}
+
+void RDP_SetCombine( u32 w0, u32 w1 )
+{
+    gDPSetCombine( _SHIFTR( w0, 0, 24 ),    // muxs0
+                   w1 );                    // muxs1
+}
+
+void RDP_SetEnvColor( u32 w0, u32 w1 )
+{
+    gDPSetEnvColor( _SHIFTR( w1, 24, 8 ),       // r
+                    _SHIFTR( w1, 16, 8 ),       // g
+                    _SHIFTR( w1,  8, 8 ),       // b
+                    _SHIFTR( w1,  0, 8 ) );     // a
+}
+
+void RDP_SetPrimColor( u32 w0, u32 w1 )
+{
+    gDPSetPrimColor( _SHIFTL( w0,  8, 8 ),      // m
+                     _SHIFTL( w0,  0, 8 ),      // l
+                     _SHIFTR( w1, 24, 8 ),      // r
+                     _SHIFTR( w1, 16, 8 ),      // g
+                     _SHIFTR( w1,  8, 8 ),      // b
+                     _SHIFTR( w1,  0, 8 ) );    // a
+
+}
+
+void RDP_SetBlendColor( u32 w0, u32 w1 )
+{
+    gDPSetBlendColor( _SHIFTR( w1, 24, 8 ),     // r
+                      _SHIFTR( w1, 16, 8 ),     // g
+                      _SHIFTR( w1,  8, 8 ),     // b
+                      _SHIFTR( w1,  0, 8 ) );   // a
+}
+
+void RDP_SetFogColor( u32 w0, u32 w1 )
+{
+    gDPSetFogColor( _SHIFTR( w1, 24, 8 ),       // r
+                    _SHIFTR( w1, 16, 8 ),       // g
+                    _SHIFTR( w1,  8, 8 ),       // b
+                    _SHIFTR( w1,  0, 8 ) );     // a
+}
+
+void RDP_SetFillColor( u32 w0, u32 w1 )
+{
+    gDPSetFillColor( w1 );
+}
+
+void RDP_FillRect( u32 w0, u32 w1 )
+{
+    gDPFillRectangle( _SHIFTR( w1, 14, 10 ),    // ulx
+                      _SHIFTR( w1,  2, 10 ),    // uly
+                      _SHIFTR( w0, 14, 10 ),    // lrx
+                      _SHIFTR( w0,  2, 10 ) );  // lry
+}
+
+void RDP_SetTile( u32 w0, u32 w1 )
+{
+
+    gDPSetTile( _SHIFTR( w0, 21, 3 ),   // fmt
+                _SHIFTR( w0, 19, 2 ),   // siz
+                _SHIFTR( w0,  9, 9 ),   // line
+                _SHIFTR( w0,  0, 9 ),   // tmem
+                _SHIFTR( w1, 24, 3 ),   // tile
+                _SHIFTR( w1, 20, 4 ),   // palette
+                _SHIFTR( w1, 18, 2 ),   // cmt
+                _SHIFTR( w1,  8, 2 ),   // cms
+                _SHIFTR( w1, 14, 4 ),   // maskt
+                _SHIFTR( w1,  4, 4 ),   // masks
+                _SHIFTR( w1, 10, 4 ),   // shiftt
+                _SHIFTR( w1,  0, 4 ) ); // shifts
+}
+
+void RDP_LoadTile( u32 w0, u32 w1 )
+{
+    gDPLoadTile( _SHIFTR( w1, 24,  3 ),     // tile
+                 _SHIFTR( w0, 12, 12 ),     // uls
+                 _SHIFTR( w0,  0, 12 ),     // ult
+                 _SHIFTR( w1, 12, 12 ),     // lrs
+                 _SHIFTR( w1,  0, 12 ) );   // lrt
+}
+
+void RDP_LoadBlock( u32 w0, u32 w1 )
+{
+    gDPLoadBlock( _SHIFTR( w1, 24,  3 ),    // tile
+                  _SHIFTR( w0, 12, 12 ),    // uls
+                  _SHIFTR( w0,  0, 12 ),    // ult
+                  _SHIFTR( w1, 12, 12 ),    // lrs
+                  _SHIFTR( w1,  0, 12 ) );  // dxt
+}
+
+void RDP_SetTileSize( u32 w0, u32 w1 )
+{
+    gDPSetTileSize( _SHIFTR( w1, 24,  3 ),      // tile
+                    _SHIFTR( w0, 12, 12 ),      // uls
+                    _SHIFTR( w0,  0, 12 ),      // ult
+                    _SHIFTR( w1, 12, 12 ),      // lrs
+                    _SHIFTR( w1,  0, 12 ) );    // lrt
+}
+
+void RDP_LoadTLUT( u32 w0, u32 w1 )
+{
+    gDPLoadTLUT( _SHIFTR( w1, 24,  3 ), // tile
+                  _SHIFTR( w0, 12, 12 ),    // uls
+                  _SHIFTR( w0,  0, 12 ),    // ult
+                  _SHIFTR( w1, 12, 12 ),    // lrs
+                  _SHIFTR( w1,  0, 12 ) );  // lrt
+}
+
+void RDP_SetOtherMode( u32 w0, u32 w1 )
+{
+    gDPSetOtherMode( _SHIFTR( w0, 0, 24 ),  // mode0
+                     w1 );                  // mode1
+}
+
+void RDP_SetPrimDepth( u32 w0, u32 w1 )
+{
+    gDPSetPrimDepth( _SHIFTR( w1, 16, 16 ),     // z
+                     _SHIFTR( w1,  0, 16 ) );   // dz
+}
+
+void RDP_SetScissor( u32 w0, u32 w1 )
+{
+    gDPSetScissor( _SHIFTR( w1, 24, 2 ),                        // mode
+                   _FIXED2FLOAT( _SHIFTR( w0, 12, 12 ), 2 ),    // ulx
+                   _FIXED2FLOAT( _SHIFTR( w0,  0, 12 ), 2 ),    // uly
+                   _FIXED2FLOAT( _SHIFTR( w1, 12, 12 ), 2 ),    // lrx
+                   _FIXED2FLOAT( _SHIFTR( w1,  0, 12 ), 2 ) );  // lry
+}
+
+void RDP_SetConvert( u32 w0, u32 w1 )
+{
+    gDPSetConvert( _SHIFTR( w0, 13, 9 ),    // k0
+                   _SHIFTR( w0,  4, 9 ),    // k1
+                   _SHIFTL( w0,  5, 4 ) | _SHIFTR( w1, 25, 5 ), // k2
+                   _SHIFTR( w1, 18, 9 ),    // k3
+                   _SHIFTR( w1,  9, 9 ),    // k4
+                   _SHIFTR( w1,  0, 9 ) );  // k5
+}
+
+void RDP_SetKeyR( u32 w0, u32 w1 )
+{
+    gDPSetKeyR( _SHIFTR( w1,  8,  8 ),      // cR
+                _SHIFTR( w1,  0,  8 ),      // sR
+                _SHIFTR( w1, 16, 12 ) );    // wR
+}
+
+void RDP_SetKeyGB( u32 w0, u32 w1 )
+{
+    gDPSetKeyGB( _SHIFTR( w1, 24,  8 ),     // cG
+                 _SHIFTR( w1, 16,  8 ),     // sG
+                 _SHIFTR( w0, 12, 12 ),     // wG
+                 _SHIFTR( w1,  8,  8 ),     // cB
+                 _SHIFTR( w1,  0,  8 ),     // SB
+                 _SHIFTR( w0,  0, 12 ) );   // wB
+}
+
+void RDP_FullSync( u32 w0, u32 w1 )
+{
+    gDPFullSync();
+}
+
+void RDP_TileSync( u32 w0, u32 w1 )
+{
+//    gDPTileSync();
+}
+
+void RDP_PipeSync( u32 w0, u32 w1 )
+{
+//    gDPPipeSync();
+}
+
+void RDP_LoadSync( u32 w0, u32 w1 )
+{
+//    gDPLoadSync();
+}
+
+void RDP_TexRectFlip( u32 w0, u32 w1 )
+{
+    u32 w2 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
+    RSP.PC[RSP.PCi] += 8;
+
+    u32 w3 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
+    RSP.PC[RSP.PCi] += 8;
+
+    gDPTextureRectangleFlip( _FIXED2FLOAT( _SHIFTR( w1, 12, 12 ), 2 ),          // ulx
+                             _FIXED2FLOAT( _SHIFTR( w1,  0, 12 ), 2 ),          // uly
+                             _FIXED2FLOAT( _SHIFTR( w0, 12, 12 ), 2 ),          // lrx
+                             _FIXED2FLOAT( _SHIFTR( w0,  0, 12 ), 2 ),          // lry
+                             _SHIFTR( w1, 24,  3 ),                             // tile
+                             _FIXED2FLOAT( (s16)_SHIFTR( w2, 16, 16 ), 5 ),     // s
+                             _FIXED2FLOAT( (s16)_SHIFTR( w2,  0, 16 ), 5 ),     // t
+                             _FIXED2FLOAT( (s16)_SHIFTR( w3, 16, 16 ), 10 ),    // dsdx
+                             _FIXED2FLOAT( (s16)_SHIFTR( w3,  0, 16 ), 10 ) );  // dsdy
+}
+
+void RDP_TexRect( u32 w0, u32 w1 )
+{
+    u32 w2 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
+    RSP.PC[RSP.PCi] += 8;
+
+    u32 w3 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
+    RSP.PC[RSP.PCi] += 8;
+
+    gDPTextureRectangle( _FIXED2FLOAT( _SHIFTR( w1, 12, 12 ), 2 ),          // ulx
+                         _FIXED2FLOAT( _SHIFTR( w1,  0, 12 ), 2 ),          // uly
+                         _FIXED2FLOAT( _SHIFTR( w0, 12, 12 ), 2 ),          // lrx
+                         _FIXED2FLOAT( _SHIFTR( w0,  0, 12 ), 2 ),          // lry
+                         _SHIFTR( w1, 24,  3 ),                             // tile
+                         _FIXED2FLOAT( (s16)_SHIFTR( w2, 16, 16 ), 5 ),     // s
+                         _FIXED2FLOAT( (s16)_SHIFTR( w2,  0, 16 ), 5 ),     // t
+                         _FIXED2FLOAT( (s16)_SHIFTR( w3, 16, 16 ), 10 ),    // dsdx
+                         _FIXED2FLOAT( (s16)_SHIFTR( w3,  0, 16 ), 10 ) );  // dsdy
+}
+
+
+//Low Level RDP Drawing Commands:
+void RDP_TriFill(u32 w0, u32 w1)
+{
+    LOG(LOG_VERBOSE, "RSP_TRI_FILL Command\n");
+}
+
+void RDP_TriFillZBuff(u32 w0, u32 w1)
+{
+    LOG(LOG_VERBOSE, "RSP_TRI_FILL_ZBUFF Command\n");
+}
+
+void RDP_TriTxtr(u32 w0, u32 w1)
+{
+    LOG(LOG_VERBOSE, "RSP_TRI_TXTR Command\n");
+}
+
+void RDP_TriTxtrZBuff(u32 w0, u32 w1)
+{
+    LOG(LOG_VERBOSE, "RSP_TRI_TXTR_ZBUFF Command\n");
+}
+
+void RDP_TriShade(u32 w0, u32 w1)
+{
+    LOG(LOG_VERBOSE, "RSP_TRI_SHADE Command\n");
+}
+
+void RDP_TriShadeZBuff(u32 w0, u32 w1)
+{
+    LOG(LOG_VERBOSE, "RSP_TRI_SHADE_ZBUFF Command\n");
+}
+
+void RDP_TriShadeTxtr(u32 w0, u32 w1)
+{
+    LOG(LOG_VERBOSE, "RSP_TRI_SHADE_TXTR Command\n");
+}
+
+void RDP_TriShadeTxtrZBuff(u32 w0, u32 w1)
+{
+    LOG(LOG_VERBOSE, "RSP_TRI_SHADE_TXTR_ZBUFF Command\n");
+}
+
+void RDP_Init()
+{
+    // Initialize RDP commands to RDP_UNKNOWN
+    for (int i = 0xC8; i <= 0xCF; i++)
+        GBI.cmd[i] = RDP_Unknown;
+
+    // Initialize RDP commands to RDP_UNKNOWN
+    for (int i = 0xE4; i <= 0xFF; i++)
+        GBI.cmd[i] = RDP_Unknown;
+
+    // Set known GBI commands
+    GBI.cmd[G_NOOP]             = RDP_NoOp;
+    GBI.cmd[G_SETCIMG]          = RDP_SetCImg;
+    GBI.cmd[G_SETZIMG]          = RDP_SetZImg;
+    GBI.cmd[G_SETTIMG]          = RDP_SetTImg;
+    GBI.cmd[G_SETCOMBINE]       = RDP_SetCombine;
+    GBI.cmd[G_SETENVCOLOR]      = RDP_SetEnvColor;
+    GBI.cmd[G_SETPRIMCOLOR]     = RDP_SetPrimColor;
+    GBI.cmd[G_SETBLENDCOLOR]    = RDP_SetBlendColor;
+    GBI.cmd[G_SETFOGCOLOR]      = RDP_SetFogColor;
+    GBI.cmd[G_SETFILLCOLOR]     = RDP_SetFillColor;
+    GBI.cmd[G_FILLRECT]         = RDP_FillRect;
+    GBI.cmd[G_SETTILE]          = RDP_SetTile;
+    GBI.cmd[G_LOADTILE]         = RDP_LoadTile;
+    GBI.cmd[G_LOADBLOCK]        = RDP_LoadBlock;
+    GBI.cmd[G_SETTILESIZE]      = RDP_SetTileSize;
+    GBI.cmd[G_LOADTLUT]         = RDP_LoadTLUT;
+    GBI.cmd[G_RDPSETOTHERMODE]  = RDP_SetOtherMode;
+    GBI.cmd[G_SETPRIMDEPTH]     = RDP_SetPrimDepth;
+    GBI.cmd[G_SETSCISSOR]       = RDP_SetScissor;
+    GBI.cmd[G_SETCONVERT]       = RDP_SetConvert;
+    GBI.cmd[G_SETKEYR]          = RDP_SetKeyR;
+    GBI.cmd[G_SETKEYGB]         = RDP_SetKeyGB;
+    GBI.cmd[G_RDPFULLSYNC]      = RDP_FullSync;
+    GBI.cmd[G_RDPTILESYNC]      = RDP_TileSync;
+    GBI.cmd[G_RDPPIPESYNC]      = RDP_PipeSync;
+    GBI.cmd[G_RDPLOADSYNC]      = RDP_LoadSync;
+    GBI.cmd[G_TEXRECTFLIP]      = RDP_TexRectFlip;
+    GBI.cmd[G_TEXRECT]          = RDP_TexRect;
+
+    GBI.cmd[G_RDPNOOP]          = RDP_NoOp;
+
+    //Low Level RDP Drawing Commands:
+    GBI.cmd[G_TRI_FILL]             = RDP_TriFill;
+    GBI.cmd[G_TRI_FILL_ZBUFF]       = RDP_TriFillZBuff;
+    GBI.cmd[G_TRI_TXTR]             = RDP_TriTxtr;
+    GBI.cmd[G_TRI_TXTR_ZBUFF]       = RDP_TriTxtrZBuff;
+    GBI.cmd[G_TRI_SHADE]            = RDP_TriShade;
+    GBI.cmd[G_TRI_SHADE_TXTR]       = RDP_TriShadeTxtr;
+    GBI.cmd[G_TRI_SHADE_TXTR_ZBUFF] = RDP_TriShadeTxtrZBuff;
+
+}
+