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
|
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);
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user