1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 06:04:49 +01:00

adjust fps limiter for gdi renderer

This commit is contained in:
FunkyFr3sh 2020-01-22 11:35:04 +01:00
parent 0b365ac275
commit da09069d7b
4 changed files with 35 additions and 44 deletions

View File

@ -94,7 +94,6 @@ typedef struct IDirectDrawImpl
HANDLE thread;
BOOL run;
HANDLE ev;
HANDLE sem;
DEVMODE mode;
struct { int width; int height; int x; int y; } viewport;

View File

@ -1777,12 +1777,6 @@ ULONG __stdcall ddraw_Release(IDirectDrawImpl *This)
ReleaseDC(This->hWnd, This->render.hDC);
This->render.hDC = NULL;
}
if(This->render.ev)
{
CloseHandle(This->render.ev);
ddraw->render.ev = NULL;
}
if (This->ticksLimiter.hTimer)
{
@ -1919,7 +1913,6 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk
}
InitializeCriticalSection(&This->cs);
This->render.ev = CreateEvent(NULL, TRUE, FALSE, NULL);
This->render.sem = CreateSemaphore(NULL, 0, 1, NULL);
This->wine = GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0;

View File

@ -42,7 +42,8 @@ DWORD WINAPI render_soft_main(void)
Sleep(500);
DWORD lastTick = 0;
DWORD tickStart = 0;
DWORD tickEnd = 0;
int maxFPS = ddraw->render.maxfps;
ddraw->fpsLimiter.tickLengthNs = 0;
ddraw->fpsLimiter.ticklength = 0;
@ -62,23 +63,13 @@ DWORD WINAPI render_soft_main(void)
while (ddraw->render.run && WaitForSingleObject(ddraw->render.sem, INFINITE) != WAIT_FAILED)
{
if (ddraw->fpsLimiter.ticklength > 0)
{
DWORD curTick = timeGetTime();
if (lastTick + ddraw->fpsLimiter.ticklength > curTick)
{
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
SetEvent(ddraw->render.ev);
SwitchToThread();
continue;
}
lastTick = curTick;
}
#if _DEBUG
DrawFrameInfoStart();
#endif
if (ddraw->fpsLimiter.ticklength > 0)
tickStart = timeGetTime();
EnterCriticalSection(&ddraw->cs);
if (ddraw->primary && (ddraw->bpp == 16 || (ddraw->primary->palette && ddraw->primary->palette->data_rgb)))
@ -168,7 +159,33 @@ DWORD WINAPI render_soft_main(void)
DrawFrameInfoEnd();
#endif
SetEvent(ddraw->render.ev);
if (ddraw->fpsLimiter.ticklength > 0)
{
if (ddraw->fpsLimiter.hTimer)
{
FILETIME ft = { 0 };
GetSystemTimeAsFileTime(&ft);
if (CompareFileTime((FILETIME*)&ddraw->fpsLimiter.dueTime, &ft) == -1)
{
memcpy(&ddraw->fpsLimiter.dueTime, &ft, sizeof(LARGE_INTEGER));
}
else
{
WaitForSingleObject(ddraw->fpsLimiter.hTimer, ddraw->fpsLimiter.ticklength * 2);
}
ddraw->fpsLimiter.dueTime.QuadPart += ddraw->fpsLimiter.tickLengthNs;
SetWaitableTimer(ddraw->fpsLimiter.hTimer, &ddraw->fpsLimiter.dueTime, 0, NULL, NULL, FALSE);
}
else
{
tickEnd = timeGetTime();
if (tickEnd - tickStart < ddraw->fpsLimiter.ticklength)
Sleep(ddraw->fpsLimiter.ticklength - (tickEnd - tickStart));
}
}
}
return TRUE;

View File

@ -466,15 +466,7 @@ HRESULT __stdcall ddraw_surface_Blt(IDirectDrawSurfaceImpl *This, LPRECT lpDestR
{
InterlockedExchange(&ddraw->render.surfaceUpdated, TRUE);
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
if (ddraw->renderer == render_soft_main)
{
WaitForSingleObject(ddraw->render.ev, INFINITE);
ResetEvent(ddraw->render.ev);
}
else
{
SwitchToThread();
}
SwitchToThread();
if (ddraw->ticksLimiter.ticklength > 0)
{
@ -696,18 +688,8 @@ HRESULT __stdcall ddraw_surface_Flip(IDirectDrawSurfaceImpl *This, LPDIRECTDRAWS
This->lastFlipTick = timeGetTime();
InterlockedExchange(&ddraw->render.surfaceUpdated, TRUE);
if (ddraw->renderer == render_soft_main)
{
ResetEvent(ddraw->render.ev);
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
WaitForSingleObject(ddraw->render.ev, INFINITE);
}
else
{
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
SwitchToThread();
}
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
SwitchToThread();
if (flags & DDFLIP_WAIT)
{