diff --git a/desmume/src/frontend/cocoa/OGLDisplayOutput.cpp b/desmume/src/frontend/cocoa/OGLDisplayOutput.cpp index bfe0098d3..df3aacf7d 100644 --- a/desmume/src/frontend/cocoa/OGLDisplayOutput.cpp +++ b/desmume/src/frontend/cocoa/OGLDisplayOutput.cpp @@ -4281,11 +4281,6 @@ void GetGLVersionOGL(GLint *outMajor, GLint *outMinor, GLint *outRevision) } } -OGLInfo* OGLInfoCreate_Legacy() -{ - return new OGLInfo_Legacy; -} - void glBindVertexArray_LegacyAPPLE(GLuint vaoID) { glBindVertexArrayAPPLE(vaoID); @@ -4301,7 +4296,6 @@ void glGenVertexArrays_LegacyAPPLE(GLsizei n, GLuint *vaoIDs) glGenVertexArraysAPPLE(n, vaoIDs); } -OGLInfo* (*OGLInfoCreate_Func)() = &OGLInfoCreate_Legacy; void (*glBindVertexArrayDESMUME)(GLuint id) = &glBindVertexArray_LegacyAPPLE; void (*glDeleteVertexArraysDESMUME)(GLsizei n, const GLuint *ids) = &glDeleteVertexArrays_LegacyAPPLE; void (*glGenVertexArraysDESMUME)(GLsizei n, GLuint *ids) = &glGenVertexArrays_LegacyAPPLE; @@ -4452,7 +4446,7 @@ static void InitHQnxLUTs() #pragma mark - -OGLInfo::OGLInfo() +OGLContextInfo::OGLContextInfo() { GetGLVersionOGL(&_versionMajor, &_versionMinor, &_versionRevision); _shaderSupport = ShaderSupport_Unsupported; @@ -4464,42 +4458,42 @@ OGLInfo::OGLInfo() _isFBOSupported = false; } -ShaderSupportTier OGLInfo::GetShaderSupport() +ShaderSupportTier OGLContextInfo::GetShaderSupport() { return this->_shaderSupport; } -bool OGLInfo::IsUsingShader150() +bool OGLContextInfo::IsUsingShader150() { return this->_useShader150; } -bool OGLInfo::IsVBOSupported() +bool OGLContextInfo::IsVBOSupported() { return this->_isVBOSupported; } -bool OGLInfo::IsVAOSupported() +bool OGLContextInfo::IsVAOSupported() { return this->_isVAOSupported; } -bool OGLInfo::IsPBOSupported() +bool OGLContextInfo::IsPBOSupported() { return this->_isPBOSupported; } -bool OGLInfo::IsShaderSupported() +bool OGLContextInfo::IsShaderSupported() { return (this->_shaderSupport != ShaderSupport_Unsupported); } -bool OGLInfo::IsFBOSupported() +bool OGLContextInfo::IsFBOSupported() { return this->_isFBOSupported; } -OGLInfo_Legacy::OGLInfo_Legacy() +OGLContextInfo_Legacy::OGLContextInfo_Legacy() { _shaderSupport = ShaderSupport_Unsupported; _useShader150 = false; @@ -4595,7 +4589,7 @@ OGLInfo_Legacy::OGLInfo_Legacy() _isFBOSupported = this->IsExtensionPresent(oglExtensionSet, "GL_EXT_framebuffer_object"); } -void OGLInfo_Legacy::GetExtensionSetOGL(std::set *oglExtensionSet) +void OGLContextInfo_Legacy::GetExtensionSetOGL(std::set *oglExtensionSet) { std::string oglExtensionString = std::string((const char *)glGetString(GL_EXTENSIONS)); @@ -4617,7 +4611,7 @@ void OGLInfo_Legacy::GetExtensionSetOGL(std::set *oglExtensionSet) } } -bool OGLInfo_Legacy::IsExtensionPresent(const std::set &oglExtensionSet, const std::string &extensionName) const +bool OGLContextInfo_Legacy::IsExtensionPresent(const std::set &oglExtensionSet, const std::string &extensionName) const { if (oglExtensionSet.size() == 0) { @@ -4910,6 +4904,7 @@ bool OGLShaderProgram::LinkOGL() OGLVideoOutput::OGLVideoOutput() { + _contextInfo = NULL; _needUpdateViewport = true; _layerList = new std::vector; _layerList->reserve(8); @@ -4927,9 +4922,6 @@ OGLVideoOutput::~OGLVideoOutput() delete this->_layerList; this->_layerList = NULL; } - - delete this->_info; - this->_info = NULL; } void OGLVideoOutput::_UpdateNormalSize() @@ -4979,15 +4971,14 @@ void OGLVideoOutput::_UpdateViewport() this->_needUpdateViewport = false; } -OGLInfo* OGLVideoOutput::GetInfo() +OGLContextInfo* OGLVideoOutput::GetContextInfo() { - return this->_info; + return this->_contextInfo; } void OGLVideoOutput::Init() { - this->_info = OGLInfoCreate_Func(); - this->_canFilterOnGPU = ( this->_info->IsShaderSupported() && this->_info->IsFBOSupported() ); + this->_canFilterOnGPU = ( this->_contextInfo->IsShaderSupported() && this->_contextInfo->IsFBOSupported() ); this->_filtersPreferGPU = this->_canFilterOnGPU; this->_willFilterOnGPU = false; @@ -5009,7 +5000,7 @@ void OGLVideoOutput::Init() glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Set up fixed-function pipeline render states. - if (!this->_info->IsShaderSupported()) + if (!this->_contextInfo->IsShaderSupported()) { glDisable(GL_ALPHA_TEST); glDisable(GL_LIGHTING); @@ -5427,7 +5418,7 @@ GLuint OGLFilterDeposterize::RunFilterOGL(GLuint srcTexID) #pragma mark - -OGLImage::OGLImage(OGLInfo *oglInfo, GLsizei imageWidth, GLsizei imageHeight, GLsizei viewportWidth, GLsizei viewportHeight) +OGLImage::OGLImage(OGLContextInfo *contextInfo, GLsizei imageWidth, GLsizei imageHeight, GLsizei viewportWidth, GLsizei viewportHeight) { _needUploadVertices = true; _useDeposterize = false; @@ -5483,7 +5474,7 @@ OGLImage::OGLImage(OGLInfo *oglInfo, GLsizei imageWidth, GLsizei imageHeight, GL glGenVertexArraysDESMUME(1, &_vaoMainStatesID); glBindVertexArrayDESMUME(_vaoMainStatesID); - if (oglInfo->IsShaderSupported()) + if (contextInfo->IsShaderSupported()) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboVertexID); glVertexAttribPointer(OGLVertexAttributeID_Position, 2, GL_INT, GL_FALSE, 0, 0); @@ -5508,10 +5499,10 @@ OGLImage::OGLImage(OGLInfo *oglInfo, GLsizei imageWidth, GLsizei imageHeight, GL _isVAOPresent = true; _pixelScaler = VideoFilterTypeID_None; - _useShader150 = oglInfo->IsUsingShader150(); - _shaderSupport = oglInfo->GetShaderSupport(); + _useShader150 = contextInfo->IsUsingShader150(); + _shaderSupport = contextInfo->GetShaderSupport(); - _canUseShaderOutput = oglInfo->IsShaderSupported(); + _canUseShaderOutput = contextInfo->IsShaderSupported(); if (_canUseShaderOutput) { _finalOutputProgram = new OGLShaderProgram; @@ -5530,7 +5521,7 @@ OGLImage::OGLImage(OGLInfo *oglInfo, GLsizei imageWidth, GLsizei imageHeight, GL _finalOutputProgram = NULL; } - _canUseShaderBasedFilters = (oglInfo->IsShaderSupported() && oglInfo->IsFBOSupported()); + _canUseShaderBasedFilters = (contextInfo->IsShaderSupported() && contextInfo->IsFBOSupported()); if (_canUseShaderBasedFilters) { _filterDeposterize = new OGLFilterDeposterize(_vf->GetSrcWidth(), _vf->GetSrcHeight(), _shaderSupport, _useShader150); @@ -6252,11 +6243,11 @@ OGLHUDLayer::OGLHUDLayer(OGLVideoOutput *oglVO) _glyphSize = 0.0f; _glyphTileSize = 0.0f; - if (_output->GetInfo()->IsShaderSupported()) + if (_output->GetContextInfo()->IsShaderSupported()) { _program = new OGLShaderProgram; - _program->SetShaderSupport(oglVO->GetInfo()->GetShaderSupport()); - _program->SetVertexAndFragmentShaderOGL(HUDOutputVertShader_100, HUDOutputFragShader_110, oglVO->GetInfo()->IsUsingShader150()); + _program->SetShaderSupport(oglVO->GetContextInfo()->GetShaderSupport()); + _program->SetVertexAndFragmentShaderOGL(HUDOutputVertShader_100, HUDOutputFragShader_110, oglVO->GetContextInfo()->IsUsingShader150()); glUseProgram(_program->GetProgramID()); _uniformViewSize = glGetUniformLocation(_program->GetProgramID(), "viewSize"); @@ -6301,7 +6292,7 @@ OGLHUDLayer::OGLHUDLayer(OGLVideoOutput *oglVO) glGenVertexArraysDESMUME(1, &_vaoMainStatesID); glBindVertexArrayDESMUME(_vaoMainStatesID); - if (oglVO->GetInfo()->IsShaderSupported()) + if (oglVO->GetContextInfo()->IsShaderSupported()) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboVertexID); glVertexAttribPointer(OGLVertexAttributeID_Position, 2, GL_FLOAT, GL_FALSE, 0, NULL); @@ -6329,7 +6320,7 @@ OGLHUDLayer::OGLHUDLayer(OGLVideoOutput *oglVO) OGLHUDLayer::~OGLHUDLayer() { - if (_output->GetInfo()->IsShaderSupported()) + if (_output->GetContextInfo()->IsShaderSupported()) { glUseProgram(0); delete this->_program; @@ -6455,7 +6446,7 @@ void OGLHUDLayer::_UpdateVerticesOGL() void OGLHUDLayer::UpdateViewportOGL() { - if (this->_output->GetInfo()->IsShaderSupported()) + if (this->_output->GetContextInfo()->IsShaderSupported()) { glUseProgram(this->_program->GetProgramID()); glUniform2f(this->_uniformViewSize, this->_output->GetViewProperties().clientWidth, this->_output->GetViewProperties().clientHeight); @@ -6492,7 +6483,7 @@ void OGLHUDLayer::RenderOGL() return; } - if (this->_output->GetInfo()->IsShaderSupported()) + if (this->_output->GetContextInfo()->IsShaderSupported()) { glUseProgram(this->_program->GetProgramID()); } @@ -6634,7 +6625,7 @@ OGLDisplayLayer::OGLDisplayLayer(OGLVideoOutput *oglVO) glGenVertexArraysDESMUME(1, &this->_vaoMainStatesID); glBindVertexArrayDESMUME(this->_vaoMainStatesID); - if (this->_output->GetInfo()->IsShaderSupported()) + if (this->_output->GetContextInfo()->IsShaderSupported()) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboVertexID); glVertexAttribPointer(OGLVertexAttributeID_Position, 2, GL_FLOAT, GL_FALSE, 0, 0); @@ -6657,9 +6648,9 @@ OGLDisplayLayer::OGLDisplayLayer(OGLVideoOutput *oglVO) glBindVertexArrayDESMUME(0); - _useShader150 = _output->GetInfo()->IsUsingShader150(); - _shaderSupport = _output->GetInfo()->GetShaderSupport(); - if (_output->GetInfo()->IsShaderSupported()) + _useShader150 = _output->GetContextInfo()->IsUsingShader150(); + _shaderSupport = _output->GetContextInfo()->GetShaderSupport(); + if (_output->GetContextInfo()->IsShaderSupported()) { _finalOutputProgram = new OGLShaderProgram; _finalOutputProgram->SetShaderSupport(_shaderSupport); @@ -6702,7 +6693,7 @@ OGLDisplayLayer::OGLDisplayLayer(OGLVideoOutput *oglVO) OGLDisplayLayer::~OGLDisplayLayer() { - if (_output->GetInfo()->IsVAOSupported()) + if (_output->GetContextInfo()->IsVAOSupported()) { glDeleteVertexArraysDESMUME(1, &this->_vaoMainStatesID); } @@ -6721,7 +6712,7 @@ OGLDisplayLayer::~OGLDisplayLayer() glDeleteTextures(1, &this->_texHQ4xLUT); glActiveTexture(GL_TEXTURE0); - if (_output->GetInfo()->IsShaderSupported()) + if (_output->GetContextInfo()->IsShaderSupported()) { glUseProgram(0); delete this->_finalOutputProgram; @@ -6906,7 +6897,7 @@ void OGLDisplayLayer::_UpdateRotationScaleOGL() const double r = cdv.rotation; const double s = cdv.viewScale; - if (this->_output->GetInfo()->IsShaderSupported()) + if (this->_output->GetContextInfo()->IsShaderSupported()) { glUniform1f(this->_uniformFinalOutputAngleDegrees, r); glUniform1f(this->_uniformFinalOutputScalar, s); @@ -7461,7 +7452,7 @@ void OGLDisplayLayer::UpdateViewportOGL() const double w = cdv.clientWidth; const double h = cdv.clientHeight; - if (this->_output->GetInfo()->IsShaderSupported()) + if (this->_output->GetContextInfo()->IsShaderSupported()) { glUseProgram(this->_finalOutputProgram->GetProgramID()); glUniform2f(this->_uniformFinalOutputViewSize, w, h); @@ -7598,7 +7589,7 @@ void OGLDisplayLayer::ProcessOGL() void OGLDisplayLayer::RenderOGL() { - if (this->_output->GetInfo()->IsShaderSupported()) + if (this->_output->GetContextInfo()->IsShaderSupported()) { glUseProgram(this->_finalOutputProgram->GetProgramID()); } diff --git a/desmume/src/frontend/cocoa/OGLDisplayOutput.h b/desmume/src/frontend/cocoa/OGLDisplayOutput.h index bec6d4a0d..eb757389c 100644 --- a/desmume/src/frontend/cocoa/OGLDisplayOutput.h +++ b/desmume/src/frontend/cocoa/OGLDisplayOutput.h @@ -50,7 +50,7 @@ enum ShaderSupportTier ShaderSupport_FutureTier = 6, }; -class OGLInfo +class OGLContextInfo { protected: GLint _versionMajor; @@ -65,8 +65,8 @@ protected: bool _isFBOSupported; public: - OGLInfo(); - virtual ~OGLInfo() {}; + OGLContextInfo(); + virtual ~OGLContextInfo() {}; bool IsUsingShader150(); bool IsVBOSupported(); @@ -80,10 +80,10 @@ public: virtual bool IsExtensionPresent(const std::set &oglExtensionSet, const std::string &extensionName) const = 0; }; -class OGLInfo_Legacy : public OGLInfo +class OGLContextInfo_Legacy : public OGLContextInfo { public: - OGLInfo_Legacy(); + OGLContextInfo_Legacy(); virtual void GetExtensionSetOGL(std::set *oglExtensionSet); virtual bool IsExtensionPresent(const std::set &oglExtensionSet, const std::string &extensionName) const; @@ -229,7 +229,7 @@ protected: public: OGLImage() {}; - OGLImage(OGLInfo *oglInfo, GLsizei imageWidth, GLsizei imageHeight, GLsizei viewportWidth, GLsizei viewportHeight); + OGLImage(OGLContextInfo *oglInfo, GLsizei imageWidth, GLsizei imageHeight, GLsizei viewportWidth, GLsizei viewportHeight); virtual ~OGLImage(); bool GetFiltersPreferGPU(); @@ -388,7 +388,7 @@ public: class OGLVideoOutput : public ClientDisplay3DView { protected: - OGLInfo *_info; + OGLContextInfo *_contextInfo; GLsizei _viewportWidth; GLsizei _viewportHeight; bool _needUpdateViewport; @@ -406,7 +406,7 @@ public: OGLVideoOutput(); ~OGLVideoOutput(); - OGLInfo* GetInfo(); + OGLContextInfo* GetContextInfo(); GLsizei GetViewportWidth(); GLsizei GetViewportHeight(); @@ -437,9 +437,6 @@ public: virtual void FrameFinish(); }; -OGLInfo* OGLInfoCreate_Legacy(); - -extern OGLInfo* (*OGLInfoCreate_Func)(); extern void (*glBindVertexArrayDESMUME)(GLuint id); extern void (*glDeleteVertexArraysDESMUME)(GLsizei n, const GLuint *ids); extern void (*glGenVertexArraysDESMUME)(GLsizei n, GLuint *ids); diff --git a/desmume/src/frontend/cocoa/OGLDisplayOutput_3_2.cpp b/desmume/src/frontend/cocoa/OGLDisplayOutput_3_2.cpp index 3715e465a..b458c3706 100644 --- a/desmume/src/frontend/cocoa/OGLDisplayOutput_3_2.cpp +++ b/desmume/src/frontend/cocoa/OGLDisplayOutput_3_2.cpp @@ -23,11 +23,6 @@ enum OGLVertexAttributeID OGLVertexAttributeID_TexCoord0 = 8 }; -OGLInfo* OGLInfoCreate_3_2() -{ - return new OGLInfo_3_2; -} - void glBindVertexArray_3_2(GLuint vaoID) { glBindVertexArray(vaoID); @@ -43,7 +38,7 @@ void glGenVertexArrays_3_2(GLsizei n, GLuint *vaoIDs) glGenVertexArrays(n, vaoIDs); } -OGLInfo_3_2::OGLInfo_3_2() +OGLContextInfo_3_2::OGLContextInfo_3_2() { _useShader150 = true; _isVBOSupported = true; @@ -70,7 +65,7 @@ OGLInfo_3_2::OGLInfo_3_2() } } -void OGLInfo_3_2::GetExtensionSetOGL(std::set *oglExtensionSet) +void OGLContextInfo_3_2::GetExtensionSetOGL(std::set *oglExtensionSet) { GLint extensionCount = 0; @@ -82,7 +77,7 @@ void OGLInfo_3_2::GetExtensionSetOGL(std::set *oglExtensionSet) } } -bool OGLInfo_3_2::IsExtensionPresent(const std::set &oglExtensionSet, const std::string &extensionName) const +bool OGLContextInfo_3_2::IsExtensionPresent(const std::set &oglExtensionSet, const std::string &extensionName) const { if (oglExtensionSet.size() == 0) { diff --git a/desmume/src/frontend/cocoa/OGLDisplayOutput_3_2.h b/desmume/src/frontend/cocoa/OGLDisplayOutput_3_2.h index c20c80d25..a76fe75e4 100644 --- a/desmume/src/frontend/cocoa/OGLDisplayOutput_3_2.h +++ b/desmume/src/frontend/cocoa/OGLDisplayOutput_3_2.h @@ -26,15 +26,13 @@ #include "OGLDisplayOutput.h" -class OGLInfo_3_2 : public OGLInfo +class OGLContextInfo_3_2 : public OGLContextInfo { public: - OGLInfo_3_2(); + OGLContextInfo_3_2(); virtual void GetExtensionSetOGL(std::set *oglExtensionSet); virtual bool IsExtensionPresent(const std::set &oglExtensionSet, const std::string &extensionName) const; }; -OGLInfo* OGLInfoCreate_3_2(); - #endif diff --git a/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.h b/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.h index 450cc199a..92e0c1095 100644 --- a/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.h +++ b/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.h @@ -61,6 +61,7 @@ class OGLVideoOutput; @property (assign) NSInteger outputFilter; @property (assign) NSInteger pixelScaler; +- (void) initContext; - (BOOL) handleKeyPress:(NSEvent *)theEvent keyPressed:(BOOL)keyPressed; - (BOOL) handleMouseButton:(NSEvent *)theEvent buttonPressed:(BOOL)buttonPressed; - (void) requestScreenshot:(NSURL *)fileURL fileType:(NSBitmapImageFileType)fileType; diff --git a/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.mm b/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.mm index 2b0b1e96b..79d4cb571 100644 --- a/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.mm +++ b/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.mm @@ -1261,10 +1261,12 @@ static std::unordered_map _screenMap; // [self setMasterWindow:[self window]]; [masterWindow setTitle:(NSString *)[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]]; [masterWindow setInitialFirstResponder:view]; - [view setInputManager:[emuControl inputManager]]; [[emuControl windowList] addObject:self]; [emuControl updateAllWindowTitles]; + [view initContext]; + [view setInputManager:[emuControl inputManager]]; + // Set up the scaling factor if this is a Retina window float scaleFactor = 1.0f; #if defined(MAC_OS_X_VERSION_10_7) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7) @@ -1609,11 +1611,6 @@ static std::unordered_map _screenMap; // cdsVideoOutput = nil; _cdv = new MacOGLDisplayView(); - _cdv->Init(); - - NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"SourceSansPro-Bold" ofType:@"otf"]; - _cdv->SetHUDFontUsingPath([fontPath cStringUsingEncoding:NSUTF8StringEncoding]); - localContext = [[NSOpenGLContext alloc] initWithCGLContextObj:((MacOGLDisplayView *)_cdv)->GetContext()]; return self; @@ -1763,6 +1760,16 @@ static std::unordered_map _screenMap; // return [[self cdsVideoOutput] pixelScaler]; } +#pragma mark Class Methods +- (void) initContext +{ + [localContext setView:self]; + _cdv->Init(); + + NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"SourceSansPro-Bold" ofType:@"otf"]; + _cdv->SetHUDFontUsingPath([fontPath cStringUsingEncoding:NSUTF8StringEncoding]); +} + #pragma mark InputHIDManagerTarget Protocol - (BOOL) handleHIDQueue:(IOHIDQueueRef)hidQueue hidManager:(InputHIDManager *)hidManager { diff --git a/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.h b/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.h index b311adfcb..1c6040cb2 100644 --- a/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.h +++ b/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.h @@ -36,6 +36,7 @@ protected: public: void operator delete(void *ptr); + MacOGLDisplayView(); virtual void Init(); diff --git a/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.mm b/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.mm index 1b447f18e..6cbb54872 100644 --- a/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.mm +++ b/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.mm @@ -21,18 +21,24 @@ void MacOGLDisplayView::operator delete(void *ptr) { CGLContextObj context = ((MacOGLDisplayView *)ptr)->GetContext(); + OGLContextInfo *contextInfo = ((MacOGLDisplayView *)ptr)->GetContextInfo(); - CGLContextObj prevContext = CGLGetCurrentContext(); - CGLSetCurrentContext(context); - ::operator delete(ptr); - CGLSetCurrentContext(prevContext); - - CGLReleaseContext(context); + if (context != NULL) + { + CGLContextObj prevContext = CGLGetCurrentContext(); + CGLSetCurrentContext(context); + ::operator delete(ptr); + CGLSetCurrentContext(prevContext); + + delete contextInfo; + CGLReleaseContext(context); + } } -void MacOGLDisplayView::Init() +MacOGLDisplayView::MacOGLDisplayView() { // Initialize the OpenGL context + bool useContext_3_2 = false; CGLPixelFormatAttribute attributes[] = { kCGLPFAColorSize, (CGLPixelFormatAttribute)24, kCGLPFAAlphaSize, (CGLPixelFormatAttribute)8, @@ -42,16 +48,14 @@ void MacOGLDisplayView::Init() (CGLPixelFormatAttribute)0, (CGLPixelFormatAttribute)0, (CGLPixelFormatAttribute)0 }; - OGLInfoCreate_Func = &OGLInfoCreate_Legacy; - #ifdef _OGLDISPLAYOUTPUT_3_2_H_ // If we can support a 3.2 Core Profile context, then request that in our // pixel format attributes. - if (IsOSXVersionSupported(10, 7, 0)) + useContext_3_2 = IsOSXVersionSupported(10, 70, 0); + if (useContext_3_2) { attributes[9] = kCGLPFAOpenGLProfile; attributes[10] = (CGLPixelFormatAttribute)kCGLOGLPVersion_3_2_Core; - OGLInfoCreate_Func = &OGLInfoCreate_3_2; } #endif @@ -63,9 +67,9 @@ void MacOGLDisplayView::Init() { // If we can't get a 3.2 Core Profile context, then switch to using a // legacy context instead. + useContext_3_2 = false; attributes[9] = (CGLPixelFormatAttribute)0; attributes[10] = (CGLPixelFormatAttribute)0; - OGLInfoCreate_Func = &OGLInfoCreate_Legacy; CGLChoosePixelFormat(attributes, &cglPixFormat, &virtualScreenCount); } @@ -74,6 +78,25 @@ void MacOGLDisplayView::Init() CGLContextObj prevContext = CGLGetCurrentContext(); CGLSetCurrentContext(this->_context); + +#ifdef _OGLDISPLAYOUTPUT_3_2_H_ + if (useContext_3_2) + { + this->_contextInfo = new OGLContextInfo_3_2; + } + else +#endif + { + this->_contextInfo = new OGLContextInfo_Legacy; + } + + CGLSetCurrentContext(prevContext); +} + +void MacOGLDisplayView::Init() +{ + CGLContextObj prevContext = CGLGetCurrentContext(); + CGLSetCurrentContext(this->_context); this->OGLVideoOutput::Init(); CGLSetCurrentContext(prevContext); } diff --git a/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.mm b/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.mm index 6ac1afcfe..0893c320f 100644 --- a/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.mm +++ b/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.mm @@ -60,6 +60,7 @@ isPreviewImageLoaded = false; // Initialize the OpenGL context + bool useContext_3_2 = false; NSOpenGLPixelFormatAttribute attributes[] = { NSOpenGLPFAColorSize, (NSOpenGLPixelFormatAttribute)24, NSOpenGLPFAAlphaSize, (NSOpenGLPixelFormatAttribute)8, @@ -71,11 +72,11 @@ #ifdef _OGLDISPLAYOUTPUT_3_2_H_ // If we can support a 3.2 Core Profile context, then request that in our // pixel format attributes. - if (IsOSXVersionSupported(10, 7, 0)) + useContext_3_2 = IsOSXVersionSupported(10, 7, 0); + if (useContext_3_2) { attributes[8] = NSOpenGLPFAOpenGLProfile; attributes[9] = NSOpenGLProfileVersion3_2Core; - OGLInfoCreate_Func = &OGLInfoCreate_3_2; } #endif @@ -84,9 +85,9 @@ { // If we can't get a 3.2 Core Profile context, then switch to using a // legacy context instead. + useContext_3_2 = false; attributes[8] = (NSOpenGLPixelFormatAttribute)0; attributes[9] = (NSOpenGLPixelFormatAttribute)0; - OGLInfoCreate_Func = &OGLInfoCreate_Legacy; format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; } @@ -103,8 +104,20 @@ const NSRect newViewportRect = frameRect; #endif - OGLInfo *oglInfo = OGLInfoCreate_Func(); - oglImage = new OGLImage(oglInfo, 64, 64, newViewportRect.size.width, newViewportRect.size.height); + OGLContextInfo *contextInfo = NULL; + +#ifdef _OGLDISPLAYOUTPUT_3_2_H_ + if (useContext_3_2) + { + contextInfo = new OGLContextInfo_3_2; + } + else +#endif + { + contextInfo = new OGLContextInfo_Legacy; + } + + oglImage = new OGLImage(contextInfo, 64, 64, newViewportRect.size.width, newViewportRect.size.height); oglImage->SetFiltersPreferGPUOGL(true); oglImage->SetSourceDeposterize(false); oglImage->SetOutputFilterOGL(OutputFilterTypeID_Bilinear);