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 bff48c8254
commit 0e63ab5d78

View File

@ -17,11 +17,24 @@
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 (
"github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver/metal/mtl"
"github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver/metal/ns"
)
var macOSMajorVersion = int(C.getMacOSMajorVersion())
func (v *view) setWindow(window uintptr) {
// NSView can be updated e.g., fullscreen-state is switched.
v.window = window
@ -44,6 +57,12 @@ func (v *view) update() {
}
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).
return !v.vsyncDisabled
}