From 38d614d8d668f1255f092f825ac4223f774f5991 Mon Sep 17 00:00:00 2001 From: Akemi Date: Sun, 25 Feb 2018 14:35:13 +0100 Subject: cocoa-cb: fix stretched gl surface on window aspect ratio change when resizing async it's possible that the layer, and the underlying gl surface, is stretched on an aspect ratio change. to prevent that we do an atomic resize (resize and draw at the same time). usually max one unique frame should be dropped but it's possible, depending on the performance, that more are dropped. --- video/out/cocoa-cb/window.swift | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'video/out/cocoa-cb/window.swift') diff --git a/video/out/cocoa-cb/window.swift b/video/out/cocoa-cb/window.swift index bd94330dcb..f720205e5c 100644 --- a/video/out/cocoa-cb/window.swift +++ b/video/out/cocoa-cb/window.swift @@ -376,7 +376,22 @@ class Window: NSWindow, NSWindowDelegate { override func setFrame(_ frameRect: NSRect, display flag: Bool) { let newFrame = !isAnimating && isInFullscreen ? targetScreen!.frame : frameRect + let aspectRatioDiff = fabs( (newFrame.width/newFrame.height) - + (frame.width/frame.height) ) + + let isNotUserLiveResize = isAnimating || !(!isAnimating && inLiveResize) + if aspectRatioDiff > 0.005 && isNotUserLiveResize { + cocoaCB.layer.drawLock.lock() + cocoaCB.layer.atomicDrawingStart() + } + super.setFrame(newFrame, display: flag) + cocoaCB.layer.neededFlips += 1 + + if aspectRatioDiff > 0.005 && isNotUserLiveResize { + Swift.print("drawUnLock") + cocoaCB.layer.drawLock.unlock() + } if keepAspect { contentAspectRatio = unfsContentFrame!.size -- cgit v1.2.3