112 lines
2.4 KiB
C
112 lines
2.4 KiB
C
#include <ultra64.h>
|
|
#include "constants.h"
|
|
#include "types.h"
|
|
#include "data.h"
|
|
#include "bss.h"
|
|
#include "lib/memp.h"
|
|
|
|
u8 g_RdpDramStack[SP_DRAM_STACK_SIZE8];
|
|
|
|
u8 g_RdpYieldData[0xb00];
|
|
|
|
u16 *g_RdpOutBufferEnd = NULL;
|
|
u16 *g_RdpOutBufferStart = NULL;
|
|
|
|
struct rdptask g_RdpTaskA = {
|
|
{
|
|
// OSScTask
|
|
NULL,
|
|
0,
|
|
0,
|
|
0,
|
|
{
|
|
// OSTask
|
|
M_GFXTASK, // type
|
|
OS_TASK_DP_WAIT, // flags
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
SP_UCODE_SIZE, // ucode_size
|
|
NULL,
|
|
SP_UCODE_DATA_SIZE, // ucode_data_size
|
|
(u64 *) &g_RdpDramStack, // dram_stack
|
|
SP_DRAM_STACK_SIZE8, // dram_stack_size
|
|
}
|
|
}
|
|
};
|
|
|
|
struct rdptask g_RdpTaskB = {
|
|
{
|
|
// OSScTask
|
|
NULL,
|
|
0,
|
|
0,
|
|
0,
|
|
{
|
|
// OSTask
|
|
M_GFXTASK, // type
|
|
OS_TASK_DP_WAIT, // flags
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
SP_UCODE_SIZE, // ucode_size
|
|
NULL,
|
|
SP_UCODE_DATA_SIZE, // ucode_data_size
|
|
(u64 *) &g_RdpDramStack, // dram_stack
|
|
SP_DRAM_STACK_SIZE8, // dram_stack_size
|
|
}
|
|
}
|
|
};
|
|
|
|
struct rdptask *g_RdpCurTask = &g_RdpTaskA;
|
|
|
|
extern u8 gspTextStart;
|
|
extern u8 gspDataStart;
|
|
|
|
void rdpInit(void)
|
|
{
|
|
s32 size = 0x10000;
|
|
|
|
if (IS4MB()) {
|
|
size = 0x8000;
|
|
}
|
|
|
|
g_RdpOutBufferStart = mempAlloc(size, MEMPOOL_PERMANENT);
|
|
g_RdpOutBufferEnd = (u16 *)((u32)g_RdpOutBufferStart + size);
|
|
}
|
|
|
|
void rdpCreateTask(Gfx *gdlstart, Gfx *gdlend, u32 arg2, void *msg)
|
|
{
|
|
OSScTask *sctask;
|
|
OSTask *task;
|
|
|
|
sctask = &g_RdpCurTask->sctask;
|
|
task = &sctask->list;
|
|
|
|
task->t.ucode_boot = (u64 *) rspbootTextStart;
|
|
task->t.ucode_boot_size = (u32) ((u32)rspbootTextEnd - (u32)rspbootTextStart);
|
|
|
|
if (rspbootTextStart);
|
|
|
|
task->t.ucode = (u64 *) &gspTextStart;
|
|
task->t.ucode_data = (u64 *) &gspDataStart;
|
|
task->t.output_buff = (u64 *)g_RdpOutBufferStart;
|
|
task->t.output_buff_size = (u64 *)g_RdpOutBufferEnd;
|
|
task->t.data_ptr = (u64 *) gdlstart;
|
|
task->t.data_size = (gdlend - gdlstart) * sizeof(Gfx);
|
|
task->t.yield_data_ptr = (u64 *)&g_RdpYieldData;
|
|
task->t.yield_data_size = sizeof(g_RdpYieldData);
|
|
|
|
sctask->next = NULL;
|
|
sctask->flags = OS_SC_NEEDS_RSP | OS_SC_NEEDS_RDP | OS_SC_LAST_TASK | OS_SC_SWAPBUFFER;
|
|
sctask->msgQ = &g_SchedMesgQueue;
|
|
sctask->msg = msg;
|
|
sctask->framebuffer = g_RdpCurTask->framebuffer;
|
|
|
|
osWritebackDCacheAll();
|
|
schedAppendTasks(&g_Sched, sctask);
|
|
|
|
// Swap g_RdpCurTask
|
|
g_RdpCurTask = (struct rdptask *)((u32)g_RdpCurTask ^ (u32) &g_RdpTaskA ^ (u32) &g_RdpTaskB);
|
|
}
|