Ported Dxbx PerformanceCounter implementation
This seems a better approach, since it bases it's performance counter on a value that starts at the start of emulation, plus it returns values scaled back to the real Xbox frequency.
This commit is contained in:
parent
9459a2d04f
commit
74b13b7d65
|
@ -366,6 +366,8 @@ extern "C" CXBXKRNL_API void CxbxKrnlInit
|
||||||
|
|
||||||
g_CurrentProcessHandle = GetCurrentProcess();
|
g_CurrentProcessHandle = GetCurrentProcess();
|
||||||
|
|
||||||
|
CxbxInitPerformanceCounters();
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
// MessageBoxA(NULL, "Attach a Debugger", "DEBUG", 0);
|
// MessageBoxA(NULL, "Attach a Debugger", "DEBUG", 0);
|
||||||
// Debug child processes using https://marketplace.visualstudio.com/items?itemName=GreggMiskelly.MicrosoftChildProcessDebuggingPowerTool
|
// Debug child processes using https://marketplace.visualstudio.com/items?itemName=GreggMiskelly.MicrosoftChildProcessDebuggingPowerTool
|
||||||
|
|
|
@ -82,6 +82,8 @@ CXBXKRNL_API void CxbxKrnlPanic();
|
||||||
/*! empty function */
|
/*! empty function */
|
||||||
CXBXKRNL_API void CxbxKrnlNoFunc();
|
CXBXKRNL_API void CxbxKrnlNoFunc();
|
||||||
|
|
||||||
|
CXBXKRNL_API void CxbxInitPerformanceCounters(); // Implemented in EmuKrnlKe.cpp
|
||||||
|
|
||||||
/*! kernel thunk table */
|
/*! kernel thunk table */
|
||||||
extern CXBXKRNL_API uint32 CxbxKrnl_KernelThunkTable[379];
|
extern CXBXKRNL_API uint32 CxbxKrnl_KernelThunkTable[379];
|
||||||
|
|
||||||
|
|
|
@ -424,6 +424,27 @@ XBSYSAPI EXPORTNUM(125) xboxkrnl::ULONGLONG NTAPI xboxkrnl::KeQueryInterruptTime
|
||||||
RETURN(InterruptTime);
|
RETURN(InterruptTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Xbox Performance Counter Frequency = 337F98 = ACPI timer frequency (3.375000 Mhz)
|
||||||
|
#define XBOX_PERFORMANCE_FREQUENCY 3375000
|
||||||
|
|
||||||
|
LARGE_INTEGER NativePerformanceCounter = { 0 };
|
||||||
|
LARGE_INTEGER NativePerformanceFrequency = { 0 };
|
||||||
|
double NativeToXbox_FactorForPerformanceFrequency;
|
||||||
|
|
||||||
|
CXBXKRNL_API void CxbxInitPerformanceCounters()
|
||||||
|
{
|
||||||
|
//BootTickCount = GetTickCount();
|
||||||
|
|
||||||
|
// Measure current host performance counter and frequency
|
||||||
|
QueryPerformanceCounter(&NativePerformanceCounter);
|
||||||
|
QueryPerformanceFrequency(&NativePerformanceFrequency);
|
||||||
|
// TODO : If anything like speed-stepping influences this, prevent or fix it here
|
||||||
|
|
||||||
|
// Calculate the host-to-xbox performance frequency factor,
|
||||||
|
// used the return Xbox-like results in KeQueryPerformanceCounter:
|
||||||
|
NativeToXbox_FactorForPerformanceFrequency = (double)XBOX_PERFORMANCE_FREQUENCY / NativePerformanceFrequency.QuadPart;
|
||||||
|
}
|
||||||
|
|
||||||
// ******************************************************************
|
// ******************************************************************
|
||||||
// * 0x007E - KeQueryPerformanceCounter()
|
// * 0x007E - KeQueryPerformanceCounter()
|
||||||
// ******************************************************************
|
// ******************************************************************
|
||||||
|
@ -431,11 +452,19 @@ XBSYSAPI EXPORTNUM(126) xboxkrnl::ULONGLONG NTAPI xboxkrnl::KeQueryPerformanceCo
|
||||||
{
|
{
|
||||||
LOG_FUNC();
|
LOG_FUNC();
|
||||||
|
|
||||||
::LARGE_INTEGER Counter;
|
::LARGE_INTEGER PerformanceCounter;
|
||||||
|
|
||||||
QueryPerformanceCounter(&Counter);
|
// Dxbx note : Xbox actually uses the RDTSC machine code instruction for this,
|
||||||
|
// and we we're bound to a single core, so we could do that too, but on Windows
|
||||||
|
// rdtsc is not a very stable counter, so instead, we'll use the native PeformanceCounter :
|
||||||
|
QueryPerformanceCounter(&PerformanceCounter);
|
||||||
|
|
||||||
RETURN(Counter.QuadPart);
|
// Re-base the performance counter to increase accuracy of the following conversion :
|
||||||
|
PerformanceCounter.QuadPart -= NativePerformanceCounter.QuadPart;
|
||||||
|
// We appy a conversion factor here, to fake Xbox1-like increment-speed behaviour :
|
||||||
|
PerformanceCounter.QuadPart = (ULONGLONG)(NativeToXbox_FactorForPerformanceFrequency * PerformanceCounter.QuadPart);
|
||||||
|
|
||||||
|
RETURN(PerformanceCounter.QuadPart);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ******************************************************************
|
// ******************************************************************
|
||||||
|
@ -445,12 +474,11 @@ XBSYSAPI EXPORTNUM(127) xboxkrnl::ULONGLONG NTAPI xboxkrnl::KeQueryPerformanceFr
|
||||||
{
|
{
|
||||||
LOG_FUNC();
|
LOG_FUNC();
|
||||||
|
|
||||||
// Xbox Performance Counter Frequency := 337F98h
|
// Dxbx note : We return the real Xbox1 frequency here,
|
||||||
::LARGE_INTEGER Frequency;
|
// to make subsequent calculations behave the same as on the real Xbox1 :
|
||||||
|
ULONGLONG ret = XBOX_PERFORMANCE_FREQUENCY;
|
||||||
|
|
||||||
QueryPerformanceFrequency(&Frequency);
|
RETURN(ret);
|
||||||
|
|
||||||
RETURN(Frequency.QuadPart);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ******************************************************************
|
// ******************************************************************
|
||||||
|
|
Loading…
Reference in New Issue