Merge branch 'dev' of https://github.com/Reonu/HackerSM64 into formatting_changes

This commit is contained in:
Arceveti
2021-10-30 13:28:30 -07:00
4 changed files with 215 additions and 170 deletions

View File

@@ -429,6 +429,7 @@ void render_game(void) {
#if PUPPYPRINT_DEBUG
profiler_update(graphTime, first);
graphTime[perfIteration] -= (collisionTime[perfIteration] - colTime);
graphTime[perfIteration] -= profilerTime[perfIteration];
#endif
#if PUPPYPRINT_DEBUG
puppyprint_render_profiler();

View File

@@ -729,6 +729,8 @@ void thread5_game_loop(UNUSED void *arg) {
#endif
#if PUPPYPRINT_DEBUG
profiler_update(scriptTime, lastTime);
scriptTime[perfIteration] -= profilerTime[perfIteration];
scriptTime[perfIteration] -= profilerTime2[perfIteration];
if (benchmarkLoop > 0 && benchOption == 0) {
benchmarkLoop--;
benchMark[benchmarkLoop] = osGetTime() - lastTime;

View File

@@ -51,15 +51,18 @@ ColorRGBA currEnv;
u8 fDebug = FALSE;
#if PUPPYPRINT_DEBUG
s8 benchViewer = FALSE;
u8 benchOption = 0;
s8 logViewer = FALSE;
s8 benchViewer = FALSE;
u8 benchOption = 0;
s8 logViewer = FALSE;
u8 sPPDebugPage = 0;
u8 sDebugMenu = FALSE;
u8 sDebugOption = 0;
// Profiler values
s8 perfIteration = 0;
s16 benchmarkLoop = 0;
s8 perfIteration = 0;
s16 benchmarkLoop = 0;
s32 benchmarkTimer = 0;
s32 benchmarkProgramTimer = 0;
s8 benchmarkType = 0;
s8 benchmarkType = 0;
// General
u32 cpuTime = 0;
u32 rspTime = 0;
@@ -67,7 +70,7 @@ u32 rdpTime = 0;
u32 ramTime = 0;
u32 loadTime = 0;
u32 gLastOSTime = 0;
u32 rspDelta = 0;
u32 rspDelta = 0;
s32 benchMark[NUM_BENCH_ITERATIONS + 2];
// CPU
u32 collisionTime[NUM_PERF_ITERATIONS + 1];
@@ -274,6 +277,10 @@ void print_ram_overview(void) {
y += 12;
drawn++;
}
sprintf(textBytes, "RAM: %06X/%06X (%d_)", main_pool_available(), mempool, (s32)(((f32)main_pool_available() / (f32)mempool) * 100));
print_small_text(SCREEN_CENTER_X, (SCREEN_HEIGHT - 16), textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, FONT_OUTLINE);
print_ram_bar();
}
const char *audioPoolNames[NUM_AUDIO_POOLS] = {
@@ -309,7 +316,7 @@ void print_audio_ram_overview(void) {
}
sprintf(textBytes, "%s: %X / %X (%d.%d_)", audioPoolNames[i],
audioPoolSizes[i][1], audioPoolSizes[i][0], (percentage / 10), (percentage % 10));
print_set_envcolour(colourChart[i][0], colourChart[i][1], colourChart[i][2], 255);
print_small_text(x, y, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL, FONT_OUTLINE);
@@ -318,7 +325,7 @@ void print_audio_ram_overview(void) {
totalMemory[0] += audioPoolSizes[i][0];
totalMemory[1] += audioPoolSizes[i][1];
}
if (totalMemory[0] == 0) {
percentage = 0;
} else {
@@ -331,7 +338,7 @@ void print_audio_ram_overview(void) {
sprintf(textBytes, "TOTAL AUDIO MEMORY: %X / %X (Incorrect!)",
totalMemory[1], totalMemory[0]);
}
print_set_envcolour(colourChart[30][0], colourChart[30][1], colourChart[30][2], 255);
print_small_text(x, tmpY, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL, FONT_OUTLINE);
}
@@ -416,6 +423,44 @@ void print_console_log(void) {
}
#undef LINE_HEIGHT
extern u8 viewCycle;
extern s16 gVisualSurfaceCount;
#ifndef VISUAL_DEBUG
#define gVisualSurfaceCount 0
#endif
void puppyprint_render_collision(void) {
char textBytes[200];
sprintf(textBytes, "Collision:<COL_99505099> %dus", collisionTime[NUM_PERF_ITERATIONS]);
print_small_text(304, 48, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, 1);
sprintf(textBytes, "Pool Size: %X#Node Size: %X#Surfaces Allocated: %d#Nodes Allocated: %d#Current Cell: %d", (SURFACE_NODE_POOL_SIZE * sizeof(struct SurfaceNode)), (SURFACE_POOL_SIZE * sizeof(struct Surface)),
gSurfacesAllocated, gSurfaceNodesAllocated, gVisualSurfaceCount);
print_small_text(304, 60, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, 1);
#ifdef VISUAL_DEBUG
print_small_text(160, (SCREEN_HEIGHT - 42), "Use the dpad to toggle visual collision modes", PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, 1);
switch (viewCycle) {
case 0: print_small_text(160, (SCREEN_HEIGHT - 32), "Current view: None", PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, 1); break;
case 1: print_small_text(160, (SCREEN_HEIGHT - 32), "Current view: Hitboxes", PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, 1); break;
case 2: print_small_text(160, (SCREEN_HEIGHT - 32), "Current view: Surfaces", PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, 1); break;
case 3: print_small_text(160, (SCREEN_HEIGHT - 32), "Current view: Hitboxes and Surfaces", PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, 1); break;
}
if (gPlayer1Controller->buttonPressed & R_JPAD) viewCycle++;
if (gPlayer1Controller->buttonPressed & L_JPAD) viewCycle--;
if (viewCycle == 4) {
viewCycle = 0;
}
if (viewCycle == 255) {
viewCycle = 3;
}
hitboxView = ((viewCycle == 1) || (viewCycle == 3));
surfaceView = ((viewCycle == 2) || (viewCycle == 3));
#endif
}
struct CPUBar {
u32 *time;
ColorRGB colour;
@@ -433,121 +478,141 @@ struct CPUBar cpu_ordering_table[] = {
{ dmaTime, COLOR_RGB_MAGENTA, { "DMA: <COL_99509999>" }},
};
#define CPU_TABLE_MAX sizeof(cpu_ordering_table)/sizeof(struct CPUBar)
#define CPU_TABLE_MAX (sizeof(cpu_ordering_table) / sizeof(struct CPUBar))
#define ADDTIMES MAX(((collisionTime[MX] + graphTime[MX] + behaviourTime[MX] + audioTime[MX] + cameraTime[MX] + dmaTime[MX]) / 80), 1)
void puppyprint_render_profiler(void) {
void print_basic_profiling(void) {
char textBytes[90];
print_fps(16, 40);
sprintf(textBytes, "CPU: %dus (%d_)#RSP: %dus (%d_)#RDP: %dus (%d_)", cpuTime, cpuTime / 333, rspTime, rspTime / 333, rdpTime, rdpTime / 333);
print_small_text(16, 52, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL, FONT_OUTLINE);
}
void puppyprint_render_standard(void) {
s32 perfPercentage[CPU_TABLE_MAX];
s32 graphPos;
s32 prevGraph;
u32 i;
s32 viewedNums;
OSTime cpuCount = CYCLE_CONV(cpuTime + audioTime[NUM_PERF_ITERATIONS]
+ dmaAudioTime[NUM_PERF_ITERATIONS]
+ faultTime[NUM_PERF_ITERATIONS]
+ taskTime[NUM_PERF_ITERATIONS]
- profilerTime[NUM_PERF_ITERATIONS]
- profilerTime2[NUM_PERF_ITERATIONS]);
OSTime first = osGetTime();
char textBytes[80];
print_basic_profiling();
sprintf(textBytes, "OBJ: %d/%d", gObjectCounter, OBJECT_POOL_CAPACITY);
print_small_text(16, 124, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL, FONT_OUTLINE);
// Very little point printing useless info if Mario doesn't even exist.
if (gMarioState->marioObj) {
sprintf(textBytes, "Mario Pos#X: %d#Y: %d#Z: %d#D: %X#A: %x",
(s32)(gMarioState->pos[0]),
(s32)(gMarioState->pos[1]),
(s32)(gMarioState->pos[2]),
(u16)(gMarioState->faceAngle[1]),
(u32)(gMarioState->action & ACT_ID_MASK));
print_small_text(16, 140, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL, FONT_OUTLINE);
}
// Same for the camera, especially so because this will crash otherwise.
if (gCamera) {
sprintf(textBytes, "Camera Pos#X: %d#Y: %d#Z: %d#D: %X",
(s32)(gCamera->pos[0]),
(s32)(gCamera->pos[1]),
(s32)(gCamera->pos[2]),
(u16)(gCamera->yaw));
print_small_text((SCREEN_WIDTH - 16), 140, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE);
}
// Just to keep screen estate a little friendlier.
#define MX NUM_PERF_ITERATIONS
for (i = 0; i < CPU_TABLE_MAX; i++) {
perfPercentage[i] = MAX((cpu_ordering_table[i].time[MX] / ADDTIMES), 0);
}
#undef ADDTIMES
#undef MX
viewedNums = 0;
for (i = 0; i < CPU_TABLE_MAX; i++) {
s32 num = cpu_ordering_table[i].time[NUM_PERF_ITERATIONS];
if (num != 0) {
sprintf(textBytes, "%s%dus", cpu_ordering_table[i].str, num);
print_small_text((SCREEN_WIDTH - 16), (40 + (viewedNums * 12)), textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE);
viewedNums++;
}
}
s32 barY = ((28 + (viewedNums * 12)) + 16);
prepare_blank_box();
viewedNums = 0;
// Render CPU breakdown bar.
for (i = 0; i < CPU_TABLE_MAX; i++) {
if ((perfPercentage[i] == 0) && (i != (CPU_TABLE_MAX - 1))) {
continue;
}
if (viewedNums == 0) {
graphPos = ((SCREEN_WIDTH - 96) + perfPercentage[i]);
render_blank_box((SCREEN_WIDTH - 96), barY, graphPos, (barY + 8), cpu_ordering_table[i].colour[0], cpu_ordering_table[i].colour[1], cpu_ordering_table[i].colour[2], 255);
} else if (i == (CPU_TABLE_MAX - 1)) {
graphPos = ((SCREEN_WIDTH - 96) + perfPercentage[i]);
render_blank_box(prevGraph, barY, (SCREEN_WIDTH - 16), (barY + 8), cpu_ordering_table[i].colour[0], cpu_ordering_table[i].colour[1], cpu_ordering_table[i].colour[2], 255);
} else {
graphPos += perfPercentage[i];
render_blank_box(prevGraph, barY, graphPos, (barY + 8), cpu_ordering_table[i].colour[0], cpu_ordering_table[i].colour[1], cpu_ordering_table[i].colour[2], 255);
}
viewedNums++;
prevGraph = graphPos;
}
finish_blank_box();
}
void puppyprint_render_minimal(void) {
print_basic_profiling();
}
struct PuppyPrintPage ppPages[] = {
{&puppyprint_render_standard, "Standard" },
{&puppyprint_render_minimal, "Minimal" },
{&print_audio_ram_overview, "Audio" },
{&print_ram_overview, "Segments" },
{&puppyprint_render_collision, "Collision"},
{&print_console_log, "Log" },
};
#define MENU_BOX_WIDTH 128
#define MAX_DEBUG_OPTIONS (sizeof(ppPages) / sizeof(struct PuppyPrintPage))
void render_page_menu(void) {
s32 i;
s32 posY;
s32 scrollY = (36 / (MAX_DEBUG_OPTIONS - 1));
prepare_blank_box();
render_blank_box(32, 32, (32 + MENU_BOX_WIDTH), (32 + 72), 0x00, 0x00, 0x00, 0xC0);
render_blank_box((32 + MENU_BOX_WIDTH - 8), (32 + (scrollY * sDebugOption)), (32 + MENU_BOX_WIDTH), (32 + (scrollY * sDebugOption) + 36), 0xFF, 0xFF, 0xFF, 0xFF);
finish_blank_box();
for (i = 0; i < (s32)MAX_DEBUG_OPTIONS; i++) {
s32 yOffset = ((sDebugOption > 5) ? (sDebugOption - 5) : 0);
posY = (38 + ((i-yOffset) * 10));
if ((posY > 32) && (posY < 90)) {
if (sDebugOption == i) {
print_set_envcolour(0xFF, 0x40, 0x40, 0xFF);
} else {
print_set_envcolour(0xFF, 0xFF, 0xFF, 0xFF);
}
print_small_text(28+(MENU_BOX_WIDTH / 2), posY, ppPages[i].name, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, 0);
}
}
}
void puppyprint_render_profiler(void) {
OSTime first = osGetTime();
if (!fDebug) {
profiler_update(profilerTime, first);
return;
}
sprintf(textBytes, "RAM: %06X/%06X (%d_)", main_pool_available(), mempool, (s32)(((f32)main_pool_available() / (f32)mempool) * 100));
print_small_text(SCREEN_CENTER_X, (SCREEN_HEIGHT - 16), textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, FONT_OUTLINE);
(ppPages[sPPDebugPage].func)();
if (!ramViewer && !audioRamViewer && !benchViewer && !logViewer) {
print_fps(16, 40);
sprintf(textBytes, "CPU: %dus (%d_)#RSP: %dus (%d_)#RDP: %dus (%d_)", (s32)cpuCount, (s32)(cpuCount / 333), (s32)CYCLE_CONV(rspTime), ((s32)CYCLE_CONV(rspTime) / 333), (s32)CYCLE_CONV(rdpTime), ((s32)CYCLE_CONV(rdpTime) / 333));
print_small_text(16, 52, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL, FONT_OUTLINE);
if (sDebugMenu)
render_page_menu();
sprintf(textBytes, "OBJ: %d/%d", gObjectCounter, OBJECT_POOL_CAPACITY);
print_small_text(16, 124, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL, FONT_OUTLINE);
// Very little point printing useless info if Mayro doesn't even exist.
if (gMarioState->marioObj) {
sprintf(textBytes, "Mario Pos#X: %d#Y: %d#Z: %d#D: %X#A: %x",
(s32)(gMarioState->pos[0]),
(s32)(gMarioState->pos[1]),
(s32)(gMarioState->pos[2]),
(u16)(gMarioState->faceAngle[1]),
(u32)(gMarioState->action & ACT_ID_MASK));
print_small_text(16, 140, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL, FONT_OUTLINE);
}
// Same for the camera, especially so because this will crash otherwise.
if (gCamera) {
sprintf(textBytes, "Camera Pos#X: %d#Y: %d#Z: %d#D: %X",
(s32)(gCamera->pos[0]),
(s32)(gCamera->pos[1]),
(s32)(gCamera->pos[2]),
(u16)(gCamera->yaw));
print_small_text((SCREEN_WIDTH - 16), 140, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE);
}
if (benchmarkTimer > 0) {
benchmarkTimer--;
prepare_blank_box();
sprintf(textBytes, "Done in %0.000f seconds#Benchmark: %dus#High: %dus", ((f32)(benchmarkProgramTimer) * 0.000001f), (s32)CYCLE_CONV(benchMark[NUM_BENCH_ITERATIONS]), (s32)CYCLE_CONV(benchMark[NUM_BENCH_ITERATIONS + 1]));
render_blank_box((SCREEN_CENTER_X - (get_text_width(textBytes, FONT_OUTLINE) / 2) - 4), 158, (SCREEN_CENTER_X + (get_text_width(textBytes, FONT_OUTLINE) / 2) + 4), 196, 0, 0, 0, 255);
print_set_envcolour(255, 255, 255, 255);
print_small_text(SCREEN_CENTER_X, 160, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, FONT_OUTLINE);
finish_blank_box();
}
// Just to keep screen estate a little friendlier.
#define MX NUM_PERF_ITERATIONS
s32 unclampedPerfPErcentage;
for (i = 0; i < CPU_TABLE_MAX; i++) {
unclampedPerfPErcentage = (cpu_ordering_table[i].time[MX] / ADDTIMES);
perfPercentage[i] = MAX(unclampedPerfPErcentage, 0);
}
#undef ADDTIMES
#undef MX
viewedNums = 0;
for (i = 0; i < CPU_TABLE_MAX; i++) {
s32 num = CYCLE_CONV(cpu_ordering_table[i].time[NUM_PERF_ITERATIONS]);
if (num != 0) {
sprintf(textBytes, "%s%dus", cpu_ordering_table[i].str, num);
print_small_text((SCREEN_WIDTH - 16), (40 + (viewedNums * 12)), textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE);
viewedNums++;
}
}
s32 barY = ((28 + (viewedNums * 12)) + 16);
prepare_blank_box();
viewedNums = 0;
// Render CPU breakdown bar.
for (i = 0; i < CPU_TABLE_MAX; i++) {
if ((perfPercentage[i] == 0) && (i != (CPU_TABLE_MAX - 1))) {
continue;
}
if (viewedNums == 0) {
graphPos = ((SCREEN_WIDTH - 96) + perfPercentage[i]);
render_blank_box((SCREEN_WIDTH - 96), barY, graphPos, (barY + 8), cpu_ordering_table[i].colour[0], cpu_ordering_table[i].colour[1], cpu_ordering_table[i].colour[2], 255);
} else if (i == (CPU_TABLE_MAX - 1)) {
graphPos = ((SCREEN_WIDTH - 96) + perfPercentage[i]);
render_blank_box(prevGraph, barY, (SCREEN_WIDTH - 16), (barY + 8), cpu_ordering_table[i].colour[0], cpu_ordering_table[i].colour[1], cpu_ordering_table[i].colour[2], 255);
} else {
graphPos += perfPercentage[i];
render_blank_box(prevGraph, barY, graphPos, (barY + 8), cpu_ordering_table[i].colour[0], cpu_ordering_table[i].colour[1], cpu_ordering_table[i].colour[2], 255);
}
viewedNums++;
prevGraph = graphPos;
}
finish_blank_box();
} else if (ramViewer) {
print_ram_overview();
} else if (audioRamViewer) {
print_audio_ram_overview();
} else if (logViewer) {
print_console_log();
} else if (benchViewer) {
print_which_benchmark();
}
print_ram_bar();
profiler_update(profilerTime, first);
}
@@ -563,7 +628,7 @@ void get_average_perf_time(u32 *time) {
total += time[i];
}
total /= NUM_PERF_ITERATIONS;
time[NUM_PERF_ITERATIONS] = MAX(total, 0);
time[NUM_PERF_ITERATIONS] = CYCLE_CONV(MAX(total, 0));
}
void puppyprint_profiler_process(void) {
@@ -572,7 +637,30 @@ void puppyprint_profiler_process(void) {
busTime[perfIteration] = (IO_READ(DPC_PIPEBUSY_REG));
OSTime newTime = osGetTime();
if ((gGlobalTimer % 15) == 0) {
if (fDebug && gPlayer1Controller->buttonPressed & L_TRIG) {
sDebugMenu ^= TRUE;
if (sDebugMenu == FALSE) {
sPPDebugPage = sDebugOption;
}
}
if ((gPlayer1Controller->buttonDown & U_JPAD) && (gPlayer1Controller->buttonPressed & L_TRIG)) {
fDebug ^= TRUE;
sDebugMenu = FALSE;
}
if (sDebugMenu) {
if (gPlayer1Controller->buttonPressed & U_JPAD) sDebugOption--;
if (gPlayer1Controller->buttonPressed & D_JPAD) sDebugOption++;
if (sDebugOption == 255) {
sDebugOption = ((sizeof(ppPages) / sizeof(struct PuppyPrintPage)) - 1);
}
if (sDebugOption >= (sizeof(ppPages) / sizeof(struct PuppyPrintPage))) {
sDebugOption = 0;
}
}
if ((gGlobalTimer % 16) == 0) {
get_average_perf_time( scriptTime);
get_average_perf_time(behaviourTime);
get_average_perf_time(collisionTime);
@@ -586,6 +674,9 @@ void puppyprint_profiler_process(void) {
get_average_perf_time( profilerTime2);
get_average_perf_time( cameraTime);
// Performed twice a frame without fail, so doubled to have a more representative value.
audioTime[NUM_PERF_ITERATIONS] *= 2;
dmaAudioTime[NUM_PERF_ITERATIONS] *= 2;
dmaTime[NUM_PERF_ITERATIONS] += dmaAudioTime[NUM_PERF_ITERATIONS];
get_average_perf_time(rspGenTime);
@@ -600,7 +691,7 @@ void puppyprint_profiler_process(void) {
#if BBPLAYER == 1 // iQue RDP registers need to be halved to be correct.
rdpTime /= 2;
#endif
cpuTime = scriptTime[NUM_PERF_ITERATIONS];
cpuTime = scriptTime[NUM_PERF_ITERATIONS] + taskTime[NUM_PERF_ITERATIONS] + faultTime[NUM_PERF_ITERATIONS] + audioTime[NUM_PERF_ITERATIONS];
rspTime = rspGenTime[NUM_PERF_ITERATIONS];
puppyprint_calculate_ram_usage();
}
@@ -609,63 +700,6 @@ void puppyprint_profiler_process(void) {
if (gGlobalTimer > 5) {
IO_WRITE(DPC_STATUS_REG, (DPC_CLR_CLOCK_CTR | DPC_CLR_CMD_CTR | DPC_CLR_PIPE_CTR | DPC_CLR_TMEM_CTR));
}
if (fDebug/* && (gMarioState->action != ACT_DEBUG_FREE_MOVE)*/) {
if (gPlayer1Controller->buttonPressed & D_JPAD) {
benchViewer ^= TRUE;
ramViewer = FALSE;
audioRamViewer = FALSE;
logViewer = FALSE;
} else if (gPlayer1Controller->buttonPressed & U_JPAD) {
if (audioRamViewer) {
ramViewer = FALSE;
} else {
ramViewer ^= TRUE;
}
audioRamViewer = FALSE;
benchViewer = FALSE;
logViewer = FALSE;
} else if (gPlayer1Controller->buttonPressed & L_JPAD) {
if (audioRamViewer) {
ramViewer = TRUE;
logViewer = FALSE;
} else {
logViewer ^= TRUE;
ramViewer = FALSE;
}
audioRamViewer = FALSE;
benchViewer = FALSE;
} else if (gPlayer1Controller->buttonPressed & R_JPAD) {
if (ramViewer) {
audioRamViewer ^= TRUE;
logViewer = FALSE;
ramViewer = FALSE;
benchViewer = FALSE;
}
}
#ifdef VISUAL_DEBUG
else if (!benchViewer && !ramViewer && !audioRamViewer && !logViewer) {
debug_box_input();
}
#endif
if (benchViewer) {
if (gPlayer1Controller->buttonPressed & R_JPAD) benchOption++;
if (gPlayer1Controller->buttonPressed & L_JPAD) benchOption--;
if (benchOption == 255) benchOption = 2;
if (benchOption > 2) benchOption = 0;
if (gPlayer1Controller->buttonPressed & L_TRIG) {
benchmarkLoop = NUM_BENCH_ITERATIONS;
benchmarkProgramTimer = osGetTime();
}
}
benchmark_custom();
}
if ((gPlayer1Controller->buttonDown & U_JPAD) && (gPlayer1Controller->buttonPressed & L_TRIG)) {
ramViewer = FALSE;
audioRamViewer = FALSE;
benchViewer = FALSE;
logViewer = FALSE;
fDebug ^= TRUE;
}
if (perfIteration++ == (NUM_PERF_ITERATIONS - 1)) {
perfIteration = 0;
}

View File

@@ -7,9 +7,14 @@
#define NUM_BENCH_ITERATIONS 150
#define LOG_BUFFER_SIZE 16
struct PuppyPrintPage{
void (*func)();
char name[32];
};
enum Benchmark {
BENCHMARK_NONE,
BENCHMARK_GAME,
BENCHMARK_GAME,
BENCHMARK_AUDIO,
BENCHMARK_GRAPHICS
};
@@ -31,6 +36,7 @@ enum PuppyFont {
FONT_NUM,
};
extern u8 sPPDebugPage;
extern u8 gPuppyFont;
extern s8 perfIteration;
extern s16 benchmarkLoop;
@@ -61,6 +67,8 @@ extern u32 dmaAudioTime[NUM_PERF_ITERATIONS + 1];
extern u32 faultTime[NUM_PERF_ITERATIONS + 1];
extern u32 taskTime[NUM_PERF_ITERATIONS + 1];
extern u32 cameraTime[NUM_PERF_ITERATIONS + 1];
extern u32 profilerTime[NUM_PERF_ITERATIONS + 1];
extern u32 profilerTime2[NUM_PERF_ITERATIONS + 1];
// RSP
extern u32 rspGenTime[NUM_PERF_ITERATIONS + 1];
// RDP