Cocoa Port: Bring back NSOpenGLContext for Macs running macOS 10.7 Lion or earlier.
Also do some misc. backwards compatibility fixes.
This commit is contained in:
parent
07a68dbb7a
commit
3af5423387
|
@ -40,6 +40,7 @@ class OGLVideoOutput;
|
|||
InputManager *inputManager;
|
||||
CocoaDSDisplayVideo *cdsVideoOutput;
|
||||
CALayer *localLayer;
|
||||
NSOpenGLContext *localOGLContext;
|
||||
}
|
||||
|
||||
@property (retain) InputManager *inputManager;
|
||||
|
|
|
@ -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 <Carbon/Carbon.h>
|
||||
|
||||
#if defined(__ppc__) || defined(__ppc64__)
|
||||
|
@ -1599,26 +1603,46 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _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<DisplayViewCALayer>)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<DisplayViewCALayer>)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<NSScreen *, DisplayWindowController *> _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<NSScreen *, DisplayWindowController *> _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<NSScreen *, DisplayWindowController *> _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<NSScreen *, DisplayWindowController *> _screenMap; //
|
|||
ClientDisplay3DView *cdv = [(id<DisplayViewCALayer>)localLayer clientDisplay3DView];
|
||||
cdv->UpdateView();
|
||||
}
|
||||
#endif
|
||||
|
||||
- (void)drawRect:(NSRect)dirtyRect
|
||||
{
|
||||
|
@ -1910,16 +1952,22 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue