PANDORA: Make GLES context compatible with latest driver (FB only, no X11)
[mupen64plus-pandora.git] / source / gles2n64 / src / GBI.h
CommitLineData
34cf4058 1#ifndef GBI_H
2#define GBI_H
3#include "Hash.h"
4#include "Types.h"
5#include <stdio.h>
6
7// Microcode Types
8#define F3D 0
9#define F3DEX 1
10#define F3DEX2 2
11#define L3D 3
12#define L3DEX 4
13#define L3DEX2 5
14#define S2DEX 6
15#define S2DEX2 7
16#define F3DPD 8
17#define F3DDKR 9
18#define F3DWRUS 10
19#define F3DCBFD 11
20#define NONE 12
21
22#ifdef MAINDEF
23const char *MicrocodeTypes[] =
24{
25 "Fast3D",
26 "F3DEX",
27 "F3DEX2",
28 "Line3D",
29 "L3DEX",
30 "L3DEX2",
31 "S2DEX",
32 "S2DEX2",
33 "Perfect Dark",
34 "DKR/JFG",
35 "Waverace US",
36 "Conker's Bad Fur Day",
37 "None",
38};
39#else
40extern const char *MicrocodeTypes[];
41#endif
42
43static const int numMicrocodeTypes = 11;
44
45// Fixed point conversion factors
46#define FIXED2FLOATRECIP1 0.5f
47#define FIXED2FLOATRECIP2 0.25f
48#define FIXED2FLOATRECIP3 0.125f
49#define FIXED2FLOATRECIP4 0.0625f
50#define FIXED2FLOATRECIP5 0.03125f
51#define FIXED2FLOATRECIP6 0.015625f
52#define FIXED2FLOATRECIP7 0.0078125f
53#define FIXED2FLOATRECIP8 0.00390625f
54#define FIXED2FLOATRECIP9 0.001953125f
55#define FIXED2FLOATRECIP10 0.0009765625f
56#define FIXED2FLOATRECIP11 0.00048828125f
57#define FIXED2FLOATRECIP12 0.00024414063f
58#define FIXED2FLOATRECIP13 0.00012207031f
59#define FIXED2FLOATRECIP14 6.1035156e-05f
60#define FIXED2FLOATRECIP15 3.0517578e-05f
61#define FIXED2FLOATRECIP16 1.5258789e-05f
62
63#define _FIXED2FLOAT( v, b ) \
64 ((f32)v * FIXED2FLOATRECIP##b)
65
66// Useful macros for decoding GBI command's parameters
67#define _SHIFTL( v, s, w ) \
68 (((u32)v & ((0x01 << w) - 1)) << s)
69#define _SHIFTR( v, s, w ) \
70 (((u32)v >> s) & ((0x01 << w) - 1))
71
72// BG flags
73#define G_BGLT_LOADBLOCK 0x0033
74#define G_BGLT_LOADTILE 0xfff4
75
76#define G_BG_FLAG_FLIPS 0x01
77#define G_BG_FLAG_FLIPT 0x10
78
79// Sprite object render modes
80#define G_OBJRM_NOTXCLAMP 0x01
81#define G_OBJRM_XLU 0x02 /* Ignored */
82#define G_OBJRM_ANTIALIAS 0x04 /* Ignored */
83#define G_OBJRM_BILERP 0x08
84#define G_OBJRM_SHRINKSIZE_1 0x10
85#define G_OBJRM_SHRINKSIZE_2 0x20
86#define G_OBJRM_WIDEN 0x40
87
88// Sprite texture loading types
89#define G_OBJLT_TXTRBLOCK 0x00001033
90#define G_OBJLT_TXTRTILE 0x00fc1034
91#define G_OBJLT_TLUT 0x00000030
92
93
94// These are all the constant flags
95#define G_ZBUFFER 0x00000001
96#define G_SHADE 0x00000004
97#define G_FOG 0x00010000
98#define G_LIGHTING 0x00020000
99#define G_TEXTURE_GEN 0x00040000
100#define G_TEXTURE_GEN_LINEAR 0x00080000
101#define G_LOD 0x00100000
102
103#define G_MV_MMTX 2
104#define G_MV_PMTX 6
105#define G_MV_LIGHT 10
106#define G_MV_POINT 12
107#define G_MV_MATRIX 14
108
109#define G_MVO_LOOKATX 0
110#define G_MVO_LOOKATY 24
111#define G_MVO_L0 48
112#define G_MVO_L1 72
113#define G_MVO_L2 96
114#define G_MVO_L3 120
115#define G_MVO_L4 144
116#define G_MVO_L5 168
117#define G_MVO_L6 192
118#define G_MVO_L7 216
119
120#define G_MV_LOOKATY 0x82
121#define G_MV_LOOKATX 0x84
122#define G_MV_L0 0x86
123#define G_MV_L1 0x88
124#define G_MV_L2 0x8a
125#define G_MV_L3 0x8c
126#define G_MV_L4 0x8e
127#define G_MV_L5 0x90
128#define G_MV_L6 0x92
129#define G_MV_L7 0x94
130#define G_MV_TXTATT 0x96
131#define G_MV_MATRIX_1 0x9E
132#define G_MV_MATRIX_2 0x98
133#define G_MV_MATRIX_3 0x9A
134#define G_MV_MATRIX_4 0x9C
135
136#define G_MW_MATRIX 0x00
137#define G_MW_NUMLIGHT 0x02
138#define G_MW_CLIP 0x04
139#define G_MW_SEGMENT 0x06
140#define G_MW_FOG 0x08
141#define G_MW_LIGHTCOL 0x0A
142#define G_MW_FORCEMTX 0x0C
143#define G_MW_POINTS 0x0C
144#define G_MW_PERSPNORM 0x0E
145#define G_MV_COORDMOD 0x10 //Conker Bad Fur Day
146
147#define G_MWO_NUMLIGHT 0x00
148#define G_MWO_CLIP_RNX 0x04
149#define G_MWO_CLIP_RNY 0x0c
150#define G_MWO_CLIP_RPX 0x14
151#define G_MWO_CLIP_RPY 0x1c
152#define G_MWO_SEGMENT_0 0x00
153#define G_MWO_SEGMENT_1 0x01
154#define G_MWO_SEGMENT_2 0x02
155#define G_MWO_SEGMENT_3 0x03
156#define G_MWO_SEGMENT_4 0x04
157#define G_MWO_SEGMENT_5 0x05
158#define G_MWO_SEGMENT_6 0x06
159#define G_MWO_SEGMENT_7 0x07
160#define G_MWO_SEGMENT_8 0x08
161#define G_MWO_SEGMENT_9 0x09
162#define G_MWO_SEGMENT_A 0x0a
163#define G_MWO_SEGMENT_B 0x0b
164#define G_MWO_SEGMENT_C 0x0c
165#define G_MWO_SEGMENT_D 0x0d
166#define G_MWO_SEGMENT_E 0x0e
167#define G_MWO_SEGMENT_F 0x0f
168#define G_MWO_FOG 0x00
169
170#define G_MWO_MATRIX_XX_XY_I 0x00
171#define G_MWO_MATRIX_XZ_XW_I 0x04
172#define G_MWO_MATRIX_YX_YY_I 0x08
173#define G_MWO_MATRIX_YZ_YW_I 0x0C
174#define G_MWO_MATRIX_ZX_ZY_I 0x10
175#define G_MWO_MATRIX_ZZ_ZW_I 0x14
176#define G_MWO_MATRIX_WX_WY_I 0x18
177#define G_MWO_MATRIX_WZ_WW_I 0x1C
178#define G_MWO_MATRIX_XX_XY_F 0x20
179#define G_MWO_MATRIX_XZ_XW_F 0x24
180#define G_MWO_MATRIX_YX_YY_F 0x28
181#define G_MWO_MATRIX_YZ_YW_F 0x2C
182#define G_MWO_MATRIX_ZX_ZY_F 0x30
183#define G_MWO_MATRIX_ZZ_ZW_F 0x34
184#define G_MWO_MATRIX_WX_WY_F 0x38
185#define G_MWO_MATRIX_WZ_WW_F 0x3C
186#define G_MWO_POINT_RGBA 0x10
187#define G_MWO_POINT_ST 0x14
188#define G_MWO_POINT_XYSCREEN 0x18
189#define G_MWO_POINT_ZSCREEN 0x1C
190
191#ifdef DEBUG
192static const char *MWOPointText[] =
193{
194 "G_MWO_POINT_RGBA",
195 "G_MWO_POINT_ST",
196 "G_MWO_POINT_XYSCREEN",
197 "G_MWO_POINT_ZSCREEN"
198};
199
200static const char *MWOMatrixText[] =
201{
202 "G_MWO_MATRIX_XX_XY_I", "G_MWO_MATRIX_XZ_XW_I", "G_MWO_MATRIX_YX_YY_I", "G_MWO_MATRIX_YZ_YW_I",
203 "G_MWO_MATRIX_ZX_ZY_I", "G_MWO_MATRIX_ZZ_ZW_I", "G_MWO_MATRIX_WX_WY_I", "G_MWO_MATRIX_WZ_WW_I",
204 "G_MWO_MATRIX_XX_XY_F", "G_MWO_MATRIX_XZ_XW_F", "G_MWO_MATRIX_YX_YY_F", "G_MWO_MATRIX_YZ_YW_F",
205 "G_MWO_MATRIX_ZX_ZY_F", "G_MWO_MATRIX_ZZ_ZW_F", "G_MWO_MATRIX_WX_WY_F", "G_MWO_MATRIX_WZ_WW_F"
206};
207#endif
208
209// These flags change between ucodes
210extern u32 G_MTX_STACKSIZE;
211
212extern u32 G_MTX_MODELVIEW;
213extern u32 G_MTX_PROJECTION;
214extern u32 G_MTX_MUL;
215extern u32 G_MTX_LOAD;
216extern u32 G_MTX_NOPUSH;
217extern u32 G_MTX_PUSH;
218
219extern u32 G_TEXTURE_ENABLE;
220extern u32 G_SHADING_SMOOTH;
221extern u32 G_CULL_FRONT;
222extern u32 G_CULL_BACK;
223extern u32 G_CULL_BOTH;
224extern u32 G_CLIPPING;
225
226extern u32 G_MV_VIEWPORT;
227
228extern u32 G_MWO_aLIGHT_1, G_MWO_bLIGHT_1;
229extern u32 G_MWO_aLIGHT_2, G_MWO_bLIGHT_2;
230extern u32 G_MWO_aLIGHT_3, G_MWO_bLIGHT_3;
231extern u32 G_MWO_aLIGHT_4, G_MWO_bLIGHT_4;
232extern u32 G_MWO_aLIGHT_5, G_MWO_bLIGHT_5;
233extern u32 G_MWO_aLIGHT_6, G_MWO_bLIGHT_6;
234extern u32 G_MWO_aLIGHT_7, G_MWO_bLIGHT_7;
235extern u32 G_MWO_aLIGHT_8, G_MWO_bLIGHT_8;
236
237// Image formats
238#define G_IM_FMT_RGBA 0
239#define G_IM_FMT_YUV 1
240#define G_IM_FMT_CI 2
241#define G_IM_FMT_IA 3
242#define G_IM_FMT_I 4
243#define G_IM_FMT_CI_IA 5 //not real
244
245// Image sizes
246#define G_IM_SIZ_4b 0
247#define G_IM_SIZ_8b 1
248#define G_IM_SIZ_16b 2
249#define G_IM_SIZ_32b 3
250#define G_IM_SIZ_DD 5
251
252#define G_TX_MIRROR 0x1
253#define G_TX_CLAMP 0x2
254
255#ifdef DEBUG
256static const char *ImageFormatText[] =
257{
258 "G_IM_FMT_RGBA",
259 "G_IM_FMT_YUV",
260 "G_IM_FMT_CI",
261 "G_IM_FMT_IA",
262 "G_IM_FMT_I",
263 "G_IM_FMT_INVALID",
264 "G_IM_FMT_INVALID",
265 "G_IM_FMT_INVALID"
266};
267
268static const char *ImageSizeText[] =
269{
270 "G_IM_SIZ_4b",
271 "G_IM_SIZ_8b",
272 "G_IM_SIZ_16b",
273 "G_IM_SIZ_32b"
274};
275
276static const char *SegmentText[] =
277{
278 "G_MWO_SEGMENT_0", "G_MWO_SEGMENT_1", "G_MWO_SEGMENT_2", "G_MWO_SEGMENT_3",
279 "G_MWO_SEGMENT_4", "G_MWO_SEGMENT_5", "G_MWO_SEGMENT_6", "G_MWO_SEGMENT_7",
280 "G_MWO_SEGMENT_8", "G_MWO_SEGMENT_9", "G_MWO_SEGMENT_A", "G_MWO_SEGMENT_B",
281 "G_MWO_SEGMENT_C", "G_MWO_SEGMENT_D", "G_MWO_SEGMENT_E", "G_MWO_SEGMENT_F"
282};
283#endif
284
285#define G_NOOP 0x00
286
287#define G_IMMFIRST -65
288
289// These GBI commands are common to all ucodes
290#define G_SETCIMG 0xFF /* -1 */
291#define G_SETZIMG 0xFE /* -2 */
292#define G_SETTIMG 0xFD /* -3 */
293#define G_SETCOMBINE 0xFC /* -4 */
294#define G_SETENVCOLOR 0xFB /* -5 */
295#define G_SETPRIMCOLOR 0xFA /* -6 */
296#define G_SETBLENDCOLOR 0xF9 /* -7 */
297#define G_SETFOGCOLOR 0xF8 /* -8 */
298#define G_SETFILLCOLOR 0xF7 /* -9 */
299#define G_FILLRECT 0xF6 /* -10 */
300#define G_SETTILE 0xF5 /* -11 */
301#define G_LOADTILE 0xF4 /* -12 */
302#define G_LOADBLOCK 0xF3 /* -13 */
303#define G_SETTILESIZE 0xF2 /* -14 */
304#define G_LOADTLUT 0xF0 /* -16 */
305#define G_RDPSETOTHERMODE 0xEF /* -17 */
306#define G_SETPRIMDEPTH 0xEE /* -18 */
307#define G_SETSCISSOR 0xED /* -19 */
308#define G_SETCONVERT 0xEC /* -20 */
309#define G_SETKEYR 0xEB /* -21 */
310#define G_SETKEYGB 0xEA /* -22 */
311#define G_RDPFULLSYNC 0xE9 /* -23 */
312#define G_RDPTILESYNC 0xE8 /* -24 */
313#define G_RDPPIPESYNC 0xE7 /* -25 */
314#define G_RDPLOADSYNC 0xE6 /* -26 */
315#define G_TEXRECTFLIP 0xE5 /* -27 */
316#define G_TEXRECT 0xE4 /* -28 */
317
318#define G_RDPNOOP 0xC0
319
320#define G_TRI_FILL 0xC8 /* fill triangle: 11001000 */
321#define G_TRI_FILL_ZBUFF 0xC9 /* fill, zbuff triangle: 11001001 */
322#define G_TRI_TXTR 0xCA /* texture triangle: 11001010 */
323#define G_TRI_TXTR_ZBUFF 0xCB /* texture, zbuff triangle: 11001011 */
324#define G_TRI_SHADE 0xCC /* shade triangle: 11001100 */
325#define G_TRI_SHADE_ZBUFF 0xCD /* shade, zbuff triangle: 11001101 */
326#define G_TRI_SHADE_TXTR 0xCE /* shade, texture triangle: 11001110 */
327#define G_TRI_SHADE_TXTR_ZBUFF 0xCF /* shade, txtr, zbuff trngl: 11001111 */
328
329/*
330 * G_SETOTHERMODE_L sft: shift count
331 */
332#define G_MDSFT_ALPHACOMPARE 0
333#define G_MDSFT_ZSRCSEL 2
334#define G_MDSFT_RENDERMODE 3
335#define G_MDSFT_BLENDER 16
336
337/*
338 * G_SETOTHERMODE_H sft: shift count
339 */
340#define G_MDSFT_BLENDMASK 0 /* unsupported */
341#define G_MDSFT_ALPHADITHER 4
342#define G_MDSFT_RGBDITHER 6
343
344#define G_MDSFT_COMBKEY 8
345#define G_MDSFT_TEXTCONV 9
346#define G_MDSFT_TEXTFILT 12
347#define G_MDSFT_TEXTLUT 14
348#define G_MDSFT_TEXTLOD 16
349#define G_MDSFT_TEXTDETAIL 17
350#define G_MDSFT_TEXTPERSP 19
351#define G_MDSFT_CYCLETYPE 20
352#define G_MDSFT_COLORDITHER 22 /* unsupported in HW 2.0 */
353#define G_MDSFT_PIPELINE 23
354
355/* G_SETOTHERMODE_H gPipelineMode */
356#define G_PM_1PRIMITIVE 1
357#define G_PM_NPRIMITIVE 0
358
359/* G_SETOTHERMODE_H gSetCycleType */
360#define G_CYC_1CYCLE 0
361#define G_CYC_2CYCLE 1
362#define G_CYC_COPY 2
363#define G_CYC_FILL 3
364
365/* G_SETOTHERMODE_H gSetTexturePersp */
366#define G_TP_NONE 0
367#define G_TP_PERSP 1
368
369/* G_SETOTHERMODE_H gSetTextureDetail */
370#define G_TD_CLAMP 0
371#define G_TD_SHARPEN 1
372#define G_TD_DETAIL 2
373
374/* G_SETOTHERMODE_H gSetTextureLOD */
375#define G_TL_TILE 0
376#define G_TL_LOD 1
377
378/* G_SETOTHERMODE_H gSetTextureLUT */
379#define G_TT_NONE 0
380#define G_TT_RGBA16 2
381#define G_TT_IA16 3
382
383/* G_SETOTHERMODE_H gSetTextureFilter */
384#define G_TF_POINT 0
385#define G_TF_AVERAGE 3
386#define G_TF_BILERP 2
387
388/* G_SETOTHERMODE_H gSetTextureConvert */
389#define G_TC_CONV 0
390#define G_TC_FILTCONV 5
391#define G_TC_FILT 6
392
393/* G_SETOTHERMODE_H gSetCombineKey */
394#define G_CK_NONE 0
395#define G_CK_KEY 1
396
397/* G_SETOTHERMODE_H gSetColorDither */
398#define G_CD_MAGICSQ 0
399#define G_CD_BAYER 1
400#define G_CD_NOISE 2
401
402#define G_CD_DISABLE 3
403#define G_CD_ENABLE G_CD_NOISE /* HW 1.0 compatibility mode */
404
405/* G_SETOTHERMODE_H gSetAlphaDither */
406#define G_AD_PATTERN 0
407#define G_AD_NOTPATTERN 1
408#define G_AD_NOISE 2
409#define G_AD_DISABLE 3
410
411/* G_SETOTHERMODE_L gSetAlphaCompare */
412#define G_AC_NONE 0
413#define G_AC_THRESHOLD 1
414#define G_AC_DITHER 3
415
416/* G_SETOTHERMODE_L gSetDepthSource */
417#define G_ZS_PIXEL 0
418#define G_ZS_PRIM 1
419
420/* G_SETOTHERMODE_L gSetRenderMode */
421#define AA_EN 1
422#define Z_CMP 1
423#define Z_UPD 1
424#define IM_RD 1
425#define CLR_ON_CVG 1
426#define CVG_DST_CLAMP 0
427#define CVG_DST_WRAP 1
428#define CVG_DST_FULL 2
429#define CVG_DST_SAVE 3
430#define ZMODE_OPA 0
431#define ZMODE_INTER 1
432#define ZMODE_XLU 2
433#define ZMODE_DEC 3
434#define CVG_X_ALPHA 1
435#define ALPHA_CVG_SEL 1
436#define FORCE_BL 1
437#define TEX_EDGE 0 // not used
438
439#define G_SC_NON_INTERLACE 0
440#define G_SC_EVEN_INTERLACE 2
441#define G_SC_ODD_INTERLACE 3
442
443#ifdef DEBUG
444static const char *AAEnableText = "AA_EN";
445static const char *DepthCompareText = "Z_CMP";
446static const char *DepthUpdateText = "Z_UPD";
447static const char *ClearOnCvgText = "CLR_ON_CVG";
448static const char *CvgXAlphaText = "CVG_X_ALPHA";
449static const char *AlphaCvgSelText = "ALPHA_CVG_SEL";
450static const char *ForceBlenderText = "FORCE_BL";
451
452static const char *AlphaCompareText[] =
453{
454 "G_AC_NONE", "G_AC_THRESHOLD", "G_AC_INVALID", "G_AC_DITHER"
455};
456
457static const char *DepthSourceText[] =
458{
459 "G_ZS_PIXEL", "G_ZS_PRIM"
460};
461
462static const char *AlphaDitherText[] =
463{
464 "G_AD_PATTERN", "G_AD_NOTPATTERN", "G_AD_NOISE", "G_AD_DISABLE"
465};
466
467static const char *ColorDitherText[] =
468{
469 "G_CD_MAGICSQ", "G_CD_BAYER", "G_CD_NOISE", "G_CD_DISABLE"
470};
471
472static const char *CombineKeyText[] =
473{
474 "G_CK_NONE", "G_CK_KEY"
475};
476
477static const char *TextureConvertText[] =
478{
479 "G_TC_CONV", "G_TC_INVALID", "G_TC_INVALID", "G_TC_INVALID", "G_TC_INVALID", "G_TC_FILTCONV", "G_TC_FILT", "G_TC_INVALID"
480};
481
482static const char *TextureFilterText[] =
483{
484 "G_TF_POINT", "G_TF_INVALID", "G_TF_BILERP", "G_TF_AVERAGE"
485};
486
487static const char *TextureLUTText[] =
488{
489 "G_TT_NONE", "G_TT_INVALID", "G_TT_RGBA16", "G_TT_IA16"
490};
491
492static const char *TextureLODText[] =
493{
494 "G_TL_TILE", "G_TL_LOD"
495};
496
497static const char *TextureDetailText[] =
498{
499 "G_TD_CLAMP", "G_TD_SHARPEN", "G_TD_DETAIL"
500};
501
502static const char *TexturePerspText[] =
503{
504 "G_TP_NONE", "G_TP_PERSP"
505};
506
507static const char *CycleTypeText[] =
508{
509 "G_CYC_1CYCLE", "G_CYC_2CYCLE", "G_CYC_COPY", "G_CYC_FILL"
510};
511
512static const char *PipelineModeText[] =
513{
514 "G_PM_NPRIMITIVE", "G_PM_1PRIMITIVE"
515};
516
517static const char *CvgDestText[] =
518{
519 "CVG_DST_CLAMP", "CVG_DST_WRAP", "CVG_DST_FULL", "CVG_DST_SAVE"
520};
521
522static const char *DepthModeText[] =
523{
524 "ZMODE_OPA", "ZMODE_INTER", "ZMODE_XLU", "ZMODE_DEC"
525};
526
527static const char *ScissorModeText[] =
528{
529 "G_SC_NON_INTERLACE", "G_SC_INVALID", "G_SC_EVEN_INTERLACE", "G_SC_ODD_INTERLACE"
530};
531#endif
532
533/* Color combiner constants: */
534#define G_CCMUX_COMBINED 0
535#define G_CCMUX_TEXEL0 1
536#define G_CCMUX_TEXEL1 2
537#define G_CCMUX_PRIMITIVE 3
538#define G_CCMUX_SHADE 4
539#define G_CCMUX_ENVIRONMENT 5
540#define G_CCMUX_CENTER 6
541#define G_CCMUX_SCALE 6
542#define G_CCMUX_COMBINED_ALPHA 7
543#define G_CCMUX_TEXEL0_ALPHA 8
544#define G_CCMUX_TEXEL1_ALPHA 9
545#define G_CCMUX_PRIMITIVE_ALPHA 10
546#define G_CCMUX_SHADE_ALPHA 11
547#define G_CCMUX_ENV_ALPHA 12
548#define G_CCMUX_LOD_FRACTION 13
549#define G_CCMUX_PRIM_LOD_FRAC 14
550#define G_CCMUX_NOISE 7
551#define G_CCMUX_K4 7
552#define G_CCMUX_K5 15
553#define G_CCMUX_1 6
554#define G_CCMUX_0 31
555
556/* Alpha combiner constants: */
557#define G_ACMUX_COMBINED 0
558#define G_ACMUX_TEXEL0 1
559#define G_ACMUX_TEXEL1 2
560#define G_ACMUX_PRIMITIVE 3
561#define G_ACMUX_SHADE 4
562#define G_ACMUX_ENVIRONMENT 5
563#define G_ACMUX_LOD_FRACTION 0
564#define G_ACMUX_PRIM_LOD_FRAC 6
565#define G_ACMUX_1 6
566#define G_ACMUX_0 7
567
568#ifdef DEBUG
569static const char *saRGBText[] =
570{
571 "COMBINED", "TEXEL0", "TEXEL1", "PRIMITIVE",
572 "SHADE", "ENVIRONMENT", "NOISE", "1",
573 "0", "0", "0", "0",
574 "0", "0", "0", "0"
575};
576
577static const char *sbRGBText[] =
578{
579 "COMBINED", "TEXEL0", "TEXEL1", "PRIMITIVE",
580 "SHADE", "ENVIRONMENT", "CENTER", "K4",
581 "0", "0", "0", "0",
582 "0", "0", "0", "0"
583};
584
585static const char *mRGBText[] =
586{
587 "COMBINED", "TEXEL0", "TEXEL1", "PRIMITIVE",
588 "SHADE", "ENVIRONMENT", "SCALE", "COMBINED_ALPHA",
589 "TEXEL0_ALPHA", "TEXEL1_ALPHA", "PRIMITIVE_ALPHA", "SHADE_ALPHA",
590 "ENV_ALPHA", "LOD_FRACTION", "PRIM_LOD_FRAC", "K5",
591 "0", "0", "0", "0",
592 "0", "0", "0", "0",
593 "0", "0", "0", "0",
594 "0", "0", "0", "0"
595};
596
597static const char *aRGBText[] =
598{
599 "COMBINED", "TEXEL0", "TEXEL1", "PRIMITIVE",
600 "SHADE", "ENVIRONMENT", "1", "0",
601};
602
603static const char *saAText[] =
604{
605 "COMBINED", "TEXEL0", "TEXEL1", "PRIMITIVE",
606 "SHADE", "ENVIRONMENT", "1", "0",
607};
608
609static const char *sbAText[] =
610{
611 "COMBINED", "TEXEL0", "TEXEL1", "PRIMITIVE",
612 "SHADE", "ENVIRONMENT", "1", "0",
613};
614
615static const char *mAText[] =
616{
617 "LOD_FRACTION", "TEXEL0", "TEXEL1", "PRIMITIVE",
618 "SHADE", "ENVIRONMENT", "PRIM_LOD_FRAC", "0",
619};
620
621static const char *aAText[] =
622{
623 "COMBINED", "TEXEL0", "TEXEL1", "PRIMITIVE",
624 "SHADE", "ENVIRONMENT", "1", "0",
625};
626#endif
627
628extern u32 G_RDPHALF_1, G_RDPHALF_2, G_RDPHALF_CONT;
629extern u32 G_SPNOOP;
630extern u32 G_SETOTHERMODE_H, G_SETOTHERMODE_L;
631extern u32 G_DL, G_ENDDL, G_CULLDL, G_BRANCH_Z;
632extern u32 G_LOAD_UCODE;
633extern u32 G_MOVEMEM, G_MOVEWORD;
634extern u32 G_MTX, G_POPMTX;
635extern u32 G_GEOMETRYMODE, G_SETGEOMETRYMODE, G_CLEARGEOMETRYMODE;
636extern u32 G_TEXTURE;
637extern u32 G_DMA_IO, G_DMA_DL, G_DMA_TRI, G_DMA_MTX, G_DMA_VTX, G_DMA_OFFSETS;
638extern u32 G_SPECIAL_1, G_SPECIAL_2, G_SPECIAL_3;
639extern u32 G_VTX, G_MODIFYVTX, G_VTXCOLORBASE;
640extern u32 G_TRI1, G_TRI2, G_TRI4;
641extern u32 G_QUAD, G_LINE3D;
642extern u32 G_RESERVED0, G_RESERVED1, G_RESERVED2, G_RESERVED3;
643extern u32 G_SPRITE2D_BASE;
644extern u32 G_BG_1CYC, G_BG_COPY;
645extern u32 G_OBJ_RECTANGLE, G_OBJ_SPRITE, G_OBJ_MOVEMEM;
646extern u32 G_SELECT_DL, G_OBJ_RENDERMODE, G_OBJ_RECTANGLE_R;
647extern u32 G_OBJ_LOADTXTR, G_OBJ_LDTX_SPRITE, G_OBJ_LDTX_RECT, G_OBJ_LDTX_RECT_R;
648extern u32 G_RDPHALF_0, G_TRI_UNKNOWN;
649
650#define LIGHT_1 1
651#define LIGHT_2 2
652#define LIGHT_3 3
653#define LIGHT_4 4
654#define LIGHT_5 5
655#define LIGHT_6 6
656#define LIGHT_7 7
657#define LIGHT_8 8
658
659#define G_DL_PUSH 0x00
660#define G_DL_NOPUSH 0x01
661
662typedef struct
663{
664 s16 y;
665 s16 x;
666
667 u16 flag;
668 s16 z;
669
670 s16 t;
671 s16 s;
672
673 union {
674 struct
675 {
676 u8 a;
677 u8 b;
678 u8 g;
679 u8 r;
680 } color;
681 struct
682 {
683 s8 a;
684 s8 z; // b
685 s8 y; //g
686 s8 x; //r
687 } normal;
688 };
689} Vertex;
690
691typedef struct
692{
693 s16 y, x;
694 u16 ci;
695 s16 z;
696 s16 t, s;
697} PDVertex;
698
699
700typedef struct
701{
702 u8 v2, v1, v0, flag;
703 s16 t0, s0;
704 s16 t1, s1;
705 s16 t2, s2;
706} DKRTriangle;
707
708struct Light
709{
710 u8 pad0, b, g, r;
711 u8 pad1, b2, g2, r2;
712 s8 pad2, z, y, x;
713};
714
715struct LightMM
716{
717 u8 pad0, b, g, r;
718 u8 pad1, b2, g2, r2;
719 s16 y, x, range, z;
720};
721
722
723// GBI commands
724typedef void (*GBIFunc)( u32 w0, u32 w1 );
725//extern GBIFunc GBICmd[256];
726
727struct SpecialMicrocodeInfo
728{
729 u32 type;
730 u32 NoN;
731 u32 crc;
732 const char *text;
733};
734
735struct MicrocodeInfo
736{
737 u32 address, dataAddress;
738 u16 dataSize;
739 u32 type;
740 u32 NoN;
741 u32 crc;
742 u32 *text;
743
744 MicrocodeInfo *higher, *lower;
745};
746
747struct GBIInfo
748{
749 GBIFunc cmd[256];
750
751 u32 PCStackSize, numMicrocodes;
752 MicrocodeInfo *current, *top, *bottom;
753
754#ifdef PROFILE_GBI
755 unsigned int profileTimer[256 * 12];
756 unsigned int profileNum[256 * 12];
757 unsigned int profileTmp;
758#endif
759};
760
761extern GBIInfo GBI;
762
763#ifdef PROFILE_GBI
764void GBI_ProfileReset();
765void GBI_ProfileInit();
766void GBI_ProfileBegin(u32 cmd);
767void GBI_ProfileEnd(u32 cmd);
768u32 GBI_ProfilePrint(FILE *file);
769const char* GBI_GetFuncName(u32 ucode, u32 cmd);
770u32 GBI_GetFuncTime(u32 ucode, u32 cmd);
771#endif
772
773void GBI_MakeCurrent( MicrocodeInfo *current );
774MicrocodeInfo *GBI_DetectMicrocode( u32 uc_start, u32 uc_dstart, u16 uc_dsize );
775extern u32 last_good_ucode;
776void GBI_Init();
777void GBI_Destroy();
778
779// Allows easier setting of GBI commands
780#define GBI_SetGBI( command, value, function ) \
781 command = value; \
782 GBI.cmd[command] = function
783
784#define GBI_InitFlags( ucode ) \
785 G_MTX_STACKSIZE = ucode##_MTX_STACKSIZE; \
786 G_MTX_MODELVIEW = ucode##_MTX_MODELVIEW; \
787 G_MTX_PROJECTION = ucode##_MTX_PROJECTION; \
788 G_MTX_MUL = ucode##_MTX_MUL; \
789 G_MTX_LOAD = ucode##_MTX_LOAD; \
790 G_MTX_NOPUSH = ucode##_MTX_NOPUSH; \
791 G_MTX_PUSH = ucode##_MTX_PUSH; \
792\
793 G_TEXTURE_ENABLE = ucode##_TEXTURE_ENABLE; \
794 G_SHADING_SMOOTH = ucode##_SHADING_SMOOTH; \
795 G_CULL_FRONT = ucode##_CULL_FRONT; \
796 G_CULL_BACK = ucode##_CULL_BACK; \
797 G_CULL_BOTH = ucode##_CULL_BOTH; \
798 G_CLIPPING = ucode##_CLIPPING; \
799\
800 G_MV_VIEWPORT = ucode##_MV_VIEWPORT; \
801\
802 G_MWO_aLIGHT_1 = ucode##_MWO_aLIGHT_1; \
803 G_MWO_bLIGHT_1 = ucode##_MWO_bLIGHT_1; \
804 G_MWO_aLIGHT_2 = ucode##_MWO_aLIGHT_2; \
805 G_MWO_bLIGHT_2 = ucode##_MWO_bLIGHT_2; \
806 G_MWO_aLIGHT_3 = ucode##_MWO_aLIGHT_3; \
807 G_MWO_bLIGHT_3 = ucode##_MWO_bLIGHT_3; \
808 G_MWO_aLIGHT_4 = ucode##_MWO_aLIGHT_4; \
809 G_MWO_bLIGHT_4 = ucode##_MWO_bLIGHT_4; \
810 G_MWO_aLIGHT_5 = ucode##_MWO_aLIGHT_5; \
811 G_MWO_bLIGHT_5 = ucode##_MWO_bLIGHT_5; \
812 G_MWO_aLIGHT_6 = ucode##_MWO_aLIGHT_6; \
813 G_MWO_bLIGHT_6 = ucode##_MWO_bLIGHT_6; \
814 G_MWO_aLIGHT_7 = ucode##_MWO_aLIGHT_7; \
815 G_MWO_bLIGHT_7 = ucode##_MWO_bLIGHT_7; \
816 G_MWO_aLIGHT_8 = ucode##_MWO_aLIGHT_8; \
817 G_MWO_bLIGHT_8 = ucode##_MWO_bLIGHT_8;
818
819#endif
820