mirror of
https://github.com/zeldaret/oot.git
synced 2024-12-26 14:46:16 +00:00
Irqmgr and Sched Retail OK (#1678)
* irqmgr OK * sched OK * PR review renames
This commit is contained in:
parent
06379c3109
commit
2bc159e518
2 changed files with 64 additions and 71 deletions
|
@ -253,31 +253,36 @@ void IrqMgr_ThreadEntry(void* arg) {
|
|||
case IRQ_RETRACE_MSG:
|
||||
IrqMgr_HandleRetrace(irqMgr);
|
||||
break;
|
||||
|
||||
case IRQ_PRENMI_MSG:
|
||||
PRINTF("PRE_NMI_MSG\n");
|
||||
// "Scheduler: Receives PRE_NMI message"
|
||||
PRINTF("スケジューラ:PRE_NMIメッセージを受信\n");
|
||||
IrqMgr_HandlePreNMI(irqMgr);
|
||||
break;
|
||||
|
||||
case IRQ_PRENMI450_MSG:
|
||||
PRINTF("PRENMI450_MSG\n");
|
||||
// "Scheduler: Receives PRENMI450 message"
|
||||
PRINTF("スケジューラ:PRENMI450メッセージを受信\n");
|
||||
IrqMgr_HandlePreNMI450(irqMgr);
|
||||
break;
|
||||
|
||||
case IRQ_PRENMI480_MSG:
|
||||
PRINTF("PRENMI480_MSG\n");
|
||||
// "Scheduler: Receives PRENMI480 message"
|
||||
PRINTF("スケジューラ:PRENMI480メッセージを受信\n");
|
||||
IrqMgr_HandlePreNMI480(irqMgr);
|
||||
break;
|
||||
|
||||
case IRQ_PRENMI500_MSG:
|
||||
PRINTF("PRENMI500_MSG\n");
|
||||
// "Scheduler: Receives PRENMI500 message"
|
||||
PRINTF("スケジューラ:PRENMI500メッセージを受信\n");
|
||||
exit = true;
|
||||
IrqMgr_HandlePreNMI500(irqMgr);
|
||||
exit = true;
|
||||
break;
|
||||
|
||||
default:
|
||||
// "Unexpected message received"
|
||||
PRINTF("irqmgr.c:予期しないメッセージを受け取りました(%08x)\n", msg);
|
||||
|
|
128
src/code/sched.c
128
src/code/sched.c
|
@ -45,34 +45,44 @@
|
|||
#define RDP_DONE_MSG 668
|
||||
#define NOTIFY_MSG 670 // original name: ENTRY_MSG
|
||||
|
||||
vs32 sLogScheduler = false;
|
||||
vs32 sSchedDebugPrintfEnabled = false;
|
||||
|
||||
OSTime sRSPGfxTimeStart;
|
||||
OSTime sRSPAudioTimeStart;
|
||||
OSTime sRSPOtherTimeStart;
|
||||
OSTime sRDPTimeStart;
|
||||
|
||||
#if OOT_DEBUG
|
||||
#define SCHED_DEBUG_PRINTF \
|
||||
if (sSchedDebugPrintfEnabled) \
|
||||
PRINTF
|
||||
#elif defined(__sgi)
|
||||
// See comment about PRINTF in macros.h
|
||||
#define SCHED_DEBUG_PRINTF(args) (void)0
|
||||
#else
|
||||
#define SCHED_DEBUG_PRINTF(format, ...) (void)0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Set the current framebuffer to the swapbuffer pointed to by the provided cfb
|
||||
*/
|
||||
void Sched_SwapFrameBufferImpl(CfbInfo* cfbInfo) {
|
||||
u16 width;
|
||||
|
||||
LOG_UTILS_CHECK_VALID_POINTER("cfbinfo->swapbuffer", cfbInfo->swapBuffer, "../sched.c", 340);
|
||||
|
||||
if (cfbInfo->swapBuffer != NULL) {
|
||||
// Register the swapbuffer to display on next VI
|
||||
osViSwapBuffer(cfbInfo->swapBuffer);
|
||||
cfbInfo->updateTimer = cfbInfo->updateRate;
|
||||
SCHED_DEBUG_PRINTF("osViSwapBuffer %08x %08x %08x\n", osViGetCurrentFramebuffer(), osViGetNextFramebuffer(),
|
||||
(cfbInfo != NULL) ? cfbInfo->swapBuffer : NULL);
|
||||
|
||||
if (sLogScheduler) {
|
||||
PRINTF("osViSwapBuffer %08x %08x %08x\n", osViGetCurrentFramebuffer(), osViGetNextFramebuffer(),
|
||||
(cfbInfo != NULL) ? cfbInfo->swapBuffer : NULL);
|
||||
{
|
||||
u16 width = (cfbInfo->viMode != NULL) ? cfbInfo->viMode->comRegs.width : (u32)gScreenWidth;
|
||||
|
||||
Fault_SetFrameBuffer(cfbInfo->swapBuffer, width, 16);
|
||||
}
|
||||
|
||||
width = (cfbInfo->viMode != NULL) ? cfbInfo->viMode->comRegs.width : (u32)gScreenWidth;
|
||||
Fault_SetFrameBuffer(cfbInfo->swapBuffer, width, 16);
|
||||
|
||||
#if OOT_DEBUG
|
||||
if (R_HREG_MODE == HREG_MODE_SCHED && R_SCHED_INIT != HREG_MODE_SCHED) {
|
||||
R_SCHED_TOGGLE_SPECIAL_FEATURES = 0;
|
||||
R_SCHED_GAMMA_ON = 0;
|
||||
|
@ -100,6 +110,7 @@ void Sched_SwapFrameBufferImpl(CfbInfo* cfbInfo) {
|
|||
osViSetSpecialFeatures(R_SCHED_GAMMA_DITHER_ON ? OS_VI_GAMMA_DITHER_ON : OS_VI_GAMMA_DITHER_OFF);
|
||||
osViSetSpecialFeatures(R_SCHED_DIVOT_ON ? OS_VI_DIVOT_ON : OS_VI_DIVOT_OFF);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
cfbInfo->unk_10 = 0;
|
||||
|
@ -117,6 +128,7 @@ void Sched_SwapFrameBuffer(Scheduler* sc, CfbInfo* cfbInfo) {
|
|||
}
|
||||
|
||||
void Sched_HandlePreNMI(Scheduler* sc) {
|
||||
#if OOT_DEBUG
|
||||
OSTime now;
|
||||
|
||||
if (sc->curRSPTask != NULL) {
|
||||
|
@ -143,6 +155,7 @@ void Sched_HandlePreNMI(Scheduler* sc) {
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void Sched_HandleNMI(Scheduler* sc) {
|
||||
|
@ -161,10 +174,9 @@ void Sched_QueueTask(Scheduler* sc, OSScTask* task) {
|
|||
463);
|
||||
|
||||
if (type == M_AUDTASK) {
|
||||
if (sLogScheduler) {
|
||||
// "You have entered an audio task"
|
||||
PRINTF("オーディオタスクをエントリしました\n");
|
||||
}
|
||||
// "You have entered an audio task"
|
||||
SCHED_DEBUG_PRINTF("オーディオタスクをエントリしました\n");
|
||||
|
||||
// Add to audio queue
|
||||
if (sc->audioListTail != NULL) {
|
||||
sc->audioListTail->next = task;
|
||||
|
@ -176,10 +188,10 @@ void Sched_QueueTask(Scheduler* sc, OSScTask* task) {
|
|||
// Set audio flag
|
||||
sc->doAudio = true;
|
||||
} else {
|
||||
if (sLogScheduler) {
|
||||
// "Entered graph task"
|
||||
PRINTF("グラフタスクをエントリしました\n");
|
||||
}
|
||||
|
||||
// "Entered graph task"
|
||||
SCHED_DEBUG_PRINTF("グラフタスクをエントリしました\n");
|
||||
|
||||
// Add to graphics queue
|
||||
if (sc->gfxListTail != NULL) {
|
||||
sc->gfxListTail->next = task;
|
||||
|
@ -202,9 +214,7 @@ void Sched_Yield(Scheduler* sc) {
|
|||
// Send yield request
|
||||
osSpTaskYield();
|
||||
|
||||
if (sLogScheduler) {
|
||||
PRINTF("%08d:osSpTaskYield\n", (u32)(OS_CYCLES_TO_USEC(osGetTime())));
|
||||
}
|
||||
SCHED_DEBUG_PRINTF("%08d:osSpTaskYield\n", (u32)(OS_CYCLES_TO_USEC(osGetTime())));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -405,11 +415,9 @@ void Sched_RunTask(Scheduler* sc, OSScTask* spTask, OSScTask* dpTask) {
|
|||
// Run RSP
|
||||
osSpTaskStartGo(&spTask->list);
|
||||
|
||||
if (sLogScheduler) {
|
||||
PRINTF(
|
||||
"%08d:osSpTaskStartGo(%08x) %s\n", (u32)OS_CYCLES_TO_USEC(osGetTime()), &spTask->list,
|
||||
(spTask->list.t.type == M_AUDTASK ? "AUDIO" : (spTask->list.t.type == M_GFXTASK ? "GRAPH" : "OTHER")));
|
||||
}
|
||||
SCHED_DEBUG_PRINTF(
|
||||
"%08d:osSpTaskStartGo(%08x) %s\n", (u32)OS_CYCLES_TO_USEC(osGetTime()), &spTask->list,
|
||||
(spTask->list.t.type == M_AUDTASK ? "AUDIO" : (spTask->list.t.type == M_GFXTASK ? "GRAPH" : "OTHER")));
|
||||
|
||||
// Set currently running RSP task
|
||||
sc->curRSPTask = spTask;
|
||||
|
@ -442,9 +450,8 @@ void Sched_HandleNotification(Scheduler* sc) {
|
|||
// signal to the currently running task to yield the RSP so that the audio task may
|
||||
// be ran as soon as possible.
|
||||
if (sc->doAudio && sc->curRSPTask != NULL) {
|
||||
if (sLogScheduler) {
|
||||
PRINTF("[YIELD B]");
|
||||
}
|
||||
SCHED_DEBUG_PRINTF("[YIELD B]");
|
||||
|
||||
Sched_Yield(sc);
|
||||
return;
|
||||
}
|
||||
|
@ -454,15 +461,12 @@ void Sched_HandleNotification(Scheduler* sc) {
|
|||
if (Sched_Schedule(sc, &nextRSP, &nextRDP, state) != state) {
|
||||
Sched_RunTask(sc, nextRSP, nextRDP);
|
||||
}
|
||||
if (sLogScheduler) {
|
||||
PRINTF("EN sc:%08x sp:%08x dp:%08x state:%x\n", sc, nextRSP, nextRDP, state);
|
||||
}
|
||||
SCHED_DEBUG_PRINTF("EN sc:%08x sp:%08x dp:%08x state:%x\n", sc, nextRSP, nextRDP, state);
|
||||
}
|
||||
|
||||
void Sched_HandleRetrace(Scheduler* sc) {
|
||||
if (sLogScheduler) {
|
||||
PRINTF("%08d:scHandleRetrace %08x\n", (u32)OS_CYCLES_TO_USEC(osGetTime()), osViGetCurrentFramebuffer());
|
||||
}
|
||||
SCHED_DEBUG_PRINTF("%08d:scHandleRetrace %08x\n", (u32)OS_CYCLES_TO_USEC(osGetTime()), osViGetCurrentFramebuffer());
|
||||
|
||||
ViConfig_UpdateBlack();
|
||||
sc->retraceCount++;
|
||||
|
||||
|
@ -490,11 +494,9 @@ void Sched_HandleRetrace(Scheduler* sc) {
|
|||
}
|
||||
}
|
||||
|
||||
if (sLogScheduler) {
|
||||
PRINTF("%08x %08x %08x %d\n", osViGetCurrentFramebuffer(), osViGetNextFramebuffer(),
|
||||
(sc->pendingSwapBuf1 != NULL) ? sc->pendingSwapBuf1->swapBuffer : NULL,
|
||||
(sc->curBuf != NULL) ? sc->curBuf->updateTimer : 0);
|
||||
}
|
||||
SCHED_DEBUG_PRINTF("%08x %08x %08x %d\n", osViGetCurrentFramebuffer(), osViGetNextFramebuffer(),
|
||||
(sc->pendingSwapBuf1 != NULL) ? sc->pendingSwapBuf1->swapBuffer : NULL,
|
||||
(sc->curBuf != NULL) ? sc->curBuf->updateTimer : 0);
|
||||
|
||||
// Run the notification handler to enqueue any waiting tasks and possibly run one
|
||||
Sched_HandleNotification(sc);
|
||||
|
@ -524,14 +526,11 @@ void Sched_HandleRSPDone(Scheduler* sc) {
|
|||
curRSPTask = sc->curRSPTask;
|
||||
sc->curRSPTask = NULL;
|
||||
|
||||
if (sLogScheduler) {
|
||||
PRINTF("RSP DONE %d %d", curRSPTask->state & OS_SC_YIELD, osSpTaskYielded(&curRSPTask->list));
|
||||
}
|
||||
SCHED_DEBUG_PRINTF("RSP DONE %d %d", curRSPTask->state & OS_SC_YIELD, osSpTaskYielded(&curRSPTask->list));
|
||||
|
||||
if ((curRSPTask->state & OS_SC_YIELD) && osSpTaskYielded(&curRSPTask->list)) {
|
||||
if (sLogScheduler) {
|
||||
PRINTF("[YIELDED]\n");
|
||||
}
|
||||
SCHED_DEBUG_PRINTF("[YIELDED]\n");
|
||||
|
||||
// Task yielded, set yielded state
|
||||
curRSPTask->state |= OS_SC_YIELDED;
|
||||
// Add it to the front of the queue
|
||||
|
@ -541,9 +540,7 @@ void Sched_HandleRSPDone(Scheduler* sc) {
|
|||
sc->gfxListTail = curRSPTask;
|
||||
}
|
||||
} else {
|
||||
if (sLogScheduler) {
|
||||
PRINTF("[NOT YIELDED]\n");
|
||||
}
|
||||
SCHED_DEBUG_PRINTF("[NOT YIELDED]\n");
|
||||
// Task has completed on the RSP, unset RSP flag and check if the task is fully complete
|
||||
curRSPTask->state &= ~OS_SC_SP;
|
||||
Sched_TaskComplete(sc, curRSPTask);
|
||||
|
@ -554,9 +551,7 @@ void Sched_HandleRSPDone(Scheduler* sc) {
|
|||
if (Sched_Schedule(sc, &nextRSP, &nextRDP, state) != state) {
|
||||
Sched_RunTask(sc, nextRSP, nextRDP);
|
||||
}
|
||||
if (sLogScheduler) {
|
||||
PRINTF("SP sc:%08x sp:%08x dp:%08x state:%x\n", sc, nextRSP, nextRDP, state);
|
||||
}
|
||||
SCHED_DEBUG_PRINTF("SP sc:%08x sp:%08x dp:%08x state:%x\n", sc, nextRSP, nextRDP, state);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -588,9 +583,7 @@ void Sched_HandleRDPDone(Scheduler* sc) {
|
|||
if (Sched_Schedule(sc, &nextRSP, &nextRDP, state) != state) {
|
||||
Sched_RunTask(sc, nextRSP, nextRDP);
|
||||
}
|
||||
if (sLogScheduler) {
|
||||
PRINTF("DP sc:%08x sp:%08x dp:%08x state:%x\n", sc, nextRSP, nextRDP, state);
|
||||
}
|
||||
SCHED_DEBUG_PRINTF("DP sc:%08x sp:%08x dp:%08x state:%x\n", sc, nextRSP, nextRDP, state);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -601,9 +594,7 @@ void Sched_HandleRDPDone(Scheduler* sc) {
|
|||
* Original name: osScKickEntryMsg
|
||||
*/
|
||||
void Sched_Notify(Scheduler* sc) {
|
||||
if (sLogScheduler) {
|
||||
PRINTF("osScKickEntryMsg\n");
|
||||
}
|
||||
SCHED_DEBUG_PRINTF("osScKickEntryMsg\n");
|
||||
|
||||
osSendMesg(&sc->interruptQueue, (OSMesg)NOTIFY_MSG, OS_MESG_BLOCK);
|
||||
}
|
||||
|
@ -613,41 +604,38 @@ void Sched_ThreadEntry(void* arg) {
|
|||
Scheduler* sc = (Scheduler*)arg;
|
||||
|
||||
while (true) {
|
||||
if (sLogScheduler) {
|
||||
// "%08d: standby"
|
||||
PRINTF("%08d:待機中\n", (u32)OS_CYCLES_TO_USEC(osGetTime()));
|
||||
}
|
||||
// "%08d: standby"
|
||||
SCHED_DEBUG_PRINTF("%08d:待機中\n", (u32)OS_CYCLES_TO_USEC(osGetTime()));
|
||||
|
||||
// Await interrupt messages, either from the OS, IrqMgr, or another thread
|
||||
osRecvMesg(&sc->interruptQueue, &msg, OS_MESG_BLOCK);
|
||||
|
||||
switch ((s32)msg) {
|
||||
case NOTIFY_MSG:
|
||||
if (sLogScheduler) {
|
||||
PRINTF("%08d:ENTRY_MSG\n", (u32)OS_CYCLES_TO_USEC(osGetTime()));
|
||||
}
|
||||
SCHED_DEBUG_PRINTF("%08d:ENTRY_MSG\n", (u32)OS_CYCLES_TO_USEC(osGetTime()));
|
||||
Sched_HandleNotification(sc);
|
||||
continue;
|
||||
|
||||
case RSP_DONE_MSG:
|
||||
if (sLogScheduler) {
|
||||
PRINTF("%08d:RSP_DONE_MSG\n", (u32)OS_CYCLES_TO_USEC(osGetTime()));
|
||||
}
|
||||
SCHED_DEBUG_PRINTF("%08d:RSP_DONE_MSG\n", (u32)OS_CYCLES_TO_USEC(osGetTime()));
|
||||
Sched_HandleRSPDone(sc);
|
||||
continue;
|
||||
|
||||
case RDP_DONE_MSG:
|
||||
if (sLogScheduler) {
|
||||
PRINTF("%08d:RDP_DONE_MSG\n", (u32)OS_CYCLES_TO_USEC(osGetTime()));
|
||||
}
|
||||
SCHED_DEBUG_PRINTF("%08d:RDP_DONE_MSG\n", (u32)OS_CYCLES_TO_USEC(osGetTime()));
|
||||
Sched_HandleRDPDone(sc);
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (((OSScMsg*)msg)->type) {
|
||||
case OS_SC_RETRACE_MSG:
|
||||
Sched_HandleRetrace(sc);
|
||||
continue;
|
||||
|
||||
case OS_SC_PRE_NMI_MSG:
|
||||
Sched_HandlePreNMI(sc);
|
||||
continue;
|
||||
|
||||
case OS_SC_NMI_MSG:
|
||||
Sched_HandleNMI(sc);
|
||||
continue;
|
||||
|
|
Loading…
Reference in a new issue