Rice Video Plugin for GLES1.1
[mupen64plus-pandora.git] / source / rice_gles / src / DecodedMux.h
CommitLineData
d07c171f 1/*
2Copyright (C) 2002 Rice1964
3
4This program is free software; you can redistribute it and/or
5modify it under the terms of the GNU General Public License
6as published by the Free Software Foundation; either version 2
7of the License, or (at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program; if not, write to the Free Software
16Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17*/
18
19#ifndef _DECODEDMUX_H_
20#define _DECODEDMUX_H_
21
22#include <string.h>
23#include <stdio.h>
24
25#include "typedefs.h"
26#include "CombinerDefs.h"
27
28typedef enum {
29 N64Cycle0RGB=0,
30 N64Cycle0Alpha=1,
31 N64Cycle1RGB=2,
32 N64Cycle1Alpha=3,
33} N64StageNumberType;
34
35typedef union {
36 struct {
37 uint32 dwMux0;
38 uint32 dwMux1;
39 };
40 uint64 Mux64;
41} MuxType;
42
43typedef struct {
44 MuxType ori_mux;
45 MuxType simple_mux;
46} SimpleMuxMapType;
47
48class DecodedMux
49{
50public:
51 union {
52 struct {
53 uint8 aRGB0;
54 uint8 bRGB0;
55 uint8 cRGB0;
56 uint8 dRGB0;
57
58 uint8 aA0;
59 uint8 bA0;
60 uint8 cA0;
61 uint8 dA0;
62
63 uint8 aRGB1;
64 uint8 bRGB1;
65 uint8 cRGB1;
66 uint8 dRGB1;
67
68 uint8 aA1;
69 uint8 bA1;
70 uint8 cA1;
71 uint8 dA1;
72 };
73 uint8 m_bytes[16];
74 uint32 m_dWords[4];
75 N64CombinerType m_n64Combiners[4];
76 };
77
78 union {
79 struct {
80 uint32 m_dwMux0;
81 uint32 m_dwMux1;
82 };
83 uint64 m_u64Mux;
84 };
85
86 CombinerFormatType splitType[4];
87 CombinerFormatType mType;
88
89 uint32 m_dwShadeColorChannelFlag;
90 uint32 m_dwShadeAlphaChannelFlag;
91 uint32 m_ColorTextureFlag[2]; // I may use a texture to represent a constant color
92 // when there are more constant colors are used than
93 // the system can support
94
95 bool m_bShadeIsUsed[2]; // 0 for color channel, 1 for alpha channel
96 bool m_bTexel0IsUsed;
97 bool m_bTexel1IsUsed;
98
99 int m_maxConstants; // OpenGL 1.1 does not really support a constant color in combiner
100 // must use shade for constants;
101 int m_maxTextures; // 1 or 2
102
103
104 void Decode(uint32 dwMux0, uint32 dwMux1);
105 virtual void Hack(void);
106 bool isUsed(uint8 fac, uint8 mask=MUX_MASK);
107 bool isUsedInAlphaChannel(uint8 fac, uint8 mask=MUX_MASK);
108 bool isUsedInColorChannel(uint8 fac, uint8 mask=MUX_MASK);
109 bool isUsedInCycle(uint8 fac, int cycle, CombineChannel channel, uint8 mask=MUX_MASK);
110 bool isUsedInCycle(uint8 fac, int cycle, uint8 mask=MUX_MASK);
111 uint32 GetCycle(int cycle, CombineChannel channel);
112 uint32 GetCycle(int cycle);
113 CombinerFormatType GetCombinerFormatType(uint32 cycle);
114 void Display(bool simplified=true, FILE *fp=NULL);
115 static char* FormatStr(uint8 val, char *buf);
116 void CheckCombineInCycle1(void);
117 virtual void Simplify(void);
118 virtual void Reformat(bool do_complement = true);
119 virtual void To_AB_Add_CD_Format(void); // Use by TNT,Geforce
120 virtual void To_AB_Add_C_Format(void); // Use by ATI Radeon
121
122 virtual void MergeShadeWithConstants(void);
123 virtual void MergeShadeWithConstantsInChannel(CombineChannel channel);
124 virtual void MergeConstants(void);
125 virtual void UseShadeForConstant(void);
126 virtual void UseTextureForConstant(void);
127
128 void ConvertComplements();
129 int HowManyConstFactors();
130 int HowManyTextures();
131 void MergeConstFactors();
132 virtual void SplitComplexStages(); // Only used if the combiner supports more than 1 stages
133 void ConvertLODFracTo0();
134 void ReplaceVal(uint8 val1, uint8 val2, int cycle= -1, uint8 mask = MUX_MASK);
135 void Replace1Val(uint8 &val1, const uint8 val2, uint8 mask = MUX_MASK)
136 {
137 val1 &= (~mask);
138 val1 |= val2;
139 }
140 int CountTexels(void);
141 int Count(uint8 val, int cycle= -1, uint8 mask = MUX_MASK);
142
143#ifdef DEBUGGER
144 void DisplayMuxString(const char *prompt);
145 void DisplaySimpliedMuxString(const char *prompt);
146 void DisplayConstantsWithShade(uint32 flag,CombineChannel channel);
147#else
148 void DisplayMuxString(const char *prompt) {}
149 void DisplaySimpliedMuxString(const char *prompt){}
150 void DisplayConstantsWithShade(uint32 flag,CombineChannel channel){}
151 void LogMuxString(const char *prompt, FILE *fp);
152 void LogSimpliedMuxString(const char *prompt, FILE *fp);
153 void LogConstantsWithShade(uint32 flag,CombineChannel channel, FILE *fp);
154#endif
155
156 virtual DecodedMux& operator=(const DecodedMux& mux)
157 {
158 m_dWords[0] = mux.m_dWords[0];
159 m_dWords[1] = mux.m_dWords[1];
160 m_dWords[2] = mux.m_dWords[2];
161 m_dWords[3] = mux.m_dWords[3];
162 m_u64Mux = mux.m_u64Mux;
163 splitType[0] = mux.splitType[0];
164 splitType[1] = mux.splitType[1];
165 splitType[2] = mux.splitType[2];
166 splitType[3] = mux.splitType[3];
167 mType = mux.mType;
168
169 m_dwShadeColorChannelFlag = mux.m_dwShadeColorChannelFlag;
170 m_dwShadeAlphaChannelFlag = mux.m_dwShadeAlphaChannelFlag;
171
172 m_bShadeIsUsed[0] = mux.m_bShadeIsUsed[0];
173 m_bShadeIsUsed[1] = mux.m_bShadeIsUsed[1];
174 m_bTexel0IsUsed = mux.m_bTexel0IsUsed;
175 m_bTexel1IsUsed = mux.m_bTexel1IsUsed;
176
177 m_maxConstants = mux.m_maxConstants;
178 m_maxTextures = mux.m_maxTextures;
179 m_ColorTextureFlag[0] = mux.m_ColorTextureFlag[0];
180 m_ColorTextureFlag[1] = mux.m_ColorTextureFlag[1];
181
182 return *this;
183 }
184
185 static inline bool IsConstFactor(uint8 val)
186 {
187 uint8 v = val&MUX_MASK;
188 return( v == MUX_0 || v == MUX_1 || v == MUX_PRIM || v == MUX_ENV || v == MUX_LODFRAC || v == MUX_PRIMLODFRAC );
189 }
190
191 DecodedMux()
192 {
193 memset(m_bytes, 0, sizeof(m_bytes));
194 mType=CM_FMT_TYPE_NOT_CHECKED;
195 for( int i=0; i<4; i++ )
196 {
197 splitType[i] = CM_FMT_TYPE_NOT_CHECKED;
198 }
199 m_maxConstants = 1;
200 m_maxTextures = 2;
201 }
202
203 virtual ~DecodedMux() {}
204};
205
206class DecodedMuxForPixelShader : public DecodedMux
207{
208public:
209 virtual void Simplify(void);
210 void SplitComplexStages() {};
211};
212
213class DecodedMuxForSemiPixelShader : public DecodedMux
214{
215public:
216 void Reset(void);
217};
218
219class DecodedMuxForOGL14V2 : public DecodedMuxForPixelShader
220{
221public:
222 virtual void Simplify(void);
223 void UseTextureForConstant(void);
224};
225
226typedef struct
227{
228 bool bFurtherFormatForOGL2;
229 bool bUseShadeForConstants;
230 bool bUseTextureForConstants;
231 bool bUseMoreThan2TextureForConstants;
232 bool bReformatToAB_CD;
233 bool bAllowHack;
234 bool bAllowComplimentary;
235 bool bCheckCombineInCycle1;
236 bool bSetLODFracTo0;
237 bool bMergeShadeWithConstants;
238 bool bSplitComplexStage;
239 bool bReformatAgainWithTwoTexels;
240} MuxConverterOptions;
241
242#endif
243
244