tp/libs/dolphin/gx/GXPixel.c

248 lines
9.6 KiB
C

#include "dolphin/gx/GXPixel.h"
#include "dolphin/gx.h"
/* 8035F8B8-8035FACC 35A1F8 0214+00 0/0 20/20 2/2 .text GXSetFog */
void GXSetFog(GXFogType type, f32 startz, f32 endz, f32 nearz, f32 farz, GXColor color) {
f32 a, c;
u32 a_bits, c_bits;
u32 fogColorReg = 0;
u32 fogParamReg0 = 0;
u32 fogParamReg1 = 0;
u32 fogParamReg2 = 0;
u32 fogParamReg3 = 0;
u32 fsel = type & 7;
BOOL isOrtho = (type >> 3) & 1;
u32 col;
if (isOrtho) {
if (farz == nearz || endz == startz) {
a = 0.0f;
c = 0.0f;
} else {
a = (1.0f / (endz - startz)) * (farz - nearz);
c = (1.0f / (endz - startz)) * (startz - nearz);
}
} else {
f32 tmpA, tmpB, tmpC;
u32 expB, magB, shiftB;
if (farz == nearz || endz == startz) {
tmpA = 0.0f;
tmpB = 0.5f;
tmpC = 0.0f;
} else {
tmpA = (farz * nearz) / ((farz - nearz) * (endz - startz));
tmpB = farz / (farz - nearz);
tmpC = startz / (endz - startz);
}
expB = 0;
while (tmpB > 1.0) {
tmpB /= 2.0f;
expB++;
}
while (tmpB > 0.0f && tmpB < 0.5) {
tmpB *= 2.0f;
expB--;
}
a = tmpA / (1 << expB + 1);
magB = 8388638.0f * tmpB;
shiftB = expB + 1;
c = tmpC;
GX_SET_REG(fogParamReg1, magB, GX_BP_FOGPARAM1_B_MAG_ST, GX_BP_FOGPARAM1_B_MAG_END);
GX_SET_REG(fogParamReg2, shiftB, GX_BP_FOGPARAM2_B_SHIFT_ST, GX_BP_FOGPARAM2_B_SHIFT_END);
GX_SET_REG(fogParamReg1, GX_BP_REG_FOGPARAM1, 0, 7);
GX_SET_REG(fogParamReg2, GX_BP_REG_FOGPARAM2, 0, 7);
}
a_bits = *(u32*)&a;
c_bits = *(u32*)&c;
GX_SET_REG(fogParamReg0, a_bits >> 12, GX_BP_FOGPARAM0_A_MANT_ST, GX_BP_FOGPARAM0_A_MANT_END);
GX_SET_REG(fogParamReg0, a_bits >> 23, GX_BP_FOGPARAM0_A_EXP_ST, GX_BP_FOGPARAM0_A_EXP_END);
GX_SET_REG(fogParamReg0, a_bits >> 31, GX_BP_FOGPARAM0_A_SIGN_ST, GX_BP_FOGPARAM0_A_SIGN_END);
GX_SET_REG(fogParamReg0, GX_BP_REG_FOGPARAM0, 0, 7);
GX_SET_REG(fogParamReg3, c_bits >> 12, GX_BP_FOGPARAM3_C_MANT_ST, GX_BP_FOGPARAM3_C_MANT_END);
GX_SET_REG(fogParamReg3, c_bits >> 23, GX_BP_FOGPARAM3_C_EXP_ST, GX_BP_FOGPARAM3_C_EXP_END);
GX_SET_REG(fogParamReg3, c_bits >> 31, GX_BP_FOGPARAM3_C_SIGN_ST, GX_BP_FOGPARAM3_C_SIGN_END);
GX_SET_REG(fogParamReg3, isOrtho, GX_BP_FOGPARAM3_PROJ_ST, GX_BP_FOGPARAM3_PROJ_END);
GX_SET_REG(fogParamReg3, fsel, GX_BP_FOGPARAM3_FSEL_ST, GX_BP_FOGPARAM3_FSEL_END);
GX_SET_REG(fogParamReg3, GX_BP_REG_FOGPARAM3, 0, 7);
col = *(u32*)&color;
GX_SET_REG(fogColorReg, col >> 8, GX_BP_FOGCOLOR_RGB_ST, GX_BP_FOGCOLOR_RGB_END);
GX_SET_REG(fogColorReg, GX_BP_REG_FOGCOLOR, 0, 7);
GX_BP_LOAD_REG(fogParamReg0);
GX_BP_LOAD_REG(fogParamReg1);
GX_BP_LOAD_REG(fogParamReg2);
GX_BP_LOAD_REG(fogParamReg3);
GX_BP_LOAD_REG(fogColorReg);
__GXData->bpSentNot = GX_FALSE;
}
/* 8035FACC-8035FBF0 35A40C 0124+00 0/0 9/9 2/2 .text GXSetFogRangeAdj */
void GXSetFogRangeAdj(GXBool enable, u16 center, GXFogAdjTable* table) {
u32 fogRangeReg;
u32 fogRangeRegK;
u32 i;
if (enable) {
for (i = 0; i < 10; i += 2) {
fogRangeRegK = 0;
GX_SET_REG(fogRangeRegK, table->fogVals[i], GX_BP_FOGRANGEK_HI_ST,
GX_BP_FOGRANGEK_HI_END);
GX_SET_REG(fogRangeRegK, table->fogVals[i + 1], GX_BP_FOGRANGEK_LO_ST,
GX_BP_FOGRANGEK_LO_END);
GX_SET_REG(fogRangeRegK, GX_BP_REG_FOGRANGEK0 + (i / 2), 0, 7);
GX_BP_LOAD_REG(fogRangeRegK);
}
}
fogRangeReg = 0;
GX_SET_REG(fogRangeReg, center + 342, GX_BP_FOGRANGE_CENTER_ST, GX_BP_FOGRANGE_CENTER_END);
GX_SET_REG(fogRangeReg, enable, GX_BP_FOGRANGE_ENABLED_ST, GX_BP_FOGRANGE_ENABLED_END);
GX_SET_REG(fogRangeReg, GX_BP_REG_FOGRANGE, 0, 7);
GX_BP_LOAD_REG(fogRangeReg);
__GXData->bpSentNot = GX_FALSE;
}
/* 8035FBF0-8035FC44 35A530 0054+00 0/0 53/53 3/3 .text GXSetBlendMode */
void GXSetBlendMode(GXBlendMode type, GXBlendFactor src_factor, GXBlendFactor dst_factor,
GXLogicOp op) {
u32 blendModeReg = __GXData->cmode0;
GX_SET_REG(blendModeReg, type == GX_BM_SUBTRACT, GX_BP_BLENDMODE_SUBTRACT_ST,
GX_BP_BLENDMODE_SUBTRACT_END);
GX_SET_REG(blendModeReg, type, GX_BP_BLENDMODE_ENABLE_ST, GX_BP_BLENDMODE_ENABLE_END);
GX_SET_REG(blendModeReg, type == GX_BM_LOGIC, GX_BP_BLENDMODE_LOGIC_OP_ST,
GX_BP_BLENDMODE_LOGIC_OP_END);
GX_SET_REG(blendModeReg, op, GX_BP_BLENDMODE_LOGICMODE_ST, GX_BP_BLENDMODE_LOGICMODE_END);
GX_SET_REG(blendModeReg, src_factor, GX_BP_BLENDMODE_SRCFACTOR_ST,
GX_BP_BLENDMODE_SRCFACTOR_END);
GX_SET_REG(blendModeReg, dst_factor, GX_BP_BLENDMODE_DSTFACTOR_ST,
GX_BP_BLENDMODE_DSTFACTOR_END);
GX_BP_LOAD_REG(blendModeReg);
__GXData->cmode0 = blendModeReg;
__GXData->bpSentNot = FALSE;
}
/* 8035FC44-8035FC70 35A584 002C+00 0/0 10/10 2/2 .text GXSetColorUpdate */
void GXSetColorUpdate(GXBool updateEnable) {
u32 blendModeReg = __GXData->cmode0;
GX_SET_REG(blendModeReg, updateEnable, GX_BP_BLENDMODE_COLOR_UPDATE_ST,
GX_BP_BLENDMODE_COLOR_UPDATE_END);
GX_BP_LOAD_REG(blendModeReg);
__GXData->cmode0 = blendModeReg;
__GXData->bpSentNot = GX_FALSE;
}
/* 8035FC70-8035FC9C 35A5B0 002C+00 0/0 10/10 2/2 .text GXSetAlphaUpdate */
void GXSetAlphaUpdate(GXBool updateEnable) {
u32 blendModeReg = __GXData->cmode0;
GX_SET_REG(blendModeReg, updateEnable, GX_BP_BLENDMODE_ALPHA_UPDATE_ST,
GX_BP_BLENDMODE_ALPHA_UPDATE_END);
GX_BP_LOAD_REG(blendModeReg);
__GXData->cmode0 = blendModeReg;
__GXData->bpSentNot = GX_FALSE;
}
/* 8035FC9C-8035FCD0 35A5DC 0034+00 0/0 40/40 6/6 .text GXSetZMode */
void GXSetZMode(GXBool compareEnable, GXCompare func, GXBool updateEnable) {
u32 zModeReg = __GXData->zmode;
GX_SET_REG(zModeReg, compareEnable, GX_BP_ZMODE_TEST_ENABLE_ST, GX_BP_ZMODE_TEST_ENABLE_END);
GX_SET_REG(zModeReg, func, GX_BP_ZMODE_COMPARE_ST, GX_BP_ZMODE_COMPARE_END);
GX_SET_REG(zModeReg, updateEnable, GX_BP_ZMODE_UPDATE_ENABLE_ST, GX_BP_ZMODE_UPDATE_ENABLE_END);
GX_BP_LOAD_REG(zModeReg);
__GXData->zmode = zModeReg;
__GXData->bpSentNot = GX_FALSE;
}
/* 8035FCD0-8035FD04 35A610 0034+00 0/0 29/29 5/5 .text GXSetZCompLoc */
void GXSetZCompLoc(GXBool beforeTex) {
GX_SET_REG(__GXData->peCtrl, beforeTex, GX_BP_ZCONTROL_BEFORE_TEX_ST,
GX_BP_ZCONTROL_BEFORE_TEX_END);
GX_BP_LOAD_REG(__GXData->peCtrl);
__GXData->bpSentNot = GX_FALSE;
}
/* 8035FD04-8035FDD8 35A644 00D4+00 0/0 2/2 1/1 .text GXSetPixelFmt */
void GXSetPixelFmt(GXPixelFmt pixelFmt, GXZFmt16 zFmt) {
GXBool isZ16;
static u32 p2f[GX_PF_MAX] = {GX_PF_RGB8_Z24, GX_PF_RGBA6_Z24, GX_PF_RGB565_Z16, GX_PF_Z24,
GX_PF_Y8, GX_PF_Y8, GX_PF_Y8, GX_PF_U8};
const u32 zControlRegOld = __GXData->peCtrl;
GX_SET_REG(__GXData->peCtrl, p2f[pixelFmt], GX_BP_ZCONTROL_PIXEL_FMT_ST,
GX_BP_ZCONTROL_PIXEL_FMT_END);
GX_SET_REG(__GXData->peCtrl, zFmt, GX_BP_ZCONTROL_Z_FMT_ST, GX_BP_ZCONTROL_Z_FMT_END);
if (zControlRegOld != __GXData->peCtrl) {
GX_BP_LOAD_REG(__GXData->peCtrl);
isZ16 = (pixelFmt == GX_PF_RGB565_Z16) ? GX_TRUE : GX_FALSE;
GX_SET_REG(__GXData->genMode, isZ16, GX_BP_GENMODE_MULTISAMPLE_ST,
GX_BP_GENMODE_MULTISAMPLE_END);
__GXData->dirtyState |= GX_DIRTY_GEN_MODE;
}
if (p2f[pixelFmt] == GX_PF_Y8) {
GX_SET_REG(__GXData->cmode1, pixelFmt - GX_PF_Y8, GX_BP_DSTALPHA_YUV_FMT_ST,
GX_BP_DSTALPHA_YUV_FMT_END);
GX_SET_REG(__GXData->cmode1, GX_BP_REG_DSTALPHA, 0, 7);
GX_BP_LOAD_REG(__GXData->cmode1);
}
__GXData->bpSentNot = FALSE;
}
/* 8035FDD8-8035FE04 35A718 002C+00 0/0 22/22 1/1 .text GXSetDither */
void GXSetDither(GXBool dither) {
u32 blendModeReg = __GXData->cmode0;
GX_SET_REG(blendModeReg, dither, GX_BP_BLENDMODE_DITHER_ST, GX_BP_BLENDMODE_DITHER_END);
GX_BP_LOAD_REG(blendModeReg);
__GXData->cmode0 = blendModeReg;
__GXData->bpSentNot = GX_FALSE;
}
/* 8035FE04-8035FE40 35A744 003C+00 0/0 2/2 0/0 .text GXSetDstAlpha */
void GXSetDstAlpha(GXBool enable, u8 alpha) {
u32 dstAlpha = __GXData->cmode1;
GX_SET_REG(dstAlpha, alpha, GX_BP_DSTALPHA_ALPHA_ST, GX_BP_DSTALPHA_ALPHA_END);
GX_SET_REG(dstAlpha, enable, GX_BP_DSTALPHA_ENABLE_ST, GX_BP_DSTALPHA_ENABLE_END);
GX_BP_LOAD_REG(dstAlpha);
__GXData->cmode1 = dstAlpha;
__GXData->bpSentNot = GX_FALSE;
}
/* 8035FE40-8035FE78 35A780 0038+00 0/0 1/1 0/0 .text GXSetFieldMask */
void GXSetFieldMask(GXBool enableEven, GXBool enableOdd) {
u32 fieldMaskReg = 0;
GX_SET_REG(fieldMaskReg, enableOdd, GX_BP_FIELDMASK_ODD_ST, GX_BP_FIELDMASK_ODD_END);
GX_SET_REG(fieldMaskReg, enableEven, GX_BP_FIELDMASK_EVEN_ST, GX_BP_FIELDMASK_EVEN_END);
GX_SET_REG(fieldMaskReg, GX_BP_REG_FIELDMASK, 0, 7);
GX_BP_LOAD_REG(fieldMaskReg);
__GXData->bpSentNot = GX_FALSE;
}
/* 8035FE78-8035FEF0 35A7B8 0078+00 0/0 1/1 0/0 .text GXSetFieldMode */
void GXSetFieldMode(GXBool texLOD, GXBool adjustAR) {
GX_SET_REG(__GXData->lpSize, adjustAR, GX_BP_LINEPTWIDTH_ADJUST_ST,
GX_BP_LINEPTWIDTH_ADJUST_END);
GX_BP_LOAD_REG(__GXData->lpSize);
__GXFlushTextureState();
GX_BP_LOAD_REG(GX_BP_REG_FIELDMODE << 24 | texLOD);
__GXFlushTextureState();
}