diff --git a/Source/Core/Common/Src/Thread.cpp b/Source/Core/Common/Src/Thread.cpp index 2788a4583e..aeee52ca22 100644 --- a/Source/Core/Common/Src/Thread.cpp +++ b/Source/Core/Common/Src/Thread.cpp @@ -492,11 +492,16 @@ namespace Common if (timeout != INFINITE) { + memset(&wait, 0, sizeof(wait)); +#ifdef USE_GETTIMEOFDAY + struct timeval now; + gettimeofday(&now, NULL); + wait.tv_nsec = (now.tv_usec + (timeout % 1000)) * 1000; +#else struct timespec now; clock_gettime(CLOCK_MONOTONIC_RAW, &now); - - memset(&wait, 0, sizeof(wait)); wait.tv_nsec = now.tv_nsec + (timeout % 1000) * 1000000; +#endif wait.tv_sec = now.tv_sec + (timeout / 1000); } diff --git a/Source/Core/Common/Src/Thread.h b/Source/Core/Common/Src/Thread.h index 6f179e795e..04e6214b46 100644 --- a/Source/Core/Common/Src/Thread.h +++ b/Source/Core/Common/Src/Thread.h @@ -60,8 +60,13 @@ #define INFINITE 0xffffffff #endif -//for clock_gettime and struct timespec +//for (clock_gettime|gettimeofday) and struct time(spec|val) +#include #include +#if !defined(_POSIX_TIMERS) || _POSIX_TIMERS == 0 +#define USE_GETTIMEOFDAY +#include +#endif #endif diff --git a/Source/Core/Common/Src/Timer.cpp b/Source/Core/Common/Src/Timer.cpp index d4d9897006..6583202f99 100644 --- a/Source/Core/Common/Src/Timer.cpp +++ b/Source/Core/Common/Src/Timer.cpp @@ -21,6 +21,12 @@ #include #include #include +#else +#include +#if !defined(_POSIX_TIMERS) || _POSIX_TIMERS == 0 +#define USE_GETTIMEOFDAY +#include +#endif #endif #include "Common.h" @@ -34,6 +40,10 @@ u32 Timer::GetTimeMs() { #ifdef _WIN32 return timeGetTime(); +#elif defined USE_GETTIMEOFDAY + struct timeval t; + (void)gettimeofday(&t, NULL); + return ((u32)(t.tv_sec * 1000 + t.tv_usec / 1000)); #else struct timespec t; (void)clock_gettime(CLOCK_MONOTONIC_RAW, &t); @@ -203,6 +213,10 @@ std::string Timer::GetTimeFormatted() struct timeb tp; (void)::ftime(&tp); sprintf(formattedTime, "%s:%03i", tmp, tp.millitm); +#elif defined USE_GETTIMEOFDAY + struct timeval t; + (void)gettimeofday(&t, NULL); + sprintf(formattedTime, "%s:%03d", tmp, (int)(t.tv_usec / 1000)); #else struct timespec t; (void)clock_gettime(CLOCK_REALTIME, &t); @@ -219,6 +233,9 @@ double Timer::GetDoubleTime() #ifdef _WIN32 struct timeb tp; (void)::ftime(&tp); +#elif defined USE_GETTIMEOFDAY + struct timeval t; + (void)gettimeofday(&t, NULL); #else struct timespec t; (void)clock_gettime(CLOCK_REALTIME, &t); @@ -236,6 +253,8 @@ double Timer::GetDoubleTime() u32 Seconds = (u32)TmpSeconds; #ifdef _WIN32 double ms = tp.millitm / 1000.0 / 1000.0; +#elif defined USE_GETTIMEOFDAY + double ms = t.tv_usec / 1000000.0; #else double ms = t.tv_nsec / 1000000000.0; #endif diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp index 8079a00164..ee0b7d1f89 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp @@ -162,12 +162,14 @@ ps_adds1 #include #else #include -static inline u64 __rdtsc() +#include +static inline uint64_t __rdtsc() { - struct timespec ts; - clock_gettime(CLOCK_MONOTONIC_RAW, &ts); - - return (ts.tv_sec * 100000000 + ts.tv_nsec); + uint32_t lo, hi; + __asm__ __volatile__ ("xorl %%eax,%%eax \n cpuid" + ::: "%rax", "%rbx", "%rcx", "%rdx"); + __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); + return (uint64_t)hi << 32 | lo; } #endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp index e72a11b2cb..9e6176d1fd 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp @@ -196,6 +196,10 @@ void Initialize(void *init) g_Config.GameIniLoad(globals->game_ini); g_Config.UpdateProjectionHack(); +#if defined _WIN32 + // Enable support for PNG screenshots. + wxImage::AddHandler( new wxPNGHandler ); +#endif UpdateActiveConfig(); if (!OpenGL_Create(g_VideoInitialize, 640, 480))