From a91889f5ba2b816e424bc420c42d05fbbeba2679 Mon Sep 17 00:00:00 2001 From: fincs Date: Thu, 9 Feb 2017 19:57:02 +0100 Subject: [PATCH] Added C3D_FrameRate() for controlling output framerate --- include/c3d/renderqueue.h | 1 + source/renderqueue.c | 29 +++++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/include/c3d/renderqueue.h b/include/c3d/renderqueue.h index 1865663..36b687f 100644 --- a/include/c3d/renderqueue.h +++ b/include/c3d/renderqueue.h @@ -24,6 +24,7 @@ enum C3D_FRAME_NONBLOCK = BIT(1), // Return false instead of waiting for the GPU to finish rendering }; +float C3D_FrameRate(float fps); bool C3D_FrameBegin(u8 flags); bool C3D_FrameDrawOn(C3D_RenderTarget* target); void C3D_FrameEnd(u8 flags); diff --git a/source/renderqueue.c b/source/renderqueue.c index 2a637c4..b011013 100644 --- a/source/renderqueue.c +++ b/source/renderqueue.c @@ -16,6 +16,8 @@ static struct static u8 queueSwap, queuedCount, queuedState; static bool inFrame, inSafeTransfer, inSafeClear; +static float framerate = 60.0f; +static float framerateCounter[2] = { 60.0f, 60.0f }; static void onRenderFinish(void* unused); static void onTransferFinish(void* unused); @@ -47,6 +49,17 @@ static void performClear(void) C3D_RenderBufClearAsync(renderBuf); } +static bool framerateLimit(int id) +{ + framerateCounter[id] -= framerate; + if (framerateCounter[id] <= 0.0f) + { + framerateCounter[id] += 60.0f; + return true; + } + return false; +} + static void updateFrameQueue(void) { C3D_RenderTarget* a; @@ -95,7 +108,7 @@ static void clearTarget(C3D_RenderTarget* target) static void onVBlank0(C3D_UNUSED void* unused) { - if (!linkedTarget[0]) return; + if (!linkedTarget[0] || !framerateLimit(0)) return; if (gfxIs3D()) { @@ -117,7 +130,7 @@ static void onVBlank0(C3D_UNUSED void* unused) static void onVBlank1(C3D_UNUSED void* unused) { - if (linkedTarget[2] && linkedTarget[2]->transferOk) + if (linkedTarget[2] && framerateLimit(1) && linkedTarget[2]->transferOk) transferTarget(linkedTarget[2]); } @@ -244,6 +257,18 @@ static bool checkRenderQueueInit(void) return true; } +float C3D_FrameRate(float fps) +{ + float old = framerate; + if (fps > 0.0f && fps <= 60.0f) + { + framerate = fps; + framerateCounter[0] = fps; + framerateCounter[1] = fps; + } + return old; +} + bool C3D_FrameBegin(u8 flags) { if (inFrame) return false;