Arachnoid GLESv1.1 plugin. Compile and run (a bit glitchy and no frameskip) on the...
[mupen64plus-pandora.git] / source / mupen64plus-video-arachnoid / src / RDP / RDP.h
diff --git a/source/mupen64plus-video-arachnoid/src/RDP/RDP.h b/source/mupen64plus-video-arachnoid/src/RDP/RDP.h
new file mode 100755 (executable)
index 0000000..c203eea
--- /dev/null
@@ -0,0 +1,290 @@
+/******************************************************************************
+ * Arachnoid Graphics Plugin for Mupen64Plus
+ * http://bitbucket.org/wahrhaft/mupen64plus-video-arachnoid/
+ *
+ * Copyright (C) 2007 Kristofer Karlsson, Rickard Niklasson
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *****************************************************************************/
+
+#ifndef REALITY_DRAWING_PROCESSOR_H_
+#define REALITY_DRAWING_PROCESSOR_H_
+
+//Includes
+#define M64P_PLUGIN_PROTOTYPES 1
+#include "m64p_plugin.h"
+#include "UCodeDefs.h"
+#include "GBI.h"
+#include "GBIDefs.h"
+#include "TextureLoader.h"
+
+//Forward declaration
+class RSP;
+class VI;
+class Memory;
+class DisplayListParser;
+class TextureCache;
+class AdvancedCombinerManager;
+class FogManager;
+class TextureLoader;
+class OpenGL2DRenderer;
+
+//*****************************************************************************
+//! RDPSetImgInfo
+//! Used by RDP to set color- and depth- image info
+//*****************************************************************************
+struct RDPSetImgInfo
+{
+    unsigned int format;
+    unsigned int size;
+    unsigned int width;
+    unsigned int rdramAddress;
+    unsigned int bpl;
+};
+
+//*****************************************************************************
+//* OtherMode
+//! Struct used to get input to combiner
+//*****************************************************************************
+union OtherMode
+{
+    struct
+    {
+        //Low 32:
+        unsigned int alphaCompare : 2;
+        unsigned int depthSource : 1;
+
+        //RenderMode
+        unsigned int AAEnable : 1;
+        unsigned int depthCompare : 1;
+        unsigned int depthUpdate : 1;
+        unsigned int imageRead : 1;
+        unsigned int clearOnCvg : 1;
+        unsigned int cvgDest : 2;
+        unsigned int depthMode : 2;
+        unsigned int cvgXAlpha : 1;
+        unsigned int alphaCvgSel : 1;
+        unsigned int forceBlender : 1;
+        unsigned int textureEdge : 1;
+
+        //Blender
+        unsigned int c2_m2b : 2;
+        unsigned int c1_m2b : 2;
+        unsigned int c2_m2a : 2;
+        unsigned int c1_m2a : 2;
+        unsigned int c2_m1b : 2;
+        unsigned int c1_m1b : 2;
+        unsigned int c2_m1a : 2;
+        unsigned int c1_m1a : 2;
+
+        // High 32:
+        unsigned int blendMask : 4;
+        unsigned int alphaDither : 2;
+        unsigned int colorDither : 2;    
+        unsigned int combineKey : 1;
+        unsigned int textureConvert : 3;
+        unsigned int textureFilter : 2;
+        unsigned int textureLUT : 2;
+        unsigned int textureLOD : 1;
+        unsigned int textureDetail : 2;
+        unsigned int texturePersp : 1;
+        unsigned int cycleType : 2;
+        unsigned int unusedColorDither : 1; // unsupported
+        unsigned int pipelineMode : 1;
+        unsigned int pad : 8;
+    };
+
+    struct
+    {
+        unsigned int l, h;   //!< Low and high values
+    };
+};
+
+//*****************************************************************************
+//* RDP
+//! Class for emulating the Reality Drawing Processor
+//*****************************************************************************
+class RDP
+{
+public:
+
+    //Constructor / Destructor
+    RDP();
+    ~RDP();
+
+    //initialize
+    bool initialize(GFX_INFO* graphicsInfo, RSP* rsp, Memory* memory, GBI* gbi, TextureCache* textureCache, VI* vi, DisplayListParser* displayListParser, FogManager* fogMgr);
+    void updateStates();
+    void dispose();
+    void reset();
+    void triggerInterrupt();
+
+public:
+    void signalUpdate() { m_screenUpdatePending = true; }
+
+    //Get Combiner Manager
+    AdvancedCombinerManager* getCombinerMgr() { return m_combinerMgr; }
+
+    //Set/Get Cycle Type
+    void setCycleType(unsigned int cycleType) { m_otherMode.cycleType = cycleType; m_updateCombiner = true; }
+    unsigned int getCycleType() { return m_otherMode.cycleType; }
+
+    //Set Texture LUT
+    void setTextureLUT(unsigned int lut) { m_textureLUT = lut; }
+    unsigned int getTextureLUT() { return m_textureLUT; }
+
+    //Set/Get Texture Filtering
+    void setTextureFiltering(unsigned int filterMode) { m_otherMode.textureFilter = filterMode; }
+    unsigned int getTextureFiltering() { return m_otherMode.textureFilter; }
+
+    // Set / Get Alpha Compare
+    void setAlphaCompareMode(unsigned int mode);
+    unsigned int getAlphaCompareMode() { return m_otherMode.alphaCompare; }
+
+    // Set Rendermode
+    void setRenderMode(unsigned int w1);        
+
+    //Get Textures, Tiles    
+    TextureImage* getTextureImage()          { return m_textureLoader->getTextureImage(); }
+    RDPTile*      getCurrentTile()           { return m_textureLoader->getCurrentTile();  }
+    RDPTile*      getTile(unsigned int tile) { return m_textureLoader->getTile(tile);     }
+
+    //Get texture modes
+    TextureMode getTextureMode() { return m_textureMode;  }
+    LoadType getLoadType()       { return m_loadType;     }
+    bool getChangedTiles()       { return m_changedTiles; }
+    bool getChangedTMEM()        { return m_tmemChanged;  }
+
+    //Texture rectangle Size
+    unsigned int getTexRectWidth() { return m_texRectWidth; }
+    unsigned int getTexRectHeight() { return m_texRectHeight; }
+
+    //Half
+    void setHalf1(unsigned int half1) { m_half1 = half1; }
+    void setHalf2(unsigned int half2) { m_half2 = half2; }
+    unsigned int getHalf1() { return m_half1; }
+    unsigned int getHalf2() { return m_half2; }
+
+    //Get Primitive Depth
+    float getPrimitiveZ() { return m_primitiveZ; }
+
+    //Depth Source (get z value from prim depth?)
+    void setDepthSource(unsigned int source) { m_otherMode.depthSource = source; }
+    unsigned int getDepthSource()            { return m_otherMode.depthSource;   }
+
+    void setUpdateCombiner(bool update) { m_updateCombiner = update; }
+
+public:
+
+    //Texture Rectangle
+    void _textureRectangle(float ulx, float uly, float lrx, float lry, int tile, float s, float t, float dsdx, float dtdy,bool flip);
+    void _textureRectangleFlip(int nX0, int nY0, int nX1, int nY1, float fS0, float fT0, float fS1, float fT1, int tile);
+
+public:
+
+    //Texturing
+    void RDP_SetCImg(unsigned int format, unsigned int size, unsigned int width, unsigned int segmentAddress);
+    void RDP_SetZImg(unsigned int format, unsigned int size, unsigned int width, unsigned int segmentAddress);
+    void RDP_SetTImg(unsigned int format, unsigned int size, unsigned int width, unsigned int segmentAddress);
+    void RDP_SetTile(int format, int size, int line, int tmem, int tile, int palette, 
+                          int clampS, int clampT, int mirrorS, int mirrorT, int maskS, 
+                          int maskT, int shiftS, int shiftT);
+    void RDP_SetTileSize(int tile, unsigned int s0, unsigned int t0, unsigned int s1, unsigned int t1);
+    void RDP_LoadTile(int tile, int s0, int t0, int s1, int t1);
+    void RDP_LoadBlock(int tile, int s0, int t0, int s1, int t1);
+    void RDP_LoadTLUT(int tile, int s0, int t0, int s1, int t1);
+
+    //Colors
+    void RDP_SetEnvColor(float r, float g, float b, float a);
+    void RDP_SetFogColor(float r, float g, float b, float a);
+    void RDP_SetBlendColor(float r, float g, float b, float a);    
+    void RDP_SetPrimColor(float r, float g, float b, float a, unsigned int primLodMin, unsigned int primLevel);    
+    void RDP_SetFillColor(float r, float g, float b, float a);    
+
+    //Combiner
+    void RDP_SetCombine(MicrocodeArgument* ucode);
+
+    //Misc
+    void RDP_SetOtherMode(MicrocodeArgument* ucode);
+    void RDP_SetPrimDepth(unsigned int dwZ, unsigned int dwDZ);
+    void RDP_SetScissor(int x0, int y0, int x1, int y1, int mode);    
+
+    //Rendering
+    void RDP_FillRect(unsigned int x0, unsigned int y0, unsigned int x1, unsigned int y1);
+    void RDP_TexRectFlip(unsigned int dwXH, unsigned int dwYH, unsigned int dwXL, unsigned int dwYL, 
+                              unsigned int tileno, unsigned int dwS, unsigned int dwT, int nDSDX, int nDTDY);
+    void RDP_TexRect(unsigned int dwXH, unsigned int dwYH, unsigned int dwXL, unsigned int dwYL, 
+                          unsigned int tileno, unsigned short dwS, unsigned short dwT, unsigned short nDSDX, unsigned short nDTDY);
+
+    //Other
+    void RDP_FullSync();
+
+public:
+
+    static Memory* m_memory;                       //!< Pointer to memory manager
+
+public:
+
+    //Other Mode
+    OtherMode m_otherMode;             //!< Lots of states for graphics and combiner
+
+    //Hash values for paletts
+    unsigned int m_paletteCRC16[16];  //!< Hash values used to select correct texture
+    unsigned int m_paletteCRC256;     //!< Hash values used to select correct texture 
+
+protected:
+
+    //Pointers to other objects and managers
+    GFX_INFO*                m_graphicsInfo;       //!< Access to emulator data (like RDRAM ...)
+    RSP*                     m_rsp;                //!< Pointer to Reality Signal Processor    
+    VI*                      m_vi;                 //!< Pointer to video interface
+    DisplayListParser*       m_displayListParser;  //!< Pointer to display list parser
+    TextureCache*            m_textureCache;       //!< Pointer to texture cache
+    FogManager*              m_fogMgr;             //!< Pointer to fog manager
+    AdvancedCombinerManager* m_combinerMgr;        //!< Pointer to combiner manager
+    TextureLoader*           m_textureLoader;      //!< Pointer to texture loader
+    OpenGL2DRenderer*        m_openGL2DRenderer;   //!< Pointer to OpenGL 2D Renderer
+
+    //Prim Depth
+    float m_primitiveZ;                //!< Z value assigned to vertices z value if depth source says so
+    float m_primitiveDeltaZ;           //!< ??? Unused by this plugin
+
+    //Update?
+    bool m_updateCombiner;             //!< Update combiner?
+    bool m_updateCombineColors;        //!< Update colors combiner uses?
+    bool m_tmemChanged;                //!< True when texture memory has been altered
+    bool m_changedTiles;               //!< True if tiles have been changed  
+
+    //Textures        
+    LoadType m_loadType;               //!< What kind of texture was previusly loaded
+    TextureMode m_textureMode;         //!< Texture mode (NORMAL, TEXRECT, BACKGROUND, FRAMEBUFFER)
+    unsigned int m_textureLUT;         //!< Texture Look Up Table
+    unsigned int m_texRectWidth;      //!< Width of the texture rectangle to be rendered
+    unsigned int m_texRectHeight;     //!< Height of the texture rectangle to be rendered
+
+    //Images
+    RDPSetImgInfo m_colorImageInfo;    //!< Information about color image
+    RDPSetImgInfo m_depthImageInfo;    //!< Information about depth image
+
+    //Half
+    unsigned int m_half1;             //!< First half value
+    unsigned int m_half2;             //!< Second half value
+
+    //Update on first CI
+    bool m_screenUpdatePending;
+
+};
+#endif