blob: 25a996d115423a64d41043706958a5c618ad6080 [file]
#pragma once
// Emscripten/WASM compatibility shim for microprofile.
// microprofile.h only defines MP_TICK, MP_BREAK, etc. for __APPLE__, _WIN32,
// and __linux__. Emscripten supports the same POSIX APIs as Linux so we
// replicate the Linux platform block here and include this header before
// microprofile.h.
#if defined(__EMSCRIPTEN__) && !defined(MP_TICK)
#include <stdint.h>
#include <strings.h>
#include <time.h>
#include <unistd.h>
inline int64_t MicroProfileTicksPerSecondCpu() { return 1000000000ll; }
inline int64_t MicroProfileGetTick()
{
// Use a MONOTONIC clock, not CLOCK_REALTIME. MicroProfile treats ticks as a
// monotonic relative counter (native builds use rdtsc / mach_absolute_time)
// and derives frame durations from tick deltas. CLOCK_REALTIME is the
// absolute wall clock (emscripten maps it to Date.now()): it can jump
// (NTP, sleep/wake, background-tab throttling pausing the render loop) and
// its epoch-scale magnitude turns any stale frame-start slot into an
// astronomically large duration. CLOCK_MONOTONIC maps to performance.now(),
// which is monotonic, high-resolution under cross-origin isolation, and
// relative to page load.
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return 1000000000ll * ts.tv_sec + ts.tv_nsec;
}
#define MP_TICK() MicroProfileGetTick()
#define MP_BREAK() __builtin_trap()
#define MP_THREAD_LOCAL __thread
#define MP_STRCASECMP strcasecmp
#define MP_GETCURRENTTHREADID() (uint64_t)pthread_self()
typedef uint64_t MicroProfileThreadIdType;
#endif // __EMSCRIPTEN__ && !MP_TICK