librw/tools/ps2/gs.h
2015-08-27 16:45:54 +02:00

485 lines
9.7 KiB
C
Executable File

#ifndef GS_H
#define GS_H
#include "ps2.h"
#include "ee_regs.h"
typedef struct GsState GsState;
struct GsState {
int32 mode, interlaced, field;
int32 width, height;
int32 startx, starty;
int32 dw, dh;
int32 magh, magv;
int32 xoff, yoff;
int32 xmax, ymax;
int32 psm;
int32 depth;
int32 bpp;
int32 zpsm;
int32 zdepth;
int32 zbpp;
int32 zmax;
int32 currentMemPtr;
uint32 fbAddr[2];
uint32 zbAddr;
int32 visibleFb;
int32 activeFb;
uint32 clearcol;
int32 ztest;
int32 zfunc;
struct {
int32 enable;
int32 a, b, c, d;
int32 fix;
} blend;
int32 shadingmethod;
};
extern GsState *gsCurState;
void gsDumpState(void);
void gsInitState(uint16 interlaced,
uint16 mode, uint16 field);
void gsInit(void);
void gsUpdateContext(void);
void gsSelectVisibleFb(int n);
void gsSelectActiveFb(int n);
void gsFlip(int synch);
void gsClear(void);
void gsNormalizedToScreen(float *v1, uint32 *v2);
void drawrect(uint16 x1, uint16 y1, uint16 x2, uint16 y2, uint32 col);
//void drawdata(float *data, int vertexCount);
#define NTSC 2
#define PAL 3
#define DTV480P 0x50 //(use with NONINTERLACED, FRAME)
#define NONINTERLACED 0
#define INTERLACED 1
#define FIELD 0
#define FRAME 1
#define PSMCT32 0
#define PSMCT24 1
#define PSMCT16 2
#define PSMCT16S 10
#define PS_GPU24 18
#define PSMCZ32 0
#define PSMCZ24 1
#define PSMCZ16 2
#define PSMCZ16S 10
#define ZTST_NEVER 0
#define ZTST_ALWAYS 1
#define ZTST_GREATER 2
#define ZTST_GEQUAL 3
#define PRIM_POINT 0
#define PRIM_LINE 1
#define PRIM_LINE_STRIP 2
#define PRIM_TRI 3
#define PRIM_TRI_STRIP 4
#define PRIM_TRI_FAN 5
#define PRIM_SPRITE 6
#define PRIM_NO_SPEC 7
#define IIP_FLAT 0
#define 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
#define MAKE_GS_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 MAKE_GS_RGBAQ(R,G,B,A,Q) \
(BIT64(R, 0) | \
BIT64(G, 8) | \
BIT64(B, 16) | \
BIT64(A, 24) | \
BIT64(Q, 32))
#define MAKE_GS_ST(S,T) \
(BIT64(S, 0) | \
BIT64(T, 32))
#define MAKE_GS_UV(U,V) \
(BIT64(U, 0) | \
BIT64(V, 16))
#define MAKE_GS_XYZF(X,Y,Z,F) \
(BIT64(X, 0) | \
BIT64(Y, 16) | \
BIT64(Z, 32) | \
BIT64(F, 56))
#define MAKE_GS_XYZ(X,Y,Z) \
(BIT64(X, 0) | \
BIT64(Y, 16) | \
BIT64(Z, 32))
#define MAKE_GS_TEX0(TBP0,TBW,PSM,TW,TH,TCC,TFX,CBP,CPSM,CSM,CSA,CLD) \
(BIT64(TBP0, 0) | \
BIT64(TBW, 14) | \
BIT64(PSM, 20) | \
BIT64(TW, 26) | \
BIT64(TH, 30) | \
BIT64(TCC, 34) | \
BIT64(TFX, 35) | \
BIT64(CBP, 37) | \
BIT64(CPSM, 51) | \
BIT64(CSM, 55) | \
BIT64(CSA, 56) | \
BIT64(CLD, 61))
#define MAKE_GS_CLAMP(WMS,WMT,MINU,MAXU,MINV,MAXV) \
(BIT64(WMS, 0) | \
BIT64(WMT, 2) | \
BIT64(MINU, 4) | \
BIT64(MAXU, 14) | \
BIT64(MINV, 24) | \
BIT64(MAXV, 34))
#define MAKE_GS_FOG(F) \
(BIT64(F, 56))
#define MAKE_GS_TEX1(LCM,MXL,MMAG,MMIN,MTBA,L,K) \
(BIT64(LCM, 0) | \
BIT64(MXL, 2) | \
BIT64(MMAG, 5) | \
BIT64(MMIN, 6) | \
BIT64(MTBA, 9) | \
BIT64(L, 19) | \
BIT64(K, 32))
#define MAKE_GS_TEX2(PSM,CBP,CPSM,CSM,CSA,CLD) \
(BIT64(PSM, 20) | \
BIT64(CBP, 37) | \
BIT64(CPSM, 51) | \
BIT64(CSM, 55) | \
BIT64(CSA, 56) | \
BIT64(CLD, 61))
#define MAKE_GS_XYOFFSET(OFX,OFY) \
(BIT64(OFX, 0) | \
BIT64(OFY, 32))
#define MAKE_GS_PRMODECONT(AC) \
(BIT64(AC, 0))
#define MAKE_GS_PRMODE(IIP,TME,FGE,ABE,AA1,FST,CTXT,FIX) \
(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 MAKE_GS_TEXCLUT(CBW,COU,COV) \
(BIT64(CBW, 0) | \
BIT64(COU, 6) | \
BIT64(COV, 12))
#define MAKE_GS_SCANMSK(MSK) \
(BIT64(MSK, 0))
#define MAKE_GS_MIPTBP1(TBP1,TBW1,TBP2,TBW2,TBP3,TBW3) \
(BIT64(TBP1, 0) | \
BIT64(TBW1, 14) | \
BIT64(TBP2, 20) | \
BIT64(TBW2, 34) | \
BIT64(TBP3, 40) | \
BIT64(TBW3, 54))
#define MAKE_GS_MIPTBP2(TBP4,TBW4,TBP5,TBW5,TBP6,TBW6) \
(BIT64(TBP4, 0) | \
BIT64(TBW4, 14) | \
BIT64(TBP5, 20) | \
BIT64(TBW5, 34) | \
BIT64(TBP6, 40) | \
BIT64(TBW6, 54))
#define MAKE_GS_TEXA(TA0,AEM,TA1) \
(BIT64(TA0, 0) | \
BIT64(AEM, 15) | \
BIT64(TA1, 32))
#define MAKE_GS_FOGCOL(FCR,FCG,FCB) \
(BIT64(FCR, 0) | \
BIT64(FCG, 8) | \
BIT64(FCB, 16))
/* GS_TEXFLUSH */
#define MAKE_GS_SCISSOR(SCAX0,SCAX1,SCAY0,SCAY1) \
(BIT64(SCAX0, 0) | \
BIT64(SCAX1, 16) | \
BIT64(SCAY0, 32) | \
BIT64(SCAY1, 48))
#define MAKE_GS_ALPHA(A,B,C,D,FIX) \
(BIT64(A, 0) | \
BIT64(B, 2) | \
BIT64(C, 4) | \
BIT64(D, 6) | \
BIT64(FIX, 32))
#define MAKE_GS_DIMX(DM00,DM01,DM02,DM03, \
DM10,DM11,DM12,DM13, \
DM20,DM21,DM22,DM23, \
DM30,DM31,DM32,DM33) \
(BIT64(DM00, 0) | \
BIT64(DM01, 4) | \
BIT64(DM02, 8) | \
BIT64(DM03, 12) | \
BIT64(DM10, 16) | \
BIT64(DM11, 20) | \
BIT64(DM12, 24) | \
BIT64(DM13, 28) | \
BIT64(DM20, 32) | \
BIT64(DM21, 36) | \
BIT64(DM22, 40) | \
BIT64(DM23, 44) | \
BIT64(DM30, 48) | \
BIT64(DM31, 52) | \
BIT64(DM32, 56) | \
BIT64(DM33, 60))
#define MAKE_GS_DITHE(DTHE) \
(BIT64(DTHE, 0))
#define MAKE_GS_COLCLAMP(CLAMP) \
(BIT64(CLAMP, 0))
#define MAKE_GS_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 MAKE_GS_PABE(PABE) \
(BIT64(PABE, 0))
#define MAKE_GS_FBA(FBA) \
(BIT64(FBA, 0))
#define MAKE_GS_FRAME(FBP,FBW,PSM,FBMSK) \
(BIT64(FBP, 0) | \
BIT64(FBW, 16) | \
BIT64(PSM, 24) | \
BIT64(FBMSK, 32))
#define MAKE_GS_ZBUF(ZBP,PSM,ZMSK) \
(BIT64(ZBP, 0) | \
BIT64(PSM, 24) | \
BIT64(ZMSK, 32))
#define MAKE_GS_BITBLTBUF(SBP,SBW,SPSM,DBP,DBW,DPSM) \
(BIT64(SBP, 0) | \
BIT64(SBW, 16) | \
BIT64(SPSM, 24) | \
BIT64(DBP, 32) | \
BIT64(DBW, 48) | \
BIT64(DPSM, 56))
#define MAKE_GS_TRXPOS(SSAX,SSAY,DSAX,DSAY,DIR) \
(BIT64(SSAX, 0) | \
BIT64(SSAY, 16) | \
BIT64(DSAX, 32) | \
BIT64(DSAY, 48) | \
BIT64(DIR, 59))
#define MAKE_GS_TRXREG(RRW,RRH) \
(BIT64(RRW, 0) | \
BIT64(RRH, 32))
#define MAKE_GS_TRXDIR(XDIR) \
(BIT64(XDIR, 0))
#define MAKE_GS_HWREG(DATA) \
(BIT64(DATA, 0))
#define MAKE_GS_SIGNAL(ID,IDMSK) \
(BIT64(ID, 0) | \
BIT64(IDMSK, 32))
/* GS_FINISH */
#define MAKE_GS_LABEL(ID,IDMSK) \
(BIT64(ID, 0) | \
BIT64(IDMSK, 32))
/*
* No documentation about these:
* GS_SRFSH
* GS_SYNCH1
* GS_SYNCH2
* GS_SYNCV
*/
#define MAKE_GS_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))
#define MAKE_GS_SMODE(INT,FFMD,DPMS) \
(BIT64(INT, 0) | \
BIT64(FFMD, 1) | \
BIT64(DPMS, 2))
#define MAKE_GS_DISPFB(FBP,FBW,PSM,DBX,DBY) \
(BIT64(FBP, 0) | \
BIT64(FBW, 9) | \
BIT64(PSM, 15) | \
BIT64(DBX, 32) | \
BIT64(DBY, 43))
#define MAKE_GS_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))
#define MAKE_GS_EXTBUF(EXBP,EXBW,FBIN,WFFMD,EMODE,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))
#define MAKE_GS_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))
#define MAKE_GS_EXTWRITE(WRITE) \
(BIT64(WRITE, 0))
#define MAKE_GS_BGCOLOR(R,G,B) \
(BIT64(R, 0) | \
BIT64(G, 8) | \
BIT64(B, 16))
#define MAKE_GS_CSR(SIGNAL,FINISH,HSINT,VSINT,EDWINT,FLUSH,RESET,NFIELD,\
FIELD,FIFO,REV,ID) \
(BIT64(SIGNAL, 0) | \
BIT64(FINISH, 1) | \
BIT64(HSINT, 2) | \
BIT64(VSINT, 3) | \
BIT64(EDWINT, 4) | \
BIT64(FLUSH, 8) | \
BIT64(RESET, 9) | \
BIT64(NFIELD, 12) | \
BIT64(FIELD, 13) | \
BIT64(FIFO, 14) | \
BIT64(REV, 16) | \
BIT64(ID, 24))
#define MAKE_GS_IMR(SIGMSK,FINISHMSK,HSMSK,VSMSK,EDWMSK) \
(BIT64(SIGMSK, 8) | \
BIT64(FINISHMSK, 9) | \
BIT64(HSMSK, 10) | \
BIT64(VSMSK, 11) | \
BIT64(EDWMSK, 12))
#define MAKE_GS_BUSDIR(DIR) \
(BIT64(DIR, 0))
#define MAKE_GS_SIGLBLID(SIGID,LBLID) \
(BIT64(SIGID, 0) | \
BIT64(LBLID, 32))
#define GS_RESET() \
SET_REG64(GS_CSR, BIT64(1, 9))
#endif