diff --git a/app/internal/window/egl.go b/app/internal/window/egl.go index c1a4f40f..858ed153 100644 --- a/app/internal/window/egl.go +++ b/app/internal/window/egl.go @@ -28,6 +28,7 @@ type eglDriver interface { eglDisplay() _EGLNativeDisplayType eglWindow(visID int) (_EGLNativeWindowType, int, int, error) eglDestroy() + needVSync() bool } type eglContext struct { @@ -156,6 +157,14 @@ func (c *context) MakeCurrent() error { c.eglWin = nilEGLNativeWindowType return err } + // eglSwapInterval 1 leads to erratic frame rates and unnecessary blocking. + // We rely on platform specific frame rate limiting instead, except on Windows + // and X11 where eglSwapInterval is all there is. + if c.driver.needVSync() { + eglSwapInterval(c.eglCtx.disp, 1) + } else { + eglSwapInterval(c.eglCtx.disp, 0) + } if c.eglCtx.srgb { return nil } @@ -269,13 +278,5 @@ func createSurfaceAndMakeCurrent(eglCtx *eglContext, win _EGLNativeWindowType) ( eglDestroySurface(eglCtx.disp, eglSurf) return nilEGLSurface, fmt.Errorf("eglMakeCurrent error 0x%x", eglGetError()) } - // eglSwapInterval 1 leads to erratic frame rates and unnecessary blocking. - // We rely on platform specific frame rate limiting instead, except on Windows - // where eglSwapInterval is all there is. - if runtime.GOOS != "windows" { - eglSwapInterval(eglCtx.disp, 0) - } else { - eglSwapInterval(eglCtx.disp, 1) - } return eglSurf, nil } diff --git a/app/internal/window/egl_android.go b/app/internal/window/egl_android.go index afaa83ee..145567ce 100644 --- a/app/internal/window/egl_android.go +++ b/app/internal/window/egl_android.go @@ -18,3 +18,5 @@ func (w *window) eglWindow(visID int) (_EGLNativeWindowType, int, int, error) { win, width, height := w.nativeWindow(visID) return _EGLNativeWindowType(win), width, height, nil } + +func (w *window) needVSync() bool { return false } diff --git a/app/internal/window/egl_wayland.go b/app/internal/window/egl_wayland.go index dbf5ce3b..bebb1bb0 100644 --- a/app/internal/window/egl_wayland.go +++ b/app/internal/window/egl_wayland.go @@ -62,3 +62,5 @@ func (w *window) eglWindow(visID int) (_EGLNativeWindowType, int, int, error) { C.wl_egl_window_resize(eglWin, C.int(width), C.int(height), 0, 0) return _EGLNativeWindowType(uintptr(unsafe.Pointer(eglWin))), width, height, nil } + +func (w *window) needVSync() bool { return false } diff --git a/app/internal/window/egl_windows.go b/app/internal/window/egl_windows.go index 0e61c42b..0d52200e 100644 --- a/app/internal/window/egl_windows.go +++ b/app/internal/window/egl_windows.go @@ -158,3 +158,5 @@ func (w *window) eglWindow(visID int) (_EGLNativeWindowType, int, int, error) { func (w *window) NewContext() (gl.Context, error) { return newContext(w) } + +func (w *window) needVSync() bool { return true }