Improve performance by computing the resolution required by the PIT,
and then using the standard tick count instead of performance counters
when that resolution is low.


svn path=/branches/ntvdm/; revision=60783
This commit is contained in:
Aleksandar Andrejevic 2013-10-28 02:25:54 +00:00
parent b8d8b21ebd
commit 97acc35c7c
3 changed files with 45 additions and 7 deletions

View file

@ -151,19 +151,37 @@ INT wmain(INT argc, WCHAR *argv[])
/* Main loop */
while (VdmRunning)
{
/* Get the resolution of the system timer */
DWORD TimerResolution = PitGetResolution();
/* Get the current number of ticks */
CurrentTickCount = GetTickCount();
/* Get the current performance counter value */
QueryPerformanceCounter(&Counter);
if (TimerResolution > 1000)
{
/* Get the current performance counter value */
QueryPerformanceCounter(&Counter);
/* Get the number of PIT ticks that have passed */
TimerTicks = ((Counter.QuadPart - LastTimerTick.QuadPart)
* PIT_BASE_FREQUENCY) / Frequency.QuadPart;
/* Get the number of PIT ticks that have passed */
TimerTicks = ((Counter.QuadPart - LastTimerTick.QuadPart)
* PIT_BASE_FREQUENCY) / Frequency.QuadPart;
}
else
{
/* Use the standard tick count */
Counter.QuadPart = CurrentTickCount;
/* Get the number of PIT ticks that have passed */
TimerTicks = ((Counter.QuadPart - LastTimerTick.QuadPart)
* PIT_BASE_FREQUENCY) / 1000;
}
/* Update the PIT */
for (i = 0; i < TimerTicks; i++) PitDecrementCount();
LastTimerTick = Counter;
if (TimerTicks > 0)
{
for (i = 0; i < TimerTicks; i++) PitDecrementCount();
LastTimerTick = Counter;
}
/* Check for vertical retrace */
if ((CurrentTickCount - LastVerticalRefresh) >= 16)

View file

@ -233,4 +233,23 @@ VOID PitDecrementCount()
}
}
DWORD PitGetResolution(VOID)
{
INT i;
DWORD MinReloadValue = 65536;
for (i = 0; i < PIT_CHANNELS; i++)
{
DWORD ReloadValue = PitChannels[i].ReloadValue;
/* 0 means 65536 */
if (ReloadValue == 0) ReloadValue = 65536;
if (ReloadValue < MinReloadValue) MinReloadValue = ReloadValue;
}
/* Return the frequency resolution */
return PIT_BASE_FREQUENCY / MinReloadValue;
}
/* EOF */

View file

@ -49,6 +49,7 @@ VOID PitWriteCommand(BYTE Value);
BYTE PitReadData(BYTE Channel);
VOID PitWriteData(BYTE Channel, BYTE Value);
VOID PitDecrementCount();
DWORD PitGetResolution(VOID);
#endif // _TIMER_H_