This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
SDL_systimer.c
132 lines (108 loc) · 3.19 KB
1
2
/*
SDL - Simple DirectMedia Layer
3
Copyright (C) 1997-2011 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
#include <mmsystem.h>
28
29
30
31
#include "SDL_timer.h"
#ifdef _WIN32_WCE
32
#error This is WinCE. Please use src/timer/wince/SDL_systimer.c instead.
33
34
35
36
#endif
#define TIME_WRAP_VALUE (~(DWORD)0)
37
/* The first (low-resolution) ticks value of the application */
38
39
static DWORD start;
40
41
42
43
44
45
46
47
48
#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
49
50
void
SDL_StartTicks(void)
51
{
52
/* Set first ticks value */
53
#ifdef USE_GETTICKCOUNT
54
start = GetTickCount();
55
#else
56
57
58
59
60
#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
61
#endif
62
63
64
65
66
{
hires_timer_available = FALSE;
timeBeginPeriod(1); /* use 1 ms timer precision */
start = timeGetTime();
}
67
68
69
#endif
}
70
71
Uint32
SDL_GetTicks(void)
72
{
73
DWORD now, ticks;
74
#ifndef USE_GETTICKCOUNT
75
LARGE_INTEGER hires_now;
76
#endif
77
78
#ifdef USE_GETTICKCOUNT
79
now = GetTickCount();
80
#else
81
82
83
84
85
86
87
88
89
90
91
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();
}
92
#endif
93
94
95
96
97
98
99
if (now < start) {
ticks = (TIME_WRAP_VALUE - start) + now;
} else {
ticks = (now - start);
}
return (ticks);
100
101
}
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
Uint64
SDL_GetPerformanceCounter(void)
{
LARGE_INTEGER counter;
if (!QueryPerformanceCounter(&counter)) {
return SDL_GetTicks();
}
return counter.QuadPart;
}
Uint64
SDL_GetPerformanceFrequency(void)
{
LARGE_INTEGER frequency;
if (!QueryPerformanceFrequency(&frequency)) {
return 1000;
}
return frequency.QuadPart;
}
124
125
void
SDL_Delay(Uint32 ms)
126
{
127
Sleep(ms);
128
129
}
130
131
#endif /* SDL_TIMER_WINDOWS */
132
/* vi: set ts=4 sw=4 expandtab: */