X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FPlatform%2FPlatformUnix.cpp;fp=Source%2FPlatform%2FPlatformUnix.cpp;h=6ed11bf7e6ecbf0cd9e7051e3eb6cd07a36da6d1;hb=72217fbefd03881048287da8345925e1b89b5b9b;hp=0000000000000000000000000000000000000000;hpb=a15391fb6e514e033a50c714ef32968d21419f19;p=lugaru.git diff --git a/Source/Platform/PlatformUnix.cpp b/Source/Platform/PlatformUnix.cpp new file mode 100644 index 0000000..6ed11bf --- /dev/null +++ b/Source/Platform/PlatformUnix.cpp @@ -0,0 +1,116 @@ +/* +Copyright (C) 2003, 2010 - Wolfire Games +Copyright (C) 2010-2016 - Lugaru contributors (see AUTHORS file) + +This file is part of Lugaru. + +Lugaru is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +Lugaru is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Lugaru. If not, see . +*/ + +#ifdef PLATFORM_UNIX + +#include "Platform/Platform.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef long long __int64; +typedef __int64 LARGE_INTEGER; +static int QueryPerformanceFrequency(LARGE_INTEGER* liptr) +{ + assert(sizeof(__int64) == 8); + assert(sizeof(LARGE_INTEGER) == 8); + *liptr = 1000; + return (1); +} + +static int QueryPerformanceCounter(LARGE_INTEGER* liptr) +{ + struct timeval tv; + gettimeofday(&tv, NULL); + *liptr = ((((LARGE_INTEGER)tv.tv_sec) * 1000) + + (((LARGE_INTEGER)tv.tv_usec) / 1000)); + return (1); +} + +class AppTime +{ + public: + AppTime() + { + counterRate = 1; + baseCounter = 0; + QueryPerformanceFrequency((LARGE_INTEGER*)&counterRate); + QueryPerformanceCounter((LARGE_INTEGER*)&baseCounter); + } + __int64 counterRate; // LARGE_INTEGER type has no math functions so use int64 + __int64 baseCounter; +}; +static AppTime g_appTime; + +AbsoluteTime UpTime() +{ + __int64 counter; + QueryPerformanceCounter((LARGE_INTEGER*)&counter); + + counter -= g_appTime.baseCounter; + + AbsoluteTime time; + time.lo = (unsigned long)counter; + time.hi = (unsigned long)(counter >> 32); + return time; +} + +Duration AbsoluteDeltaToDuration(AbsoluteTime& a, AbsoluteTime& b) +{ + __int64 value = a.hi; + value <<= 32; + value |= a.lo; + __int64 value2 = b.hi; + value2 <<= 32; + value2 |= b.lo; + value -= value2; + + if (value <= 0) { + return durationImmediate; + } + + __int64 frac = value % g_appTime.counterRate; + value /= g_appTime.counterRate; + + Duration time; + + if (value == 0) { + frac *= -1000000; + frac /= g_appTime.counterRate; + time = (Duration)frac; + } else { + frac *= 1000; + frac /= g_appTime.counterRate; + value *= 1000; + value += frac; + time = (Duration)value; + } + + return time; +} + +#endif // PLATFORM_UNIX