diff --git a/src/Timer.zig b/src/Timer.zig index 04c3a0de..16d58e15 100644 --- a/src/Timer.zig +++ b/src/Timer.zig @@ -7,26 +7,35 @@ backing_timer: BackingTimerType = undefined, // TODO: verify declarations and its signatures const BackingTimerType = if (builtin.cpu.arch == .wasm32) struct { - pad0: u8 = 0, + initial: f64 = undefined, + + const js = struct { + extern fn machPerfNow() f64; + }; const WasmTimer = @This(); fn start() !WasmTimer { - return WasmTimer{}; + return WasmTimer{ .initial = js.machPerfNow() }; } - fn read(_: *WasmTimer) u64 { - return 0; + fn read(timer: *WasmTimer) u64 { + return timeToNs(js.machPerfNow() - timer.initial); } - fn reset(_: *WasmTimer) void {} - - fn lap(_: *WasmTimer) u64 { - return 0; + fn reset(timer: *WasmTimer) void { + timer.initial = js.machPerfNow(); } - fn timeToNs(_: f64) u64 { - return 0; + fn lap(timer: *WasmTimer) u64 { + const now = js.machPerfNow(); + const initial = timer.initial; + timer.initial = now; + return timeToNs(now - initial); + } + + fn timeToNs(t: f64) u64 { + return @floatToInt(u64, t) * 1000000; } } else std.time.Timer; diff --git a/src/mach.js b/src/mach.js index 14ed302f..a7bf3a04 100644 --- a/src/mach.js +++ b/src/mach.js @@ -85,6 +85,10 @@ const mach = { const cv = mach.canvases[canvas]; return cv.canvas.height; }, + + machPerfNow() { + return performance.now(); + }, }; export { mach };