Adopt JBus' GetGCTicks()

This commit is contained in:
Jack Andersen 2017-01-07 17:08:02 -10:00
parent 5c0443d160
commit ef43c3319b
3 changed files with 49 additions and 5 deletions

View File

@ -30,7 +30,7 @@ struct OSCalendarTime
class CBasics class CBasics
{ {
public: public:
static void Init(); static void Initialize();
static const char* Stringize(const char* fmt, ...); static const char* Stringize(const char* fmt, ...);
static const u64 SECONDS_TO_2000; static const u64 SECONDS_TO_2000;
@ -40,6 +40,7 @@ public:
static std::chrono::system_clock::time_point FromWiiTime(OSTime wiiTime); static std::chrono::system_clock::time_point FromWiiTime(OSTime wiiTime);
static u64 GetGCTicks(); static u64 GetGCTicks();
static constexpr u64 GetGCTicksPerSec() { return 486000000ull; }
static OSCalendarTime ToCalendarTime(OSTime time) { return ToCalendarTime(FromWiiTime(time)); } static OSCalendarTime ToCalendarTime(OSTime time) { return ToCalendarTime(FromWiiTime(time)); }
static OSCalendarTime ToCalendarTime(std::chrono::system_clock::time_point time); static OSCalendarTime ToCalendarTime(std::chrono::system_clock::time_point time);

View File

@ -1,14 +1,42 @@
#ifndef _WIN32
#include <unistd.h>
#include <sys/time.h>
#if __APPLE__
#include <mach/mach_time.h>
#endif
#else
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#endif
#include <stdio.h> #include <stdio.h>
#include <stdarg.h> #include <stdarg.h>
#include <time.h> #include <time.h>
#include "CBasics.hpp" #include "CBasics.hpp"
#if __APPLE__
static u64 MachToDolphinNum;
static u64 MachToDolphinDenom;
#elif _WIN32
static LARGE_INTEGER PerfFrequency;
#endif
namespace urde namespace urde
{ {
void CBasics::Init() void CBasics::Initialize()
{ {
#if __APPLE__
mach_timebase_info_data_t timebase;
mach_timebase_info(&timebase);
MachToDolphinNum = GetGCTicksPerSec() * timebase.numer;
MachToDolphinDenom = 1000000000ull * timebase.denom;
#elif _WIN32
QueryPerformanceFrequency(&PerfFrequency);
#endif
} }
const char* CBasics::Stringize(const char* fmt, ...) const char* CBasics::Stringize(const char* fmt, ...)
@ -23,9 +51,22 @@ const char* CBasics::Stringize(const char* fmt, ...)
u64 CBasics::GetGCTicks() u64 CBasics::GetGCTicks()
{ {
auto nanos = std::chrono::duration_cast<std::chrono::nanoseconds>( #if __APPLE__
std::chrono::steady_clock::now().time_since_epoch()).count(); return mach_absolute_time() * MachToDolphinNum / MachToDolphinDenom;
return nanos * 486000000 / 1000000000; #elif __linux__ || __FreeBSD__
struct timespec tp;
clock_gettime(CLOCK_MONOTONIC, &tp);
return u64((tp.tv_sec * 1000000000ull) + tp.tv_nsec) * GetGCTicksPerSec() / 1000000000ull;
#elif _WIN32
LARGE_INTEGER perf;
QueryPerformanceCounter(&perf);
perf.QuadPart *= GetGCTicksPerSec();
perf.QuadPart /= PerfFrequency.QuadPart;
return perf.QuadPart;
#else
return 0;
#endif
} }
const u64 CBasics::SECONDS_TO_2000 = 946684800LL; const u64 CBasics::SECONDS_TO_2000 = 946684800LL;

View File

@ -9,6 +9,7 @@
#include "Graphics/Shaders/CXRayBlurFilter.hpp" #include "Graphics/Shaders/CXRayBlurFilter.hpp"
#include "Character/CCharLayoutInfo.hpp" #include "Character/CCharLayoutInfo.hpp"
#include "CGBASupport.hpp" #include "CGBASupport.hpp"
#include "CBasics.hpp"
namespace urde namespace urde
{ {
@ -114,6 +115,7 @@ void CMain::ResetGameState()
void CMain::InitializeSubsystems(const hecl::Runtime::FileStoreManager& storeMgr) void CMain::InitializeSubsystems(const hecl::Runtime::FileStoreManager& storeMgr)
{ {
CBasics::Initialize();
CModelShaders::Initialize(storeMgr, CGraphics::g_BooFactory); CModelShaders::Initialize(storeMgr, CGraphics::g_BooFactory);
CMoviePlayer::Initialize(); CMoviePlayer::Initialize();
CLineRenderer::Initialize(); CLineRenderer::Initialize();