X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=source%2Fmupen64plus-video-arachnoid%2Fsrc%2FRDP%2FRDP.h;fp=source%2Fmupen64plus-video-arachnoid%2Fsrc%2FRDP%2FRDP.h;h=c203eea062aad626898c7b31cdd57cf9746a4bbf;hb=22726e4d55be26faa48b57b22689cbedde27ae44;hp=0000000000000000000000000000000000000000;hpb=fc5d46b49a19d41f9f2da5a9336daec452900475;p=mupen64plus-pandora.git diff --git a/source/mupen64plus-video-arachnoid/src/RDP/RDP.h b/source/mupen64plus-video-arachnoid/src/RDP/RDP.h new file mode 100755 index 0000000..c203eea --- /dev/null +++ b/source/mupen64plus-video-arachnoid/src/RDP/RDP.h @@ -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