diff options
| author | Tharo <17233964+Thar0@users.noreply.github.com> | 2022-06-03 20:43:30 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-03 15:43:30 -0400 |
| commit | 1738b19d63d65afd01e1043a5359502ffef2e40e (patch) | |
| tree | 28046b3903f20dfeb34c0bbddea44450ce3e2308 /include/sched.h | |
| parent | ee5ac838b693f14710954f361ad91936975d00b7 (diff) | |
More documentation for sched.c (#1219)
* More documentation for sched.c
* VI retrace -> vertical retrace, attempt to clarify comment in viconfig
* Further review changes, fix inconsistent capitalization of PreNMI (PRENMI -> PreNMI)
* Fix typo
Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com>
* Change TaskSwapBuffer, change comment on OS_SC_DRAM_DLIST to unimplemented
* Rename SchedContext/gSchedContext to Scheduler/gScheduler
* Comments fixes
Co-authored-by: Dragorn421 <Dragorn421@users.noreply.github.com>
* Format
Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com>
Co-authored-by: Dragorn421 <Dragorn421@users.noreply.github.com>
Diffstat (limited to 'include/sched.h')
| -rw-r--r-- | include/sched.h | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/include/sched.h b/include/sched.h new file mode 100644 index 000000000..48ecc7b24 --- /dev/null +++ b/include/sched.h @@ -0,0 +1,70 @@ +#ifndef SCHED_H +#define SCHED_H + +#include "ultra64.h" +#include "irqmgr.h" + +#define OS_SC_NEEDS_RDP 0x0001 // Task uses the RDP +#define OS_SC_NEEDS_RSP 0x0002 // Task uses the RSP +#define OS_SC_DRAM_DLIST 0x0004 // Unimplemented +#define OS_SC_PARALLEL_TASK 0x0010 // Unimplemented +#define OS_SC_LAST_TASK 0x0020 // Unimplemented +#define OS_SC_SWAPBUFFER 0x0040 // Swap framebuffer when done + +#define OS_SC_DP OS_SC_NEEDS_RDP // Task is using the RDP +#define OS_SC_SP OS_SC_NEEDS_RSP // Task is using the RSP +#define OS_SC_YIELD 0x0010 // Task has been asked to yield +#define OS_SC_YIELDED 0x0020 // Task has yielded + +#define OS_SC_RCP_MASK (OS_SC_NEEDS_RDP | OS_SC_NEEDS_RSP) +#define OS_SC_TYPE_MASK (OS_SC_NEEDS_RDP | OS_SC_NEEDS_RSP | OS_SC_DRAM_DLIST) + +typedef struct { + /* 0x00 */ u16* framebuffer; // current framebuffer + /* 0x04 */ u16* swapBuffer; // framebuffer to swap to + /* 0x08 */ OSViMode* viMode; + /* 0x0C */ u32 viFeatures; + /* 0x10 */ u8 unk_10; // set to 0, never read + /* 0x11 */ s8 updateRate; // how many VIs should elapse before next swap + /* 0x12 */ s8 updateTimer; // counts down (in VIs) from updateRate to 0, swaps the framebuffer at 0 + /* 0x14 */ f32 xScale; + /* 0x18 */ f32 yScale; +} CfbInfo; // size = 0x1C + +typedef struct OSScTask { + /* 0x00 */ struct OSScTask* next; + /* 0x04 */ u32 state; + /* 0x08 */ u32 flags; + /* 0x0C */ CfbInfo* framebuffer; // The original libultra OSScTask had void* here, it would point directly to a framebuffer + /* 0x10 */ OSTask list; + /* 0x50 */ OSMesgQueue* msgQueue; // Notification queue, will receive a message when the task completes + /* 0x54 */ OSMesg msg; + /* 0x58 */ OSTime startTime; // These last two fields are a guess based on the original libultra OSScTask and padding in other structures, they are unused. + /* 0x60 */ OSTime totalTime; +} OSScTask; // size = 0x68 + +typedef struct { + /* 0x0000 */ OSMesgQueue interruptQueue; + /* 0x0018 */ OSMesg interruptMsgBuf[8]; + /* 0x0038 */ OSMesgQueue cmdQueue; // queue for receiving OSScTask pointers + /* 0x0050 */ OSMesg cmdMsgBuf[8]; + /* 0x0070 */ OSThread thread; + /* 0x0220 */ OSScTask* audioListHead; + /* 0x0224 */ OSScTask* gfxListHead; + /* 0x0228 */ OSScTask* audioListTail; + /* 0x022C */ OSScTask* gfxListTail; + /* 0x0230 */ OSScTask* curRSPTask; // task currently using the RSP + /* 0x0234 */ OSScTask* curRDPTask; // task currently using the RDP + /* 0x0238 */ s32 retraceCount; + /* 0x023C */ s32 doAudio; + /* 0x0240 */ CfbInfo* curBuf; // current framebuffer (taken from buffer 1) + /* 0x0244 */ CfbInfo* pendingSwapBuf1; // buffer 1 (next buffer) + /* 0x0220 */ CfbInfo* pendingSwapBuf2; // buffer 2 (always NULL) + /* 0x0220 */ s32 isFirstSwap; + /* 0x0250 */ IrqMgrClient irqClient; +} Scheduler; // size = 0x258 + +void Sched_Notify(Scheduler* sc); +void Sched_Init(Scheduler* sc, void* stack, OSPri priority, UNK_TYPE arg3, UNK_TYPE arg4, IrqMgr* irqMgr); + +#endif |
