1 // Copyright (c) 2012- PPSSPP Project.
2 
3 // This program is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, version 2.0 or later versions.
6 
7 // This program is distributed in the hope that it will be useful,
8 // but WITHOUT ANY WARRANTY; without even the implied warranty of
9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10 // GNU General Public License 2.0 for more details.
11 
12 // A copy of the GPL 2.0 should have been included with the program.
13 // If not, see http://www.gnu.org/licenses/
14 
15 // Official git repository and contact information can be found at
16 // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
17 
18 #pragma once
19 
20 enum GECommand {
21 	GE_CMD_NOP = 0,
22 	GE_CMD_VADDR = 0x1,
23 	GE_CMD_IADDR = 0x2,
24 	GE_CMD_PRIM = 0x4,
25 	GE_CMD_BEZIER = 0x5,
26 	GE_CMD_SPLINE = 0x6,
27 	GE_CMD_BOUNDINGBOX = 0x7,
28 	GE_CMD_JUMP = 0x8,
29 	GE_CMD_BJUMP = 0x9,
30 	GE_CMD_CALL = 0xA,
31 	GE_CMD_RET = 0xB,
32 	GE_CMD_END = 0xC,
33 	GE_CMD_SIGNAL = 0xE,
34 	GE_CMD_FINISH = 0xF,
35 	GE_CMD_BASE = 0x10,
36 	GE_CMD_VERTEXTYPE = 0x12,
37 	GE_CMD_OFFSETADDR = 0x13,
38 	GE_CMD_ORIGIN = 0x14,
39 	GE_CMD_REGION1 = 0x15,
40 	GE_CMD_REGION2 = 0x16,
41 	GE_CMD_LIGHTINGENABLE = 0x17,
42 	GE_CMD_LIGHTENABLE0 = 0x18,
43 	GE_CMD_LIGHTENABLE1 = 0x19,
44 	GE_CMD_LIGHTENABLE2 = 0x1A,
45 	GE_CMD_LIGHTENABLE3 = 0x1B,
46 	GE_CMD_DEPTHCLAMPENABLE = 0x1C,
47 	GE_CMD_CULLFACEENABLE = 0x1D,
48 	GE_CMD_TEXTUREMAPENABLE = 0x1E,
49 	GE_CMD_FOGENABLE = 0x1F,
50 	GE_CMD_DITHERENABLE = 0x20,
51 	GE_CMD_ALPHABLENDENABLE = 0x21,
52 	GE_CMD_ALPHATESTENABLE = 0x22,
53 	GE_CMD_ZTESTENABLE = 0x23,
54 	GE_CMD_STENCILTESTENABLE = 0x24,
55 	GE_CMD_ANTIALIASENABLE = 0x25,
56 	GE_CMD_PATCHCULLENABLE = 0x26,
57 	GE_CMD_COLORTESTENABLE = 0x27,
58 	GE_CMD_LOGICOPENABLE = 0x28,
59 	GE_CMD_BONEMATRIXNUMBER = 0x2A,
60 	GE_CMD_BONEMATRIXDATA = 0x2B,
61 	GE_CMD_MORPHWEIGHT0 = 0x2C,
62 	GE_CMD_MORPHWEIGHT1 = 0x2D,
63 	GE_CMD_MORPHWEIGHT2 = 0x2E,
64 	GE_CMD_MORPHWEIGHT3 = 0x2F,
65 	GE_CMD_MORPHWEIGHT4 = 0x30,
66 	GE_CMD_MORPHWEIGHT5 = 0x31,
67 	GE_CMD_MORPHWEIGHT6 = 0x32,
68 	GE_CMD_MORPHWEIGHT7 = 0x33,
69 	GE_CMD_PATCHDIVISION = 0x36,
70 	GE_CMD_PATCHPRIMITIVE = 0x37,
71 	GE_CMD_PATCHFACING = 0x38,
72 	GE_CMD_WORLDMATRIXNUMBER = 0x3A,
73 	GE_CMD_WORLDMATRIXDATA = 0x3B,
74 	GE_CMD_VIEWMATRIXNUMBER = 0x3C,
75 	GE_CMD_VIEWMATRIXDATA = 0x3D,
76 	GE_CMD_PROJMATRIXNUMBER = 0x3E,
77 	GE_CMD_PROJMATRIXDATA = 0x3F,
78 	GE_CMD_TGENMATRIXNUMBER = 0x40,
79 	GE_CMD_TGENMATRIXDATA = 0x41,
80 	GE_CMD_VIEWPORTXSCALE = 0x42,
81 	GE_CMD_VIEWPORTYSCALE = 0x43,
82 	GE_CMD_VIEWPORTZSCALE = 0x44,
83 	GE_CMD_VIEWPORTXCENTER = 0x45,
84 	GE_CMD_VIEWPORTYCENTER = 0x46,
85 	GE_CMD_VIEWPORTZCENTER = 0x47,
86 	GE_CMD_TEXSCALEU = 0x48,
87 	GE_CMD_TEXSCALEV = 0x49,
88 	GE_CMD_TEXOFFSETU = 0x4A,
89 	GE_CMD_TEXOFFSETV = 0x4B,
90 	GE_CMD_OFFSETX = 0x4C,
91 	GE_CMD_OFFSETY = 0x4D,
92 	GE_CMD_SHADEMODE = 0x50,  // flat or gouraud
93 	GE_CMD_REVERSENORMAL = 0x51,
94 	GE_CMD_MATERIALUPDATE = 0x53,
95 	GE_CMD_MATERIALEMISSIVE = 0x54, //not sure about these but this makes sense
96 	GE_CMD_MATERIALAMBIENT = 0x55,  //gotta try enabling lighting and check :)
97 	GE_CMD_MATERIALDIFFUSE = 0x56,
98 	GE_CMD_MATERIALSPECULAR = 0x57,
99 	GE_CMD_MATERIALALPHA = 0x58,
100 	GE_CMD_MATERIALSPECULARCOEF = 0x5B,
101 	GE_CMD_AMBIENTCOLOR = 0x5C,
102 	GE_CMD_AMBIENTALPHA = 0x5D,
103 	GE_CMD_LIGHTMODE = 0x5E,
104 	GE_CMD_LIGHTTYPE0 = 0x5F,
105 	GE_CMD_LIGHTTYPE1 = 0x60,
106 	GE_CMD_LIGHTTYPE2 = 0x61,
107 	GE_CMD_LIGHTTYPE3 = 0x62,
108 	GE_CMD_LX0 = 0x63,
109 	GE_CMD_LY0,
110 	GE_CMD_LZ0,
111 	GE_CMD_LX1,
112 	GE_CMD_LY1,
113 	GE_CMD_LZ1,
114 	GE_CMD_LX2,
115 	GE_CMD_LY2,
116 	GE_CMD_LZ2,
117 	GE_CMD_LX3,
118 	GE_CMD_LY3,
119 	GE_CMD_LZ3,
120 	GE_CMD_LDX0 = 0x6F,
121 	GE_CMD_LDY0,
122 	GE_CMD_LDZ0,
123 	GE_CMD_LDX1,
124 	GE_CMD_LDY1,
125 	GE_CMD_LDZ1,
126 	GE_CMD_LDX2,
127 	GE_CMD_LDY2,
128 	GE_CMD_LDZ2,
129 	GE_CMD_LDX3,
130 	GE_CMD_LDY3,
131 	GE_CMD_LDZ3,
132 	GE_CMD_LKA0 = 0x7B,
133 	GE_CMD_LKB0,
134 	GE_CMD_LKC0,
135 	GE_CMD_LKA1,
136 	GE_CMD_LKB1,
137 	GE_CMD_LKC1,
138 	GE_CMD_LKA2,
139 	GE_CMD_LKB2,
140 	GE_CMD_LKC2,
141 	GE_CMD_LKA3,
142 	GE_CMD_LKB3,
143 	GE_CMD_LKC3,
144 	GE_CMD_LKS0 = 0x87,
145 	GE_CMD_LKS1,
146 	GE_CMD_LKS2,
147 	GE_CMD_LKS3,
148 	GE_CMD_LKO0 = 0x8b,
149 	GE_CMD_LKO1,
150 	GE_CMD_LKO2,
151 	GE_CMD_LKO3,
152 	GE_CMD_LAC0 = 0x8F,
153 	GE_CMD_LDC0,
154 	GE_CMD_LSC0,
155 	GE_CMD_LAC1,
156 	GE_CMD_LDC1,
157 	GE_CMD_LSC1,
158 	GE_CMD_LAC2,
159 	GE_CMD_LDC2,
160 	GE_CMD_LSC2,
161 	GE_CMD_LAC3,
162 	GE_CMD_LDC3,
163 	GE_CMD_LSC3,
164 	GE_CMD_CULL = 0x9B,
165 	GE_CMD_FRAMEBUFPTR = 0x9C,
166 	GE_CMD_FRAMEBUFWIDTH = 0x9D,
167 	GE_CMD_ZBUFPTR = 0x9E,
168 	GE_CMD_ZBUFWIDTH = 0x9F,
169 	GE_CMD_TEXADDR0 = 0xA0,
170 	GE_CMD_TEXADDR1,
171 	GE_CMD_TEXADDR2,
172 	GE_CMD_TEXADDR3,
173 	GE_CMD_TEXADDR4,
174 	GE_CMD_TEXADDR5,
175 	GE_CMD_TEXADDR6,
176 	GE_CMD_TEXADDR7,
177 	GE_CMD_TEXBUFWIDTH0 = 0xA8,
178 	GE_CMD_TEXBUFWIDTH1,
179 	GE_CMD_TEXBUFWIDTH2,
180 	GE_CMD_TEXBUFWIDTH3,
181 	GE_CMD_TEXBUFWIDTH4,
182 	GE_CMD_TEXBUFWIDTH5,
183 	GE_CMD_TEXBUFWIDTH6,
184 	GE_CMD_TEXBUFWIDTH7,
185 	GE_CMD_CLUTADDR = 0xB0,
186 	GE_CMD_CLUTADDRUPPER = 0xB1,
187 	GE_CMD_TRANSFERSRC,
188 	GE_CMD_TRANSFERSRCW,
189 	GE_CMD_TRANSFERDST,
190 	GE_CMD_TRANSFERDSTW,
191 	GE_CMD_TEXSIZE0=0xB8,
192 	GE_CMD_TEXSIZE1,
193 	GE_CMD_TEXSIZE2,
194 	GE_CMD_TEXSIZE3,
195 	GE_CMD_TEXSIZE4,
196 	GE_CMD_TEXSIZE5,
197 	GE_CMD_TEXSIZE6,
198 	GE_CMD_TEXSIZE7,
199 	GE_CMD_TEXMAPMODE = 0xC0,
200 	GE_CMD_TEXSHADELS = 0xC1,
201 	GE_CMD_TEXMODE = 0xC2,
202 	GE_CMD_TEXFORMAT = 0xC3,
203 	GE_CMD_LOADCLUT = 0xC4,
204 	GE_CMD_CLUTFORMAT = 0xC5,
205 	GE_CMD_TEXFILTER = 0xC6,
206 	GE_CMD_TEXWRAP = 0xC7,
207 	GE_CMD_TEXLEVEL = 0xC8,
208 	GE_CMD_TEXFUNC = 0xC9,
209 	GE_CMD_TEXENVCOLOR = 0xCA,
210 	GE_CMD_TEXFLUSH = 0xCB,
211 	GE_CMD_TEXSYNC = 0xCC,
212 	GE_CMD_FOG1 = 0xCD,
213 	GE_CMD_FOG2 = 0xCE,
214 	GE_CMD_FOGCOLOR = 0xCF,
215 	GE_CMD_TEXLODSLOPE = 0xD0,
216 	GE_CMD_FRAMEBUFPIXFORMAT = 0xD2,
217 	GE_CMD_CLEARMODE = 0xD3,
218 	GE_CMD_SCISSOR1 = 0xD4,
219 	GE_CMD_SCISSOR2 = 0xD5,
220 	GE_CMD_MINZ = 0xD6,
221 	GE_CMD_MAXZ = 0xD7,
222 	GE_CMD_COLORTEST = 0xD8,
223 	GE_CMD_COLORREF = 0xD9,
224 	GE_CMD_COLORTESTMASK = 0xDA,
225 	GE_CMD_ALPHATEST = 0xDB,
226 	GE_CMD_STENCILTEST = 0xDC,
227 	GE_CMD_STENCILOP = 0xDD,
228 	GE_CMD_ZTEST = 0xDE,
229 	GE_CMD_BLENDMODE = 0xDF,
230 	GE_CMD_BLENDFIXEDA = 0xE0,
231 	GE_CMD_BLENDFIXEDB = 0xE1,
232 	GE_CMD_DITH0 = 0xE2,
233 	GE_CMD_DITH1,
234 	GE_CMD_DITH2,
235 	GE_CMD_DITH3,
236 	GE_CMD_LOGICOP = 0xE6,
237 	GE_CMD_ZWRITEDISABLE = 0xE7,
238 	GE_CMD_MASKRGB = 0xE8,
239 	GE_CMD_MASKALPHA = 0xE9,
240 	GE_CMD_TRANSFERSTART = 0xEA,
241 	GE_CMD_TRANSFERSRCPOS = 0xEB,
242 	GE_CMD_TRANSFERDSTPOS = 0xEC,
243 	GE_CMD_TRANSFERSIZE = 0xEE,
244 	GE_CMD_VSCX = 0xF0,
245 	GE_CMD_VSCY = 0xF1,
246 	GE_CMD_VSCZ = 0xF2,
247 	GE_CMD_VTCS = 0xF3,
248 	GE_CMD_VTCT = 0xF4,
249 	GE_CMD_VTCQ = 0xF5,
250 	GE_CMD_VCV = 0xF6,
251 	GE_CMD_VAP = 0xF7,
252 	GE_CMD_VFC = 0xF8,
253 	GE_CMD_VSCV = 0xF9,
254 	GE_CMD_UNKNOWN_03 = 0x03,
255 	GE_CMD_UNKNOWN_0D = 0x0D,
256 	GE_CMD_UNKNOWN_11 = 0x11,
257 	GE_CMD_UNKNOWN_29 = 0x29,
258 	GE_CMD_UNKNOWN_34 = 0x34,
259 	GE_CMD_UNKNOWN_35 = 0x35,
260 	GE_CMD_UNKNOWN_39 = 0x39,
261 	GE_CMD_UNKNOWN_4E = 0x4E,
262 	GE_CMD_UNKNOWN_4F = 0x4F,
263 	GE_CMD_UNKNOWN_52 = 0x52,
264 	GE_CMD_UNKNOWN_59 = 0x59,
265 	GE_CMD_UNKNOWN_5A = 0x5A,
266 	GE_CMD_UNKNOWN_B6 = 0xB6,
267 	GE_CMD_UNKNOWN_B7 = 0xB7,
268 	GE_CMD_UNKNOWN_D1 = 0xD1,
269 	GE_CMD_UNKNOWN_ED = 0xED,
270 	GE_CMD_UNKNOWN_EF = 0xEF,
271 	GE_CMD_UNKNOWN_FA = 0xFA,
272 	GE_CMD_UNKNOWN_FB = 0xFB,
273 	GE_CMD_UNKNOWN_FC = 0xFC,
274 	GE_CMD_UNKNOWN_FD = 0xFD,
275 	GE_CMD_UNKNOWN_FE = 0xFE,
276 	GE_CMD_NOP_FF = 0xFF,
277 };
278 
279 enum GEBufferFormat
280 {
281 	GE_FORMAT_565 = 0,
282 	GE_FORMAT_5551 = 1,
283 	GE_FORMAT_4444 = 2,
284 	GE_FORMAT_8888 = 3,
285 	GE_FORMAT_DEPTH16 = 4,  // Virtual format, just used to pass into Depal
286 	GE_FORMAT_INVALID = 0xFF,
287 };
288 
289 const char *GeBufferFormatToString(GEBufferFormat fmt);
IsGeBufferFormat16BitColor(GEBufferFormat fmt)290 inline bool IsGeBufferFormat16BitColor(GEBufferFormat fmt) {
291 	return (int)fmt < 3;
292 }
293 
294 #define GE_VTYPE_TRANSFORM (0<<23)
295 #define GE_VTYPE_THROUGH   (1<<23)
296 #define GE_VTYPE_THROUGH_MASK (1<<23)
297 
298 #define GE_VTYPE_TC_NONE  (0<<0)
299 #define GE_VTYPE_TC_8BIT  (1<<0)
300 #define GE_VTYPE_TC_16BIT (2<<0)
301 #define GE_VTYPE_TC_FLOAT (3<<0)
302 #define GE_VTYPE_TC_MASK  (3<<0)
303 #define GE_VTYPE_TC_SHIFT 0
304 
305 #define GE_VTYPE_COL_NONE (0<<2)
306 #define GE_VTYPE_COL_565  (4<<2)
307 #define GE_VTYPE_COL_5551 (5<<2)
308 #define GE_VTYPE_COL_4444 (6<<2)
309 #define GE_VTYPE_COL_8888 (7<<2)
310 #define GE_VTYPE_COL_MASK (7<<2)
311 #define GE_VTYPE_COL_SHIFT 2
312 
313 #define GE_VTYPE_NRM_NONE  (0<<5)
314 #define GE_VTYPE_NRM_8BIT  (1<<5)
315 #define GE_VTYPE_NRM_16BIT (2<<5)
316 #define GE_VTYPE_NRM_FLOAT (3<<5)
317 #define GE_VTYPE_NRM_MASK  (3<<5)
318 #define GE_VTYPE_NRM_SHIFT 5
319 
320 //#define GE_VTYPE_POSITION_NONE  (0<<5)
321 #define GE_VTYPE_POS_8BIT  (1<<7)
322 #define GE_VTYPE_POS_16BIT (2<<7)
323 #define GE_VTYPE_POS_FLOAT (3<<7)
324 #define GE_VTYPE_POS_MASK  (3<<7)
325 #define GE_VTYPE_POS_SHIFT 7
326 
327 #define GE_VTYPE_WEIGHT_NONE  (0<<9)
328 #define GE_VTYPE_WEIGHT_8BIT  (1<<9)
329 #define GE_VTYPE_WEIGHT_16BIT (2<<9)
330 #define GE_VTYPE_WEIGHT_FLOAT (3<<9)
331 #define GE_VTYPE_WEIGHT_MASK  (3<<9)
332 #define GE_VTYPE_WEIGHT_SHIFT 9
333 
334 #define GE_VTYPE_WEIGHTCOUNT_MASK  (7<<14)
335 #define GE_VTYPE_WEIGHTCOUNT_SHIFT 14
336 
337 #define GE_VTYPE_MORPHCOUNT_MASK  (7<<18)
338 #define GE_VTYPE_MORPHCOUNT_SHIFT 18
339 
340 #define GE_VTYPE_IDX_NONE  (0<<11)
341 #define GE_VTYPE_IDX_8BIT  (1<<11)
342 #define GE_VTYPE_IDX_16BIT (2<<11)
343 #define GE_VTYPE_IDX_32BIT (3<<11)
344 #define GE_VTYPE_IDX_MASK  (3<<11)
345 #define GE_VTYPE_IDX_SHIFT 11
346 
347 #define GE_CLEARMODE_COLOR (1<<8)
348 #define GE_CLEARMODE_ALPHA (1<<9) //or stencil?
349 #define GE_CLEARMODE_Z     (1<<10)
350 #define GE_CLEARMODE_ALL (GE_CLEARMODE_COLOR|GE_CLEARMODE_ALPHA|GE_CLEARMODE_Z)
351 
352 enum GEMatrixType {
353 	GE_MTX_BONE0 = 0,
354 	GE_MTX_BONE1,
355 	GE_MTX_BONE2,
356 	GE_MTX_BONE3,
357 	GE_MTX_BONE4,
358 	GE_MTX_BONE5,
359 	GE_MTX_BONE6,
360 	GE_MTX_BONE7,
361 	GE_MTX_WORLD,
362 	GE_MTX_VIEW,
363 	GE_MTX_PROJECTION,
364 	GE_MTX_TEXGEN,
365 };
366 
367 enum GEComparison
368 {
369 	GE_COMP_NEVER = 0,
370 	GE_COMP_ALWAYS = 1,
371 	GE_COMP_EQUAL = 2,
372 	GE_COMP_NOTEQUAL = 3,
373 	GE_COMP_LESS = 4,
374 	GE_COMP_LEQUAL = 5,
375 	GE_COMP_GREATER = 6,
376 	GE_COMP_GEQUAL = 7,
377 };
378 
379 enum GEShadeMode
380 {
381 	GE_SHADE_FLAT = 0,
382 	GE_SHADE_GOURAUD = 1,
383 };
384 
385 enum GELightType
386 {
387 	GE_LIGHTTYPE_DIRECTIONAL = 0,
388 	GE_LIGHTTYPE_POINT = 1,
389 	GE_LIGHTTYPE_SPOT = 2,
390 	GE_LIGHTTYPE_UNKNOWN = 3,
391 };
392 
393 enum GELightColorSetting
394 {
395 	GE_LIGHTCOLOR_AMBIENT = 0,
396 	GE_LIGHTCOLOR_DIFFUSE = 1,
397 	GE_LIGHTCOLOR_SPECULAR = 2,
398 };
399 
400 enum GELightComputation
401 {
402 	GE_LIGHTCOMP_ONLYDIFFUSE = 0,
403 	GE_LIGHTCOMP_BOTH = 1,
404 	GE_LIGHTCOMP_ONLYPOWDIFFUSE = 2,
405 };
406 
407 enum GETextureFormat
408 {
409 	GE_TFMT_5650 = 0,
410 	GE_TFMT_5551 = 1,
411 	GE_TFMT_4444 = 2,
412 	GE_TFMT_8888 = 3,
413 	GE_TFMT_CLUT4 = 4,
414 	GE_TFMT_CLUT8 = 5,
415 	GE_TFMT_CLUT16 = 6,
416 	GE_TFMT_CLUT32 = 7,
417 	GE_TFMT_DXT1 = 8,
418 	GE_TFMT_DXT3 = 9,
419 	GE_TFMT_DXT5 = 10,
420 };
421 
IsClutFormat(GETextureFormat tfmt)422 inline bool IsClutFormat(GETextureFormat tfmt) {
423 	return tfmt == GE_TFMT_CLUT4 || tfmt == GE_TFMT_CLUT8 || tfmt == GE_TFMT_CLUT16 || tfmt == GE_TFMT_CLUT32;
424 }
IsDXTFormat(GETextureFormat tfmt)425 inline bool IsDXTFormat(GETextureFormat tfmt) {
426 	return tfmt == GE_TFMT_DXT1 || tfmt == GE_TFMT_DXT3 || tfmt == GE_TFMT_DXT5;
427 }
IsTextureFormatBufferCompatible(GETextureFormat tfmt)428 inline bool IsTextureFormatBufferCompatible(GETextureFormat tfmt) {
429 	return (int)tfmt < 4;
430 }
IsBufferFormat16Bit(GEBufferFormat bfmt)431 inline bool IsBufferFormat16Bit(GEBufferFormat bfmt) {
432 	return (int)bfmt < 3;
433 }
IsTextureFormat16Bit(GETextureFormat tfmt)434 inline bool IsTextureFormat16Bit(GETextureFormat tfmt) {
435 	return (int)tfmt < 3;
436 }
TextureFormatMatchesBufferFormat(GETextureFormat fmt,GEBufferFormat bfmt)437 inline bool TextureFormatMatchesBufferFormat(GETextureFormat fmt, GEBufferFormat bfmt) {
438 	// First four matches perfectly.
439 	if ((int)fmt < 4) {
440 		return (int)fmt == (int)bfmt;
441 	} else {
442 		return false;
443 	}
444 }
445 // only applicable if IsTextureFormatBufferCompatible(fmt)
TextureFormatToBufferFormat(GETextureFormat bfmt)446 inline GEBufferFormat TextureFormatToBufferFormat(GETextureFormat bfmt) {
447 	return (GEBufferFormat)(int)bfmt;
448 }
449 
450 enum GETexLevelMode {
451 	GE_TEXLEVEL_MODE_AUTO = 0,
452 	GE_TEXLEVEL_MODE_CONST = 1,
453 	GE_TEXLEVEL_MODE_SLOPE = 2,
454 	GE_TEXLEVEL_MODE_UNKNOWN = 3,  // Behaves like CONST.
455 };
456 
457 enum GEMaterialColorSetting
458 {
459 	GE_MATERIALCOLOR_EMISSIVE = 0,
460 	GE_MATERIALCOLOR_AMBIENT = 1,
461 	GE_MATERIALCOLOR_DIFFUSE = 2,
462 	GE_MATERIALCOLOR_SPECULAR = 3,
463 };
464 
465 enum GEBlendMode
466 {
467 	GE_BLENDMODE_MUL_AND_ADD = 0,
468 	GE_BLENDMODE_MUL_AND_SUBTRACT = 1,
469 	GE_BLENDMODE_MUL_AND_SUBTRACT_REVERSE = 2,
470 	GE_BLENDMODE_MIN = 3,
471 	GE_BLENDMODE_MAX = 4,
472 	GE_BLENDMODE_ABSDIFF = 5,
473 };
474 
475 enum GEBlendSrcFactor
476 {
477 	GE_SRCBLEND_DSTCOLOR,
478 	GE_SRCBLEND_INVDSTCOLOR,
479 	GE_SRCBLEND_SRCALPHA,
480 	GE_SRCBLEND_INVSRCALPHA,
481 	GE_SRCBLEND_DSTALPHA,
482 	GE_SRCBLEND_INVDSTALPHA,
483 	GE_SRCBLEND_DOUBLESRCALPHA,
484 	GE_SRCBLEND_DOUBLEINVSRCALPHA,
485 	GE_SRCBLEND_DOUBLEDSTALPHA,
486 	GE_SRCBLEND_DOUBLEINVDSTALPHA,
487 	GE_SRCBLEND_FIXA,
488 };
489 
490 enum GEBlendDstFactor
491 {
492 	GE_DSTBLEND_SRCCOLOR,
493 	GE_DSTBLEND_INVSRCCOLOR,
494 	GE_DSTBLEND_SRCALPHA,
495 	GE_DSTBLEND_INVSRCALPHA,
496 	GE_DSTBLEND_DSTALPHA,
497 	GE_DSTBLEND_INVDSTALPHA,
498 	GE_DSTBLEND_DOUBLESRCALPHA,
499 	GE_DSTBLEND_DOUBLEINVSRCALPHA,
500 	GE_DSTBLEND_DOUBLEDSTALPHA,
501 	GE_DSTBLEND_DOUBLEINVDSTALPHA,
502 	GE_DSTBLEND_FIXB,
503 };
504 
505 enum GETexFunc
506 {
507 	GE_TEXFUNC_MODULATE = 0,
508 	GE_TEXFUNC_DECAL = 1,
509 	GE_TEXFUNC_BLEND = 2,
510 	GE_TEXFUNC_REPLACE = 3,
511 	GE_TEXFUNC_ADD = 4,
512 	GE_TEXFUNC_UNKNOWN1 = 5,
513 	GE_TEXFUNC_UNKNOWN2 = 6,
514 	GE_TEXFUNC_UNKNOWN3 = 7,
515 };
516 
517 enum GEStencilOp
518 {
519 	GE_STENCILOP_KEEP = 0,
520 	GE_STENCILOP_ZERO = 1,
521 	GE_STENCILOP_REPLACE = 2,
522 	GE_STENCILOP_INVERT = 3,
523 	GE_STENCILOP_INCR = 4,
524 	GE_STENCILOP_DECR = 5,
525 };
526 
527 enum GETextureFiltering
528 {
529 	GE_TFILT_NEAREST = 0,
530 	GE_TFILT_LINEAR = 1,
531 	GE_TFILT_NEAREST_MIPMAP_NEAREST = 4,
532 	GE_TFILT_LINEAR_MIPMAP_NEAREST = 5,
533 	GE_TFILT_NEAREST_MIPMAP_LINEAR = 6,
534 	GE_TFILT_LINEAR_MIPMAP_LINEAR = 7,
535 };
536 
537 enum GETexMapMode
538 {
539 	GE_TEXMAP_TEXTURE_COORDS = 0,
540 	GE_TEXMAP_TEXTURE_MATRIX = 1,
541 	GE_TEXMAP_ENVIRONMENT_MAP = 2,
542 	GE_TEXMAP_UNKNOWN = 3,
543 };
544 
545 enum GETexProjMapMode
546 {
547 	GE_PROJMAP_POSITION = 0,
548 	GE_PROJMAP_UV = 1,
549 	GE_PROJMAP_NORMALIZED_NORMAL = 2,
550 	GE_PROJMAP_NORMAL = 3,
551 };
552 
553 enum GEPrimitiveType
554 {
555 	GE_PRIM_POINTS = 0,
556 	GE_PRIM_LINES = 1,
557 	GE_PRIM_LINE_STRIP = 2,
558 	GE_PRIM_TRIANGLES = 3,
559 	GE_PRIM_TRIANGLE_STRIP = 4,
560 	GE_PRIM_TRIANGLE_FAN = 5,
561 	GE_PRIM_RECTANGLES = 6,
562 	GE_PRIM_KEEP_PREVIOUS = 7,
563 	GE_PRIM_INVALID = -1,
564 };
565 
566 enum GELogicOp
567 {
568 	GE_LOGIC_CLEAR = 0,
569 	GE_LOGIC_AND = 1,
570 	GE_LOGIC_AND_REVERSE = 2,
571 	GE_LOGIC_COPY = 3,
572 	GE_LOGIC_AND_INVERTED = 4,
573 	GE_LOGIC_NOOP = 5,
574 	GE_LOGIC_XOR = 6,
575 	GE_LOGIC_OR = 7,
576 	GE_LOGIC_NOR = 8,
577 	GE_LOGIC_EQUIV = 9,
578 	GE_LOGIC_INVERTED = 10,
579 	GE_LOGIC_OR_REVERSE = 11,
580 	GE_LOGIC_COPY_INVERTED = 12,
581 	GE_LOGIC_OR_INVERTED = 13,
582 	GE_LOGIC_NAND = 14,
583 	GE_LOGIC_SET = 15,
584 };
585 
586 enum GEPatchPrimType
587 {
588 	GE_PATCHPRIM_TRIANGLES = 0,
589 	GE_PATCHPRIM_LINES = 1,
590 	GE_PATCHPRIM_POINTS = 2,
591 	// Treated as points.
592 	GE_PATCHPRIM_UNKNOWN = 3,
593 };
594 
PatchPrimToPrim(GEPatchPrimType type)595 inline GEPrimitiveType PatchPrimToPrim(GEPatchPrimType type) {
596 	switch (type) {
597 	case GE_PATCHPRIM_TRIANGLES: return GE_PRIM_TRIANGLES;
598 	case GE_PATCHPRIM_LINES: return GE_PRIM_LINES;
599 	case GE_PATCHPRIM_POINTS: return GE_PRIM_POINTS;
600 	case GE_PATCHPRIM_UNKNOWN: default: return GE_PRIM_POINTS; // Treated as points.
601 	}
602 }
603 
604 enum GEPaletteFormat
605 {
606 	GE_CMODE_16BIT_BGR5650,
607 	GE_CMODE_16BIT_ABGR5551,
608 	GE_CMODE_16BIT_ABGR4444,
609 	GE_CMODE_32BIT_ABGR8888,
610 };
611 
612 const char *GEPaletteFormatToString(GEPaletteFormat pfmt);
613 const char *GeTextureFormatToString(GETextureFormat tfmt);
614 const char *GeTextureFormatToString(GETextureFormat tfmt, GEPaletteFormat pfmt);
615