tp/include/dolphin/gx/GX.h

516 lines
13 KiB
C

#ifndef GX_H_
#define GX_H_
#include "dolphin/gx/GXDisplayList.h"
#include "dolphin/gx/GXTexture.h"
#include "dolphin/types.h"
// TODO: maybe split?
typedef enum _GXCullMode {
GX_CULL_NONE = 0,
GX_CULL_FRONT = 1,
GX_CULL_BACK = 2,
GX_CULL_ALL = 3
} GXCullMode;
typedef enum _GXTexMapID {
GX_TEXMAP1 = 1,
GX_TEXMAP2 = 2,
GX_TEXMAP0 = 0,
GX_TEXMAP5 = 5,
GX_TEXMAP6 = 6,
GX_TEXMAP3 = 3,
GX_TEXMAP4 = 4,
GX_TEXMAP_NULL = 255,
GX_TEX_DISABLE = 256,
GX_TEXMAP7 = 7,
GX_MAX_TEXMAP = 8
} GXTexMapID;
typedef enum _GXTevStageID {
/* 0x0 */ GX_TEVSTAGE0,
/* 0x1 */ GX_TEVSTAGE1,
/* 0x2 */ GX_TEVSTAGE2,
/* 0x3 */ GX_TEVSTAGE3,
/* 0x4 */ GX_TEVSTAGE4,
/* 0x5 */ GX_TEVSTAGE5,
/* 0x6 */ GX_TEVSTAGE6,
/* 0x7 */ GX_TEVSTAGE7,
/* 0x8 */ GX_TEVSTAGE8,
/* 0x9 */ GX_TEVSTAGE9,
/* 0xA */ GX_TEVSTAGE10,
/* 0xB */ GX_TEVSTAGE11,
/* 0xC */ GX_TEVSTAGE12,
/* 0xD */ GX_TEVSTAGE13,
/* 0xE */ GX_TEVSTAGE14,
/* 0xF */ GX_TEVSTAGE15,
} GXTevStageID;
typedef enum _GXTexCoordID {
/* 0x00 */ GX_TEXCOORD0,
/* 0x01 */ GX_TEXCOORD1,
/* 0x02 */ GX_TEXCOORD2,
/* 0x03 */ GX_TEXCOORD3,
/* 0x04 */ GX_TEXCOORD4,
/* 0x05 */ GX_TEXCOORD5,
/* 0x06 */ GX_TEXCOORD6,
/* 0x07 */ GX_TEXCOORD7,
/* 0xFF */ GX_TEXCOORD_NULL = 255,
} GXTexCoordID;
typedef enum _GXChannelID {
/* 0x00 */ GX_COLOR0,
/* 0x01 */ GX_COLOR1,
/* 0x02 */ GX_ALPHA0,
/* 0x03 */ GX_ALPHA1,
/* 0x04 */ GX_COLOR0A0,
/* 0x05 */ GX_COLOR1A1,
/* 0x06 */ GX_COLOR_ZERO,
/* 0x07 */ GX_ALPHA_BUMP,
/* 0x08 */ GX_ALPHA_BUMPN,
/* 0xFF */ GX_COLOR_NULL = 255,
} GXChannelID;
typedef enum _GXColorSrc {
/* 0x0 */ GX_SRC_REG,
/* 0x1 */ GX_SRC_VTX,
} GXColorSrc;
typedef enum _GXLightID {
/* 0x00 */ GX_LIGHT0,
/* 0x02 */ GX_LIGHT1 = 0x2,
/* 0x04 */ GX_LIGHT2 = 0x4,
/* 0x08 */ GX_LIGHT3 = 0x8,
/* 0x10 */ GX_LIGHT4 = 0x10,
/* 0x20 */ GX_LIGHT5 = 0x20,
/* 0x40 */ GX_LIGHT6 = 0x40,
/* 0x80 */ GX_LIGHT7 = 0x80,
} GXLightID;
typedef enum _GXDiffuseFn {
/* 0x0 */ GX_DF_NONE,
/* 0x1 */ GX_DF_SIGN,
/* 0x2 */ GX_DF_CLAMP,
} GXDiffuseFn;
typedef enum _GXAttnFn {
/* 0x0 */ GX_AF_SPEC,
/* 0x1 */ GX_AF_SPOT,
/* 0x2 */ GX_AF_NONE,
} GXAttnFn;
typedef enum _GXTevMode {
/* 0x0 */ GX_MODULATE,
/* 0x1 */ GX_DECAL,
/* 0x2 */ GX_BLEND,
/* 0x3 */ GX_REPLACE,
/* 0x4 */ GX_PASSCLR,
} GXTevMode;
typedef enum _GXBlendMode {
/* 0x0 */ GX_BM_NONE,
/* 0x1 */ GX_BM_BLEND,
/* 0x2 */ GX_BM_LOGIC,
/* 0x3 */ GX_BM_SUBTRACT,
} GXBlendMode;
typedef enum _GXBlendFactor {
/* 0x0 */ GX_BL_ZERO,
/* 0x1 */ GX_BL_ONE,
/* 0x2 */ GX_BL_SRC_COLOR,
/* 0x3 */ GX_BL_INV_SRC_COLOR,
/* 0x4 */ GX_BL_SRC_ALPHA,
/* 0x5 */ GX_BL_INV_SRC_ALPHA,
/* 0x6 */ GX_BL_DST_ALPHA,
/* 0x7 */ GX_BL_INV_DST_ALPHA,
} GXBlendFactor;
typedef enum _GXLogicOp {
/* 0x0 */ GX_LO_CLEAR,
/* 0x1 */ GX_LO_AND,
/* 0x2 */ GX_LO_REV_AND,
/* 0x3 */ GX_LO_COPY,
/* 0x4 */ GX_LO_INV_AND,
/* 0x5 */ GX_LO_NOOP,
/* 0x6 */ GX_LO_XOR,
/* 0x7 */ GX_LO_OP,
/* 0x8 */ GX_LO_NOR,
/* 0x9 */ GX_LO_EQUIV,
/* 0xA */ GX_LO_INV,
/* 0xB */ GX_LO_REV_OR,
/* 0xC */ GX_LO_INV_COPY,
/* 0xD */ GX_LO_INV_OR,
/* 0xE */ GX_LO_NAND,
/* 0xF */ GX_LO_SET,
} GXLogicOp;
typedef enum _GXVtxFmt {
/* 0x0 */ GX_VTXFMT0,
/* 0x1 */ GX_VTXFMT1,
/* 0x2 */ GX_VTXFMT2,
/* 0x3 */ GX_VTXFMT3,
/* 0x4 */ GX_VTXFMT4,
/* 0x5 */ GX_VTXFMT5,
/* 0x6 */ GX_VTXFMT6,
/* 0x7 */ GX_VTXFMT7,
} GXVtxFmt;
typedef enum _GXAttr {
/* 0x00 */ GX_VA_PTNMTXIDX,
/* 0x01 */ GX_VA_TEX0MTXIDX,
/* 0x02 */ GX_VA_TEX1MTXIDX,
/* 0x03 */ GX_VA_TEX2MTXIDX,
/* 0x04 */ GX_VA_TEX3MTXIDX,
/* 0x05 */ GX_VA_TEX4MTXIDX,
/* 0x06 */ GX_VA_TEX5MTXIDX,
/* 0x07 */ GX_VA_TEX6MTXIDX,
/* 0x08 */ GX_VA_TEX7MTXIDX,
/* 0x09 */ GX_VA_POS,
/* 0x0A */ GX_VA_NRM,
/* 0x0B */ GX_VA_CLR0,
/* 0x0C */ GX_VA_CLR1,
/* 0x0D */ GX_VA_TEX0,
/* 0x0E */ GX_VA_TEX1,
/* 0x0F */ GX_VA_TEX2,
/* 0x10 */ GX_VA_TEX3,
/* 0x11 */ GX_VA_TEX4,
/* 0x12 */ GX_VA_TEX5,
/* 0x13 */ GX_VA_TEX6,
/* 0x14 */ GX_VA_TEX7,
/* 0x15 */ GX_POS_MTX_ARRAY,
/* 0x16 */ GX_NRM_MTX_ARRAY,
/* 0x17 */ GX_TEX_MTX_ARRAY,
/* 0x18 */ GX_LIGHT_ARRAY,
/* 0x19 */ GX_VA_NBT,
/* 0x1A */ GX_VA_MAX_ATTR,
/* 0xFF */ GX_VA_NULL = 255,
} GXAttr;
typedef enum _GXCompCnt {
/* 0x0 */ GX_TEX_S,
/* 0x0 */ GX_NRM_XYZ = 0,
/* 0x0 */ GX_CLR_RGB = 0,
/* 0x0 */ GX_POS_XY = 0,
/* 0x1 */ GX_TEX_ST = 1,
/* 0x1 */ GX_NRM_NBT = 1,
/* 0x1 */ GX_CLR_RGBA = 1,
/* 0x1 */ GX_POS_XYZ = 1,
/* 0x2 */ GX_NRM_NBT3,
} GXCompCnt;
typedef enum _GXCompType {
/* 0x0 */ GX_U8,
/* 0x0 */ GX_RGB565 = 0,
/* 0x1 */ GX_S8,
/* 0x1 */ GX_RGB8 = 1,
/* 0x2 */ GX_RGBX8,
/* 0x2 */ GX_U16 = 2,
/* 0x3 */ GX_S16,
/* 0x3 */ GX_RGBA4 = 3,
/* 0x4 */ GX_RGBA6,
/* 0x4 */ GX_F32 = 4,
/* 0x5 */ GX_RGBA8,
} GXCompType;
typedef enum _GXAttrType {
/* 0x0 */ GX_NONE,
/* 0x1 */ GX_DIRECT,
/* 0x2 */ GX_INDEX8,
/* 0x3 */ GX_INDEX16,
} GXAttrType;
typedef enum _GXTevOp {
/* 0x0 */ GX_TEV_ADD,
/* 0x1 */ GX_TEV_SUB,
/* 0x8 */ GX_TEV_COMP_R8_GT = 8,
/* 0x9 */ GX_TEV_COMP_R8_EQ,
/* 0xA */ GX_TEV_COMP_GR16_GT,
/* 0xB */ GX_TEV_COMP_GR16_EQ,
/* 0xC */ GX_TEV_COMP_BGR24_GT,
/* 0xD */ GX_TEV_COMP_BGR24_EQ,
/* 0xE */ GX_TEV_COMP_A8_GT,
/* 0xE */ GX_TEV_COMP_RGB8_GT = 14,
/* 0xF */ GX_TEV_COMP_RGB8_EQ,
/* 0xF */ GX_TEV_COMP_A8_EQ = 15,
} GXTevOp;
typedef enum _GXTevBias {
/* 0x0 */ GX_TB_ZERO,
/* 0x1 */ GX_TB_ADDHALF,
/* 0x2 */ GX_TB_SUBHALF,
} GXTevBias;
typedef enum _GXTevColorArg {
/* 0x0 */ GX_CC_CPREV,
/* 0x1 */ GX_CC_APREV,
/* 0x2 */ GX_CC_C0,
/* 0x3 */ GX_CC_A0,
/* 0x4 */ GX_CC_C1,
/* 0x5 */ GX_CC_A1,
/* 0x6 */ GX_CC_C2,
/* 0x7 */ GX_CC_A2,
/* 0x8 */ GX_CC_TEXC,
/* 0x9 */ GX_CC_TEXA,
/* 0xA */ GX_CC_RASC,
/* 0xB */ GX_CC_RASA,
/* 0xC */ GX_CC_ONE,
/* 0xD */ GX_CC_HALF,
/* 0xE */ GX_CC_KONST,
/* 0xF */ GX_CC_ZERO,
} GXTevColorArg;
typedef enum _GXTevColor {
/* 0x0 */ GX_CH_RED,
/* 0x1 */ GX_CH_BLUE,
/* 0x2 */ GX_CH_GREEN,
/* 0x3 */ GX_CH_ALPHA,
} GXTevColor;
typedef enum _GXTevScale {
/* 0x0 */ GX_CS_SCALE_1,
/* 0x1 */ GX_CS_SCALE_2,
/* 0x2 */ GX_CS_SCALE_4,
/* 0x3 */ GX_CS_DIVIDE_2,
} GXTevScale;
typedef enum _GXTevRegID {
/* 0x0 */ GX_TEVPREV,
/* 0x1 */ GX_TEVREG0,
/* 0x2 */ GX_TEVREG1,
/* 0x3 */ GX_TEVREG2,
} GXTevRegID;
typedef enum _GXTevAlphaArg {
/* 0x0 */ GX_CA_APREV,
/* 0x1 */ GX_CA_A0,
/* 0x2 */ GX_CA_A1,
/* 0x3 */ GX_CA_A2,
/* 0x4 */ GX_CA_TEXA,
/* 0x5 */ GX_CA_TEXB,
/* 0x6 */ GX_CA_ZERO,
} GXTevAlphaArg;
typedef struct _GXRenderModeObj {
s32 vi_tv_mode;
u16 fb_width;
u16 efb_height;
u16 xfb_height;
u16 vi_x_origin;
u16 vi_y_origin;
u16 vi_width;
u16 vi_height;
s32 xfb_mode;
u8 field_rendering;
u8 antialiasing;
u8 sample_pattern[12][2];
u8 vfilter[7];
} GXRenderModeObj;
struct _GXTexObj {
u32 texture_filter;
u32 texture_lod;
u32 texture_size;
u32 texture_address;
u32 user_data;
u32 texture_format;
u32 tlut_name;
u16 texture_time_count;
u8 texture_tile_type;
u8 texture_flags;
};
struct _GXTlutObj {
u32 format;
u32 address;
u32 numEntries;
};
typedef enum GXTexFmt8 { /* 8-bit version of GXTexFmt for use in structures */
GX_CTF_A8 = 39,
GX_CTF_B8 = 42,
GX_CTF_G8 = 41,
GX_CTF_GB8 = 44,
GX_CTF_R4 = 32,
GX_CTF_R8 = 40,
GX_CTF_RA4 = 34,
GX_CTF_RA8 = 35,
GX_CTF_RG8 = 43,
GX_CTF_YUVA8 = 38,
GX_CTF_Z16L = 60,
GX_CTF_Z4 = 48,
GX_CTF_Z8L = 58,
GX_CTF_Z8M = 57,
GX_TF_CMPR = 14,
GX_TF_I4 = 0,
GX_TF_I8 = 1,
GX_TF_IA4 = 2,
GX_TF_IA8 = 3,
GX_TF_RGB565 = 4,
GX_TF_RGB5A3 = 5,
GX_TF_RGBA8 = 6,
GX_TF_Z16 = 19,
GX_TF_Z24X8 = 22,
GX_TF_Z8 = 17
} GXTexFmt8;
typedef enum GXTexFmt {
_GX_TF_I4,
_GX_TF_I8,
_GX_TF_IA4,
_GX_TF_IA8,
_GX_TF_RGB565,
_GX_TF_TGB5A3,
_GX_TF_RGBA8,
_GX_TF_CMPR = 14,
_GX_TF_Z8 = 17,
_GX_TF_Z16 = 19,
_GX_TF_Z24X8 = 22,
_GX_CTF_R4 = 32,
_GX_CTF_RA4 = 34,
_GX_CTF_RA8,
_GX_CTF_YUVA8 = 38,
_GX_CTF_A8,
_GX_CTF_R8,
_GX_CTF_G8,
_GX_CTF_B8,
_GX_CTF_RG8,
_GX_CTF_GB8,
_GX_CTF_Z4 = 48,
_GX_CTF_Z8M = 57,
_GX_CTF_Z8L,
_GX_CTF_Z16L = 60
} GXTexFmt;
typedef enum GXTexWrapMode8 { /* Same as GXTexWrapMode, but as 1 byte for use inside structures */
GX_CLAMP = 0,
GX_MIRROR = 2,
GX_REPEAT = 1
} GXTexWrapMode8;
typedef enum GXTexWrapMode {
_GX_CLAMP,
_GX_REPEAT,
_GX_MIRROR,
} GXTexWrapMode;
typedef enum GXTexFilter8 { /* Same as GXTexFilter, but as 1 byte for use within structures that
store the value as a byte */
GX_LINEAR = 1,
GX_LIN_MIP_LIN = 5,
GX_LIN_MIP_NEAR = 3,
GX_NEAR = 0,
GX_NEAR_MIP_LIN = 4,
GX_NEAR_MIP_NEAR = 2
} GXTexFilter8;
typedef enum GXTexFilter {
_GX_NEAR,
_GX_LINEAR,
_GX_NEAR_MIP_NEAR,
_GX_LIN_MIP_NEAR,
_GX_NEAR_MIP_LIN,
_GX_LIN_MIP_LIN,
} GXTexFilter;
typedef enum GXAnisotropy {
GX_ANISO_1,
GX_ANISO_2,
GX_ANISO_4,
} GXAnisotropy;
typedef enum GXTlutFmt {
GX_TL_IA8,
GX_TL_RGB565,
GX_TL_RGB5A3,
} GXTlutFmt;
enum GXCITexFmt {
/* 0x8 */ GX_TF_C4 = 8,
/* 0x8 */ GX_TF_C8,
/* 0xA */ GX_TF_C14X2
};
extern "C" {
f32 GXGetYScaleFactor(u16 efb_height, u16 xfb_height);
u16 GXGetNumXfbLines(u32 efb_height, f32 y_scale);
void GXBegin(u8, u8, u16);
void GXLoadTexObj(_GXTexObj*, _GXTexMapID);
void GXInitTexObjLOD(_GXTexObj*, GXTexFilter, GXTexFilter, f32, f32, f32, s32, s32, GXAnisotropy);
void GXInitTexObj(_GXTexObj*, void*, u16, u16, GXTexFmt, GXTexWrapMode, GXTexWrapMode, s32);
void GXInitTlutObj(_GXTlutObj*, void*, GXTlutFmt, u16);
void GXLoadTlut(_GXTlutObj*, u32);
void GXInitTexObjCI(_GXTexObj*, void*, u16, u16, GXCITexFmt, GXTexWrapMode, GXTexWrapMode, s32,
u32);
void GXSetNumChans(u32);
void GXSetNumTevStages(u32);
void GXSetNumTexGens(u32);
void GXSetTevOrder(u32, u32, u32, u32);
void GXSetChanCtrl(u32, u32, u32, u32, u32, u32, s32);
void GXSetTevOp(s32, s32);
void GXSetTevColor(s32, _GXColor);
void GXSetTevColorIn(s32, u32, u32, u32, u32);
void GXSetTevAlphaIn(s32, u32, u32, u32, u32);
void GXSetTevColorOp(s32, u32, u32, u32, u32, u32);
void GXSetTevAlphaOp(s32, u32, u32, u32, u32, u32);
void GXSetBlendMode(u32, u32, u32, u32);
void GXSetVtxAttrFmt(u32, u32, u32, u32, u32);
void GXClearVtxDesc();
void GXSetVtxDesc(u32, u32);
typedef void (*GXDrawDoneCallback)(void);
void GXSetDrawDoneCallback(GXDrawDoneCallback);
void GXDrawDone(void);
void GXAbortFrame(void);
void GXFlush(void);
struct OSThread;
OSThread* GXSetCurrentGXThread(void);
OSThread* GXGetCurrentGXThread(void);
// Below needs proper symbols
void GXClearVtxDesc(void);
void GXCopyTex(void);
void GXGetProjectionv(void);
u32 GXGetTexBufferSize(u16 width, u16 height, u32 format, s32 is_mip_map, u8 max_lod);
void GXGetViewportv(void);
void GXInitLightColor(void);
void GXInitLightDir(void);
void GXInitLightDistAttn(void);
void GXInitLightPos(void);
void GXInitLightSpot(void);
void GXInvalidateTexAll(void);
void GXLoadLightObjImm(void);
void GXLoadPosMtxImm(void);
void GXLoadTexMtxImm(void);
void GXPixModeSync(void);
void GXProject(void);
void GXSetAlphaCompare(void);
void GXSetAlphaUpdate(void);
void GXSetChanMatColor(void);
void GXSetClipMode(void);
void GXSetCoPlanar(void);
void GXSetCopyFilter(void);
void GXSetCullMode(void);
void GXSetCurrentMtx(void);
void GXSetDither(void);
void GXSetFog(void);
void GXSetFogRangeAdj(void);
void GXSetNumIndStages(void);
void GXSetProjection(void);
void GXSetScissor(void);
void GXSetTevColorS10(void);
void GXSetTevKAlphaSel(void);
void GXSetTevSwapMode(void);
void GXSetTevSwapModeTable(void);
void GXSetTexCoordGen2(void);
void GXSetTexCopyDst(void);
void GXSetTexCopySrc(void);
void GXSetViewport(void);
void GXSetZCompLoc(void);
void GXSetZMode(void);
void GXSetZTexture(void);
};
#endif