mirror of https://github.com/zeldaret/tp.git
388 lines
10 KiB
C
388 lines
10 KiB
C
#include "dolphin/gx/GXPerf.h"
|
|
#include "dolphin/gx.h"
|
|
|
|
/* 8036067C-80360EC4 35AFBC 0848+00 2/0 1/1 0/0 .text GXSetGPMetric */
|
|
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;
|
|
}
|
|
|
|
/* 80360EC4-80360ED4 35B804 0010+00 0/0 1/1 0/0 .text GXClearGPMetric */
|
|
void GXClearGPMetric(void) {
|
|
GX_SET_CP_REG(2, 4);
|
|
}
|
|
|
|
/* 80360ED4-80360F98 35B814 00C4+00 0/0 1/1 0/0 .text GXReadXfRasMetric */
|
|
#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 scheduling reset
|