refresh rate: comments
[fceu.git] / drivers / gp2x / throttle.c
CommitLineData
35868d35 1#include <sys/time.h>
2#include "main.h"
b2b95d2e 3#include "gp2x.h"
7b356ee3 4#include "minimal.h"
35868d35 5#include "throttle.h"
6
35868d35 7
8extern uint8 PAL;
b2b95d2e 9extern int FSkip;
35868d35 10static int skip_count = 0;
7b356ee3 11static struct timeval tv_prev;
35868d35 12
2a6855a3 13void RefreshThrottleFPS(void)
14{
7b356ee3 15 skip_count = 0;
16 if (Settings.perfect_vsync)
17 {
18 gp2x_video_wait_vsync();
19 }
20 gettimeofday(&tv_prev, 0);
2a6855a3 21}
22
7b356ee3 23#define tvdiff(tv1, tv2) \
24 ((tv1.tv_sec - tv2.tv_sec) * 1000000 + tv1.tv_usec - tv2.tv_usec)
25
26#define tvadd(tv, usec) { \
27 tv.tv_usec += usec; \
28 if (tv.tv_usec >= 1000000) { \
29 tv.tv_sec += 1; \
30 tv.tv_usec -= 1000000; \
31 } \
32}
33
34#define tvsub(tv, usec) { \
35 tv.tv_usec -= usec; \
36 if (tv.tv_usec < 0) { \
37 tv.tv_sec -= 1; \
38 tv.tv_usec += 1000000; \
39 } \
40}
41
42static void wait_to(struct timeval *tv_aim)
35868d35 43{
35868d35 44 struct timeval tv_now;
7b356ee3 45 int diff;
35868d35 46
7b356ee3 47 do
48 {
49 gettimeofday(&tv_now, 0);
50 diff = tvdiff((*tv_aim), tv_now);
35868d35 51 }
7b356ee3 52 while (diff > 0);
53}
35868d35 54
7b356ee3 55#include <stdio.h>
56void SpeedThrottle(void)
57{
58 struct timeval tv_now, tv_aim;
59 int tdiff;
60
61 tv_aim = tv_prev;
62 tvadd(tv_aim, PAL ? 19997 : 16639); // ~50.007, 19.997 ms/frame : ~60.1, 16.639 ms/frame
35868d35 63
7b356ee3 64 gettimeofday(&tv_now, 0);
65 tdiff = tvdiff(tv_now, tv_aim);
35868d35 66
67#ifdef FRAMESKIP
b2b95d2e 68 if (Settings.frameskip >= 0)
35868d35 69 {
b2b95d2e 70 if (skip_count >= Settings.frameskip)
35868d35 71 skip_count = 0;
72 else {
73 skip_count++;
74 FSkip = 1;
75 }
76 }
7b356ee3 77 else if (tdiff > 0)
35868d35 78 {
79 /* auto frameskip */
35868d35 80 tv_prev = tv_now;
7b356ee3 81 if (tdiff < 1024*16) // limit frameskip
82 {
83 FSkip = 1;
84 tvsub(tv_prev, tdiff);
85 }
35868d35 86 return;
87 }
88#endif
89
7b356ee3 90 /* throttle */
91 if (tdiff < 0)
35868d35 92 {
7b356ee3 93 if (Settings.perfect_vsync)
94 {
95 if (tdiff <= (PAL ? 19997/2 : 16639/2))
96 {
97 struct timeval tv_tmp = tv_aim;
98 tvsub(tv_tmp, 5000);
99 wait_to(&tv_tmp);
100 }
101 gp2x_video_wait_vsync();
102 gettimeofday(&tv_prev, 0);
103 return;
104 }
105 else
106 {
107 wait_to(&tv_aim);
108 }
35868d35 109 }
7b356ee3 110
111 tv_prev = tv_aim;
35868d35 112}
35868d35 113