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
};
float C3D_FrameRate(float fps);
bool C3D_FrameBegin(u8 flags);
bool C3D_FrameDrawOn(C3D_RenderTarget* target);
void C3D_FrameEnd(u8 flags);

View File

@ -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;