Added C3D_FrameRate() for controlling output framerate
This commit is contained in:
parent
3ae31adab4
commit
a91889f5ba
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user