Added C3D_FrameRate() for controlling output framerate

This commit is contained in:
fincs 2017-02-09 19:57:02 +01:00
parent 3ae31adab4
commit a91889f5ba
2 changed files with 28 additions and 2 deletions

View File

@ -24,6 +24,7 @@ enum
C3D_FRAME_NONBLOCK = BIT(1), // Return false instead of waiting for the GPU to finish rendering 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_FrameBegin(u8 flags);
bool C3D_FrameDrawOn(C3D_RenderTarget* target); bool C3D_FrameDrawOn(C3D_RenderTarget* target);
void C3D_FrameEnd(u8 flags); void C3D_FrameEnd(u8 flags);

View File

@ -16,6 +16,8 @@ static struct
static u8 queueSwap, queuedCount, queuedState; static u8 queueSwap, queuedCount, queuedState;
static bool inFrame, inSafeTransfer, inSafeClear; 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 onRenderFinish(void* unused);
static void onTransferFinish(void* unused); static void onTransferFinish(void* unused);
@ -47,6 +49,17 @@ static void performClear(void)
C3D_RenderBufClearAsync(renderBuf); 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) static void updateFrameQueue(void)
{ {
C3D_RenderTarget* a; C3D_RenderTarget* a;
@ -95,7 +108,7 @@ static void clearTarget(C3D_RenderTarget* target)
static void onVBlank0(C3D_UNUSED void* unused) static void onVBlank0(C3D_UNUSED void* unused)
{ {
if (!linkedTarget[0]) return; if (!linkedTarget[0] || !framerateLimit(0)) return;
if (gfxIs3D()) if (gfxIs3D())
{ {
@ -117,7 +130,7 @@ static void onVBlank0(C3D_UNUSED void* unused)
static void onVBlank1(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]); transferTarget(linkedTarget[2]);
} }
@ -244,6 +257,18 @@ static bool checkRenderQueueInit(void)
return true; 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) bool C3D_FrameBegin(u8 flags)
{ {
if (inFrame) return false; if (inFrame) return false;