22726e4d |
1 | /****************************************************************************** |
2 | * Arachnoid Graphics Plugin for Mupen64Plus |
3 | * http://bitbucket.org/wahrhaft/mupen64plus-video-arachnoid/ |
4 | * |
5 | * Copyright (C) 2007 Kristofer Karlsson, Rickard Niklasson |
6 | * |
7 | * This program is free software; you can redistribute it and/or |
8 | * modify it under the terms of the GNU General Public License |
9 | * as published by the Free Software Foundation; either version 2 |
10 | * of the License, or (at your option) any later version. |
11 | * |
12 | * This program is distributed in the hope that it will be useful, |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * GNU General Public License for more details. |
16 | * |
17 | * You should have received a copy of the GNU General Public License |
18 | * along with this program; if not, write to the Free Software |
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
20 | *****************************************************************************/ |
21 | |
22 | #ifndef REALITY_DRAWING_PROCESSOR_H_ |
23 | #define REALITY_DRAWING_PROCESSOR_H_ |
24 | |
25 | //Includes |
26 | #define M64P_PLUGIN_PROTOTYPES 1 |
27 | #include "m64p_plugin.h" |
28 | #include "UCodeDefs.h" |
29 | #include "GBI.h" |
30 | #include "GBIDefs.h" |
31 | #include "TextureLoader.h" |
32 | |
33 | //Forward declaration |
34 | class RSP; |
35 | class VI; |
36 | class Memory; |
37 | class DisplayListParser; |
38 | class TextureCache; |
39 | class AdvancedCombinerManager; |
40 | class FogManager; |
41 | class TextureLoader; |
42 | class OpenGL2DRenderer; |
43 | |
44 | //***************************************************************************** |
45 | //! RDPSetImgInfo |
46 | //! Used by RDP to set color- and depth- image info |
47 | //***************************************************************************** |
48 | struct RDPSetImgInfo |
49 | { |
50 | unsigned int format; |
51 | unsigned int size; |
52 | unsigned int width; |
53 | unsigned int rdramAddress; |
54 | unsigned int bpl; |
55 | }; |
56 | |
57 | //***************************************************************************** |
58 | //* OtherMode |
59 | //! Struct used to get input to combiner |
60 | //***************************************************************************** |
61 | union OtherMode |
62 | { |
63 | struct |
64 | { |
65 | //Low 32: |
66 | unsigned int alphaCompare : 2; |
67 | unsigned int depthSource : 1; |
68 | |
69 | //RenderMode |
70 | unsigned int AAEnable : 1; |
71 | unsigned int depthCompare : 1; |
72 | unsigned int depthUpdate : 1; |
73 | unsigned int imageRead : 1; |
74 | unsigned int clearOnCvg : 1; |
75 | unsigned int cvgDest : 2; |
76 | unsigned int depthMode : 2; |
77 | unsigned int cvgXAlpha : 1; |
78 | unsigned int alphaCvgSel : 1; |
79 | unsigned int forceBlender : 1; |
80 | unsigned int textureEdge : 1; |
81 | |
82 | //Blender |
83 | unsigned int c2_m2b : 2; |
84 | unsigned int c1_m2b : 2; |
85 | unsigned int c2_m2a : 2; |
86 | unsigned int c1_m2a : 2; |
87 | unsigned int c2_m1b : 2; |
88 | unsigned int c1_m1b : 2; |
89 | unsigned int c2_m1a : 2; |
90 | unsigned int c1_m1a : 2; |
91 | |
92 | // High 32: |
93 | unsigned int blendMask : 4; |
94 | unsigned int alphaDither : 2; |
95 | unsigned int colorDither : 2; |
96 | unsigned int combineKey : 1; |
97 | unsigned int textureConvert : 3; |
98 | unsigned int textureFilter : 2; |
99 | unsigned int textureLUT : 2; |
100 | unsigned int textureLOD : 1; |
101 | unsigned int textureDetail : 2; |
102 | unsigned int texturePersp : 1; |
103 | unsigned int cycleType : 2; |
104 | unsigned int unusedColorDither : 1; // unsupported |
105 | unsigned int pipelineMode : 1; |
106 | unsigned int pad : 8; |
107 | }; |
108 | |
109 | struct |
110 | { |
111 | unsigned int l, h; //!< Low and high values |
112 | }; |
113 | }; |
114 | |
115 | //***************************************************************************** |
116 | //* RDP |
117 | //! Class for emulating the Reality Drawing Processor |
118 | //***************************************************************************** |
119 | class RDP |
120 | { |
121 | public: |
122 | |
123 | //Constructor / Destructor |
124 | RDP(); |
125 | ~RDP(); |
126 | |
127 | //initialize |
128 | bool initialize(GFX_INFO* graphicsInfo, RSP* rsp, Memory* memory, GBI* gbi, TextureCache* textureCache, VI* vi, DisplayListParser* displayListParser, FogManager* fogMgr); |
129 | void updateStates(); |
130 | void dispose(); |
131 | void reset(); |
132 | void triggerInterrupt(); |
133 | |
134 | public: |
135 | void signalUpdate() { m_screenUpdatePending = true; } |
136 | |
137 | //Get Combiner Manager |
138 | AdvancedCombinerManager* getCombinerMgr() { return m_combinerMgr; } |
139 | |
140 | //Set/Get Cycle Type |
141 | void setCycleType(unsigned int cycleType) { m_otherMode.cycleType = cycleType; m_updateCombiner = true; } |
142 | unsigned int getCycleType() { return m_otherMode.cycleType; } |
143 | |
144 | //Set Texture LUT |
145 | void setTextureLUT(unsigned int lut) { m_textureLUT = lut; } |
146 | unsigned int getTextureLUT() { return m_textureLUT; } |
147 | |
148 | //Set/Get Texture Filtering |
149 | void setTextureFiltering(unsigned int filterMode) { m_otherMode.textureFilter = filterMode; } |
150 | unsigned int getTextureFiltering() { return m_otherMode.textureFilter; } |
151 | |
152 | // Set / Get Alpha Compare |
153 | void setAlphaCompareMode(unsigned int mode); |
154 | unsigned int getAlphaCompareMode() { return m_otherMode.alphaCompare; } |
155 | |
156 | // Set Rendermode |
157 | void setRenderMode(unsigned int w1); |
158 | |
159 | //Get Textures, Tiles |
160 | TextureImage* getTextureImage() { return m_textureLoader->getTextureImage(); } |
161 | RDPTile* getCurrentTile() { return m_textureLoader->getCurrentTile(); } |
162 | RDPTile* getTile(unsigned int tile) { return m_textureLoader->getTile(tile); } |
163 | |
164 | //Get texture modes |
165 | TextureMode getTextureMode() { return m_textureMode; } |
166 | LoadType getLoadType() { return m_loadType; } |
167 | bool getChangedTiles() { return m_changedTiles; } |
168 | bool getChangedTMEM() { return m_tmemChanged; } |
169 | |
170 | //Texture rectangle Size |
171 | unsigned int getTexRectWidth() { return m_texRectWidth; } |
172 | unsigned int getTexRectHeight() { return m_texRectHeight; } |
173 | |
174 | //Half |
175 | void setHalf1(unsigned int half1) { m_half1 = half1; } |
176 | void setHalf2(unsigned int half2) { m_half2 = half2; } |
177 | unsigned int getHalf1() { return m_half1; } |
178 | unsigned int getHalf2() { return m_half2; } |
179 | |
180 | //Get Primitive Depth |
181 | float getPrimitiveZ() { return m_primitiveZ; } |
182 | |
183 | //Depth Source (get z value from prim depth?) |
184 | void setDepthSource(unsigned int source) { m_otherMode.depthSource = source; } |
185 | unsigned int getDepthSource() { return m_otherMode.depthSource; } |
186 | |
187 | void setUpdateCombiner(bool update) { m_updateCombiner = update; } |
188 | |
189 | public: |
190 | |
191 | //Texture Rectangle |
192 | void _textureRectangle(float ulx, float uly, float lrx, float lry, int tile, float s, float t, float dsdx, float dtdy,bool flip); |
193 | void _textureRectangleFlip(int nX0, int nY0, int nX1, int nY1, float fS0, float fT0, float fS1, float fT1, int tile); |
194 | |
195 | public: |
196 | |
197 | //Texturing |
198 | void RDP_SetCImg(unsigned int format, unsigned int size, unsigned int width, unsigned int segmentAddress); |
199 | void RDP_SetZImg(unsigned int format, unsigned int size, unsigned int width, unsigned int segmentAddress); |
200 | void RDP_SetTImg(unsigned int format, unsigned int size, unsigned int width, unsigned int segmentAddress); |
201 | void RDP_SetTile(int format, int size, int line, int tmem, int tile, int palette, |
202 | int clampS, int clampT, int mirrorS, int mirrorT, int maskS, |
203 | int maskT, int shiftS, int shiftT); |
204 | void RDP_SetTileSize(int tile, unsigned int s0, unsigned int t0, unsigned int s1, unsigned int t1); |
205 | void RDP_LoadTile(int tile, int s0, int t0, int s1, int t1); |
206 | void RDP_LoadBlock(int tile, int s0, int t0, int s1, int t1); |
207 | void RDP_LoadTLUT(int tile, int s0, int t0, int s1, int t1); |
208 | |
209 | //Colors |
210 | void RDP_SetEnvColor(float r, float g, float b, float a); |
211 | void RDP_SetFogColor(float r, float g, float b, float a); |
212 | void RDP_SetBlendColor(float r, float g, float b, float a); |
213 | void RDP_SetPrimColor(float r, float g, float b, float a, unsigned int primLodMin, unsigned int primLevel); |
214 | void RDP_SetFillColor(float r, float g, float b, float a); |
215 | |
216 | //Combiner |
217 | void RDP_SetCombine(MicrocodeArgument* ucode); |
218 | |
219 | //Misc |
220 | void RDP_SetOtherMode(MicrocodeArgument* ucode); |
221 | void RDP_SetPrimDepth(unsigned int dwZ, unsigned int dwDZ); |
222 | void RDP_SetScissor(int x0, int y0, int x1, int y1, int mode); |
223 | |
224 | //Rendering |
225 | void RDP_FillRect(unsigned int x0, unsigned int y0, unsigned int x1, unsigned int y1); |
226 | void RDP_TexRectFlip(unsigned int dwXH, unsigned int dwYH, unsigned int dwXL, unsigned int dwYL, |
227 | unsigned int tileno, unsigned int dwS, unsigned int dwT, int nDSDX, int nDTDY); |
228 | void RDP_TexRect(unsigned int dwXH, unsigned int dwYH, unsigned int dwXL, unsigned int dwYL, |
229 | unsigned int tileno, unsigned short dwS, unsigned short dwT, unsigned short nDSDX, unsigned short nDTDY); |
230 | |
231 | //Other |
232 | void RDP_FullSync(); |
233 | |
234 | public: |
235 | |
236 | static Memory* m_memory; //!< Pointer to memory manager |
237 | |
238 | public: |
239 | |
240 | //Other Mode |
241 | OtherMode m_otherMode; //!< Lots of states for graphics and combiner |
242 | |
243 | //Hash values for paletts |
244 | unsigned int m_paletteCRC16[16]; //!< Hash values used to select correct texture |
245 | unsigned int m_paletteCRC256; //!< Hash values used to select correct texture |
246 | |
247 | protected: |
248 | |
249 | //Pointers to other objects and managers |
250 | GFX_INFO* m_graphicsInfo; //!< Access to emulator data (like RDRAM ...) |
251 | RSP* m_rsp; //!< Pointer to Reality Signal Processor |
252 | VI* m_vi; //!< Pointer to video interface |
253 | DisplayListParser* m_displayListParser; //!< Pointer to display list parser |
254 | TextureCache* m_textureCache; //!< Pointer to texture cache |
255 | FogManager* m_fogMgr; //!< Pointer to fog manager |
256 | AdvancedCombinerManager* m_combinerMgr; //!< Pointer to combiner manager |
257 | TextureLoader* m_textureLoader; //!< Pointer to texture loader |
258 | OpenGL2DRenderer* m_openGL2DRenderer; //!< Pointer to OpenGL 2D Renderer |
259 | |
260 | //Prim Depth |
261 | float m_primitiveZ; //!< Z value assigned to vertices z value if depth source says so |
262 | float m_primitiveDeltaZ; //!< ??? Unused by this plugin |
263 | |
264 | //Update? |
265 | bool m_updateCombiner; //!< Update combiner? |
266 | bool m_updateCombineColors; //!< Update colors combiner uses? |
267 | bool m_tmemChanged; //!< True when texture memory has been altered |
268 | bool m_changedTiles; //!< True if tiles have been changed |
269 | |
270 | //Textures |
271 | LoadType m_loadType; //!< What kind of texture was previusly loaded |
272 | TextureMode m_textureMode; //!< Texture mode (NORMAL, TEXRECT, BACKGROUND, FRAMEBUFFER) |
273 | unsigned int m_textureLUT; //!< Texture Look Up Table |
274 | unsigned int m_texRectWidth; //!< Width of the texture rectangle to be rendered |
275 | unsigned int m_texRectHeight; //!< Height of the texture rectangle to be rendered |
276 | |
277 | //Images |
278 | RDPSetImgInfo m_colorImageInfo; //!< Information about color image |
279 | RDPSetImgInfo m_depthImageInfo; //!< Information about depth image |
280 | |
281 | //Half |
282 | unsigned int m_half1; //!< First half value |
283 | unsigned int m_half2; //!< Second half value |
284 | |
285 | //Update on first CI |
286 | bool m_screenUpdatePending; |
287 | |
288 | }; |
289 | |
290 | #endif |