[Mesa-dev] [PATCH] glx/dri2: use uint64_t instead of double to represent time for FPS calculation

Marek Olšák maraeo at gmail.com
Sun Sep 30 12:51:10 PDT 2012


Wine or a windows app changes fpucw to 0x7f, causing doubles to be equivalent
to floats, which broke the calculation of FPS.
We should be very careful about using doubles in Mesa.
---
 src/glx/dri2_glx.c |   11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
index f2fc187..4ff0b9e 100644
--- a/src/glx/dri2_glx.c
+++ b/src/glx/dri2_glx.c
@@ -112,7 +112,7 @@ struct dri2_drawable
    int have_fake_front;
    int swap_interval;
 
-   double previous_time;
+   uint64_t previous_time;
    unsigned frames;
 };
 
@@ -676,17 +676,18 @@ unsigned dri2GetSwapEventType(Display* dpy, XID drawable)
 static void show_fps(struct dri2_drawable *draw)
 {
    struct timeval tv;
-   double current_time;
+   uint64_t current_time;
 
    gettimeofday(&tv, 0);
-   current_time = (double)tv.tv_sec + (double)tv.tv_usec * 0.000001;
+   current_time = (uint64_t)tv.tv_sec*1000000 + (uint64_t)tv.tv_usec;
 
    draw->frames++;
 
-   if (draw->previous_time + 1 < current_time) {
+   if (draw->previous_time + 1000000 <= current_time) {
       if (draw->previous_time) {
          fprintf(stderr, "libGL: FPS = %.1f\n",
-                 draw->frames / (current_time - draw->previous_time));
+                 ((uint64_t)draw->frames * 1000000) /
+                 (double)(current_time - draw->previous_time));
       }
       draw->frames = 0;
       draw->previous_time = current_time;
-- 
1.7.9.5



More information about the mesa-dev mailing list