From 5e156dd71939cd225f1fc2aef828b4d03aff507b Mon Sep 17 00:00:00 2001 From: fincs Date: Thu, 16 Feb 2017 14:39:48 +0100 Subject: [PATCH] Add C3D_GetDrawingTime/C3D_GetProcessingTime --- include/c3d/renderqueue.h | 3 +++ source/renderqueue.c | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/include/c3d/renderqueue.h b/include/c3d/renderqueue.h index 0c0a4b5..c28d36b 100644 --- a/include/c3d/renderqueue.h +++ b/include/c3d/renderqueue.h @@ -39,6 +39,9 @@ bool C3D_FrameBegin(u8 flags); bool C3D_FrameDrawOn(C3D_RenderTarget* target); void C3D_FrameEnd(u8 flags); +float C3D_GetDrawingTime(void); +float C3D_GetProcessingTime(void); + #if defined(__GNUC__) && !defined(__cplusplus) typedef union __attribute__((__transparent_union__)) { diff --git a/source/renderqueue.c b/source/renderqueue.c index 5c0fc9f..9a08ece 100644 --- a/source/renderqueue.c +++ b/source/renderqueue.c @@ -10,6 +10,8 @@ static C3D_RenderTarget *firstTarget, *lastTarget; static C3D_RenderTarget *linkedTarget[3]; static C3D_RenderTarget *transferQueue, *clearQueue; +static TickCounter gpuTime, cpuTime; + static struct { C3D_RenderTarget* targetList; @@ -31,6 +33,7 @@ static void performDraw(void) { gspSetEventCallback(GSPGPU_EVENT_P3D, onRenderFinish, NULL, true); GX_ProcessCommandList(queuedFrame[queueSwap].cmdBuf, queuedFrame[queueSwap].cmdBufSize, queuedFrame[queueSwap].flags); + osTickCounterStart(&gpuTime); } static void performTransfer(void) @@ -170,6 +173,7 @@ static void onVBlank1(C3D_UNUSED void* unused) void onRenderFinish(C3D_UNUSED void* unused) { C3D_RenderTarget *a, *next; + osTickCounterUpdate(&gpuTime); // The following check should never trigger if (queuedState!=1) svcBreak(USERBREAK_PANIC); @@ -312,6 +316,7 @@ bool C3D_FrameBegin(u8 flags) return false; gspWaitForP3D(); } + osTickCounterStart(&cpuTime); inFrame = true; return true; } @@ -343,6 +348,7 @@ void C3D_FrameEnd(u8 flags) { if (!inFrame) return; inFrame = false; + osTickCounterUpdate(&cpuTime); int pos = queueSwap^queuedCount; if (!queuedFrame[pos].targetList) return; @@ -365,6 +371,16 @@ void C3D_FrameEnd(u8 flags) updateFrameQueue(); } +float C3D_GetDrawingTime(void) +{ + return osTickCounterRead(&gpuTime); +} + +float C3D_GetProcessingTime(void) +{ + return osTickCounterRead(&cpuTime); +} + static C3D_RenderTarget* C3Di_RenderTargetNew(void) { C3D_RenderTarget* target = (C3D_RenderTarget*)malloc(sizeof(C3D_RenderTarget));