Some GX work (#1998)

* Some GX work

* GXFrameBuf work

* Import GXAttr functions and enums

* Import most of GXTev

* Import most of GXPixel

* Import GXFifo

* Import some of GXInit

* Import and work on GXTransform

* Import GXPerf

* A little work on GXTexture
This commit is contained in:
hatal175
2023-12-06 15:57:35 -08:00
committed by GitHub
parent 28fb711606
commit 0de0339250
117 changed files with 4450 additions and 4768 deletions
+475 -196
View File
File diff suppressed because it is too large Load Diff
+19 -19
View File
@@ -27,7 +27,7 @@ void GXSetTevIndirect(GXTevStageID tevStage, GXIndTexStageID texStage, GXIndTexF
GXFIFO.u8 = 0x61;
GXFIFO.s32 = field;
__GXData->field_0x2 = 0;
__GXData->bpSentNot = 0;
}
/* 8035ED2C-8035EEA4 35966C 0178+00 0/0 4/4 1/1 .text GXSetIndTexMtx */
@@ -84,7 +84,7 @@ void GXSetIndTexMtx(GXIndTexMtxID mtxID, f32 offset[6], s8 scale_exp) {
GXFIFO.u8 = 0x61;
GXFIFO.s32 = field;
__GXData->field_0x2 = 0;
__GXData->bpSentNot = 0;
}
/* 8035EEA4-8035EFE8 3597E4 0144+00 0/0 5/5 0/0 .text GXSetIndTexCoordScale */
@@ -126,7 +126,7 @@ void GXSetIndTexCoordScale(GXIndTexStageID texStage, GXIndTexScale scaleS, GXInd
break;
}
__GXData->field_0x2 = 0;
__GXData->bpSentNot = 0;
}
/* 8035EFE8-8035F0D4 359928 00EC+00 0/0 3/3 0/0 .text GXSetIndTexOrder */
@@ -144,36 +144,36 @@ void GXSetIndTexOrder(GXIndTexStageID stage, GXTexCoordID coord, GXTexMapID map)
switch (stage) {
case GX_INDTEXSTAGE0:
data = __GXData;
GX_BITFIELD_SET(data->field_0x120, 29, 3, map);
GX_BITFIELD_SET(data->field_0x120, 26, 3, coord);
GX_BITFIELD_SET(data->iref, 29, 3, map);
GX_BITFIELD_SET(data->iref, 26, 3, coord);
break;
case GX_INDTEXSTAGE1:
data = __GXData;
GX_BITFIELD_SET(data->field_0x120, 23, 3, map);
GX_BITFIELD_SET(data->field_0x120, 20, 3, coord);
GX_BITFIELD_SET(data->iref, 23, 3, map);
GX_BITFIELD_SET(data->iref, 20, 3, coord);
break;
case GX_INDTEXSTAGE2:
data = __GXData;
GX_BITFIELD_SET(data->field_0x120, 17, 3, map);
GX_BITFIELD_SET(data->field_0x120, 14, 3, coord);
GX_BITFIELD_SET(data->iref, 17, 3, map);
GX_BITFIELD_SET(data->iref, 14, 3, coord);
break;
case GX_INDTEXSTAGE3:
data = __GXData;
GX_BITFIELD_SET(data->field_0x120, 11, 3, map);
GX_BITFIELD_SET(data->field_0x120, 8, 3, coord);
GX_BITFIELD_SET(data->iref, 11, 3, map);
GX_BITFIELD_SET(data->iref, 8, 3, coord);
break;
}
GXFIFO.u8 = 0x61;
GXFIFO.s32 = __GXData->field_0x120;
GXFIFO.s32 = __GXData->iref;
GXSetWasteFlags();
}
/* 8035F0D4-8035F0F8 359A14 0024+00 0/0 43/43 7/7 .text GXSetNumIndStages */
void GXSetNumIndStages(u8 num) {
GXData* data = __GXData;
GX_BITFIELD_SET(data->field_0x204, 13, 3, num);
data->field_0x5ac |= 0x6;
GX_BITFIELD_SET(data->genMode, 13, 3, num);
data->dirtyFlags |= GX_DIRTY_BP_MASK | GX_DIRTY_GEN_MODE;
}
/* 8035F0F8-8035F140 359A38 0048+00 0/0 16/16 0/0 .text GXSetTevDirect */
@@ -189,15 +189,15 @@ void __GXUpdateBPMask(void) {}
void __GXSetIndirectMask(u32 mask) {
GXData* data = __GXData;
GX_BITFIELD_SET(data->field_0x124, 24, 8, mask);
GX_BITFIELD_SET(data->bpMask, 24, 8, mask);
GXFIFO.u8 = 0x61;
GXFIFO.s32 = data->field_0x124;
data->field_0x2 = 0;
GXFIFO.s32 = data->bpMask;
data->bpSentNot = 0;
}
/* 8035F174-8035F198 359AB4 0024+00 0/0 4/4 0/0 .text __GXFlushTextureState */
void __GXFlushTextureState(void) {
GXFIFO.u8 = 0x61;
GXFIFO.s32 = __GXData->field_0x124;
__GXData->field_0x2 = 0;
GXFIFO.s32 = __GXData->bpMask;
__GXData->bpSentNot = 0;
}
+1 -1
View File
@@ -8,7 +8,7 @@
/* 8035FEF0-8035FF60 35A830 0070+00 0/0 20/20 4/4 .text GXCallDisplayList */
void GXCallDisplayList(void* list, u32 nbytes) {
if (__GXData->field_0x5ac != 0) {
if (__GXData->dirtyFlags != 0) {
__GXSetDirtyState();
}
+253 -163
View File
File diff suppressed because it is too large Load Diff
+307 -10
View File
@@ -86,22 +86,22 @@ void GXSetTexCopyDst(u16 width, u16 height, s32 fmt, GXBool mipmap) {
case 2:
case 3:
case 0x26:
GX_BITFIELD_SET(__GXData->field_0x1fc, 15, 2, 3);
GX_BITFIELD_SET(__GXData->cpTex, 15, 2, 3);
break;
default:
GX_BITFIELD_SET(__GXData->field_0x1fc, 15, 2, 2);
GX_BITFIELD_SET(__GXData->cpTex, 15, 2, 2);
break;
}
__GXData->field_0x200 = (fmt & 0x10) == 0x10;
__GXData->field_0x1fc = __rlwimi(__GXData->field_0x1fc, fmt2, 0, 28, 28);
__GXData->field_0x200 = 0x10 == (fmt & 0x10);
__GXData->cpTex = __rlwimi(__GXData->cpTex, fmt2, 0, 28, 28);
fmt2 &= 7;
__GetImageTileCount(fmt, width, height, &arg3, &arg4, &arg5);
__GXData->field_0x1f8 = 0;
GX_BITFIELD_SET(__GXData->field_0x1f8, 22, 10, arg3*arg5);
GX_BITFIELD_SET(__GXData->field_0x1f8, 0, 8, 0x4d);
GX_BITFIELD_SET(__GXData->field_0x1fc, 22, 1, mipmap);
GX_BITFIELD_SET(__GXData->field_0x1fc, 25, 3, fmt2);
GX_BITFIELD_SET(__GXData->cpTex, 22, 1, mipmap);
GX_BITFIELD_SET(__GXData->cpTex, 25, 3, fmt2);
}
#else
#pragma push
@@ -118,7 +118,7 @@ asm void GXSetTexCopyDst(u16 width, u16 height, s32 fmt, GXBool mipmap) {
void GXSetDispCopyFrame2Field(GXCopyMode arg0)
{
GX_BITFIELD_SET(__GXData->field_0x1ec, 18, 2, arg0);
GX_BITFIELD_SET(__GXData->field_0x1fc, 18, 2, 0);
GX_BITFIELD_SET(__GXData->cpTex, 18, 2, 0);
}
#define INSERT_FIELD(reg, value, nbits, shift) \
(reg) = ((u32) (reg) & ~(((1 << (nbits)) - 1) << (shift))) | \
@@ -130,8 +130,8 @@ void GXSetCopyClamp(GXFBClamp clamp) {
u8 isBottom = (clamp & GX_CLAMP_BOTTOM) == GX_CLAMP_BOTTOM;
__GXData->field_0x1ec = __rlwimi(__GXData->field_0x1ec, isTop, 0, 31, 31);
__GXData->field_0x1ec = __rlwimi(__GXData->field_0x1ec, isBottom, 1, 30, 30);
__GXData->field_0x1fc = __rlwimi(__GXData->field_0x1fc, isTop, 0, 31, 31);
__GXData->field_0x1fc = __rlwimi(__GXData->field_0x1fc, isBottom, 1, 30, 30);
__GXData->cpTex = __rlwimi(__GXData->cpTex, isTop, 0, 31, 31);
__GXData->cpTex = __rlwimi(__GXData->cpTex, isBottom, 1, 30, 30);
}
/* ############################################################################################## */
@@ -142,7 +142,28 @@ SECTION_SDATA2 static f32 lit_179[1 + 1 /* padding */] = {
0.0f,
};
static u32 __GXGetNumXfbLines(u16 efb_height, u32 y_scale) {
u32 rv = ((efb_height - 1) * 0x100) / y_scale + 1;
if (y_scale > 0x80 && y_scale < 0x100) {
for (; (y_scale & 1) == 0; y_scale >>= 1) {
}
if (efb_height % y_scale == 0) {
rv++;
}
}
if (rv > 0x400) {
rv = 0x400;
}
return rv;
}
/* 8035CCDC-8035CD6C 35761C 0090+00 0/0 2/2 0/0 .text GXGetNumXfbLines */
// regalloc
#ifdef NONMATCHING
u16 GXGetNumXfbLines(u32 efb_height, f32 y_scale) {
return __GXGetNumXfbLines(efb_height, ((u32)(256.0f / y_scale)) & 0x1ff);
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -151,12 +172,37 @@ asm u16 GXGetNumXfbLines(u32 efb_height, f32 y_scale) {
#include "asm/dolphin/gx/GXFrameBuf/GXGetNumXfbLines.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 804565B0-804565B8 004BB0 0008+00 1/1 0/0 0/0 .sdata2 @234 */
SECTION_SDATA2 static f64 lit_234 = 4503599627370496.0 /* cast u32 to float */;
/* 8035CD6C-8035CFA4 3576AC 0238+00 0/0 2/2 0/0 .text GXGetYScaleFactor */
// Matches with literals
#ifdef NONMATCHING
f32 GXGetYScaleFactor(u16 efb_height, u16 xfb_height) {
u8 padding[0x10];
u32 uVar6 = xfb_height;
f32 f29;
f32 ratio = (f32)xfb_height / (f32)efb_height;
u32 uVar5 = __GXGetNumXfbLines(efb_height, (u32)(256.0f / ratio) & 0x1ff);
while (uVar5 > xfb_height) {
uVar6--;
ratio = (f32)uVar6 / (f32)efb_height;
uVar5 = __GXGetNumXfbLines(efb_height, ((u32)(256.0f / ratio)) & 0x1ff);
}
f29 = ratio;
while (uVar5 < xfb_height) {
uVar6++;
f29 = ratio;
ratio = (f32)uVar6 / (f32)efb_height;
uVar5 = __GXGetNumXfbLines(efb_height, ((u32)(256.0f / ratio)) & 0x1ff);
}
return f29;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -165,8 +211,26 @@ asm f32 GXGetYScaleFactor(u16 efb_height, u16 xfb_height) {
#include "asm/dolphin/gx/GXFrameBuf/GXGetYScaleFactor.s"
}
#pragma pop
#endif
/* 8035CFA4-8035D070 3578E4 00CC+00 0/0 2/2 0/0 .text GXSetDispCopyYScale */
// Needs works
#ifdef NONMATCHING
u32 GXSetDispCopyYScale(f32 y_scale) {
u32 r5;
u32 r6;
u32 r7 = ((u32)(256.0f / y_scale)) & 0x1ff;
GXFIFO.u8 = 0x61;
r6 = 0;
GX_BITFIELD_SET(r6, 0x17, 9, r7);
GX_BITFIELD_SET(r6, 0, 7, 0x4e);
GXFIFO.u32 = r6;
__GXData->bpSentNot = 0;
r5 = 0x100 - r7 != 1;
GX_BITFIELD_SET(__GXData->field_0x1ec, 0x15, 1, r5);
return __GXGetNumXfbLines(__GXData->field_0x1e4, r7);
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -175,6 +239,7 @@ asm u32 GXSetDispCopyYScale(f32 y_scale) {
#include "asm/dolphin/gx/GXFrameBuf/GXSetDispCopyYScale.s"
}
#pragma pop
#endif
/* 8035D070-8035D0E8 3579B0 0078+00 0/0 2/2 0/0 .text GXSetCopyClear */
void GXSetCopyClear(GXColor color, u32 clear_z) {
@@ -198,10 +263,101 @@ void GXSetCopyClear(GXColor color, u32 clear_z) {
GXFIFO.u8 = 0x61;
GXFIFO.u32 = r6;
__GXData->field_0x2 = 0;
__GXData->bpSentNot = 0;
}
/* 8035D0E8-8035D2F0 357A28 0208+00 0/0 4/4 0/0 .text GXSetCopyFilter */
// Start of antialias if. Possibly variable definition order.
#ifdef NONMATCHING
void GXSetCopyFilter(GXBool antialias, u8 pattern[12][2], GXBool vf, u8 vfilter[7]) {
u32 r8;
u32 r7;
u32 r3;
u32 r9;
u32 r11;
u32 r5;
if (antialias) {
r3 = 0;
GX_BITFIELD_SET(r3, 0x1c, 4, pattern[0][0]);
GX_BITFIELD_SET(r3, 0x18, 4, pattern[0][1]);
GX_BITFIELD_SET(r3, 0x14, 4, pattern[1][0]);
GX_BITFIELD_SET(r3, 0x10, 4, pattern[1][1]);
GX_BITFIELD_SET(r3, 0xc, 4, pattern[2][0]);
GX_BITFIELD_SET(r3, 0x8, 4, pattern[2][1]);
GX_BITFIELD_SET(r3, 0, 8, 1);
r7 = 0;
GX_BITFIELD_SET(r7, 0x1c, 4, pattern[3][0]);
GX_BITFIELD_SET(r7, 0x18, 4, pattern[3][1]);
GX_BITFIELD_SET(r7, 0x14, 4, pattern[4][0]);
GX_BITFIELD_SET(r7, 0x10, 4, pattern[4][1]);
GX_BITFIELD_SET(r7, 0xc, 4, pattern[5][0]);
GX_BITFIELD_SET(r7, 0x8, 4, pattern[5][1]);
GX_BITFIELD_SET(r7, 0, 8, 2);
r8 = 0;
GX_BITFIELD_SET(r8, 0x1c, 4, pattern[6][0]);
GX_BITFIELD_SET(r8, 0x18, 4, pattern[6][1]);
GX_BITFIELD_SET(r8, 0x14, 4, pattern[7][0]);
GX_BITFIELD_SET(r8, 0x10, 4, pattern[7][1]);
GX_BITFIELD_SET(r8, 0xc, 4, pattern[8][0]);
GX_BITFIELD_SET(r8, 0x8, 4, pattern[8][1]);
GX_BITFIELD_SET(r8, 0, 8, 3);
r9 = 0;
GX_BITFIELD_SET(r9, 0x1c, 4, pattern[9][0]);
GX_BITFIELD_SET(r9, 0x18, 4, pattern[9][1]);
GX_BITFIELD_SET(r9, 0x14, 4, pattern[10][0]);
GX_BITFIELD_SET(r9, 0x10, 4, pattern[10][1]);
GX_BITFIELD_SET(r9, 0xc, 4, pattern[11][0]);
GX_BITFIELD_SET(r9, 0x8, 4, pattern[11][1]);
GX_BITFIELD_SET(r9, 0, 8, 4);
} else {
r3 = 0x01666666;
r7 = 0x02666666;
r8 = 0x03666666;
r9 = 0x04666666;
}
GXFIFO.u8 = 0x61;
GXFIFO.u32 = r3;
GXFIFO.u8 = 0x61;
GXFIFO.u32 = r7;
GXFIFO.u8 = 0x61;
GXFIFO.u32 = r8;
GXFIFO.u8 = 0x61;
GXFIFO.u32 = r9;
r11 = 0;
GX_BITFIELD_SET(r11, 0, 8, 0x53);
r5 = 0;
GX_BITFIELD_SET(r5, 0, 8, 0x54);
if (vf) {
GX_BITFIELD_SET(r11, 0x1a, 6, vfilter[0]);
GX_BITFIELD_SET(r11, 0x14, 6, vfilter[1]);
GX_BITFIELD_SET(r11, 0xe, 6, vfilter[2]);
GX_BITFIELD_SET(r11, 0x8, 6, vfilter[3]);
GX_BITFIELD_SET(r5, 0x1a, 6, vfilter[4]);
GX_BITFIELD_SET(r5, 0x14, 6, vfilter[5]);
GX_BITFIELD_SET(r5, 0xe, 6, vfilter[6]);
} else {
GX_BITFIELD_SET(r11, 0x1a, 6, 0);
GX_BITFIELD_SET(r11, 0x14, 6, 0);
GX_BITFIELD_SET(r11, 0xe, 6, 0x15);
GX_BITFIELD_SET(r11, 0x8, 6, 0x16);
GX_BITFIELD_SET(r5, 0x1a, 6, 0x15);
GX_BITFIELD_SET(r5, 0x14, 6, 0);
GX_BITFIELD_SET(r5, 0xe, 6, 0);
}
GXFIFO.u8 = 0x61;
GXFIFO.u32 = r11;
GXFIFO.u8 = 0x61;
GXFIFO.u32 = r5;
__GXData->bpSentNot = 0;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -210,6 +366,7 @@ asm void GXSetCopyFilter(GXBool antialias, u8 pattern[12][2], GXBool vf, u8 vfil
#include "asm/dolphin/gx/GXFrameBuf/GXSetCopyFilter.s"
}
#pragma pop
#endif
/* 8035D2F0-8035D304 357C30 0014+00 0/0 2/2 0/0 .text GXSetDispCopyGamma */
void GXSetDispCopyGamma(GXGamma gamma)
@@ -218,6 +375,74 @@ void GXSetDispCopyGamma(GXGamma gamma)
}
/* 8035D304-8035D46C 357C44 0168+00 0/0 3/3 0/0 .text GXCopyDisp */
// regalloc / instruction order
#ifdef NONMATCHING
void GXCopyDisp(void* dst, GXBool clear) {
u32 r7;
u32 r8;
GXBool r10;
u32 r9;
u32 field_0x1dc;
if (clear) {
r8 = __GXData->field_0x1d8;
GX_BITFIELD_SET(r8, 0x1f, 1, 1);
GX_BITFIELD_SET(r8, 0x1c, 3, 7);
GXFIFO.u8 = 0x61;
GXFIFO.u32 = r8;
r7 = __GXData->field_0x1d0;
GX_BITFIELD_SET(r7, 0x1f, 1, 0);
GX_BITFIELD_SET(r7, 0x1e, 1, 0);
GXFIFO.u8 = 0x61;
GXFIFO.u32 = r7;
}
r10 = 0;
if (clear || (__GXData->field_0x1dc & 0x7) == 3) {
field_0x1dc = __GXData->field_0x1dc;
if (((field_0x1dc >> 6) & 1) == 1) {
GX_BITFIELD_SET(field_0x1dc, 0x19, 1, 0);
GXFIFO.u8 = 0x61;
GXFIFO.u32 = field_0x1dc;
r10 = 1;
}
}
r9 = 0;
__rlwimi(r9, (int)dst, 0x1b, 0xb, 0x1f);
GX_BITFIELD_SET(r9, 0, 8, 0x4b);
GXFIFO.u8 = 0x61;
GXFIFO.u32 = __GXData->field_0x1e0;
GXFIFO.u8 = 0x61;
GXFIFO.u32 = __GXData->field_0x1e4;
GXFIFO.u8 = 0x61;
GXFIFO.u32 = __GXData->field_0x1e8;
GXFIFO.u8 = 0x61;
GXFIFO.u32 = r9;
GX_BITFIELD_SET(__GXData->field_0x1ec, 0x14, 1, clear);
GX_BITFIELD_SET(__GXData->field_0x1ec, 0x11, 1, 1);
GX_BITFIELD_SET(__GXData->field_0x1ec, 0, 8, 0x52);
GXFIFO.u8 = 0x61;
GXFIFO.u32 = __GXData->field_0x1ec;
if (clear) {
GXFIFO.u8 = 0x61;
GXFIFO.u32 = __GXData->field_0x1d8;
GXFIFO.u8 = 0x61;
GXFIFO.u32 = __GXData->field_0x1d0;
}
if (r10) {
GXFIFO.u8 = 0x61;
GXFIFO.u32 = __GXData->field_0x1dc;
}
__GXData->bpSentNot = 0;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -226,8 +451,79 @@ asm void GXCopyDisp(void* dst, GXBool clear) {
#include "asm/dolphin/gx/GXFrameBuf/GXCopyDisp.s"
}
#pragma pop
#endif
/* 8035D46C-8035D5F8 357DAC 018C+00 0/0 9/9 0/0 .text GXCopyTex */
// regalloc
#ifdef NONMATCHING
void GXCopyTex(void* dst, GXBool clear) {
u32 r8;
u32 r7;
u32 field_0x1dc;
u8 r0;
u32 r10;
if (clear) {
r8 = __GXData->field_0x1d8;
GX_BITFIELD_SET(r8, 0x1f, 1, 1);
GX_BITFIELD_SET(r8, 0x1c, 3, 7);
GXFIFO.u8 = 0x61;
GXFIFO.u32 = r8;
r7 = __GXData->field_0x1d0;
GX_BITFIELD_SET(r7, 0x1f, 1, 0);
GX_BITFIELD_SET(r7, 0x1e, 1, 0);
GXFIFO.u8 = 0x61;
GXFIFO.u32 = r7;
}
r0 = 0;
field_0x1dc = __GXData->field_0x1dc;
if (__GXData->bpSentNot && (field_0x1dc & 0x7) != 3) {
GX_BITFIELD_SET(r7, 0x1d, 3, 3);
r0 = 1;
}
if ((clear || (field_0x1dc & 0x7) == 3) && ((field_0x1dc >> 6) & 1) == 1) {
GX_BITFIELD_SET(r7, 0x19, 1, 0);
r0 = 1;
}
if (r0) {
GXFIFO.u8 = 0x61;
GXFIFO.u32 = r7;
}
r10 = 0;
__rlwimi(r10, (int)dst, 0x1b, 0xb, 0x1f);
GX_BITFIELD_SET(r10, 0, 8, 0x4b);
GXFIFO.u8 = 0x61;
GXFIFO.u32 = __GXData->field_0x1f0;
GXFIFO.u8 = 0x61;
GXFIFO.u32 = __GXData->field_0x1f4;
GXFIFO.u8 = 0x61;
GXFIFO.u32 = __GXData->field_0x1f8;
GXFIFO.u8 = 0x61;
GXFIFO.u32 = r10;
GX_BITFIELD_SET(__GXData->cpTex, 0x14, 1, clear);
GX_BITFIELD_SET(__GXData->cpTex, 0x11, 1, 0);
GX_BITFIELD_SET(__GXData->cpTex, 0, 8, 0x52);
GXFIFO.u8 = 0x61;
GXFIFO.u32 = __GXData->cpTex;
if (clear) {
GXFIFO.u8 = 0x61;
GXFIFO.u32 = __GXData->field_0x1d8;
GXFIFO.u8 = 0x61;
GXFIFO.u32 = __GXData->field_0x1d0;
}
if (r0) {
GXFIFO.u8 = 0x61;
GXFIFO.u32 = __GXData->field_0x1dc;
}
__GXData->bpSentNot = 0;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -236,6 +532,7 @@ asm void GXCopyTex(void* dst, GXBool clear) {
#include "asm/dolphin/gx/GXFrameBuf/GXCopyTex.s"
}
#pragma pop
#endif
/* 8035D5F8-8035D630 357F38 0038+00 0/0 1/1 0/0 .text GXClearBoundingBox */
void GXClearBoundingBox(void)
+38 -38
View File
@@ -8,66 +8,66 @@
/* 8035C6E4-8035C764 357024 0080+00 0/0 4/4 0/0 .text __GXSetDirtyState */
void __GXSetDirtyState(void) {
u32 dirtyFlags = __GXData->field_0x5ac;
u32 dirtyFlags = __GXData->dirtyFlags;
if (dirtyFlags & 1) {
if (dirtyFlags & GX_DIRTY_SU_TEX) {
__GXSetSUTexRegs();
}
if (dirtyFlags & 2) {
if (dirtyFlags & GX_DIRTY_BP_MASK) {
__GXUpdateBPMask();
}
if (dirtyFlags & 4) {
if (dirtyFlags & GX_DIRTY_GEN_MODE) {
__GXSetGenMode();
}
if (dirtyFlags & 8) {
if (dirtyFlags & GX_DIRTY_VCD) {
__GXSetVCD();
}
if (dirtyFlags & 0x10) {
if (dirtyFlags & GX_DIRTY_VAT) {
__GXSetVAT();
}
if (dirtyFlags & 0x18) {
if (dirtyFlags & GX_DIRTY_VLIM) {
__GXCalculateVLim();
}
__GXData->field_0x5ac = 0;
__GXData->dirtyFlags = 0;
}
/* 8035C764-8035C834 3570A4 00D0+00 0/0 66/66 3/3 .text GXBegin */
void GXBegin(GXPrimitive type, GXVtxFmt fmt, u16 vert_num) {
GXData* data = __GXData;
u32 dirtyFlags = data->field_0x5ac;
u32 dirtyFlags = data->dirtyFlags;
if (data->field_0x5ac != 0) {
if (dirtyFlags & 1) {
if (data->dirtyFlags != 0) {
if (dirtyFlags & GX_DIRTY_SU_TEX) {
__GXSetSUTexRegs();
}
if (dirtyFlags & 2) {
if (dirtyFlags & GX_DIRTY_BP_MASK) {
__GXUpdateBPMask();
}
if (dirtyFlags & 4) {
if (dirtyFlags & GX_DIRTY_GEN_MODE) {
__GXSetGenMode();
}
if (dirtyFlags & 8) {
if (dirtyFlags & GX_DIRTY_VCD) {
__GXSetVCD();
}
if (dirtyFlags & 0x10) {
if (dirtyFlags & GX_DIRTY_VAT) {
__GXSetVAT();
}
if (dirtyFlags & 0x18) {
if (dirtyFlags & GX_DIRTY_VLIM) {
__GXCalculateVLim();
}
__GXData->field_0x5ac = 0;
__GXData->dirtyFlags = 0;
}
if (*(u32*)__GXData == 0) {
@@ -81,49 +81,49 @@ void GXBegin(GXPrimitive type, GXVtxFmt fmt, u16 vert_num) {
/* 8035C834-8035C8BC 357174 0088+00 1/1 1/1 0/0 .text __GXSendFlushPrim */
void __GXSendFlushPrim(void) {
u32 i;
u32 sz = __GXData->field_0x4 * __GXData->field_0x6;
u32 sz = __GXData->vNum * __GXData->vLim;
GXFIFO.u8 = 0x98;
GXFIFO.u16 = __GXData->field_0x4;
GXFIFO.u16 = __GXData->vNum;
for (i = 0; i < sz; i += 4) {
GXFIFO.s32 = 0;
}
__GXData->field_0x2 = 1;
__GXData->bpSentNot = 1;
}
/* 8035C8BC-8035C8FC 3571FC 0040+00 0/0 8/8 0/0 .text GXSetLineWidth */
void GXSetLineWidth(u8 width, GXTexOffset offsets) {
GXData* data = __GXData;
GX_BITFIELD_SET(data->field_0x7c, 24, 8, width);
GX_BITFIELD_SET(data->field_0x7c, 13, 3, offsets);
GX_BITFIELD_SET(data->lpSize, 24, 8, width);
GX_BITFIELD_SET(data->lpSize, 13, 3, offsets);
GXFIFO.u8 = 0x61;
GXFIFO.u32 = data->field_0x7c;
data->field_0x2 = 0;
GXFIFO.u32 = data->lpSize;
data->bpSentNot = 0;
}
/* 8035C8FC-8035C93C 35723C 0040+00 0/0 5/5 0/0 .text GXSetPointSize */
void GXSetPointSize(u8 size, GXTexOffset offsets) {
GXData* data = __GXData;
GX_BITFIELD_SET(data->field_0x7c, 16, 8, size);
GX_BITFIELD_SET(data->field_0x7c, 10, 3, offsets);
GX_BITFIELD_SET(data->lpSize, 16, 8, size);
GX_BITFIELD_SET(data->lpSize, 10, 3, offsets);
GXFIFO.u8 = 0x61;
GXFIFO.u32 = data->field_0x7c;
data->field_0x2 = 0;
GXFIFO.u32 = data->lpSize;
data->bpSentNot = 0;
}
/* 8035C93C-8035C984 35727C 0048+00 0/0 3/3 0/0 .text GXEnableTexOffsets */
void GXEnableTexOffsets(GXTexCoordID coord, GXBool line, GXBool point) {
GXData* data = __GXData;
GX_BITFIELD_SET(data->field_0xb8[coord], 13, 1, line);
GX_BITFIELD_SET(data->field_0xb8[coord], 12, 1, point);
GX_BITFIELD_SET(data->suTs0[coord], 13, 1, line);
GX_BITFIELD_SET(data->suTs0[coord], 12, 1, point);
GXFIFO.u8 = 0x61;
GXFIFO.u32 = data->field_0xb8[coord];
data->field_0x2 = 0;
GXFIFO.u32 = data->suTs0[coord];
data->bpSentNot = 0;
}
/* 8035C984-8035C9AC 3572C4 0028+00 0/0 33/33 5/5 .text GXSetCullMode */
@@ -135,24 +135,24 @@ void GXSetCullMode(GXCullMode mode) {
mode2 = (mode >> 1) & 1;
GX_BITFIELD_SET(mode2, 30, 1, mode);
GX_BITFIELD_SET(data->field_0x204, 16, 2, mode2);
data->field_0x5ac |= 4;
GX_BITFIELD_SET(data->genMode, 16, 2, mode2);
data->dirtyFlags |= GX_DIRTY_GEN_MODE;
}
/* 8035C9AC-8035C9E0 3572EC 0034+00 0/0 6/6 0/0 .text GXSetCoPlanar */
void GXSetCoPlanar(GXBool enable) {
GXData* data = __GXData;
GX_BITFIELD_SET(data->field_0x204, 12, 1, enable);
GX_BITFIELD_SET(data->genMode, 12, 1, enable);
GXFIFO.u8 = 0x61;
GXFIFO.u32 = 0xFE080000;
GXFIFO.u8 = 0x61;
GXFIFO.u32 = data->field_0x204;
GXFIFO.u32 = data->genMode;
}
/* 8035C9E0-8035CA04 357320 0024+00 2/2 0/0 0/0 .text __GXSetGenMode */
void __GXSetGenMode(void) {
GXFIFO.u8 = 0x61;
GXFIFO.u32 = __GXData->field_0x204;
__GXData->field_0x2 = 0;
GXFIFO.u32 = __GXData->genMode;
__GXData->bpSentNot = 0;
}
+293 -53
View File
@@ -5,14 +5,15 @@
#include "dolphin/gx/GXInit.h"
#include "dolphin/gx/GX.h"
#include "dolphin/base/PPCArch.h"
#include "dol2asm.h"
#include "dolphin/os/OSTime.h"
#include "dolphin/os/OS.h"
//
// Forward References:
//
void __GXShutdown();
void __GXInitRevisionBits();
void __GXInitGX();
@@ -21,15 +22,11 @@ void __GXInitGX();
//
void PPCSync();
void PPCMfhid2();
void PPCMthid2();
void PPCMtwpar();
void OSRegisterVersion();
void OSRegisterResetFunction();
void VIGetTvFormat();
void GXSetCPUFifo();
void GXSetGPFifo();
void GXSetBreakPtCallback();
void __GXFifoInit();
void GXClearVtxDesc();
void GXSetVtxAttrFmtv();
@@ -37,7 +34,6 @@ void GXInvalidateVtxCache();
void __GXAbort();
void GXPokeAlphaRead();
void GXPokeBlendMode();
void GXSetDrawSyncCallback();
void __GXPEInit();
void GXSetDispCopyFrame2Field();
void GXClearBoundingBox();
@@ -70,47 +66,60 @@ static GXData gxData;
GXData* const __GXData = &gxData;
/* 8035921C-80359318 353B5C 00FC+00 1/1 0/0 0/0 .text __GXDefaultTexRegionCallback */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm GXTexRegion* __GXDefaultTexRegionCallback(GXTexObj* obj, GXTexMapID mapID) {
nofralloc
#include "asm/dolphin/gx/GXInit/__GXDefaultTexRegionCallback.s"
GXTexRegion* __GXDefaultTexRegionCallback(GXTexObj* obj, GXTexMapID id) {
GXTexFmt format; // r31
GXBool isMipMap; // r3
format = GXGetTexObjFmt(obj);
isMipMap = GXGetTexObjMipMap(obj);
id = (GXTexMapID)(id % GX_MAX_TEXMAP);
switch (format) {
case GX_TF_RGBA8:
if (isMipMap) {
return &__GXData->TexRegions2[id];
}
return &__GXData->TexRegions1[id];
case GX_TF_C4:
case GX_TF_C8:
case GX_TF_C14X2:
return &__GXData->TexRegions0[id];
default:
if (isMipMap) {
return &__GXData->TexRegions1[id];
}
return &__GXData->TexRegions0[id];
}
}
#pragma pop
/* 80359318-8035933C 353C58 0024+00 1/1 0/0 0/0 .text __GXDefaultTlutRegionCallback */
#pragma push
#pragma peephole off
GXTlutRegion* __GXDefaultTlutRegionCallback(u32 tlut) {
if (tlut >= 0x14) {
return NULL;
} else {
return &__GXData->field_0x388[tlut];
return &__GXData->TlutRegions[tlut];
}
}
#pragma pop
/* 80451944-80451948 000E44 0004+00 1/1 0/0 0/0 .sbss resetFuncRegistered$145 */
/* static */ u8 resetFuncRegistered[4];
/* static */ u32 resetFuncRegistered;
/* 80451940-80451944 000E40 0004+00 1/1 0/0 0/0 .sbss calledOnce$37 */
/* static */ u8 calledOnce[4];
/* 8045193C-80451940 000E3C 0004+00 1/1 0/0 0/0 .sbss None */
/* static */ u8 data_8045193C[4];
/* static */ u32 calledOnce;
/* 80451938-8045193C 000E38 0004+00 1/1 0/0 0/0 .sbss time$36 */
/* static */ u8 time[4];
/* static */ OSTime time;
/* 80451930-80451938 000E30 0004+04 1/1 0/0 0/0 .sbss peCount$35 */
/* static */ u8 peCount[4 + 4 /* padding */];
/* static */ u32 peCount;
/* 8045192C-80451930 000E2C 0004+00 2/2 2/2 0/0 .sbss __memReg */
u8 __memReg[4];
vu16* __memReg;
/* 80451928-8045192C 000E28 0004+00 1/1 11/11 0/0 .sbss __peReg */
u8 __peReg[4];
u16* __peReg;
/* 80451924-80451928 000E24 0004+00 2/2 12/12 0/0 .sbss __cpReg */
u16* __cpReg;
@@ -120,24 +129,102 @@ u16* __cpReg;
u32* __piReg;
/* 8035933C-803594CC 353C7C 0190+00 1/0 0/0 0/0 .text __GXShutdown */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void __GXShutdown(s32) {
nofralloc
#include "asm/dolphin/gx/GXInit/__GXShutdown.s"
BOOL __GXShutdown(BOOL final) {
u32 val;
u32 newPeCount;
OSTime newTime;
if (!final) {
if (!calledOnce) {
peCount = GXReadMEMReg(0x28, 0x27);
time = OSGetTime();
calledOnce = 1;
return FALSE;
}
newTime = OSGetTime();
newPeCount = GXReadMEMReg(0x28, 0x27);
if (newTime - time < 10) {
return FALSE;
}
if (newPeCount != peCount) {
peCount = newPeCount;
time = newTime;
return FALSE;
}
} else {
GXSetBreakPtCallback(NULL);
GXSetDrawSyncCallback(NULL);
GXSetDrawDoneCallback(NULL);
GX_WRITE_U32(0);
GX_WRITE_U32(0);
GX_WRITE_U32(0);
GX_WRITE_U32(0);
GX_WRITE_U32(0);
GX_WRITE_U32(0);
GX_WRITE_U32(0);
GX_WRITE_U32(0);
PPCSync();
GX_SET_CP_REG(1, 0);
GX_SET_CP_REG(2, 3);
__GXData->abtWaitPECopy = GX_TRUE;
__GXAbort();
}
return TRUE;
}
#pragma pop
/* 803594CC-80359670 353E0C 01A4+00 1/1 1/1 0/0 .text __GXInitRevisionBits */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void __GXInitRevisionBits(void) {
nofralloc
#include "asm/dolphin/gx/GXInit/__GXInitRevisionBits.s"
void __GXInitRevisionBits(void) {
u32 i;
for (i = 0; i < 8; i++) {
FAST_FLAG_SET(__GXData->vatA[i], 1, 30, 33);
FAST_FLAG_SET(__GXData->vatB[i], 1, 31, 33);
GX_WRITE_U8(0x8);
GX_WRITE_U8(i | 0x80);
GX_WRITE_U32(__GXData->vatB[i]);
}
{
u32 reg1 = 0;
u32 reg2 = 0;
FAST_FLAG_SET(reg1, 1, 0, 1);
FAST_FLAG_SET(reg1, 1, 1, 1);
FAST_FLAG_SET(reg1, 1, 2, 1);
FAST_FLAG_SET(reg1, 1, 3, 1);
FAST_FLAG_SET(reg1, 1, 4, 1);
FAST_FLAG_SET(reg1, 1, 5, 1);
GX_WRITE_U8(0x10);
GX_WRITE_U32(0x1000);
GX_WRITE_U32(reg1);
FAST_FLAG_SET(reg2, 1, 0, 1);
GX_WRITE_U8(0x10);
GX_WRITE_U32(0x1012);
GX_WRITE_U32(reg2);
}
{
u32 reg = 0;
FAST_FLAG_SET(reg, 1, 0, 1);
FAST_FLAG_SET(reg, 1, 1, 1);
FAST_FLAG_SET(reg, 1, 2, 1);
FAST_FLAG_SET(reg, 1, 3, 1);
FAST_FLAG_SET(reg, 0x58, 24, 8);
GX_WRITE_U8(0x61);
GX_WRITE_U32(reg);
}
}
#pragma pop
/* ############################################################################################## */
/* 803D2040-803D20A0 02F160 0044+1C 2/1 0/0 0/0 .data @1 */
@@ -182,19 +269,11 @@ SECTION_DATA static u8 GXDefaultProjData[28] = {
#pragma pop
/* 803D21AC-803D226C 02F2CC 00C0+00 1/1 0/0 0/0 .data GXTexRegionAddrTable */
SECTION_DATA static u8 GXTexRegionAddrTable[192] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x03, 0x80, 0x00,
0x00, 0x04, 0x80, 0x00, 0x00, 0x05, 0x80, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00,
0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x80, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x80, 0x00,
0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
0x00, 0x08, 0x80, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00,
0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00,
0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
static u32 GXTexRegionAddrTable[] = {
0x00000, 0x10000, 0x20000, 0x30000, 0x40000, 0x50000, 0x60000, 0x70000, 0x08000, 0x18000, 0x28000, 0x38000,
0x48000, 0x58000, 0x68000, 0x78000, 0x00000, 0x90000, 0x20000, 0xB0000, 0x40000, 0x98000, 0x60000, 0xB8000,
0x80000, 0x10000, 0xA0000, 0x30000, 0x88000, 0x50000, 0xA8000, 0x70000, 0x00000, 0x90000, 0x20000, 0xB0000,
0x40000, 0x90000, 0x60000, 0xB0000, 0x80000, 0x10000, 0xA0000, 0x30000, 0x80000, 0x50000, 0xA0000, 0x70000,
};
/* 803D226C-803D2280 -00001 0010+04 1/1 0/0 0/0 .data GXResetFuncInfo */
@@ -222,6 +301,166 @@ SECTION_SDATA2 static u8 lit_268[4] = {
};
/* 80359670-80359C70 353FB0 0600+00 0/0 2/2 0/0 .text GXInit */
// Matches with literals
#ifdef NONMATCHING
static void EnableWriteGatherPipe() {
u32 hid2; // r31
hid2 = PPCMfhid2();
PPCMtwpar(OSUncachedToPhysical((void*)GXFIFO_ADDR));
hid2 |= 0x40000000;
PPCMthid2(hid2);
}
GXFifoObj* GXInit(void* base, u32 size)
{
u32 i;
u32 pad2; // for stack matching
OSRegisterVersion(__GXVersion);
__GXData->inDispList = GX_FALSE;
__GXData->dlSaveContext = GX_TRUE;
__GXData->abtWaitPECopy = GX_TRUE;
__GXData->tcsManEnab = 0;
__GXData->tevTcEnab = 0;
GXSetMisc(GX_MT_XF_FLUSH, 0);
__piReg = (void*)OSPhysicalToUncached(GX_PI_ADDR);
__cpReg = (void*)OSPhysicalToUncached(GX_CP_ADDR);
__peReg = (void*)OSPhysicalToUncached(GX_PE_ADDR);
__memReg = (void*)OSPhysicalToUncached(GX_MEM_ADDR);
__GXFifoInit();
GXInitFifoBase(&FifoObj, base, size);
GXSetCPUFifo(&FifoObj);
GXSetGPFifo(&FifoObj);
if (!resetFuncRegistered) {
OSRegisterResetFunction(&GXResetFuncInfo);
resetFuncRegistered = 1;
}
__GXPEInit();
EnableWriteGatherPipe();
__GXData->genMode = 0;
FAST_FLAG_SET(__GXData->genMode, 0, 24, 8);
__GXData->bpMask = 255;
FAST_FLAG_SET(__GXData->bpMask, 0xF, 24, 8);
__GXData->lpSize = 0;
FAST_FLAG_SET(__GXData->lpSize, 34, 24, 8);
for (i = 0; i < GX_MAX_TEVSTAGE; i++) {
__GXData->tevc[i] = 0;
__GXData->teva[i] = 0;
__GXData->tref[i / 2] = 0;
__GXData->texmapId[i] = GX_TEXMAP_NULL;
FAST_FLAG_SET(__GXData->tevc[i], 0xC0 + i * 2, 24, 8);
FAST_FLAG_SET(__GXData->teva[i], 0xC1 + i * 2, 24, 8);
FAST_FLAG_SET(__GXData->tevKsel[i / 2], 0xF6 + i / 2, 24, 8);
FAST_FLAG_SET(__GXData->tref[i / 2], 0x28 + i / 2, 24, 8);
}
__GXData->iref = 0;
FAST_FLAG_SET(__GXData->iref, 0x27, 24, 8);
for (i = 0; i < GX_MAXCOORD; i++) {
__GXData->suTs0[i] = 0;
__GXData->suTs1[i] = 0;
FAST_FLAG_SET(__GXData->suTs0[i], 0x30 + i * 2, 24, 8);
FAST_FLAG_SET(__GXData->suTs1[i], 0x31 + i * 2, 24, 8);
}
FAST_FLAG_SET(__GXData->suScis0, 0x20, 24, 8);
FAST_FLAG_SET(__GXData->suScis1, 0x21, 24, 8);
FAST_FLAG_SET(__GXData->cmode0, 0x41, 24, 8);
FAST_FLAG_SET(__GXData->cmode1, 0x42, 24, 8);
FAST_FLAG_SET(__GXData->zmode, 0x40, 24, 8);
FAST_FLAG_SET(__GXData->peCtrl, 0x43, 24, 8);
FAST_FLAG_SET(__GXData->cpTex, 0, 7, 2);
__GXData->zScale = 1.6777216E7f;
__GXData->zOffset = 0.0f;
__GXData->dirtyFlags = 0;
__GXData->dirtyVAT = 0;
{
u32 val1;
u32 val2;
val2 = OS_BUS_CLOCK / 500;
__GXFlushTextureState();
val1 = (val2 / 2048) | 0x69000400;
GX_WRITE_U8(0x61);
GX_WRITE_U32(val1);
__GXFlushTextureState();
val1 = (val2 / 4224) | 0x46000200;
GX_WRITE_U8(0x61);
GX_WRITE_U32(val1);
}
__GXInitRevisionBits();
for (i = 0; i < GX_MAX_TEXMAP; i++) {
GXInitTexCacheRegion(&__GXData->TexRegions0[i], GX_FALSE, GXTexRegionAddrTable[i], GX_TEXCACHE_32K, GXTexRegionAddrTable[i + 8],
GX_TEXCACHE_32K);
GXInitTexCacheRegion(&__GXData->TexRegions1[i], GX_FALSE, GXTexRegionAddrTable[i + 16], GX_TEXCACHE_32K, GXTexRegionAddrTable[i + 24],
GX_TEXCACHE_32K);
GXInitTexCacheRegion(&__GXData->TexRegions2[i], GX_TRUE, GXTexRegionAddrTable[i + 32], GX_TEXCACHE_32K, GXTexRegionAddrTable[i + 40],
GX_TEXCACHE_32K);
}
for (i = 0; i < GX_MAX_TLUT; i++) {
GXInitTlutRegion(&__GXData->TlutRegions[i], 0xC0000 + 0x2000 * i, GX_TLUT_256);
}
for (i = 0; i < GX_MAX_BIGTLUT; i++) {
GXInitTlutRegion(&__GXData->TlutRegions[i + 16], 0xE0000 + 0x8000 * i, GX_TLUT_1K);
}
GX_SET_CP_REG(3, 0);
FAST_FLAG_SET(__GXData->perfSel, 0, 4, 4);
GX_WRITE_U8(0x8);
GX_WRITE_U8(0x20);
GX_WRITE_U32(__GXData->perfSel);
GX_WRITE_U8(0x10);
GX_WRITE_U32(0x1006);
GX_WRITE_U32(0);
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x23000000);
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x24000000);
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x67000000);
__GXSetIndirectMask(0);
__GXSetTmemConfig(2);
__GXInitGX();
return &FifoObj;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -230,6 +469,7 @@ asm GXFifoObj* GXInit(void* base, u32 size) {
#include "asm/dolphin/gx/GXInit/GXInit.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 8045658C-80456590 004B8C 0004+00 1/1 0/0 0/0 .sdata2 @269 */
+130 -2
View File
@@ -177,6 +177,52 @@ asm void GXLoadLightObjImm(register GXLightObj* obj, register GXLightID id) {
}
/* 8035D960-8035DA48 3582A0 00E8+00 0/0 7/7 4/4 .text GXSetChanAmbColor */
// b's instead of blr's
#ifdef NONMATCHING
void GXSetChanAmbColor(GXChannelID chan, GXColor color) {
u32 ambColor;
u32 colorId;
switch(chan) {
case GX_COLOR0:
ambColor = *(u32*)&__GXData->ambColors[0];
ambColor = __rlwimi(ambColor, *(u32*)&color, 0, 0, 23);
colorId = 0;
break;
case GX_COLOR1:
ambColor = *(u32*)&__GXData->ambColors[1];
ambColor = __rlwimi(ambColor, *(u32*)&color, 0, 0, 23);
colorId = 1;
break;
case GX_ALPHA0:
ambColor = *(u32*)&__GXData->ambColors[0];
ambColor = __rlwimi(ambColor, color.a, 0, 24, 31);
colorId = 0;
break;
case GX_ALPHA1:
ambColor = *(u32*)&__GXData->ambColors[1];
ambColor = __rlwimi(ambColor, color.a, 0, 24, 31);
colorId = 1;
break;
case GX_COLOR0A0:
ambColor = *(u32*)&color;
colorId = 0;
break;
case GX_COLOR1A1:
ambColor = *(u32*)&color;
colorId = 1;
break;
default:
return;
}
GXFIFO.u8 = 0x10;
GXFIFO.u32 = colorId + 0x100a;
GXFIFO.u32 = ambColor;
__GXData->bpSentNot = 1;
((u32*)__GXData->ambColors)[colorId] = ambColor;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -185,8 +231,55 @@ asm void GXSetChanAmbColor(GXChannelID channel, GXColor color) {
#include "asm/dolphin/gx/GXLight/GXSetChanAmbColor.s"
}
#pragma pop
#endif
/* 8035DA48-8035DB30 358388 00E8+00 0/0 20/20 2/2 .text GXSetChanMatColor */
// b's instead of blr's
#ifdef NONMATCHING
void GXSetChanMatColor(GXChannelID chan, GXColor color) {
u32 matColor;
u32 colorId;
switch(chan) {
case GX_COLOR0:
matColor = *(u32*)&__GXData->matColors[0];
matColor = __rlwimi(matColor, *(u32*)&color, 0, 0, 23);
colorId = 0;
break;
case GX_COLOR1:
matColor = *(u32*)&__GXData->matColors[1];
matColor = __rlwimi(matColor, *(u32*)&color, 0, 0, 23);
colorId = 1;
break;
case GX_ALPHA0:
matColor = *(u32*)&__GXData->matColors[0];
matColor = __rlwimi(matColor, color.a, 0, 24, 31);
colorId = 0;
break;
case GX_ALPHA1:
matColor = *(u32*)&__GXData->matColors[1];
matColor = __rlwimi(matColor, color.a, 0, 24, 31);
colorId = 1;
break;
case GX_COLOR0A0:
matColor = *(u32*)&color;
colorId = 0;
break;
case GX_COLOR1A1:
matColor = *(u32*)&color;
colorId = 1;
break;
default:
return;
}
GXFIFO.u8 = 0x10;
GXFIFO.u32 = colorId + 0x100c;
GXFIFO.u32 = matColor;
__GXData->bpSentNot = 1;
((u32*)__GXData->matColors)[colorId] = matColor;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -195,19 +288,20 @@ asm void GXSetChanMatColor(GXChannelID channel, GXColor color) {
#include "asm/dolphin/gx/GXLight/GXSetChanMatColor.s"
}
#pragma pop
#endif
/* 8035DB30-8035DB6C 358470 003C+00 0/0 51/51 6/6 .text GXSetNumChans */
// 1 wrong reg
#ifdef NONMATCHING
void GXSetNumChans(u8 chan_num) {
GXData* data = __GXData;
GX_BITFIELD_SET(data->field_0x204, 25, 3, chan_num);
GX_BITFIELD_SET(data->bpSentNot04, 25, 3, chan_num);
GXFIFO.u8 = 0x10;
GXFIFO.s32 = 0x1009;
GXFIFO.s32 = chan_num;
data->field_0x5ac |= 0x4;
data->dirtyFlags |= GX_DIRTY_GEN_MODE;
}
#else
#pragma push
@@ -221,6 +315,39 @@ asm void GXSetNumChans(u8 chan_num) {
#endif
/* 8035DB6C-8035DC1C 3584AC 00B0+00 0/0 34/34 4/4 .text GXSetChanCtrl */
// mr/addi, extra branch instruction
#ifdef NONMATCHING
void GXSetChanCtrl(GXChannelID channel, GXBool enable, GXColorSrc amb_src, GXColorSrc mat_src,
u32 light_mask, GXDiffuseFn diff_fn, GXAttnFn attn_fn) {
u32 field = 0;
const u32 idx = channel & 3;
GX_BITFIELD_SET(field, 30, 1, enable);
GX_BITFIELD_SET(field, 31, 1, amb_src);
GX_BITFIELD_SET(field, 25, 1, mat_src);
GX_BITFIELD_SET(field, 23, 2, (attn_fn == GX_AF_SPEC) ? GX_DF_NONE : diff_fn);
GX_BITFIELD_SET(field, 22, 1, attn_fn != GX_AF_NONE);
GX_BITFIELD_SET(field, 21, 1, attn_fn != GX_AF_SPEC);
GX_BITFIELD_SET(field, 26, 4, (u32)light_mask);
field = __rlwimi(field, (u32)light_mask, 7, 0x11, 0x14);
GXFIFO.u8 = 0x10;
GXFIFO.u32 = idx + 0x100e;
GXFIFO.u32 = field;
if (channel == GX_COLOR0A0) {
GXFIFO.u8 = 0x10;
GXFIFO.u32 = 0x1010;
GXFIFO.u32 = field;
} else if (channel == GX_COLOR1A1) {
GXFIFO.u8 = 0x10;
GXFIFO.u32 = 0x1011;
GXFIFO.u32 = field;
}
__GXData->bpSentNot = 1;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -230,3 +357,4 @@ asm void GXSetChanCtrl(GXChannelID channel, GXBool enable, GXColorSrc amb_src, G
#include "asm/dolphin/gx/GXLight/GXSetChanCtrl.s"
}
#pragma pop
#endif
+239 -132
View File
File diff suppressed because it is too large Load Diff
+378 -100
View File
@@ -4,112 +4,390 @@
//
#include "dolphin/gx/GXPerf.h"
#include "dol2asm.h"
//
// Forward References:
//
void GXSetGPMetric();
void GXClearGPMetric();
void GXReadXfRasMetric();
//
// External References:
//
extern u8 __cpReg[4];
extern void* __GXData;
//
// Declarations:
//
/* ############################################################################################## */
/* 803D2858-803D28B4 -00001 005C+00 1/1 0/0 0/0 .data @182 */
SECTION_DATA static void* lit_182[23] = {
(void*)(((char*)GXSetGPMetric) + 0x568), (void*)(((char*)GXSetGPMetric) + 0x584),
(void*)(((char*)GXSetGPMetric) + 0x5A0), (void*)(((char*)GXSetGPMetric) + 0x5BC),
(void*)(((char*)GXSetGPMetric) + 0x610), (void*)(((char*)GXSetGPMetric) + 0x62C),
(void*)(((char*)GXSetGPMetric) + 0x648), (void*)(((char*)GXSetGPMetric) + 0x664),
(void*)(((char*)GXSetGPMetric) + 0x5D8), (void*)(((char*)GXSetGPMetric) + 0x680),
(void*)(((char*)GXSetGPMetric) + 0x6B0), (void*)(((char*)GXSetGPMetric) + 0x6E0),
(void*)(((char*)GXSetGPMetric) + 0x710), (void*)(((char*)GXSetGPMetric) + 0x740),
(void*)(((char*)GXSetGPMetric) + 0x770), (void*)(((char*)GXSetGPMetric) + 0x7A0),
(void*)(((char*)GXSetGPMetric) + 0x7D0), (void*)(((char*)GXSetGPMetric) + 0x7FC),
(void*)(((char*)GXSetGPMetric) + 0x80C), (void*)(((char*)GXSetGPMetric) + 0x81C),
(void*)(((char*)GXSetGPMetric) + 0x82C), (void*)(((char*)GXSetGPMetric) + 0x5F4),
(void*)(((char*)GXSetGPMetric) + 0x838),
};
/* 803D28B4-803D2948 -00001 0090+04 1/1 0/0 0/0 .data @181 */
SECTION_DATA static void* lit_181[36 + 1 /* padding */] = {
(void*)(((char*)GXSetGPMetric) + 0x13C),
(void*)(((char*)GXSetGPMetric) + 0x15C),
(void*)(((char*)GXSetGPMetric) + 0x17C),
(void*)(((char*)GXSetGPMetric) + 0x19C),
(void*)(((char*)GXSetGPMetric) + 0x1BC),
(void*)(((char*)GXSetGPMetric) + 0x1DC),
(void*)(((char*)GXSetGPMetric) + 0x1FC),
(void*)(((char*)GXSetGPMetric) + 0x21C),
(void*)(((char*)GXSetGPMetric) + 0x23C),
(void*)(((char*)GXSetGPMetric) + 0x25C),
(void*)(((char*)GXSetGPMetric) + 0x29C),
(void*)(((char*)GXSetGPMetric) + 0x2BC),
(void*)(((char*)GXSetGPMetric) + 0x2D8),
(void*)(((char*)GXSetGPMetric) + 0x2F4),
(void*)(((char*)GXSetGPMetric) + 0x310),
(void*)(((char*)GXSetGPMetric) + 0x32C),
(void*)(((char*)GXSetGPMetric) + 0x348),
(void*)(((char*)GXSetGPMetric) + 0x364),
(void*)(((char*)GXSetGPMetric) + 0x380),
(void*)(((char*)GXSetGPMetric) + 0x39C),
(void*)(((char*)GXSetGPMetric) + 0x3B8),
(void*)(((char*)GXSetGPMetric) + 0x3D4),
(void*)(((char*)GXSetGPMetric) + 0x3F0),
(void*)(((char*)GXSetGPMetric) + 0x40C),
(void*)(((char*)GXSetGPMetric) + 0x428),
(void*)(((char*)GXSetGPMetric) + 0x444),
(void*)(((char*)GXSetGPMetric) + 0x460),
(void*)(((char*)GXSetGPMetric) + 0x47C),
(void*)(((char*)GXSetGPMetric) + 0x498),
(void*)(((char*)GXSetGPMetric) + 0x4B4),
(void*)(((char*)GXSetGPMetric) + 0x4D0),
(void*)(((char*)GXSetGPMetric) + 0x4EC),
(void*)(((char*)GXSetGPMetric) + 0x508),
(void*)(((char*)GXSetGPMetric) + 0x524),
(void*)(((char*)GXSetGPMetric) + 0x27C),
(void*)(((char*)GXSetGPMetric) + 0x53C),
/* padding */
NULL,
};
#include "dolphin/gx/GX.h"
/* 8036067C-80360EC4 35AFBC 0848+00 2/0 1/1 0/0 .text GXSetGPMetric */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXSetGPMetric(u32 perf0, u32 perf1) {
nofralloc
#include "asm/dolphin/gx/GXPerf/GXSetGPMetric.s"
void GXSetGPMetric(GXPerf0 perf0, GXPerf1 perf1) {
switch (__GXData->perf0) {
case GX_PERF0_VERTICES:
case GX_PERF0_CLIP_VTX:
case GX_PERF0_CLIP_CLKS:
case GX_PERF0_XF_WAIT_IN:
case GX_PERF0_XF_WAIT_OUT:
case GX_PERF0_XF_XFRM_CLKS:
case GX_PERF0_XF_LIT_CLKS:
case GX_PERF0_XF_BOT_CLKS:
case GX_PERF0_XF_REGLD_CLKS:
case GX_PERF0_XF_REGRD_CLKS:
case GX_PERF0_CLIP_RATIO:
case GX_PERF0_CLOCKS:
GX_WRITE_U8(0x10);
GX_WRITE_U32(0x1006);
GX_WRITE_U32(0);
break;
case GX_PERF0_TRIANGLES:
case GX_PERF0_TRIANGLES_CULLED:
case GX_PERF0_TRIANGLES_PASSED:
case GX_PERF0_TRIANGLES_SCISSORED:
case GX_PERF0_TRIANGLES_0TEX:
case GX_PERF0_TRIANGLES_1TEX:
case GX_PERF0_TRIANGLES_2TEX:
case GX_PERF0_TRIANGLES_3TEX:
case GX_PERF0_TRIANGLES_4TEX:
case GX_PERF0_TRIANGLES_5TEX:
case GX_PERF0_TRIANGLES_6TEX:
case GX_PERF0_TRIANGLES_7TEX:
case GX_PERF0_TRIANGLES_8TEX:
case GX_PERF0_TRIANGLES_0CLR:
case GX_PERF0_TRIANGLES_1CLR:
case GX_PERF0_TRIANGLES_2CLR:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x23000000);
break;
case GX_PERF0_QUAD_0CVG:
case GX_PERF0_QUAD_NON0CVG:
case GX_PERF0_QUAD_1CVG:
case GX_PERF0_QUAD_2CVG:
case GX_PERF0_QUAD_3CVG:
case GX_PERF0_QUAD_4CVG:
case GX_PERF0_AVG_QUAD_CNT:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x24000000);
break;
case GX_PERF0_NONE:
break;
}
switch (__GXData->perf1) {
case GX_PERF1_TEXELS:
case GX_PERF1_TX_IDLE:
case GX_PERF1_TX_REGS:
case GX_PERF1_TX_MEMSTALL:
case GX_PERF1_TC_CHECK1_2:
case GX_PERF1_TC_CHECK3_4:
case GX_PERF1_TC_CHECK5_6:
case GX_PERF1_TC_CHECK7_8:
case GX_PERF1_TC_MISS:
case GX_PERF1_CLOCKS:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x67000000);
break;
case GX_PERF1_VC_ELEMQ_FULL:
case GX_PERF1_VC_MISSQ_FULL:
case GX_PERF1_VC_MEMREQ_FULL:
case GX_PERF1_VC_STATUS7:
case GX_PERF1_VC_MISSREP_FULL:
case GX_PERF1_VC_STREAMBUF_LOW:
case GX_PERF1_VC_ALL_STALLS:
case GX_PERF1_VERTICES:
FAST_FLAG_SET(__GXData->perfSel, 0, 4, 4);
GX_WRITE_U8(8);
GX_WRITE_U8(32);
GX_WRITE_U32(__GXData->perfSel);
break;
case GX_PERF1_FIFO_REQ:
case GX_PERF1_CALL_REQ:
case GX_PERF1_VC_MISS_REQ:
case GX_PERF1_CP_ALL_REQ:
GX_SET_CP_REG(3, 0);
break;
case GX_PERF1_NONE:
break;
}
__GXData->perf0 = perf0;
switch (__GXData->perf0) {
case GX_PERF0_VERTICES:
GX_WRITE_U8(0x10);
GX_WRITE_U32(0x1006);
GX_WRITE_U32(0x273);
break;
case GX_PERF0_CLIP_VTX:
GX_WRITE_U8(0x10);
GX_WRITE_U32(0x1006);
GX_WRITE_U32(0x14A);
break;
case GX_PERF0_CLIP_CLKS:
GX_WRITE_U8(0x10);
GX_WRITE_U32(0x1006);
GX_WRITE_U32(0x16B);
break;
case GX_PERF0_XF_WAIT_IN:
GX_WRITE_U8(0x10);
GX_WRITE_U32(0x1006);
GX_WRITE_U32(0x84);
break;
case GX_PERF0_XF_WAIT_OUT:
GX_WRITE_U8(0x10);
GX_WRITE_U32(0x1006);
GX_WRITE_U32(0xC6);
break;
case GX_PERF0_XF_XFRM_CLKS:
GX_WRITE_U8(0x10);
GX_WRITE_U32(0x1006);
GX_WRITE_U32(0x210);
break;
case GX_PERF0_XF_LIT_CLKS:
GX_WRITE_U8(0x10);
GX_WRITE_U32(0x1006);
GX_WRITE_U32(0x252);
break;
case GX_PERF0_XF_BOT_CLKS:
GX_WRITE_U8(0x10);
GX_WRITE_U32(0x1006);
GX_WRITE_U32(0x231);
break;
case GX_PERF0_XF_REGLD_CLKS:
GX_WRITE_U8(0x10);
GX_WRITE_U32(0x1006);
GX_WRITE_U32(0x1AD);
break;
case GX_PERF0_XF_REGRD_CLKS:
GX_WRITE_U8(0x10);
GX_WRITE_U32(0x1006);
GX_WRITE_U32(0x1CE);
break;
case GX_PERF0_CLOCKS:
GX_WRITE_U8(0x10);
GX_WRITE_U32(0x1006);
GX_WRITE_U32(0x21);
break;
case GX_PERF0_CLIP_RATIO:
GX_WRITE_U8(0x10);
GX_WRITE_U32(0x1006);
GX_WRITE_U32(0x153);
break;
case GX_PERF0_TRIANGLES:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2300AE7F);
break;
case GX_PERF0_TRIANGLES_CULLED:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x23008E7F);
break;
case GX_PERF0_TRIANGLES_PASSED:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x23009E7F);
break;
case GX_PERF0_TRIANGLES_SCISSORED:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x23001E7F);
break;
case GX_PERF0_TRIANGLES_0TEX:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2300AC3F);
break;
case GX_PERF0_TRIANGLES_1TEX:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2300AC7F);
break;
case GX_PERF0_TRIANGLES_2TEX:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2300ACBF);
break;
case GX_PERF0_TRIANGLES_3TEX:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2300ACFF);
break;
case GX_PERF0_TRIANGLES_4TEX:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2300AD3F);
break;
case GX_PERF0_TRIANGLES_5TEX:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2300AD7F);
break;
case GX_PERF0_TRIANGLES_6TEX:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2300ADBF);
break;
case GX_PERF0_TRIANGLES_7TEX:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2300ADFF);
break;
case GX_PERF0_TRIANGLES_8TEX:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2300AE3F);
break;
case GX_PERF0_TRIANGLES_0CLR:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2300A27F);
break;
case GX_PERF0_TRIANGLES_1CLR:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2300A67F);
break;
case GX_PERF0_TRIANGLES_2CLR:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2300AA7F);
break;
case GX_PERF0_QUAD_0CVG:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2402C0C6);
break;
case GX_PERF0_QUAD_NON0CVG:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2402C16B);
break;
case GX_PERF0_QUAD_1CVG:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2402C0E7);
break;
case GX_PERF0_QUAD_2CVG:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2402C108);
break;
case GX_PERF0_QUAD_3CVG:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2402C129);
break;
case GX_PERF0_QUAD_4CVG:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2402C14A);
break;
case GX_PERF0_AVG_QUAD_CNT:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x2402C1AD);
break;
case GX_PERF0_NONE:
break;
}
__GXData->perf1 = perf1;
switch (__GXData->perf1) {
case GX_PERF1_TEXELS:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x67000042);
break;
case GX_PERF1_TX_IDLE:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x67000084);
break;
case GX_PERF1_TX_REGS:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x67000063);
break;
case GX_PERF1_TX_MEMSTALL:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x67000129);
break;
case GX_PERF1_TC_MISS:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x67000252);
break;
case GX_PERF1_CLOCKS:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x67000021);
break;
case GX_PERF1_TC_CHECK1_2:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x6700014B);
break;
case GX_PERF1_TC_CHECK3_4:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x6700018D);
break;
case GX_PERF1_TC_CHECK5_6:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x670001CF);
break;
case GX_PERF1_TC_CHECK7_8:
GX_WRITE_U8(0x61);
GX_WRITE_U32(0x67000211);
break;
case GX_PERF1_VC_ELEMQ_FULL:
FAST_FLAG_SET(__GXData->perfSel, 2, 4, 4);
GX_WRITE_U8(8);
GX_WRITE_U8(32);
GX_WRITE_U32(__GXData->perfSel);
break;
case GX_PERF1_VC_MISSQ_FULL:
FAST_FLAG_SET(__GXData->perfSel, 3, 4, 4);
GX_WRITE_U8(8);
GX_WRITE_U8(32);
GX_WRITE_U32(__GXData->perfSel);
break;
case GX_PERF1_VC_MEMREQ_FULL:
FAST_FLAG_SET(__GXData->perfSel, 4, 4, 4);
GX_WRITE_U8(8);
GX_WRITE_U8(32);
GX_WRITE_U32(__GXData->perfSel);
break;
case GX_PERF1_VC_STATUS7:
FAST_FLAG_SET(__GXData->perfSel, 5, 4, 4);
GX_WRITE_U8(8);
GX_WRITE_U8(32);
GX_WRITE_U32(__GXData->perfSel);
break;
case GX_PERF1_VC_MISSREP_FULL:
FAST_FLAG_SET(__GXData->perfSel, 6, 4, 4);
GX_WRITE_U8(8);
GX_WRITE_U8(32);
GX_WRITE_U32(__GXData->perfSel);
break;
case GX_PERF1_VC_STREAMBUF_LOW:
FAST_FLAG_SET(__GXData->perfSel, 7, 4, 4);
GX_WRITE_U8(8);
GX_WRITE_U8(32);
GX_WRITE_U32(__GXData->perfSel);
break;
case GX_PERF1_VC_ALL_STALLS:
FAST_FLAG_SET(__GXData->perfSel, 9, 4, 4);
GX_WRITE_U8(8);
GX_WRITE_U8(32);
GX_WRITE_U32(__GXData->perfSel);
break;
case GX_PERF1_VERTICES:
FAST_FLAG_SET(__GXData->perfSel, 8, 4, 4);
GX_WRITE_U8(8);
GX_WRITE_U8(32);
GX_WRITE_U32(__GXData->perfSel);
break;
case GX_PERF1_FIFO_REQ:
GX_SET_CP_REG(3, 2);
break;
case GX_PERF1_CALL_REQ:
GX_SET_CP_REG(3, 3);
break;
case GX_PERF1_VC_MISS_REQ:
GX_SET_CP_REG(3, 4);
break;
case GX_PERF1_CP_ALL_REQ:
GX_SET_CP_REG(3, 5);
break;
case GX_PERF1_NONE:
break;
}
__GXData->bpSentNot = GX_FALSE;
}
#pragma pop
/* 80360EC4-80360ED4 35B804 0010+00 0/0 1/1 0/0 .text GXClearGPMetric */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXClearGPMetric(void) {
nofralloc
#include "asm/dolphin/gx/GXPerf/GXClearGPMetric.s"
void GXClearGPMetric(void) {
GX_SET_CP_REG(2, 4);
}
#pragma pop
/* 80360ED4-80360F98 35B814 00C4+00 0/0 1/1 0/0 .text GXReadXfRasMetric */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXReadXfRasMetric(u32* param_0, u32* param_1, u32* param_2, u32* param_3) {
nofralloc
#include "asm/dolphin/gx/GXPerf/GXReadXfRasMetric.s"
#pragma scheduling off
void GXReadXfRasMetric(u32* xfWaitIn, u32* xfWaitOut, u32* rasBusy, u32* clocks)
{
*rasBusy = GXReadCPReg(32, 33);
*clocks = GXReadCPReg(34, 35);
*xfWaitIn = GXReadCPReg(36, 37);
*xfWaitOut = GXReadCPReg(38, 39);
}
#pragma pop
#pragma scheduling reset
+210 -72
View File
@@ -4,6 +4,7 @@
//
#include "dolphin/gx/GXPixel.h"
#include "dolphin/gx/GX.h"
#include "dol2asm.h"
//
@@ -19,7 +20,6 @@ void GXSetPixelFmt();
void __GXFlushTextureState();
void __cvt_fp2unsigned();
extern void* __GXData;
//
// Declarations:
@@ -68,6 +68,94 @@ SECTION_SDATA2 static f32 lit_217[1 + 1 /* padding */] = {
SECTION_SDATA2 static f64 lit_219 = 4503601774854144.0 /* cast s32 to float */;
/* 8035F8B8-8035FACC 35A1F8 0214+00 0/0 20/20 2/2 .text GXSetFog */
#ifdef NONMATCHING
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;
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;
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);
c_bits = *(u32*)&c;
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);
GX_SET_REG(fogColorReg, *(u32*)&color, (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;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -76,67 +164,117 @@ asm void GXSetFog(GXFogType type, f32 startZ, f32 endZ, f32 nearZ, f32 farZ, GXC
#include "asm/dolphin/gx/GXPixel/GXSetFog.s"
}
#pragma pop
#endif
/* 8035FACC-8035FBF0 35A40C 0124+00 0/0 9/9 2/2 .text GXSetFogRangeAdj */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXSetFogRangeAdj(GXBool enable, u16 center, GXFogAdjTable* table) {
nofralloc
#include "asm/dolphin/gx/GXPixel/GXSetFogRangeAdj.s"
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;
}
#pragma pop
/* 8035FBF0-8035FC44 35A530 0054+00 0/0 53/53 3/3 .text GXSetBlendMode */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXSetBlendMode(GXBlendMode mode, GXBlendFactor src_factor, GXBlendFactor dst_factor, GXLogicOp op) {
nofralloc
#include "asm/dolphin/gx/GXPixel/GXSetBlendMode.s"
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;
}
#pragma pop
/* 8035FC44-8035FC70 35A584 002C+00 0/0 10/10 2/2 .text GXSetColorUpdate */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXSetColorUpdate(GXBool enable_update) {
nofralloc
#include "asm/dolphin/gx/GXPixel/GXSetColorUpdate.s"
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;
}
#pragma pop
/* 8035FC70-8035FC9C 35A5B0 002C+00 0/0 10/10 2/2 .text GXSetAlphaUpdate */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXSetAlphaUpdate(GXBool enable_update) {
nofralloc
#include "asm/dolphin/gx/GXPixel/GXSetAlphaUpdate.s"
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;
}
#pragma pop
/* 8035FC9C-8035FCD0 35A5DC 0034+00 0/0 40/40 6/6 .text GXSetZMode */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXSetZMode(GXBool enable_compare, GXCompare comp, GXBool enable_update) {
nofralloc
#include "asm/dolphin/gx/GXPixel/GXSetZMode.s"
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;
}
#pragma pop
/* 8035FCD0-8035FD04 35A610 0034+00 0/0 29/29 5/5 .text GXSetZCompLoc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXSetZCompLoc(GXBool z_buf_before_tex) {
nofralloc
#include "asm/dolphin/gx/GXPixel/GXSetZCompLoc.s"
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;
}
#pragma pop
/* 8035FD04-8035FDD8 35A644 00D4+00 0/0 2/2 1/1 .text GXSetPixelFmt */
// regalloc
#ifdef NONMATCHING
void GXSetPixelFmt(GXPixelFmt pixelFmt, GXZFmt16 zFmt) {
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) {
u32 isZ16;
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->dirtyFlags |= 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;
}
#else
/* ############################################################################################## */
/* 803D2838-803D2858 02F958 0020+00 1/1 0/0 0/0 .data p2f$358 */
SECTION_DATA static u8 p2f[32] = {
@@ -144,7 +282,6 @@ SECTION_DATA static u8 p2f[32] = {
0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05,
};
/* 8035FD04-8035FDD8 35A644 00D4+00 0/0 2/2 1/1 .text GXSetPixelFmt */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -153,43 +290,44 @@ asm void GXSetPixelFmt(GXPixelFmt pixel_fmt, GXZFmt16 z_fmt) {
#include "asm/dolphin/gx/GXPixel/GXSetPixelFmt.s"
}
#pragma pop
#endif
/* 8035FDD8-8035FE04 35A718 002C+00 0/0 22/22 1/1 .text GXSetDither */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXSetDither(GXBool enable_dither) {
nofralloc
#include "asm/dolphin/gx/GXPixel/GXSetDither.s"
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;
}
#pragma pop
/* 8035FE04-8035FE40 35A744 003C+00 0/0 2/2 0/0 .text GXSetDstAlpha */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXSetDstAlpha(GXBool enable, u8 alpha) {
nofralloc
#include "asm/dolphin/gx/GXPixel/GXSetDstAlpha.s"
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;
}
#pragma pop
/* 8035FE40-8035FE78 35A780 0038+00 0/0 1/1 0/0 .text GXSetFieldMask */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXSetFieldMask(GXBool odd_mask, GXBool even_mask) {
nofralloc
#include "asm/dolphin/gx/GXPixel/GXSetFieldMask.s"
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;
}
#pragma pop
/* 8035FE78-8035FEF0 35A7B8 0078+00 0/0 1/1 0/0 .text GXSetFieldMode */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXSetFieldMode(GXBool field_mode, GXBool half_aspect_ratio) {
nofralloc
#include "asm/dolphin/gx/GXPixel/GXSetFieldMode.s"
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();
}
#pragma pop
+358 -199
View File
File diff suppressed because it is too large Load Diff
+182 -72
View File
@@ -4,6 +4,8 @@
//
#include "dolphin/gx/GXTexture.h"
#include "dolphin/gx/GX.h"
#include "MSL_C/MSL_Common/Src/string.h"
#include "dol2asm.h"
//
@@ -23,7 +25,6 @@ void __GXSetTmemConfig();
// External References:
//
SECTION_INIT void memset();
void __GXFlushTextureState();
//
@@ -67,6 +68,85 @@ SECTION_DATA static void* lit_104[61] = {
};
/* 8035DC1C-8035DD78 35855C 015C+00 1/0 8/8 0/0 .text GXGetTexBufferSize */
#ifdef NONMATCHING
u32 GXGetTexBufferSize(u16 width, u16 height, u32 format, GXBool mipmap, u8 max_lod) {
u32 r0;
u32 r8;
u32 i;
u32 rv;
u32 r7;
u32 r6;
u32 r10;
u32 uVar1;
u32 uVar2;
u32 uVar3;
switch(format) {
case GX_TF_I4:
case GX_TF_CI8:
case GX_TF_CMPR:
case 32:
case 48:
r0 = 3;
r8 = 3;
break;
case GX_TF_I8:
case GX_TF_IA4:
case 17:
case 34:
case 39:
case 40:
case 41:
case 42:
case 57:
case 58:
r0 = 3;
r8 = 2;
break;
case GX_TF_IA8:
case GX_TF_RGB565:
case GX_TF_TGB5A3:
case GX_TF_RGBA8:
case 19:
case 22:
case 35:
case 43:
case 44:
case 60:
r0 = 2;
r8 = 2;
break;
default:
r8 = 0;
r0 = 0;
break;
}
if (format == 6 || format == 0x16) {
uVar3 = 0x40;
} else {
uVar3 = 0x20;
}
if (mipmap == GX_TRUE) {
r7 = (1 << r8) - 1;
r10 = (1 << r0) - 1;
rv = 0;
for (i = 0; i < max_lod; i++) {
rv += uVar3 * (((s32)(width + r10) >> r0) * ((s32)(height + r7) >> r0));
if (width == 1 && height == 1) {
break;
}
width = (width > 1) ? width >> 1 : 1;
height = (height > 1) ? height >> 1 : 1;
}
} else {
rv = uVar3 * (((s32)(width + (1 << r0) - 1) >> r0) * ((s32)(height + (1 << r8) - 1) >> r0));
}
return rv;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -75,6 +155,7 @@ asm u32 GXGetTexBufferSize(u16 width, u16 height, u32 format, GXBool mipmap, u8
#include "asm/dolphin/gx/GXTexture/GXGetTexBufferSize.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 803D268C-803D2780 -00001 00F4+00 1/1 0/0 0/0 .data @145 */
@@ -113,14 +194,84 @@ SECTION_DATA static void* lit_145[61] = {
};
/* 8035DD78-8035DE40 3586B8 00C8+00 1/0 1/1 0/0 .text __GetImageTileCount */
#ifdef NONMATCHING
void __GetImageTileCount(u32 arg0, u16 arg1, u16 arg2, s32* arg3, s32* arg4, s32* arg5) {
u32 r0;
u32 r8;
s32 uVar3;
s32 uVar4;
s32 uVar5;
s32 uVar6;
s32 uVar7;
switch(arg0) {
case GX_TF_I4:
case GX_TF_CI8:
case GX_TF_CMPR:
case 32:
case 48:
r0 = 3;
r8 = 3;
break;
case GX_TF_I8:
case GX_TF_IA4:
case 17:
case 34:
case 39:
case 40:
case 41:
case 42:
case 57:
case 58:
r0 = 3;
r8 = 2;
break;
case GX_TF_IA8:
case GX_TF_RGB565:
case GX_TF_TGB5A3:
case GX_TF_RGBA8:
case 19:
case 22:
case 35:
case 43:
case 44:
case 60:
r0 = 2;
r8 = 2;
break;
default:
r8 = 0;
r0 = 0;
break;
}
if (arg1 == 0) {
arg1 = 1;
}
if (arg2 == 0) {
arg2 = 1;
}
uVar3 = 1;
*arg3 = (arg1 + ((1 << r0) - 1)) >> r0;
*arg4 = (arg2 + ((1 << r8) - 1)) >> r8;
if ((s32)arg0 != 6 && (s32)arg0 != 0x16) {
uVar3 = 0;
}
*arg5 = uVar3 ? 2 : 1;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void __GetImageTileCount(u32 arg0, s16 arg1, s16 arg2, s32* arg3, s32* arg4, s32* arg5) {
asm void __GetImageTileCount(u32 arg0, u16 arg1, u16 arg2, s32* arg3, s32* arg4, s32* arg5) {
nofralloc
#include "asm/dolphin/gx/GXTexture/__GetImageTileCount.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 803D2780-803D27C0 -00001 003C+04 1/1 0/0 0/0 .data @224 */
@@ -261,74 +412,39 @@ asm void GXInitTexObjLOD(GXTexObj* obj, GXTexFilter min_filter, GXTexFilter max_
#pragma pop
/* 8035E238-8035E248 358B78 0010+00 0/0 4/4 1/1 .text GXGetTexObjWidth */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm u16 GXGetTexObjWidth(GXTexObj* obj) {
nofralloc
#include "asm/dolphin/gx/GXTexture/GXGetTexObjWidth.s"
u16 GXGetTexObjWidth(GXTexObj* obj) {
return (obj->texture_size & 0x3ff) + 1;
}
#pragma pop
/* 8035E248-8035E258 358B88 0010+00 0/0 3/3 0/0 .text GXGetTexObjHeight */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm u16 GXGetTexObjHeight(GXTexObj* obj) {
nofralloc
#include "asm/dolphin/gx/GXTexture/GXGetTexObjHeight.s"
u16 GXGetTexObjHeight(GXTexObj* obj) {
return ((obj->texture_size >> 10) & 0x3ff) + 1;
}
#pragma pop
/* 8035E258-8035E260 358B98 0008+00 0/0 1/1 0/0 .text GXGetTexObjFmt */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm GXTexFmt GXGetTexObjFmt(GXTexObj* obj) {
nofralloc
#include "asm/dolphin/gx/GXTexture/GXGetTexObjFmt.s"
GXTexFmt GXGetTexObjFmt(GXTexObj* obj) {
return obj->texture_format;
}
#pragma pop
/* 8035E260-8035E26C 358BA0 000C+00 0/0 1/1 0/0 .text GXGetTexObjWrapS */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm GXTexWrapMode GXGetTexObjWrapS(GXTexObj* obj) {
nofralloc
#include "asm/dolphin/gx/GXTexture/GXGetTexObjWrapS.s"
GXTexWrapMode GXGetTexObjWrapS(GXTexObj* obj) {
return obj->texture_filter & 0x3;
}
#pragma pop
/* 8035E26C-8035E278 358BAC 000C+00 0/0 1/1 0/0 .text GXGetTexObjWrapT */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm GXTexWrapMode GXGetTexObjWrapT(GXTexObj* obj) {
nofralloc
#include "asm/dolphin/gx/GXTexture/GXGetTexObjWrapT.s"
GXTexWrapMode GXGetTexObjWrapT(GXTexObj* obj) {
return (obj->texture_filter & 0xc) >> 2;
}
#pragma pop
/* 8035E278-8035E290 358BB8 0018+00 0/0 1/1 0/0 .text GXGetTexObjMipMap */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm GXBool GXGetTexObjMipMap(GXTexObj* obj) {
nofralloc
#include "asm/dolphin/gx/GXTexture/GXGetTexObjMipMap.s"
GXBool GXGetTexObjMipMap(GXTexObj* obj) {
return (obj->texture_flags & 1) == 1;
}
#pragma pop
/* 8035E290-8035E298 358BD0 0008+00 0/0 1/1 0/0 .text GXGetTexObjTlut */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm u32 GXGetTexObjTlut(GXTexObj* obj) {
nofralloc
#include "asm/dolphin/gx/GXTexture/GXGetTexObjTlut.s"
u32 GXGetTexObjTlut(GXTexObj* obj) {
return obj->tlut_name;
}
#pragma pop
/* 8035E298-8035E414 358BD8 017C+00 1/1 0/0 0/0 .text GXLoadTexObjPreLoaded */
#pragma push
@@ -392,34 +508,28 @@ asm void GXInitTlutRegion(GXTlutRegion* region, u32 tmem_addr, GXTlutSize tlut_s
#pragma pop
/* 8035E664-8035E6AC 358FA4 0048+00 0/0 8/8 1/1 .text GXInvalidateTexAll */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXInvalidateTexAll(void) {
nofralloc
#include "asm/dolphin/gx/GXTexture/GXInvalidateTexAll.s"
void GXInvalidateTexAll(void) {
__GXFlushTextureState();
GXFIFO.u8 = 0x61;
GXFIFO.u32 = 0x66001000;
GXFIFO.u8 = 0x61;
GXFIFO.u32 = 0x66001100;
__GXFlushTextureState();
}
#pragma pop
/* 8035E6AC-8035E6C0 358FEC 0014+00 0/0 1/1 0/0 .text GXSetTexRegionCallback */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm GXTexRegionCallback GXSetTexRegionCallback(GXTexRegionCallback callback) {
nofralloc
#include "asm/dolphin/gx/GXTexture/GXSetTexRegionCallback.s"
GXTexRegionCallback GXSetTexRegionCallback(GXTexRegionCallback callback) {
GXTexRegionCallback prev = __GXData->texRegionCB;
__GXData->texRegionCB = callback;
return prev;
}
#pragma pop
/* 8035E6C0-8035E6D4 359000 0014+00 0/0 1/1 0/0 .text GXSetTlutRegionCallback */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm GXTlutRegionCallback GXSetTlutRegionCallback(GXTlutRegionCallback callback) {
nofralloc
#include "asm/dolphin/gx/GXTexture/GXSetTlutRegionCallback.s"
GXTlutRegionCallback GXSetTlutRegionCallback(GXTlutRegionCallback callback) {
GXTlutRegionCallback prev = __GXData->tlutRegionCB;
__GXData->tlutRegionCB = callback;
return prev;
}
#pragma pop
/* 8035E6D4-8035E750 359014 007C+00 0/0 1/1 0/0 .text GXSetTexCoordScaleManually */
#pragma push
+298 -83
View File
@@ -4,6 +4,7 @@
//
#include "dolphin/gx/GXTransform.h"
#include "dolphin/gx/GX.h"
#include "dol2asm.h"
//
@@ -25,12 +26,6 @@ void GXSetScissorBoxOffset();
void GXSetClipMode();
void __GXSetMatrixIndex();
//
// External References:
//
extern void* __GXData;
//
// Declarations:
//
@@ -44,6 +39,36 @@ SECTION_SDATA2 static u8 lit_26[4] = {
0x00,
};
static void Copy6Floats(register f32* dst, register const f32* src) {
register f32 ps_0, ps_1, ps_2;
// clang-format off
asm {
psq_l ps_0, 0(src), 0, 0
psq_l ps_1, 8(src), 0, 0
psq_l ps_2, 16(src), 0, 0
psq_st ps_0, 0(dst), 0, 0
psq_st ps_1, 8(dst), 0, 0
psq_st ps_2, 16(dst), 0, 0
}
// clang-format on
}
static void WriteProjPS(register volatile void* dst, register const f32* src) {
register f32 ps_0, ps_1, ps_2;
// clang-format off
asm {
psq_l ps_0, 0(src), 0, 0
psq_l ps_1, 8(src), 0, 0
psq_l ps_2, 16(src), 0, 0
psq_st ps_0, 0(dst), 0, 0
psq_st ps_1, 0(dst), 0, 0
psq_st ps_2, 0(dst), 0, 0
}
// clang-format on
}
/* 80456654-80456658 004C54 0004+00 2/2 0/0 0/0 .sdata2 @27 */
SECTION_SDATA2 static f32 lit_27 = 1.0f;
@@ -51,6 +76,36 @@ SECTION_SDATA2 static f32 lit_27 = 1.0f;
SECTION_SDATA2 static f32 lit_28 = 0.5f;
/* 8035FF60-803600D4 35A8A0 0174+00 0/0 1/1 0/0 .text GXProject */
// regalloc
#ifdef NONMATCHING
void GXProject(f32 model_x, f32 model_y, f32 model_z, Mtx model_mtx, f32* proj_mtx,
f32* viewpoint, f32* screen_x, f32* screen_y, f32* screen_z) {
f32 fVar1;
f32 fVar6;
f32 fVar7;
f32 fVar8;
f32 fVar9;
f32 fVar2;
f32 fVar3;
fVar1 = (model_mtx[0][0] * model_x) + (model_mtx[0][1] * model_y) + (model_mtx[0][2] * model_z) + model_mtx[0][3];
fVar6 = (model_mtx[1][0] * model_x) + (model_mtx[1][1] * model_y) + (model_mtx[1][2] * model_z) + model_mtx[1][3];
fVar7 = (model_mtx[2][0] * model_x) + (model_mtx[2][1] * model_y) + (model_mtx[2][2] * model_z) + model_mtx[2][3];
if (proj_mtx[0] == 0.0f) {
fVar8 = fVar1 * proj_mtx[1] + fVar7 * proj_mtx[2];
fVar3 = fVar6 * proj_mtx[3] + fVar7 * proj_mtx[4];
fVar9 = proj_mtx[6] + fVar7 * proj_mtx[5];
fVar2 = 1.0f / -fVar7;
} else {
fVar8 = proj_mtx[2] + fVar1 * proj_mtx[1];
fVar3 = proj_mtx[4] + fVar6 * proj_mtx[3];
fVar9 = proj_mtx[6] + fVar7 * proj_mtx[5];
fVar2 = 1.0f;
}
*screen_x = fVar2 * viewpoint[2] * fVar8 / 2.0f + viewpoint[2] / 2.0f + viewpoint[0];
*screen_y = fVar2 * viewpoint[3] * -fVar3 / 2.0f + viewpoint[3] / 2.0f + viewpoint[1];
*screen_z = fVar2 * (viewpoint[5] - viewpoint[4]) * fVar9 + viewpoint[5];
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -60,18 +115,47 @@ asm void GXProject(f32 model_x, f32 model_y, f32 model_z, Mtx model_mtx, f32* pr
#include "asm/dolphin/gx/GXTransform/GXProject.s"
}
#pragma pop
#endif
/* 803600D4-80360178 35AA14 00A4+00 0/0 15/15 2/2 .text GXSetProjection */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXSetProjection(Mtx44 mtx, GXProjectionType type) {
nofralloc
#include "asm/dolphin/gx/GXTransform/GXSetProjection.s"
void GXSetProjection(Mtx44 mtx, GXProjectionType type) {
volatile void* fifo;
__GXData->projectionType = type;
__GXData->field_0x4dc = mtx[0][0];
__GXData->field_0x4e4 = mtx[1][1];
__GXData->field_0x4ec = mtx[2][2];
__GXData->field_0x4f0 = mtx[2][3];
if (type == GX_ORTHOGRAPHIC) {
__GXData->field_0x4e0 = mtx[0][3];
__GXData->field_0x4e8 = mtx[1][3];
} else {
__GXData->field_0x4e0 = mtx[0][2];
__GXData->field_0x4e8 = mtx[1][2];
}
GXFIFO.u8 = 0x10;
GXFIFO.u32 = 0x61020;
fifo = &GXFIFO;
WriteProjPS(fifo, &__GXData->field_0x4dc);
GXFIFO.u32 = __GXData->projectionType;
__GXData->bpSentNot = 1;
}
#pragma pop
/* 80360178-80360204 35AAB8 008C+00 0/0 1/1 1/1 .text GXSetProjectionv */
// Matches with literals
#ifdef NONMATCHING
void GXSetProjectionv(f32* p) {
__GXData->projectionType = (*p == 0.0f) ? GX_PERSPECTIVE : GX_ORTHOGRAPHIC;
p++;
Copy6Floats(&__GXData->field_0x4dc, p);
GXFIFO.u8 = 0x10;
GXFIFO.u32 = 0x61020;
WriteProjPS(&GXFIFO, &__GXData->field_0x4dc);
GXFIFO.u32 = __GXData->projectionType;
__GXData->bpSentNot = 1;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -80,8 +164,16 @@ asm void GXSetProjectionv(f32* p) {
#include "asm/dolphin/gx/GXTransform/GXSetProjectionv.s"
}
#pragma pop
#endif
/* 80360204-8036024C 35AB44 0048+00 0/0 1/1 1/1 .text GXGetProjectionv */
// Matches with literals
#ifdef NONMATCHING
void GXGetProjectionv(f32* p) {
*p = (u32)__GXData->projectionType != GX_PERSPECTIVE ? 1.0f : 0.5f;
Copy6Floats(p + 1, &__GXData->field_0x4dc);
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -90,52 +182,142 @@ asm void GXGetProjectionv(f32* p) {
#include "asm/dolphin/gx/GXTransform/GXGetProjectionv.s"
}
#pragma pop
#endif
static void WriteMTXPS4x3(register volatile void* dst, register const Mtx src) {
register f32 ps_0, ps_1, ps_2, ps_3, ps_4, ps_5;
// clang-format off
asm {
psq_l ps_0, 0(src), 0, 0
psq_l ps_1, 8(src), 0, 0
psq_l ps_2, 16(src), 0, 0
psq_l ps_3, 24(src), 0, 0
psq_l ps_4, 32(src), 0, 0
psq_l ps_5, 40(src), 0, 0
psq_st ps_0, 0(dst), 0, 0
psq_st ps_1, 0(dst), 0, 0
psq_st ps_2, 0(dst), 0, 0
psq_st ps_3, 0(dst), 0, 0
psq_st ps_4, 0(dst), 0, 0
psq_st ps_5, 0(dst), 0, 0
}
// clang-format on
}
/* 8036024C-8036029C 35AB8C 0050+00 0/0 83/83 9/9 .text GXLoadPosMtxImm */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXLoadPosMtxImm(Mtx mtx, u32 id) {
nofralloc
#include "asm/dolphin/gx/GXTransform/GXLoadPosMtxImm.s"
void GXLoadPosMtxImm(Mtx mtx, u32 id) {
GX_XF_LOAD_REGS(4 * 3 - 1, id * 4 + GX_XF_MEM_POSMTX);
WriteMTXPS4x3(&GXFIFO, mtx);
}
static void WriteMTXPS3x3(register volatile void* dst, register const Mtx src) {
register f32 ps_0, ps_1, ps_2, ps_3, ps_4, ps_5;
// clang-format off
asm {
psq_l ps_0, 0(src), 0, 0
lfs ps_1, 8(src)
psq_l ps_2, 16(src), 0, 0
lfs ps_3, 24(src)
psq_l ps_4, 32(src), 0, 0
lfs ps_5, 40(src)
psq_st ps_0, 0(dst), 0, 0
stfs ps_1, 0(dst)
psq_st ps_2, 0(dst), 0, 0
stfs ps_3, 0(dst)
psq_st ps_4, 0(dst), 0, 0
stfs ps_5, 0(dst)
}
// clang-format on
}
#pragma pop
/* 8036029C-803602EC 35ABDC 0050+00 0/0 11/11 7/7 .text GXLoadNrmMtxImm */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXLoadNrmMtxImm(Mtx mtx, u32 id) {
nofralloc
#include "asm/dolphin/gx/GXTransform/GXLoadNrmMtxImm.s"
void GXLoadNrmMtxImm(Mtx mtx, u32 id) {
GX_XF_LOAD_REGS(3 * 3 - 1, id * 3 + GX_XF_MEM_NRMMTX);
WriteMTXPS3x3(&GXFIFO, mtx);
}
#pragma pop
/* 803602EC-80360320 35AC2C 0034+00 0/0 51/51 2/2 .text GXSetCurrentMtx */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXSetCurrentMtx(u32 id) {
nofralloc
#include "asm/dolphin/gx/GXTransform/GXSetCurrentMtx.s"
void GXSetCurrentMtx(u32 id) {
GX_SET_REG(__GXData->matIdxA, id, GX_XF_MTXIDX0_GEOM_ST, GX_XF_MTXIDX0_GEOM_END);
__GXSetMatrixIndex(GX_VA_PNMTXIDX);
}
static void WriteMTXPS4x2(register volatile void* dst, register const Mtx src){
register f32 ps_0, ps_1, ps_2, ps_3;
// clang-format off
asm {
psq_l ps_0, 0(src), 0, 0
psq_l ps_1, 8(src), 0, 0
psq_l ps_2, 16(src), 0, 0
psq_l ps_3, 24(src), 0, 0
psq_st ps_0, 0(dst), 0, 0
psq_st ps_1, 0(dst), 0, 0
psq_st ps_2, 0(dst), 0, 0
psq_st ps_3, 0(dst), 0, 0
}
// clang-format on
}
#pragma pop
/* 80360320-803603D4 35AC60 00B4+00 0/0 15/15 0/0 .text GXLoadTexMtxImm */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXLoadTexMtxImm(Mtx mtx, u32 id, GXTexMtxType type) {
nofralloc
#include "asm/dolphin/gx/GXTransform/GXLoadTexMtxImm.s"
void GXLoadTexMtxImm(const Mtx mtx, u32 id, GXTexMtxType type) {
u32 addr;
u32 num;
u32 reg;
// Matrix address in XF memory
addr = id >= GX_PTTEXMTX0 ? (id - GX_PTTEXMTX0) * 4 + GX_XF_MEM_DUALTEXMTX : id * 4 + (u64)GX_XF_MEM_POSMTX;
// Number of elements in matrix
num = type == GX_MTX2x4 ? (u64)(2 * 4) : 3 * 4;
reg = addr | (num - 1) << 16;
GX_XF_LOAD_REG_HDR(reg);
if (type == GX_MTX3x4) {
WriteMTXPS4x3(&GXFIFO, mtx);
} else {
WriteMTXPS4x2(&GXFIFO, mtx);
}
}
#pragma pop
/* ############################################################################################## */
/* 8045665C-80456660 004C5C 0004+00 1/1 0/0 0/0 .sdata2 @201 */
SECTION_SDATA2 static f32 lit_201 = 342.0f;
/* 803603D4-80360464 35AD14 0090+00 1/1 0/0 0/0 .text __GXSetViewport */
// Matches with literals
#ifdef NONMATCHING
void __GXSetViewport(void) {
f32 a, b, c, d, e, f;
f32 near, far;
a = __GXData->vpWd / 2;
b = -__GXData->vpHt / 2;
d = __GXData->vpLeft + (__GXData->vpWd / 2) + 342.0f;
e = __GXData->vpTop + (__GXData->vpHt / 2) + 342.0f;
near = __GXData->vpNearz * __GXData->zScale;
far = __GXData->vpFarz * __GXData->zScale;
c = far - near;
f = far + __GXData->zOffset;
GX_XF_LOAD_REGS(5, GX_XF_REG_SCALEX);
GX_WRITE_F32(a);
GX_WRITE_F32(b);
GX_WRITE_F32(c);
GX_WRITE_F32(d);
GX_WRITE_F32(e);
GX_WRITE_F32(f);
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -144,38 +326,63 @@ asm void __GXSetViewport(void) {
#include "asm/dolphin/gx/GXTransform/__GXSetViewport.s"
}
#pragma pop
#endif
/* 80360464-803604AC 35ADA4 0048+00 0/0 10/10 1/1 .text GXSetViewport */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXSetViewport(f32 x_orig, f32 y_orig, f32 width, f32 height, f32 near_z, f32 far_z) {
nofralloc
#include "asm/dolphin/gx/GXTransform/GXSetViewport.s"
void GXSetViewport(f32 left, f32 top, f32 width, f32 height, f32 nearZ, f32 farZ) {
__GXData->vpLeft = left;
__GXData->vpTop = top;
__GXData->vpWd = width;
__GXData->vpHt = height;
__GXData->vpNearz = nearZ;
__GXData->vpFarz = farZ;
__GXSetViewport();
__GXData->bpSentNot = GX_TRUE;
}
#pragma pop
/* 803604AC-803604D0 35ADEC 0024+00 0/0 1/1 1/1 .text GXGetViewportv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXGetViewportv(f32* p) {
nofralloc
#include "asm/dolphin/gx/GXTransform/GXGetViewportv.s"
void GXGetViewportv(f32* p) {
Copy6Floats(p, &__GXData->vpLeft);
}
#pragma pop
/* 803604D0-80360548 35AE10 0078+00 0/0 11/11 4/4 .text GXSetScissor */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXSetScissor(u32 left, u32 top, u32 width, u32 height) {
nofralloc
#include "asm/dolphin/gx/GXTransform/GXSetScissor.s"
void GXSetScissor(u32 left, u32 top, u32 width, u32 height) {
u32 y1, x1, y2, x2;
u32 reg;
y1 = top + 342;
x1 = left + 342;
GX_SET_REG(__GXData->suScis0, y1, GX_BP_SCISSORTL_TOP_ST, GX_BP_SCISSORTL_TOP_END);
GX_SET_REG(__GXData->suScis0, x1, GX_BP_SCISSORTL_LEFT_ST, GX_BP_SCISSORTL_LEFT_END);
y2 = y1 + height - 1;
x2 = (x1 + width) - 1;
GX_SET_REG(__GXData->suScis1, y2, GX_BP_SCISSORBR_BOT_ST, GX_BP_SCISSORBR_BOT_END);
GX_SET_REG(__GXData->suScis1, x2, GX_BP_SCISSORBR_RIGHT_ST, GX_BP_SCISSORBR_RIGHT_END);
GX_BP_LOAD_REG(__GXData->suScis0);
GX_BP_LOAD_REG(__GXData->suScis1);
__GXData->bpSentNot = FALSE;
}
#pragma pop
/* 80360548-80360590 35AE88 0048+00 0/0 6/6 2/2 .text GXGetScissor */
#ifdef NONMATCHING
void GXGetScissor(u32* left, u32* top, u32* width, u32* height) {
u32 y1, x1, y2, x2;
x1 = GX_GET_REG(__GXData->suScis0, GX_BP_SCISSORTL_LEFT_ST, GX_BP_SCISSORTL_LEFT_END);
x2 = GX_GET_REG(__GXData->suScis1, GX_BP_SCISSORBR_RIGHT_ST, GX_BP_SCISSORBR_RIGHT_END);
y1 = GX_GET_REG(__GXData->suScis0, GX_BP_SCISSORTL_TOP_ST, GX_BP_SCISSORTL_TOP_END);
y2 = GX_GET_REG(__GXData->suScis1, GX_BP_SCISSORBR_BOT_ST, GX_BP_SCISSORBR_BOT_END);
*left = x1 - 342;
*top = y1 - 342;
*width = x2 - x1 + 1;
*height = y2 - y1 + 1;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -184,33 +391,41 @@ asm void GXGetScissor(u32* left, u32* top, u32* width, u32* height) {
#include "asm/dolphin/gx/GXTransform/GXGetScissor.s"
}
#pragma pop
#endif
/* 80360590-803605D0 35AED0 0040+00 0/0 1/1 0/0 .text GXSetScissorBoxOffset */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXSetScissorBoxOffset(u32 x_offset, u32 y_offset) {
nofralloc
#include "asm/dolphin/gx/GXTransform/GXSetScissorBoxOffset.s"
void GXSetScissorBoxOffset(s32 x, s32 y) {
u32 cmd = 0;
u32 x1;
u32 y1;
x1 = (u32)(x + 342) / 2;
y1 = (u32)(y + 342) / 2;
GX_SET_REG(cmd, x1, GX_BP_SCISSOROFS_OX_ST, GX_BP_SCISSOROFS_OX_END);
GX_SET_REG(cmd, y1, GX_BP_SCISSOROFS_OY_ST, GX_BP_SCISSOROFS_OY_END);
GX_SET_REG(cmd, GX_BP_REG_SCISSOROFFSET, 0, 7);
GX_BP_LOAD_REG(cmd);
__GXData->bpSentNot = GX_FALSE;
}
#pragma pop
/* 803605D0-803605F8 35AF10 0028+00 0/0 27/27 2/2 .text GXSetClipMode */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void GXSetClipMode(GXClipMode mode) {
nofralloc
#include "asm/dolphin/gx/GXTransform/GXSetClipMode.s"
void GXSetClipMode(GXClipMode mode) {
GX_XF_LOAD_REG(GX_XF_REG_CLIPDISABLE, mode);
__GXData->bpSentNot = GX_TRUE;
}
#pragma pop
/* 803605F8-8036067C 35AF38 0084+00 1/1 1/1 0/0 .text __GXSetMatrixIndex */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void __GXSetMatrixIndex(u32 id) {
nofralloc
#include "asm/dolphin/gx/GXTransform/__GXSetMatrixIndex.s"
void __GXSetMatrixIndex(GXAttr index) {
// Tex4 and after is stored in XF MatrixIndex1
if (index < GX_VA_TEX4MTXIDX) {
GX_CP_LOAD_REG(GX_CP_REG_MTXIDXA, __GXData->matIdxA);
GX_XF_LOAD_REG(GX_XF_REG_MATRIXINDEX0, __GXData->matIdxA);
} else {
GX_CP_LOAD_REG(GX_CP_REG_MTXIDXB, __GXData->matIdxB);
GX_XF_LOAD_REG(GX_XF_REG_MATRIXINDEX1, __GXData->matIdxB);
}
__GXData->bpSentNot = GX_TRUE;
}
#pragma pop
+3
View File
@@ -38,8 +38,11 @@ LIBGX_A_O_FILES := \
LIBGX_A_CFLAGS := \
-O4,p \
-inline auto \
-lang=c \
$(BUILD_DIR)/libs/dolphin/gx/GXInit.o: LIBGX_A_CFLAGS += -opt nopeephole
LIBGX_A_LDFLAGS := \
-nodefaults \
-fp hard \