This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
SDL_systimer.c
109 lines (89 loc) · 2.81 KB
1
2
/*
SDL - Simple DirectMedia Layer
3
Copyright (C) 1997-2010 Sam Lantinga
4
5
This library is free software; you can redistribute it and/or
6
modify it under the terms of the GNU Lesser General Public
7
License as published by the Free Software Foundation; either
8
version 2.1 of the License, or (at your option) any later version.
9
10
11
12
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
Lesser General Public License for more details.
14
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19
Sam Lantinga
20
slouken@libsdl.org
21
*/
22
#include "SDL_config.h"
23
24
#ifdef SDL_TIMER_WINDOWS
25
26
#include "../../core/windows/SDL_windows.h"
27
28
29
30
#include "SDL_timer.h"
#ifdef _WIN32_WCE
31
#error This is WinCE. Please use src/timer/wince/SDL_systimer.c instead.
32
33
34
35
#endif
#define TIME_WRAP_VALUE (~(DWORD)0)
36
/* The first (low-resolution) ticks value of the application */
37
38
static DWORD start;
39
40
41
42
43
44
45
46
47
#ifndef USE_GETTICKCOUNT
/* Store if a high-resolution performance counter exists on the system */
static BOOL hires_timer_available;
/* The first high-resolution ticks value of the application */
static LARGE_INTEGER hires_start_ticks;
/* The number of ticks per second of the high-resolution performance counter */
static LARGE_INTEGER hires_ticks_per_second;
#endif
48
49
void
SDL_StartTicks(void)
50
{
51
/* Set first ticks value */
52
#ifdef USE_GETTICKCOUNT
53
start = GetTickCount();
54
#else
55
56
57
58
59
#if 0 /* Apparently there are problems with QPC on Win2K */
if (QueryPerformanceFrequency(&hires_ticks_per_second) == TRUE) {
hires_timer_available = TRUE;
QueryPerformanceCounter(&hires_start_ticks);
} else
60
#endif
61
62
63
64
65
{
hires_timer_available = FALSE;
timeBeginPeriod(1); /* use 1 ms timer precision */
start = timeGetTime();
}
66
67
68
#endif
}
69
70
Uint32
SDL_GetTicks(void)
71
{
72
DWORD now, ticks;
73
#ifndef USE_GETTICKCOUNT
74
LARGE_INTEGER hires_now;
75
#endif
76
77
#ifdef USE_GETTICKCOUNT
78
now = GetTickCount();
79
#else
80
81
82
83
84
85
86
87
88
89
90
if (hires_timer_available) {
QueryPerformanceCounter(&hires_now);
hires_now.QuadPart -= hires_start_ticks.QuadPart;
hires_now.QuadPart *= 1000;
hires_now.QuadPart /= hires_ticks_per_second.QuadPart;
return (DWORD) hires_now.QuadPart;
} else {
now = timeGetTime();
}
91
#endif
92
93
94
95
96
97
98
if (now < start) {
ticks = (TIME_WRAP_VALUE - start) + now;
} else {
ticks = (now - start);
}
return (ticks);
99
100
}
101
102
void
SDL_Delay(Uint32 ms)
103
{
104
Sleep(ms);
105
106
}
107
108
#endif /* SDL_TIMER_WINDOWS */
109
/* vi: set ts=4 sw=4 expandtab: */