- Implemented BGFX_CAPS_SWAP_CHAIN in OpenGl on Macos (#2400)
This commit is contained in:
parent
efaa20b4a3
commit
8b209012b1
@ -21,22 +21,119 @@ namespace bgfx { namespace gl
|
|||||||
|
|
||||||
struct SwapChainGL
|
struct SwapChainGL
|
||||||
{
|
{
|
||||||
SwapChainGL(void* _nwh)
|
SwapChainGL(void* _nwh,NSOpenGLContext *_context)
|
||||||
{
|
{
|
||||||
BX_UNUSED(_nwh);
|
NSObject* nwh=(NSObject*)_nwh;
|
||||||
|
|
||||||
|
NSWindow* nsWindow = nil;
|
||||||
|
NSView* contentView = nil;
|
||||||
|
if ([nwh isKindOfClass:[NSView class]])
|
||||||
|
{
|
||||||
|
contentView = (NSView*)nwh;
|
||||||
|
}
|
||||||
|
else if ([nwh isKindOfClass:[NSWindow class]])
|
||||||
|
{
|
||||||
|
nsWindow = (NSWindow*)nwh;
|
||||||
|
contentView = [nsWindow contentView];
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(MAC_OS_X_VERSION_MAX_ALLOWED) && (MAC_OS_X_VERSION_MAX_ALLOWED >= 1070)
|
||||||
|
NSOpenGLPixelFormatAttribute profile =
|
||||||
|
#if BGFX_CONFIG_RENDERER_OPENGL >= 31
|
||||||
|
NSOpenGLProfileVersion3_2Core
|
||||||
|
#else
|
||||||
|
NSOpenGLProfileVersionLegacy
|
||||||
|
#endif // BGFX_CONFIG_RENDERER_OPENGL >= 31
|
||||||
|
;
|
||||||
|
#endif // defined(MAC_OS_X_VERSION_MAX_ALLOWED) && (MAC_OS_X_VERSION_MAX_ALLOWED >= 1070)
|
||||||
|
|
||||||
|
NSOpenGLPixelFormatAttribute pixelFormatAttributes[] = {
|
||||||
|
#if defined(MAC_OS_X_VERSION_MAX_ALLOWED) && (MAC_OS_X_VERSION_MAX_ALLOWED >= 1070)
|
||||||
|
NSOpenGLPFAOpenGLProfile, profile,
|
||||||
|
#endif // defined(MAC_OS_X_VERSION_MAX_ALLOWED) && (MAC_OS_X_VERSION_MAX_ALLOWED >= 1070)
|
||||||
|
NSOpenGLPFAColorSize, 24,
|
||||||
|
NSOpenGLPFAAlphaSize, 8,
|
||||||
|
NSOpenGLPFADepthSize, 24,
|
||||||
|
NSOpenGLPFAStencilSize, 8,
|
||||||
|
NSOpenGLPFADoubleBuffer, true,
|
||||||
|
NSOpenGLPFAAccelerated, true,
|
||||||
|
NSOpenGLPFANoRecovery, true,
|
||||||
|
0, 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
NSOpenGLPixelFormat* pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:pixelFormatAttributes];
|
||||||
|
BGFX_FATAL(NULL != pixelFormat, Fatal::UnableToInitialize, "Failed to initialize pixel format.");
|
||||||
|
|
||||||
|
NSRect glViewRect = [contentView bounds];
|
||||||
|
NSOpenGLView* glView = [[NSOpenGLView alloc] initWithFrame:glViewRect pixelFormat:pixelFormat];
|
||||||
|
|
||||||
|
|
||||||
|
// GLFW creates a helper contentView that handles things like keyboard and drag and
|
||||||
|
// drop events. We don't want to clobber that view if it exists. Instead we just
|
||||||
|
// add ourselves as a subview and make the view resize automatically.
|
||||||
|
if (nil != contentView)
|
||||||
|
{
|
||||||
|
[glView setAutoresizingMask:( NSViewHeightSizable |
|
||||||
|
NSViewWidthSizable |
|
||||||
|
NSViewMinXMargin |
|
||||||
|
NSViewMaxXMargin |
|
||||||
|
NSViewMinYMargin |
|
||||||
|
NSViewMaxYMargin )];
|
||||||
|
[contentView addSubview:glView];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (nil != nsWindow)
|
||||||
|
[nsWindow setContentView:glView];
|
||||||
|
}
|
||||||
|
|
||||||
|
NSOpenGLContext* glContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:_context];
|
||||||
|
BGFX_FATAL(NULL != glContext, Fatal::UnableToInitialize, "Failed to initialize GL context.");
|
||||||
|
|
||||||
|
void (^attachBlock)(void) = ^(void) {
|
||||||
|
[glView setOpenGLContext: glContext];
|
||||||
|
[glContext setView:glView];
|
||||||
|
};
|
||||||
|
|
||||||
|
if([NSThread isMainThread])
|
||||||
|
{
|
||||||
|
attachBlock();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dispatch_sync(dispatch_get_main_queue(),attachBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
[pixelFormat release];
|
||||||
|
|
||||||
|
[glContext makeCurrentContext];
|
||||||
|
GLint interval = 0;
|
||||||
|
[glContext setValues:&interval forParameter:NSOpenGLCPSwapInterval];
|
||||||
|
|
||||||
|
|
||||||
|
m_view = glView;
|
||||||
|
m_context = glContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
~SwapChainGL()
|
~SwapChainGL()
|
||||||
{
|
{
|
||||||
|
if(m_context!=nil) [m_context release];
|
||||||
|
if(m_view!=nil) [m_view release];
|
||||||
}
|
}
|
||||||
|
|
||||||
void makeCurrent()
|
void makeCurrent()
|
||||||
{
|
{
|
||||||
|
[m_context makeCurrentContext];
|
||||||
}
|
}
|
||||||
|
|
||||||
void swapBuffers()
|
void swapBuffers()
|
||||||
{
|
{
|
||||||
|
[m_context makeCurrentContext];
|
||||||
|
[m_context flushBuffer];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NSOpenGLView *m_view;
|
||||||
|
NSOpenGLContext *m_context;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AutoreleasePoolHolder
|
class AutoreleasePoolHolder
|
||||||
@ -202,12 +299,13 @@ namespace bgfx { namespace gl
|
|||||||
if ([nwh respondsToSelector:@selector(backingScaleFactor)] && (1.0f < [(id)nwh backingScaleFactor]))
|
if ([nwh respondsToSelector:@selector(backingScaleFactor)] && (1.0f < [(id)nwh backingScaleFactor]))
|
||||||
caps |= BGFX_CAPS_HIDPI;
|
caps |= BGFX_CAPS_HIDPI;
|
||||||
#endif // defined(MAC_OS_X_VERSION_MAX_ALLOWED) && (MAC_OS_X_VERSION_MAX_ALLOWED >= 1070)
|
#endif // defined(MAC_OS_X_VERSION_MAX_ALLOWED) && (MAC_OS_X_VERSION_MAX_ALLOWED >= 1070)
|
||||||
|
caps |= BGFX_CAPS_SWAP_CHAIN;
|
||||||
return caps;
|
return caps;
|
||||||
}
|
}
|
||||||
|
|
||||||
SwapChainGL* GlContext::createSwapChain(void* _nwh)
|
SwapChainGL* GlContext::createSwapChain(void* _nwh)
|
||||||
{
|
{
|
||||||
return BX_NEW(g_allocator, SwapChainGL)(_nwh);
|
return BX_NEW(g_allocator, SwapChainGL)(_nwh,(NSOpenGLContext*)m_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GlContext::destroySwapChain(SwapChainGL* _swapChain)
|
void GlContext::destroySwapChain(SwapChainGL* _swapChain)
|
||||||
|
Loading…
Reference in New Issue
Block a user