diff --git a/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.h b/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.h index bd6686139..f775ef8bd 100644 --- a/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.h +++ b/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.h @@ -40,6 +40,7 @@ class OGLVideoOutput; InputManager *inputManager; CocoaDSDisplayVideo *cdsVideoOutput; CALayer *localLayer; + NSOpenGLContext *localOGLContext; } @property (retain) InputManager *inputManager; diff --git a/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.mm b/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.mm index 06181fcaa..4db01c1ae 100644 --- a/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.mm +++ b/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.mm @@ -27,7 +27,11 @@ #import "cocoa_util.h" #include "MacOGLDisplayView.h" - +/* +#if defined(MAC_OS_X_VERSION_10_11) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_11) +#include "MacMetalDisplayView.h" +#endif +*/ #include #if defined(__ppc__) || defined(__ppc64__) @@ -1599,26 +1603,46 @@ static std::unordered_map _screenMap; // return self; } -#if defined(MAC_OS_X_VERSION_10_7) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7) - if ([self respondsToSelector:@selector(setWantsBestResolutionOpenGLSurface:)]) - { - [self setWantsBestResolutionOpenGLSurface:YES]; - } -#endif - inputManager = nil; cdsVideoOutput = nil; - localLayer = [[DisplayViewOpenGLLayer alloc] init]; +/*#if defined(MAC_OS_X_VERSION_10_11) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_11) + if (IsOSXVersionSupported(10, 11, 0)) + { + localLayer = [[DisplayViewMetalLayer alloc] init]; + } + else +#endif*/ + { + localLayer = [[DisplayViewOpenGLLayer alloc] init]; + MacOGLDisplayView *macOGLCDV = (MacOGLDisplayView *)[(id)localLayer clientDisplay3DView]; + + if (IsOSXVersionSupported(10, 8, 0)) + { + localOGLContext = nil; + macOGLCDV->SetRenderToCALayer(true); + + [self setLayer:localLayer]; + [self setWantsLayer:YES]; + +#if defined(MAC_OS_X_VERSION_10_6) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6) + if ([self respondsToSelector:@selector(setLayerContentsRedrawPolicy:)]) + { + [self setLayerContentsRedrawPolicy:NSViewLayerContentsRedrawNever]; + } +#endif + } + else + { + localOGLContext = [[NSOpenGLContext alloc] initWithCGLContextObj:macOGLCDV->GetContext()]; + macOGLCDV->SetRenderToCALayer(false); + } + } ClientDisplay3DView *cdv = [(id)localLayer clientDisplay3DView]; NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"SourceSansPro-Bold" ofType:@"otf"]; cdv->SetHUDFontUsingPath([fontPath cStringUsingEncoding:NSUTF8StringEncoding]); - [self setLayer:localLayer]; - [self setWantsLayer:YES]; - [self setLayerContentsRedrawPolicy:NSViewLayerContentsRedrawNever]; - return self; } @@ -1628,6 +1652,12 @@ static std::unordered_map _screenMap; // [self setCdsVideoOutput:nil]; [self setLayer:nil]; + if (localOGLContext != nil) + { + [localOGLContext clearDrawable]; + [localOGLContext release]; + } + [localLayer release]; [super dealloc]; @@ -1876,6 +1906,16 @@ static std::unordered_map _screenMap; // #pragma mark NSView Methods +- (void)lockFocus +{ + [super lockFocus]; + + if ( (localOGLContext != nil) && ([localOGLContext view] != self) ) + { + [localOGLContext setView:self]; + } +} + - (BOOL)isOpaque { return YES; @@ -1886,6 +1926,7 @@ static std::unordered_map _screenMap; // return NO; } +#if defined(MAC_OS_X_VERSION_10_8) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8) - (BOOL)wantsUpdateLayer { return YES; @@ -1896,6 +1937,7 @@ static std::unordered_map _screenMap; // ClientDisplay3DView *cdv = [(id)localLayer clientDisplay3DView]; cdv->UpdateView(); } +#endif - (void)drawRect:(NSRect)dirtyRect { @@ -1910,16 +1952,22 @@ static std::unordered_map _screenMap; // if (rect.size.width != oldFrame.size.width || rect.size.height != oldFrame.size.height) { + if (localOGLContext != nil) + { + [localOGLContext update]; + } + DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; + ClientDisplayViewProperties &props = [windowController localViewProperties]; + NSRect newViewportRect = rect; #if defined(MAC_OS_X_VERSION_10_7) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7) - const NSRect newViewportRect = [self convertRectToBacking:rect]; -#else - const NSRect newViewportRect = rect; + if ([self respondsToSelector:@selector(convertRectToBacking:)]) + { + newViewportRect = [self convertRectToBacking:rect]; + } #endif - ClientDisplayViewProperties &props = [windowController localViewProperties]; - // Calculate the view scale for the given client size. double checkWidth = props.normalWidth; double checkHeight = props.normalHeight; diff --git a/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.h b/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.h index b495fbb85..074bbbb6a 100644 --- a/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.h +++ b/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.h @@ -44,6 +44,7 @@ class MacOGLDisplayView : public OGLVideoOutput, public DisplayViewCALayerInterf protected: CGLPixelFormatObj _pixelFormat; CGLContextObj _context; + bool _willRenderToCALayer; void _FrameRenderAndFlush(); @@ -55,6 +56,9 @@ public: CGLPixelFormatObj GetPixelFormat() const; CGLContextObj GetContext() const; + + bool GetRenderToCALayer() const; + void SetRenderToCALayer(const bool renderToLayer); virtual void SetHUDFontUsingPath(const char *filePath); diff --git a/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.mm b/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.mm index 2981aeaf2..751e014ae 100644 --- a/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.mm +++ b/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.mm @@ -152,6 +152,8 @@ MacOGLDisplayView::MacOGLDisplayView() } CGLSetCurrentContext(prevContext); + + _willRenderToCALayer = false; } void MacOGLDisplayView::Init() @@ -164,7 +166,15 @@ void MacOGLDisplayView::Init() void MacOGLDisplayView::_FrameRenderAndFlush() { - this->CALayerDisplay(); + if (this->_willRenderToCALayer) + { + this->CALayerDisplay(); + } + else + { + this->FrameRender(); + CGLFlushDrawable(this->_context); + } } CGLPixelFormatObj MacOGLDisplayView::GetPixelFormat() const @@ -177,6 +187,16 @@ CGLContextObj MacOGLDisplayView::GetContext() const return this->_context; } +bool MacOGLDisplayView::GetRenderToCALayer() const +{ + return this->_willRenderToCALayer; +} + +void MacOGLDisplayView::SetRenderToCALayer(const bool renderToLayer) +{ + this->_willRenderToCALayer = renderToLayer; +} + void MacOGLDisplayView::SetHUDFontUsingPath(const char *filePath) { CGLLockContext(this->_context); diff --git a/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.mm b/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.mm index 0893c320f..03442e728 100644 --- a/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.mm +++ b/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.mm @@ -1,6 +1,6 @@ /* Copyright (C) 2011 Roger Manuel - Copyright (C) 2012-2015 DeSmuME Team + Copyright (C) 2012-2017 DeSmuME Team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -98,10 +98,12 @@ CGLContextObj prevContext = CGLGetCurrentContext(); CGLSetCurrentContext(cglDisplayContext); + NSRect newViewportRect = frameRect; #if defined(MAC_OS_X_VERSION_10_7) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7) - const NSRect newViewportRect = [self convertRectToBacking:frameRect]; -#else - const NSRect newViewportRect = frameRect; + if ([self respondsToSelector:@selector(convertRectToBacking:)]) + { + newViewportRect = [self convertRectToBacking:frameRect]; + } #endif OGLContextInfo *contextInfo = NULL;