summaryrefslogtreecommitdiff
path: root/Source/Core/Common/GL/GLInterface
diff options
context:
space:
mode:
authorshuffle2 <godisgovernment@gmail.com>2017-06-05 20:49:02 -0700
committerGitHub <noreply@github.com>2017-06-05 20:49:02 -0700
commit192fec50b9e3a98aa625684c0a6bd016bfedbcd5 (patch)
tree842cb3abfb59fbe8f6938799b305a29475ed8df7 /Source/Core/Common/GL/GLInterface
parent9a9b0eed7202bd052df92113072ef7e46a0b2582 (diff)
parentc63925dc218aaa116328716e57af576eb39178bf (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.h8
-rw-r--r--Source/Core/Common/GL/GLInterface/AGL.mm98
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];
}