From cc1accc32a347b4131e01bfefeffd3e96a150390 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Fri, 6 Aug 2021 03:08:01 +0900 Subject: [PATCH] internal/uidriver/glfw: Bug fix: Disable vsync when resizing the window Closes #1740 --- internal/graphicsdriver/metal/view.go | 9 ++++++++- internal/uidriver/glfw/ui.go | 8 +++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/internal/graphicsdriver/metal/view.go b/internal/graphicsdriver/metal/view.go index 381fc2323..10a12a3c2 100644 --- a/internal/graphicsdriver/metal/view.go +++ b/internal/graphicsdriver/metal/view.go @@ -30,6 +30,7 @@ type view struct { windowChanged bool vsync bool + vsyncInited bool device mtl.Device ml ca.MetalLayer @@ -46,8 +47,12 @@ func (v *view) getMTLDevice() mtl.Device { } func (v *view) setDisplaySyncEnabled(enabled bool) { + if v.vsync == enabled && !v.vsyncInited { + return + } v.ml.SetDisplaySyncEnabled(enabled) v.vsync = enabled + v.vsyncInited = true } func (v *view) colorPixelFormat() mtl.PixelFormat { @@ -75,7 +80,9 @@ func (v *view) reset() error { v.ml.SetMaximumDrawableCount(2) // The vsync state might be reset. Set the state again (#1364). - v.ml.SetDisplaySyncEnabled(v.vsync) + if v.vsyncInited { + v.ml.SetDisplaySyncEnabled(v.vsync) + } v.ml.SetFramebufferOnly(true) return nil diff --git a/internal/uidriver/glfw/ui.go b/internal/uidriver/glfw/ui.go index f4cfe249b..edfef9cc2 100644 --- a/internal/uidriver/glfw/ui.go +++ b/internal/uidriver/glfw/ui.go @@ -781,6 +781,9 @@ func (u *UserInterface) registerWindowSetSizeCallback() { } if err := u.runOnAnotherThreadFromMainThread(func() error { + // Disable Vsync temporarily. On macOS, getting a next frame can get stuck (#1740). + u.Graphics().SetVsyncEnabled(false) + var outsideWidth, outsideHeight float64 var outsideSizeChanged bool @@ -967,10 +970,13 @@ func (u *UserInterface) update() (float64, float64, bool, error) { // Calling this inside setWindowSize didn't work (#1363). if !u.fpsModeInited { u.fpsMode = u.getInitFPSMode() - u.updateVsync() u.fpsModeInited = true } + // Call updateVsync even though fpsMode is not updated. + // The vsync state might be changed in other places (e.g., the SetSizeCallback). + u.updateVsync() + outsideWidth, outsideHeight, outsideSizeChanged := u.updateSize() if u.fpsMode != driver.FPSModeVsyncOffMinimum {