diff --git a/include/c3d/renderqueue.h b/include/c3d/renderqueue.h index 5ccf3f3..10eb486 100644 --- a/include/c3d/renderqueue.h +++ b/include/c3d/renderqueue.h @@ -35,6 +35,8 @@ bool C3D_FrameDrawOn(C3D_RenderTarget* target); void C3D_FrameSplit(u8 flags); void C3D_FrameEnd(u8 flags); +void C3D_FrameEndHook(void (* hook)(void*), void* param); + float C3D_GetDrawingTime(void); float C3D_GetProcessingTime(void); diff --git a/source/renderqueue.c b/source/renderqueue.c index 054ebc8..8fb21e2 100644 --- a/source/renderqueue.c +++ b/source/renderqueue.c @@ -21,6 +21,8 @@ static u8 frameStage; static float framerate = 60.0f; static float framerateCounter[2] = { 60.0f, 60.0f }; static u32 frameCounter[2]; +static void (* frameEndCb)(void*); +static void* frameEndCbData; static bool framerateLimit(int id) { @@ -242,6 +244,9 @@ void C3D_FrameEnd(u8 flags) { C3D_Context* ctx = C3Di_GetContext(); + if (frameEndCb) + frameEndCb(frameEndCbData); + C3D_FrameSplit(flags); inFrame = false; osTickCounterUpdate(&cpuTime); @@ -279,6 +284,12 @@ void C3D_FrameEnd(u8 flags) gxCmdQueueRun(&ctx->gxQueue); } +void C3D_FrameEndHook(void (* hook)(void*), void* param) +{ + frameEndCb = hook; + frameEndCbData = param; +} + float C3D_GetDrawingTime(void) { return osTickCounterRead(&gpuTime);