Added initial support for CLOCK_MONOTONIC.

master
Camilla Berglund ago%!(EXTRA string=14 years)
parent df75a2dc2f
commit eede75fe5e
  1. 1
      readme.html
  2. 3
      src/x11_init.c
  3. 5
      src/x11_platform.h
  4. 72
      src/x11_time.c

@ -309,6 +309,7 @@ version of GLFW.</p>
<li>[Cocoa] Bugfix: The loop condition for saving video modes used the wrong index variable</li>
<li>[Cocoa] Bugfix: The OpenGL framework was not retrieved, making glfwGetProcAddress crash</li>
<li>[X11] Added support for the <code>GLX_EXT_swap_control</code> extension as an alternative to <code>GLX_SGI_swap_control</code></li>
<li>[X11] Added the POSIX <code>CLOCK_MONOTONIC</code> time source as the preferred method</li>
<li>[X11] Bugfix: Calling <code>glXCreateContextAttribsARB</code> with an unavailable OpenGL version caused the application to terminate with a <code>BadMatch</code> Xlib error</li>
<li>[Win32] Removed explicit support for versions of Windows older than Windows XP</li>
<li>[Win32] Bugfix: Window activation and iconification did not work as expected</li>

@ -639,6 +639,9 @@ const char* _glfwPlatformGetVersionString(void)
#else
" no-extension-support"
#endif
#if defined(_POSIX_TIMERS) && defined(_POSIX_MONOTONIC_CLOCK)
" clock_gettime"
#endif
#if defined(_GLFW_USE_LINUX_JOYSTICKS)
" Linux-joystick-API"
#else

@ -31,9 +31,9 @@
#ifndef _platform_h_
#define _platform_h_
#include <sys/time.h>
#include <unistd.h>
#include <signal.h>
#include <stdint.h>
#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <X11/Xatom.h>
@ -220,8 +220,9 @@ typedef struct _GLFWlibraryX11
// Timer data
struct {
GLboolean monotonic;
double resolution;
long long t0;
uint64_t t0;
} timer;
#if defined(_GLFW_DLOPEN_LIBGL)

@ -30,22 +30,55 @@
#include "internal.h"
#include <time.h>
//========================================================================
// Initialise timer
// Return raw time
//========================================================================
void _glfwInitTimer(void)
static uint64_t getRawTime(void)
{
struct timeval tv;
#if defined(_POSIX_TIMERS) && defined(_POSIX_MONOTONIC_CLOCK)
if (_glfwLibrary.X11.timer.monotonic)
{
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return (uint64_t) ts.tv_sec * (uint64_t) 1000000000 + (uint64_t) ts.tv_nsec;
}
else
#endif
{
struct timeval tv;
gettimeofday(&tv, NULL);
return (uint64_t) tv.tv_sec * (uint64_t) 1000000 + (uint64_t) tv.tv_usec;
}
}
// "Resolution" is 1 us
_glfwLibrary.X11.timer.resolution = 1e-6;
// Set start-time for timer
gettimeofday(&tv, NULL);
_glfwLibrary.X11.timer.t0 = (long long) tv.tv_sec * (long long) 1000000 +
(long long) tv.tv_usec;
//========================================================================
// Initialise timer
//========================================================================
void _glfwInitTimer(void)
{
#if defined(_POSIX_TIMERS) && defined(_POSIX_MONOTONIC_CLOCK)
struct timespec ts;
if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0)
{
_glfwLibrary.X11.timer.monotonic = GL_TRUE;
_glfwLibrary.X11.timer.resolution = 1e-9;
}
else
#endif
{
_glfwLibrary.X11.timer.resolution = 1e-6;
}
_glfwLibrary.X11.timer.t0 = getRawTime();
}
@ -59,14 +92,8 @@ void _glfwInitTimer(void)
double _glfwPlatformGetTime(void)
{
long long t;
struct timeval tv;
gettimeofday(&tv, NULL);
t = (long long) tv.tv_sec * (long long) 1000000 +
(long long) tv.tv_usec;
return (double)(t - _glfwLibrary.X11.timer.t0) * _glfwLibrary.X11.timer.resolution;
return (double) (getRawTime() - _glfwLibrary.X11.timer.t0) *
_glfwLibrary.X11.timer.resolution;
}
@ -76,14 +103,7 @@ double _glfwPlatformGetTime(void)
void _glfwPlatformSetTime(double t)
{
long long t0;
struct timeval tv;
gettimeofday(&tv, NULL);
t0 = (long long) tv.tv_sec * (long long) 1000000 +
(long long) tv.tv_usec;
// Calulate new starting time
_glfwLibrary.X11.timer.t0 = t0 - (long long)(t / _glfwLibrary.X11.timer.resolution);
_glfwLibrary.X11.timer.t0 = getRawTime() -
(uint64_t) (t / _glfwLibrary.X11.timer.resolution);
}

Loading…
Cancel
Save