diff options
author | Frank Richter <[email protected]> | 2017-08-15 15:46:35 +0200 |
---|---|---|
committer | Brian Paul <[email protected]> | 2017-08-16 18:32:47 -0600 |
commit | 7fb7287ce72066db7dffd918226bf15c3131a871 (patch) | |
tree | 8f96b7dda5fb934862538f4405d75b56b347b512 | |
parent | d90e05ad487e9fe7e17c293814ac8549d9d686d8 (diff) |
gallium/os: fix os_time_get_nano() to roll over less
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102241
Cc: [email protected]
Reviewed-by: Brian Paul <[email protected]>
Reviewed-by: Jose Fonseca <[email protected]>
-rw-r--r-- | src/gallium/auxiliary/os/os_time.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/os/os_time.c b/src/gallium/auxiliary/os/os_time.c index e169139034c..e4a1cae641a 100644 --- a/src/gallium/auxiliary/os/os_time.c +++ b/src/gallium/auxiliary/os/os_time.c @@ -69,10 +69,17 @@ os_time_get_nano(void) static LARGE_INTEGER frequency; LARGE_INTEGER counter; + int64_t secs, nanosecs; if(!frequency.QuadPart) QueryPerformanceFrequency(&frequency); QueryPerformanceCounter(&counter); - return counter.QuadPart*INT64_C(1000000000)/frequency.QuadPart; + /* Compute seconds and nanoseconds parts separately to + * reduce severity of precision loss. + */ + secs = counter.QuadPart / frequency.QuadPart; + nanosecs = (counter.QuadPart % frequency.QuadPart) * INT64_C(1000000000) + / frequency.QuadPart; + return secs*INT64_C(1000000000) + nanosecs; #else |