From 93ed9b2f3b12b8b8d1483c5d8265edbd3e1332b4 Mon Sep 17 00:00:00 2001 From: sergystepanov Date: Mon, 6 Jul 2026 17:27:08 +0300 Subject: [PATCH] Add RETRO_ENVIRONMENT_SET_FRAME_TIME_CALLBACK --- pkg/worker/caged/libretro/frontend.go | 2 ++ pkg/worker/caged/libretro/nanoarch/nanoarch.go | 11 +++++++++++ pkg/worker/caged/libretro/nanoarch/nanoarch.h | 5 +++++ 3 files changed, 18 insertions(+) diff --git a/pkg/worker/caged/libretro/frontend.go b/pkg/worker/caged/libretro/frontend.go index 6974d590..945a9a29 100644 --- a/pkg/worker/caged/libretro/frontend.go +++ b/pkg/worker/caged/libretro/frontend.go @@ -337,6 +337,8 @@ func (f *Frontend) Start() { case <-f.done: return default: + f.nano.NotifyFrameTime(targetFrameTimeNs / 1000) + f.Tick() now := os.Nanotime() diff --git a/pkg/worker/caged/libretro/nanoarch/nanoarch.go b/pkg/worker/caged/libretro/nanoarch/nanoarch.go index 1319cbd6..9ec2cbdc 100644 --- a/pkg/worker/caged/libretro/nanoarch/nanoarch.go +++ b/pkg/worker/caged/libretro/nanoarch/nanoarch.go @@ -40,6 +40,7 @@ type Nanoarch struct { retropad InputState keyboardCb *C.struct_retro_keyboard_callback + frameTimeCb *C.struct_retro_frame_time_callback LastFrameTime time.Time LibCo bool meta Metadata @@ -427,6 +428,12 @@ func (n *Nanoarch) Run() { } } +func (n *Nanoarch) NotifyFrameTime(usec int64) { + if n.frameTimeCb != nil { + C.call_frame_time_cb(n.frameTimeCb, C.retro_usec_t(usec)) + } +} + func (n *Nanoarch) IsSupported() error { return graphics.RGFWTryInit() } func (n *Nanoarch) IsGL() bool { return n.Video.gl.enabled } func (n *Nanoarch) IsStopped() bool { return n.Stopped.Load() } @@ -876,6 +883,10 @@ func coreEnvironment(cmd C.unsigned, data unsafe.Pointer) C.bool { latency := *(*C.unsigned)(data) Nan0.log.Info().Uint("latency_ms", uint(latency)).Msg("audio latency requested") return true + case C.RETRO_ENVIRONMENT_SET_FRAME_TIME_CALLBACK: + Nan0.frameTimeCb = (*C.struct_retro_frame_time_callback)(data) + Nan0.log.Info().Msg("Frame time callback registered") + return true } return false } diff --git a/pkg/worker/caged/libretro/nanoarch/nanoarch.h b/pkg/worker/caged/libretro/nanoarch/nanoarch.h index 2479d0cf..66a6a879 100644 --- a/pkg/worker/caged/libretro/nanoarch/nanoarch.h +++ b/pkg/worker/caged/libretro/nanoarch/nanoarch.h @@ -41,4 +41,9 @@ static inline void call_audio_buffer_status( if (cb && cb->callback) cb->callback(active, occupancy, underrun); } +static inline void call_frame_time_cb( + struct retro_frame_time_callback *cb, retro_usec_t usec) { + if (cb && cb->callback) cb->callback(usec); +} + #endif