From 38ff78df5dbeb8fcb13fa743a891237afd9ff573 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Tue, 12 Apr 2022 18:19:16 +0200 Subject: [PATCH] app: don't delay FrameEvent.Frame by v-sync latency We should return as soon as possible from FrameEvent.Frame to allow the main goroutine to continue processing other tasks. Whereas GPU.Frame may touch the frame ops, GPU.Present will not, so this change moves Present to after returning from FrameEvent.Frame. Signed-off-by: Elias Naur --- app/window.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/window.go b/app/window.go index f71375f0..28de519b 100644 --- a/app/window.go +++ b/app/window.go @@ -248,10 +248,7 @@ func (w *Window) render(frame *op.Ops, viewport image.Point) error { if err != nil { return err } - if err := w.gpu.Frame(frame, target, viewport); err != nil { - return err - } - return w.ctx.Present() + return w.gpu.Frame(frame, target, viewport) } func (w *Window) processFrame(d driver, frameStart time.Time) { @@ -808,6 +805,9 @@ func (w *Window) processEvent(d driver, e event.Event) { // We're done with frame, let the client continue. w.frameAck <- struct{}{} } + if err == nil && w.gpu != nil { + err = w.ctx.Present() + } if err != nil { w.destroyGPU() w.out <- system.DestroyEvent{Err: err}