diff options
| author | shuffle2 <godisgovernment@gmail.com> | 2017-06-05 20:49:02 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-06-05 20:49:02 -0700 |
| commit | 192fec50b9e3a98aa625684c0a6bd016bfedbcd5 (patch) | |
| tree | 842cb3abfb59fbe8f6938799b305a29475ed8df7 /Source/Core/Common/GL/GLInterface | |
| parent | 9a9b0eed7202bd052df92113072ef7e46a0b2582 (diff) | |
| parent | c63925dc218aaa116328716e57af576eb39178bf (diff) | |
Merge pull request #5276 from ligfx/macosheadless
Add headless support on macOS
Diffstat (limited to 'Source/Core/Common/GL/GLInterface')
| -rw-r--r-- | Source/Core/Common/GL/GLInterface/AGL.h | 8 | ||||
| -rw-r--r-- | Source/Core/Common/GL/GLInterface/AGL.mm | 98 |
2 files changed, 57 insertions, 49 deletions
diff --git a/Source/Core/Common/GL/GLInterface/AGL.h b/Source/Core/Common/GL/GLInterface/AGL.h index fa5e872f41..f3c3bd47cf 100644 --- a/Source/Core/Common/GL/GLInterface/AGL.h +++ b/Source/Core/Common/GL/GLInterface/AGL.h @@ -15,10 +15,6 @@ struct NSView; class cInterfaceAGL : public cInterfaceBase { -private: - NSView* cocoaWin; - NSOpenGLContext* cocoaCtx; - public: void Swap() override; bool Create(void* window_handle, bool core) override; @@ -27,4 +23,8 @@ public: void Shutdown() override; void Update() override; void SwapInterval(int interval) override; + +private: + NSView* m_view; + NSOpenGLContext* m_context; }; diff --git a/Source/Core/Common/GL/GLInterface/AGL.mm b/Source/Core/Common/GL/GLInterface/AGL.mm index 78b2db2ea4..37fec99440 100644 --- a/Source/Core/Common/GL/GLInterface/AGL.mm +++ b/Source/Core/Common/GL/GLInterface/AGL.mm @@ -5,31 +5,54 @@ #include "Common/GL/GLInterface/AGL.h" #include "Common/Logging/Log.h" -void cInterfaceAGL::Swap() +static bool UpdateCachedDimensions(NSView* view, u32* width, u32* height) { - [cocoaCtx flushBuffer]; + NSWindow* window = [view window]; + NSSize size = [view frame].size; + + float scale = [window backingScaleFactor]; + size.width *= scale; + size.height *= scale; + + if (*width == size.width && *height == size.height) + return false; + + *width = size.width; + *height = size.height; + + return true; } -// Create rendering window. -// Call browser: Core.cpp:EmuThread() > main.cpp:Video_Initialize() -bool cInterfaceAGL::Create(void* window_handle, bool core) +static bool AttachContextToView(NSOpenGLContext* context, NSView* view, u32* width, u32* height) { - cocoaWin = reinterpret_cast<NSView*>(window_handle); - NSSize size = [cocoaWin frame].size; - // Enable high-resolution display support. - [cocoaWin setWantsBestResolutionOpenGLSurface:YES]; + [view setWantsBestResolutionOpenGLSurface:YES]; - NSWindow* window = [cocoaWin window]; + NSWindow* window = [view window]; + if (window == nil) + { + ERROR_LOG(VIDEO, "failed to get NSWindow"); + return false; + } - float scale = [window backingScaleFactor]; - size.width *= scale; - size.height *= scale; + (void)UpdateCachedDimensions(view, width, height); + + [window makeFirstResponder:view]; + [context setView:view]; + [window makeKeyAndOrderFront:nil]; - // Control window size and picture scaling - s_backbuffer_width = size.width; - s_backbuffer_height = size.height; + return true; +} + +void cInterfaceAGL::Swap() +{ + [m_context flushBuffer]; +} +// Create rendering window. +// Call browser: Core.cpp:EmuThread() > main.cpp:Video_Initialize() +bool cInterfaceAGL::Create(void* window_handle, bool core) +{ NSOpenGLPixelFormatAttribute attr[] = {NSOpenGLPFADoubleBuffer, NSOpenGLPFAOpenGLProfile, core ? NSOpenGLProfileVersion3_2Core : NSOpenGLProfileVersionLegacy, @@ -41,30 +64,24 @@ bool cInterfaceAGL::Create(void* window_handle, bool core) return false; } - cocoaCtx = [[NSOpenGLContext alloc] initWithFormat:fmt shareContext:nil]; + m_context = [[NSOpenGLContext alloc] initWithFormat:fmt shareContext:nil]; [fmt release]; - if (cocoaCtx == nil) + if (m_context == nil) { ERROR_LOG(VIDEO, "failed to create context"); return false; } - if (cocoaWin == nil) - { - ERROR_LOG(VIDEO, "failed to create window"); - return false; - } - - [window makeFirstResponder:cocoaWin]; - [cocoaCtx setView:cocoaWin]; - [window makeKeyAndOrderFront:nil]; + if (!window_handle) + return true; - return true; + m_view = static_cast<NSView*>(window_handle); + return AttachContextToView(m_context, m_view, &s_backbuffer_width, &s_backbuffer_height); } bool cInterfaceAGL::MakeCurrent() { - [cocoaCtx makeCurrentContext]; + [m_context makeCurrentContext]; return true; } @@ -77,30 +94,21 @@ bool cInterfaceAGL::ClearCurrent() // Close backend void cInterfaceAGL::Shutdown() { - [cocoaCtx clearDrawable]; - [cocoaCtx release]; - cocoaCtx = nil; + [m_context clearDrawable]; + [m_context release]; + m_context = nil; } void cInterfaceAGL::Update() { - NSWindow* window = [cocoaWin window]; - NSSize size = [cocoaWin frame].size; - - float scale = [window backingScaleFactor]; - size.width *= scale; - size.height *= scale; - - if (s_backbuffer_width == size.width && s_backbuffer_height == size.height) + if (!m_view) return; - s_backbuffer_width = size.width; - s_backbuffer_height = size.height; - - [cocoaCtx update]; + if (UpdateCachedDimensions(m_view, &s_backbuffer_width, &s_backbuffer_height)) + [m_context update]; } void cInterfaceAGL::SwapInterval(int interval) { - [cocoaCtx setValues:(GLint*)&interval forParameter:NSOpenGLCPSwapInterval]; + [m_context setValues:static_cast<GLint*>(&interval) forParameter:NSOpenGLCPSwapInterval]; } |
