internal/graphicsdriver/metal: Bug fix: Vsync didn't work on macOS

This fix works only for Metal. There is not a good solution for
OpenGL so far unfortunately.

Closes #1885
This commit is contained in:
Hajime Hoshi 2021-11-27 02:52:45 +09:00
parent b7cd990bc3
commit 1dd13ae06e

View File

@ -17,11 +17,24 @@
package metal package metal
// #cgo CFLAGS: -x objective-c
// #cgo LDFLAGS: -framework Foundation
//
// #import <Foundation/Foundation.h>
//
// static int getMacOSMajorVersion() {
// NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion];
// return (int)version.majorVersion;
// }
import "C"
import ( import (
"github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver/metal/mtl" "github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver/metal/mtl"
"github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver/metal/ns" "github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver/metal/ns"
) )
var macOSMajorVersion = int(C.getMacOSMajorVersion())
func (v *view) setWindow(window uintptr) { func (v *view) setWindow(window uintptr) {
// NSView can be updated e.g., fullscreen-state is switched. // NSView can be updated e.g., fullscreen-state is switched.
v.window = window v.window = window
@ -44,6 +57,12 @@ func (v *view) update() {
} }
func (v *view) usePresentsWithTransaction() bool { func (v *view) usePresentsWithTransaction() bool {
// On macOS 12 (or later), do not use presentsWithTransaction, or vsync doesn't work (#1885).
// This works only for Metal. Unfortunately, there is not a good solution for OpenGL.
if macOSMajorVersion >= 12 {
return false
}
// Disable presentsWithTransaction on the fullscreen mode (#1745). // Disable presentsWithTransaction on the fullscreen mode (#1745).
return !v.vsyncDisabled return !v.vsyncDisabled
} }