438 lines
8.2 KiB
C
438 lines
8.2 KiB
C
#define GS_NONINTERLACED 0
|
|
#define GS_INTERLACED 1
|
|
|
|
#define GS_NTSC 2
|
|
#define GS_PAL 3
|
|
#define GS_VESA1A 0x1a
|
|
#define GS_VESA1B 0x1b
|
|
#define GS_VESA1C 0x1c
|
|
#define GS_VESA1D 0x1d
|
|
#define GS_VESA2A 0x2a
|
|
#define GS_VESA2B 0x2b
|
|
#define GS_VESA2C 0x2c
|
|
#define GS_VESA2D 0x2d
|
|
#define GS_VESA2E 0x2e
|
|
#define GS_VESA3B 0x3b
|
|
#define GS_VESA3C 0x3c
|
|
#define GS_VESA3D 0x3d
|
|
#define GS_VESA3E 0x3e
|
|
#define GS_VESA4A 0x4a
|
|
#define GS_VESA4B 0x4b
|
|
#define GS_DTV480P 0x50
|
|
|
|
#define GS_FIELD 0
|
|
#define GS_FRAME 1
|
|
|
|
#define GS_PSMCT32 0
|
|
#define GS_PSMCT24 1
|
|
#define GS_PSMCT16 2
|
|
#define GS_PSMCT16S 10
|
|
#define GS_PS_GPU24 18
|
|
|
|
#define GS_PSMZ32 0
|
|
#define GS_PSMZ24 1
|
|
#define GS_PSMZ16 2
|
|
#define GS_PSMZ16S 10
|
|
|
|
#define GS_ZTST_NEVER 0
|
|
#define GS_ZTST_ALWAYS 1
|
|
#define GS_ZTST_GREATER 2
|
|
#define GS_ZTST_GEQUAL 3
|
|
|
|
#define GS_PRIM_POINT 0
|
|
#define GS_PRIM_LINE 1
|
|
#define GS_PRIM_LINE_STRIP 2
|
|
#define GS_PRIM_TRI 3
|
|
#define GS_PRIM_TRI_STRIP 4
|
|
#define GS_PRIM_TRI_FAN 5
|
|
#define GS_PRIM_SPRITE 6
|
|
#define GS_PRIM_NO_SPEC 7
|
|
#define GS_IIP_FLAT 0
|
|
#define GS_IIP_GOURAUD 1
|
|
|
|
/* GS general purpose registers */
|
|
|
|
#define GS_PRIM 0x00
|
|
#define GS_RGBAQ 0x01
|
|
#define GS_ST 0x02
|
|
#define GS_UV 0x03
|
|
#define GS_XYZF2 0x04
|
|
#define GS_XYZ2 0x05
|
|
#define GS_TEX0_1 0x06
|
|
#define GS_TEX0_2 0x07
|
|
#define GS_CLAMP_1 0x08
|
|
#define GS_CLAMP_2 0x09
|
|
#define GS_FOG 0x0a
|
|
#define GS_XYZF3 0x0c
|
|
#define GS_XYZ3 0x0d
|
|
#define GS_TEX1_1 0x14
|
|
#define GS_TEX1_2 0x15
|
|
#define GS_TEX2_1 0x16
|
|
#define GS_TEX2_2 0x17
|
|
#define GS_XYOFFSET_1 0x18
|
|
#define GS_XYOFFSET_2 0x19
|
|
#define GS_PRMODECONT 0x1a
|
|
#define GS_PRMODE 0x1b
|
|
#define GS_TEXCLUT 0x1c
|
|
#define GS_SCANMSK 0x22
|
|
#define GS_MIPTBP1_1 0x34
|
|
#define GS_MIPTBP1_2 0x35
|
|
#define GS_MIPTBP2_1 0x36
|
|
#define GS_MIPTBP2_2 0x37
|
|
#define GS_TEXA 0x3b
|
|
#define GS_FOGCOL 0x3d
|
|
#define GS_TEXFLUSH 0x3f
|
|
#define GS_SCISSOR_1 0x40
|
|
#define GS_SCISSOR_2 0x41
|
|
#define GS_ALPHA_1 0x42
|
|
#define GS_ALPHA_2 0x43
|
|
#define GS_DIMX 0x44
|
|
#define GS_DTHE 0x45
|
|
#define GS_COLCLAMP 0x46
|
|
#define GS_TEST_1 0x47
|
|
#define GS_TEST_2 0x48
|
|
#define GS_PABE 0x49
|
|
#define GS_FBA_1 0x4a
|
|
#define GS_FBA_2 0x4b
|
|
#define GS_FRAME_1 0x4c
|
|
#define GS_FRAME_2 0x4d
|
|
#define GS_ZBUF_1 0x4e
|
|
#define GS_ZBUF_2 0x4f
|
|
#define GS_BITBLTBUF 0x50
|
|
#define GS_TRXPOS 0x51
|
|
#define GS_TRXREG 0x52
|
|
#define GS_TRXDIR 0x53
|
|
#define GS_HWREG 0x54
|
|
#define GS_SIGNAL 0x60
|
|
#define GS_FINISH 0x61
|
|
#define GS_LABEL 0x62
|
|
|
|
typedef union
|
|
{
|
|
struct {
|
|
uint64 EN1 : 1;
|
|
uint64 EN2 : 1;
|
|
uint64 CRTMD : 3;
|
|
uint64 MMOD : 1;
|
|
uint64 AMOD : 1;
|
|
uint64 SLBG : 1;
|
|
uint64 ALP : 8;
|
|
} f;
|
|
uint64 d;
|
|
} GsPmode;
|
|
|
|
#define GS_MAKE_PMODE(EN1,EN2,MMOD,AMOD,SLBG,ALP) \
|
|
(BIT64(EN1,0) | BIT64(EN2,1) | BIT64(1,2) | \
|
|
BIT64(MMOD,5) | BIT64(AMOD,6) | BIT64(SLBG,7) | BIT64(ALP,8))
|
|
|
|
typedef union
|
|
{
|
|
struct {
|
|
uint64 INT : 1;
|
|
uint64 FFMD : 1;
|
|
uint64 DPMS : 2;
|
|
} f;
|
|
uint64 d;
|
|
} GsSmode2;
|
|
|
|
#define GS_MAKE_SMODE2(INT,FFMD,DPMS) \
|
|
(BIT64(INT,0) | BIT64(FFMD,1) | BIT64(DPMS,2))
|
|
|
|
typedef union
|
|
{
|
|
struct {
|
|
uint64 FBP : 9;
|
|
uint64 FBW : 6;
|
|
uint64 PSM : 5;
|
|
uint64 : 12;
|
|
uint64 DBX : 11;
|
|
uint64 DBY : 11;
|
|
} f;
|
|
uint64 d;
|
|
} GsDispfb;
|
|
|
|
#define GS_MAKE_DISPFB(FBP,FBW,PSM,DBX,DBY) \
|
|
(BIT64(FBP,0) | BIT64(FBW,9) | BIT64(PSM,15) | \
|
|
BIT64(DBX,32) | BIT64(DBY,43))
|
|
|
|
typedef union
|
|
{
|
|
struct {
|
|
uint64 DX : 12;
|
|
uint64 DY : 11;
|
|
uint64 MAGH : 4;
|
|
uint64 MAGV : 2;
|
|
uint64 : 3;
|
|
uint64 DW : 12;
|
|
uint64 DH : 11;
|
|
} f;
|
|
uint64 d;
|
|
} GsDisplay;
|
|
|
|
#define GS_MAKE_DISPLAY(DX,DY,MAGH,MAGV,DW,DH) \
|
|
(BIT64(DX,0) | BIT64(DY,12) | BIT64(MAGH,23) | \
|
|
BIT64(MAGV,27) | BIT64(DW,32) | BIT64(DH,44))
|
|
|
|
typedef union
|
|
{
|
|
struct {
|
|
uint64 EXBP : 14;
|
|
uint64 EXBW : 6;
|
|
uint64 FBIN : 2;
|
|
uint64 WFFMD : 1;
|
|
uint64 EMODA : 2;
|
|
uint64 EMODC : 2;
|
|
uint64 : 5;
|
|
uint64 WDX : 11;
|
|
uint64 WDY : 11;
|
|
} f;
|
|
uint64 d;
|
|
} GsExtbuf;
|
|
|
|
#define GS_MAKE_EXTBUF(EXBP,EXBW,FBIN,WFFMD,EMODA,EMODC,WDX,WDY) \
|
|
(BIT64(EXBP,0) | BIT64(EXBW,14) | BIT64(FBIN,20) | \
|
|
BIT64(WFFMD,22) | BIT64(EMODA,23) | BIT64(EMODC,25) | \
|
|
BIT64(WDX,32) | BIT64(WDY,43))
|
|
|
|
typedef union
|
|
{
|
|
struct {
|
|
uint64 SX : 12;
|
|
uint64 SY : 11;
|
|
uint64 SMPH : 4;
|
|
uint64 SMPV : 2;
|
|
uint64 : 3;
|
|
uint64 WW : 12;
|
|
uint64 WH : 11;
|
|
} f;
|
|
uint64 d;
|
|
} GsExtdata;
|
|
|
|
#define GS_MAKE_EXTDATA(SX,SY,SMPH,SMPV,WW,WH) \
|
|
(BIT64(SX,0) | BIT64(SY,12) | BIT64(SMPH,23) | \
|
|
BIT64(SMPV,27) | BIT64(WW,32) | BIT64(WH,44))
|
|
|
|
typedef union
|
|
{
|
|
struct {
|
|
uint64 WRITE : 1;
|
|
} f;
|
|
uint64 d;
|
|
} GsExtwrite;
|
|
|
|
typedef union
|
|
{
|
|
struct {
|
|
uint64 R : 8;
|
|
uint64 G : 8;
|
|
uint64 B : 8;
|
|
} f;
|
|
uint64 d;
|
|
} GsBgcolor;
|
|
|
|
#define GS_MAKE_BGCOLOR(R,G,B) \
|
|
(BIT64(R,0) | BIT64(G,8) | BIT64(B,16))
|
|
|
|
typedef union
|
|
{
|
|
struct {
|
|
uint64 SIGNAL : 1;
|
|
uint64 FINISH : 1;
|
|
uint64 HSINT : 1;
|
|
uint64 VSINT : 1;
|
|
uint64 EDWINT : 1;
|
|
uint64 : 3;
|
|
uint64 FLUSH : 1;
|
|
uint64 RESET : 1;
|
|
uint64 : 2;
|
|
uint64 NFIELD : 1;
|
|
uint64 FIELD : 1;
|
|
uint64 FIFO : 2;
|
|
uint64 REV : 8;
|
|
uint64 ID : 8;
|
|
} f;
|
|
uint64 d;
|
|
} GsCsr;
|
|
|
|
#define GS_CSR_SIGNAL_O 0
|
|
#define GS_CSR_FINISH_O 1
|
|
#define GS_CSR_HSINT_O 2
|
|
#define GS_CSR_VSINT_O 3
|
|
#define GS_CSR_EDWINT_O 4
|
|
#define GS_CSR_FLUSH_O 8
|
|
#define GS_CSR_RESET_O 9
|
|
#define GS_CSR_NFIELD_O 12
|
|
#define GS_CSR_FIELD_O 13
|
|
#define GS_CSR_FIFO_O 14
|
|
#define GS_CSR_REV_O 16
|
|
#define GS_CSR_ID_O 24
|
|
|
|
typedef union
|
|
{
|
|
struct {
|
|
uint64 : 8;
|
|
uint64 SIGMSK : 1;
|
|
uint64 FINISHMSK : 1;
|
|
uint64 HSMSKMSK : 1;
|
|
uint64 VSMSKMSK : 1;
|
|
uint64 EDWMSKMSK : 1;
|
|
} f;
|
|
uint64 d;
|
|
} GsImr;
|
|
|
|
typedef union
|
|
{
|
|
struct {
|
|
uint64 DIR : 1;
|
|
} f;
|
|
uint64 d;
|
|
} GsBusdir;
|
|
|
|
typedef union
|
|
{
|
|
struct {
|
|
uint64 SIGID : 32;
|
|
uint64 LBLID : 32;
|
|
} f;
|
|
uint64 d;
|
|
} GsSiglblid;
|
|
|
|
|
|
typedef union
|
|
{
|
|
struct {
|
|
uint64 FBP : 9;
|
|
uint64 : 7;
|
|
uint64 FBW : 6;
|
|
uint64 : 2;
|
|
uint64 PSM : 6;
|
|
uint64 : 2;
|
|
uint64 FBMSK : 32;
|
|
} f;
|
|
uint64 d;
|
|
} GsFrame;
|
|
|
|
#define GS_MAKE_FRAME(FBP,FBW,PSM,FBMASK) \
|
|
(BIT64(FBP,0) | BIT64(FBW,16) | BIT64(PSM,24) | BIT64(FBMASK,32))
|
|
|
|
typedef union
|
|
{
|
|
struct {
|
|
uint64 ZBP : 9;
|
|
uint64 : 15;
|
|
uint64 PSM : 4;
|
|
uint64 : 4;
|
|
uint64 ZMSDK : 1;
|
|
} f;
|
|
uint64 d;
|
|
} GsZbuf;
|
|
|
|
#define GS_MAKE_ZBUF(ZBP,PSM,ZMSK) \
|
|
(BIT64(ZBP,0) | BIT64(PSM,24) | BIT64(ZMSK,32))
|
|
|
|
typedef union
|
|
{
|
|
struct {
|
|
uint64 OFX : 16;
|
|
uint64 : 16;
|
|
uint64 OFY : 16;
|
|
} f;
|
|
uint64 d;
|
|
} GsXyOffset;
|
|
|
|
#define GS_MAKE_XYOFFSET(OFX,OFY) \
|
|
(BIT64(OFX,0) | BIT64(OFY,32))
|
|
|
|
typedef union
|
|
{
|
|
struct {
|
|
uint64 SCAX0 : 11;
|
|
uint64 : 5;
|
|
uint64 SCAX1 : 11;
|
|
uint64 : 5;
|
|
uint64 SCAY0 : 11;
|
|
uint64 : 5;
|
|
uint64 SCAY1 : 11;
|
|
} f;
|
|
uint64 d;
|
|
} GsScissor;
|
|
|
|
#define GS_MAKE_SCISSOR(SCAX0,SCAX1,SCAY0,SCAY1) \
|
|
(BIT64(SCAX0,0) | BIT64(SCAX1,16) | BIT64(SCAY0,32) | BIT64(SCAY1,48))
|
|
|
|
#define GS_MAKE_TEST(ATE,ATST,AREF,AFAIL,DATE,DATM,ZTE,ZTST) \
|
|
(BIT64(ATE,0) | BIT64(ATST,1) | BIT64(AREF,4) | BIT64(AFAIL,12) | \
|
|
BIT64(DATE,14) | BIT64(DATM,15) | BIT64(ZTE,16) | BIT64(ZTST,17))
|
|
|
|
#define GS_MAKE_PRIM(PRIM,IIP,TME,FGE,ABE,AA1,FST,CTXT,FIX) \
|
|
(BIT64(PRIM,0) | BIT64(IIP,3) | BIT64(TME,4) | BIT64(FGE,5) | \
|
|
BIT64(ABE,6) | BIT64(AA1,7) | BIT64(FST,8) | BIT64(CTXT,9) | BIT64(FIX,10))
|
|
|
|
#define GS_MAKE_RGBAQ(R,G,B,A,Q) \
|
|
(BIT64(R,0) | BIT64(G,8) | BIT64(B,16) | BIT64(A,24) | BIT64(Q,32))
|
|
|
|
#define GS_MAKE_XYZ(X,Y,Z) \
|
|
(BIT64(X,0) | BIT64(Y,16) | BIT64(Z,32))
|
|
|
|
#define GIF_PACKED 0
|
|
#define GIF_REGLIST 1
|
|
#define GIF_IMAGE 2
|
|
|
|
#define GIF_MAKE_TAG(NLOOP,EOP,PRE,PRIM,FLG,NREG) \
|
|
(BIT64(NLOOP,0) | BIT64(EOP,15) | BIT64(PRE,46) | \
|
|
BIT64(PRIM,47) | BIT64(FLG,58) | BIT64(NREG,60))
|
|
|
|
/* This is global and not tied to a user context because
|
|
* it is set up by kernel functions and not really changed
|
|
* afterwards. */
|
|
typedef struct GsCrtState GsCrtState;
|
|
struct GsCrtState
|
|
{
|
|
short inter, mode, ff;
|
|
};
|
|
extern GsCrtState gsCrtState;
|
|
|
|
typedef struct GsDispCtx GsDispCtx;
|
|
struct GsDispCtx
|
|
{
|
|
// two circuits
|
|
GsPmode pmode;
|
|
GsDispfb dispfb1;
|
|
GsDispfb dispfb2;
|
|
GsDisplay display1;
|
|
GsDisplay display2;
|
|
GsBgcolor bgcolor;
|
|
};
|
|
|
|
typedef struct GsDrawCtx GsDrawCtx;
|
|
struct GsDrawCtx
|
|
{
|
|
//two contexts
|
|
uint128 gifTag;
|
|
GsFrame frame1;
|
|
uint64 ad_frame1;
|
|
GsFrame frame2;
|
|
uint64 ad_frame2;
|
|
GsZbuf zbuf1;
|
|
uint64 ad_zbuf1;
|
|
GsZbuf zbuf2;
|
|
uint64 ad_zbuf2;
|
|
GsXyOffset xyoffset1;
|
|
uint64 ad_xyoffset1;
|
|
GsXyOffset xyoffset2;
|
|
uint64 ad_xyoffset2;
|
|
GsScissor scissor1;
|
|
uint64 ad_scissor1;
|
|
GsScissor scissor2;
|
|
uint64 ad_scissor2;
|
|
};
|
|
|
|
typedef struct GsCtx GsCtx;
|
|
struct GsCtx
|
|
{
|
|
// display context; two buffers
|
|
GsDispCtx disp[2];
|
|
// draw context; two buffers
|
|
GsDrawCtx draw[2];
|
|
};
|