store sys timer start in qpc

This commit is contained in:
jacob 2025-01-30 08:49:08 -06:00
parent 79cc9e15e5
commit 489fc8eca3

View File

@ -98,9 +98,9 @@ struct win32_window {
GLOBAL struct {
SYSTEM_INFO info;
i64 timer_frequency_s;
i64 timer_frequency_ns;
i64 timer_start_ns;
i64 timer_start_qpc;
i64 timer_qpc_frequency;
i64 ns_per_qpc;
i32 scheduler_period_ms;
DWORD thread_tls_index;
u32 main_thread_id;
@ -136,20 +136,20 @@ GLOBAL struct {
* Events
* ========================== */
/* https://git.rfleury.com/community/root_basic/src/commit/9b49fcd24e0c3f875b7c213e81a219bf8544bddb/code/os/gfx/win32/os_gfx_win32.c#L193 */
INTERNAL void win32_init_vk_btn_table(void)
{
MEMZERO_ARRAY(G.vk_btn_table);
for (u32 i = 'A', j = SYS_BTN_A; i <= 'Z'; i += 1, j += 1) {
for (u32 i = 'A', j = SYS_BTN_A; i <= 'Z'; ++i, ++j) {
G.vk_btn_table[i] = (enum sys_btn)j;
}
for (u32 i = '0', j = SYS_BTN_0; i <= '9'; i += 1, j += 1) {
for (u32 i = '0', j = SYS_BTN_0; i <= '9'; ++i, ++j) {
G.vk_btn_table[i] = (enum sys_btn)j;
}
for (u32 i = VK_F1, j = SYS_BTN_F1; i <= VK_F24; i += 1, j += 1) {
for (u32 i = VK_F1, j = SYS_BTN_F1; i <= VK_F24; ++i, ++j) {
G.vk_btn_table[i] = (enum sys_btn)j;
}
G.vk_btn_table[VK_ESCAPE] = SYS_BTN_ESC;
G.vk_btn_table[VK_OEM_3] = SYS_BTN_GRAVE_ACCENT;
G.vk_btn_table[VK_OEM_MINUS] = SYS_BTN_MINUS;
@ -248,7 +248,7 @@ i64 sys_time_ns(void)
{
LARGE_INTEGER qpc;
QueryPerformanceCounter(&qpc);
i64 res = (qpc.QuadPart * G.timer_frequency_ns) - G.timer_start_ns;
i64 res = (qpc.QuadPart - G.timer_start_qpc) * G.ns_per_qpc;
return res;
}
@ -1931,7 +1931,7 @@ INTERNAL void win32_precise_sleep_timer(f64 seconds, HANDLE timer)
/* TODO: Does the high frequency timer even require setting / scaling of
* timeBeginPeriod/scheduler_period_ms? There isn't much documentation. */
i64 qpc_per_second = G.timer_frequency_s;
i64 qpc_per_second = G.timer_qpc_frequency;
i32 scheduler_period_ms = G.scheduler_period_ms;
LARGE_INTEGER qpc;
@ -1972,7 +1972,7 @@ INTERNAL void win32_precise_sleep_timer(f64 seconds, HANDLE timer)
INTERNAL void win32_precise_sleep_legacy(f64 seconds)
{
__prof;
i64 qpc_per_second = G.timer_frequency_s;
i64 qpc_per_second = G.timer_qpc_frequency;
i32 scheduler_period_ms = G.scheduler_period_ms;
LARGE_INTEGER qpc;
@ -2063,12 +2063,12 @@ int CALLBACK wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev_instance,
LARGE_INTEGER qpf;
QueryPerformanceFrequency(&qpf);
G.timer_frequency_s = qpf.QuadPart;
G.timer_frequency_ns = 1000000000 / qpf.QuadPart;
G.timer_qpc_frequency = qpf.QuadPart;
G.ns_per_qpc = 1000000000 / qpf.QuadPart;
LARGE_INTEGER qpc;
QueryPerformanceCounter(&qpc);
G.timer_start_ns = qpc.QuadPart * G.timer_frequency_ns;
G.timer_start_qpc = qpc.QuadPart;
TIMECAPS caps;
timeGetDevCaps(&caps, sizeof(caps));