From 7788bac40c9a422a1081913f83b9b0328eca121c Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Sat, 20 Nov 2010 03:24:51 +0000 Subject: [PATCH] Fix ogl screenshots for windows. Fix the macosx build (perhaps). This changes the JitIL timed profiling to using assembly language to obtain the time. It does seem to be faster. Not sure if it will work on macosx, but if it does it has the necessary precision that gettimeofday does not have. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6448 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/Common/Src/Thread.cpp | 9 +++++++-- Source/Core/Common/Src/Thread.h | 7 ++++++- Source/Core/Common/Src/Timer.cpp | 19 +++++++++++++++++++ .../Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp | 12 +++++++----- Source/Plugins/Plugin_VideoOGL/Src/main.cpp | 4 ++++ 5 files changed, 43 insertions(+), 8 deletions(-) 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))