RDTSC-based glcycle_t for macOS

Time profiler implementation is now closer to Windows version
This commit is contained in:
alexey.lysiuk 2017-01-31 16:00:14 +02:00
parent 1cdfcb4935
commit b12c8a8f79
3 changed files with 24 additions and 17 deletions

View File

@ -40,6 +40,8 @@
#include <intrin.h> #include <intrin.h>
#define USE_WINDOWS_DWORD #define USE_WINDOWS_DWORD
#elif defined __APPLE__
#include <sys/sysctl.h>
#endif #endif
#include "i_system.h" #include "i_system.h"
@ -114,6 +116,15 @@ void gl_CalculateCPUSpeed ()
gl_SecondsPerCycle = 1.0 / CyclesPerSecond; gl_SecondsPerCycle = 1.0 / CyclesPerSecond;
gl_MillisecPerCycle = 1000.0 / CyclesPerSecond; gl_MillisecPerCycle = 1000.0 / CyclesPerSecond;
} }
#elif defined __APPLE__
long long frequency;
size_t size = sizeof frequency;
if (0 == sysctlbyname("machdep.tsc.frequency", &frequency, &size, nullptr, 0) && 0 != frequency)
{
gl_SecondsPerCycle = 1.0 / frequency;
gl_MillisecPerCycle = 1000.0 / frequency;
}
#endif #endif
} }

View File

@ -7,11 +7,11 @@
extern bool gl_benching; extern bool gl_benching;
#ifdef _MSC_VER
extern double gl_SecondsPerCycle; extern double gl_SecondsPerCycle;
extern double gl_MillisecPerCycle; extern double gl_MillisecPerCycle;
#ifdef _MSC_VER
__forceinline long long GetClockCycle () __forceinline long long GetClockCycle ()
{ {
#if _M_X64 #if _M_X64
@ -21,10 +21,14 @@ __forceinline long long GetClockCycle ()
#endif #endif
} }
#elif defined(__GNUG__) && defined(__i386__) #elif defined __APPLE__ && (defined __i386__ || defined __x86_64__)
extern double gl_SecondsPerCycle; inline long long GetClockCycle()
extern double gl_MillisecPerCycle; {
return __builtin_ia32_rdtsc();
}
#elif defined(__GNUG__) && defined(__i386__)
inline long long GetClockCycle() inline long long GetClockCycle()
{ {
@ -42,21 +46,12 @@ inline long long GetClockCycle()
#else #else
extern double gl_SecondsPerCycle;
extern double gl_MillisecPerCycle;
inline long long GetClockCycle () inline long long GetClockCycle ()
{ {
return 0; return 0;
} }
#endif #endif
#if defined (__APPLE__)
typedef cycle_t glcycle_t;
#else // !__APPLE__
class glcycle_t class glcycle_t
{ {
public: public:
@ -100,8 +95,6 @@ private:
long long Counter; long long Counter;
}; };
#endif // __APPLE__
extern glcycle_t RenderWall,SetupWall,ClipWall; extern glcycle_t RenderWall,SetupWall,ClipWall;
extern glcycle_t RenderFlat,SetupFlat; extern glcycle_t RenderFlat,SetupFlat;
extern glcycle_t RenderSprite,SetupSprite; extern glcycle_t RenderSprite,SetupSprite;
@ -122,4 +115,4 @@ void CheckBench();
void checkBenchActive(); void checkBenchActive();
#endif #endif

View File

@ -534,6 +534,9 @@ CocoaVideo::CocoaVideo()
{ {
memset(&m_modeIterator, 0, sizeof m_modeIterator); memset(&m_modeIterator, 0, sizeof m_modeIterator);
extern void gl_CalculateCPUSpeed();
gl_CalculateCPUSpeed();
// Create OpenGL pixel format // Create OpenGL pixel format
NSOpenGLPixelFormat* pixelFormat = CreatePixelFormat(OpenGLProfile::Core); NSOpenGLPixelFormat* pixelFormat = CreatePixelFormat(OpenGLProfile::Core);