forked from bartvdbraak/blender
OpenGL: on Mac use legacy 2.1 or core 3.2
This implements Mac part of T49012. Removed options for EGL, ES2, compatibility profile. None of these exist on Mac platform. Create a GL 3.2 core context when requested at build time. Old code just pretended to support core profile.
This commit is contained in:
parent
0d1f0116fe
commit
b3cb7e2652
@ -134,6 +134,8 @@ private:
|
|||||||
/** The OpenGL drawing context */
|
/** The OpenGL drawing context */
|
||||||
NSOpenGLContext *m_openGLContext;
|
NSOpenGLContext *m_openGLContext;
|
||||||
|
|
||||||
|
bool m_coreProfile;
|
||||||
|
|
||||||
//static CGLEWContext *s_cglewContext;
|
//static CGLEWContext *s_cglewContext;
|
||||||
|
|
||||||
/** The first created OpenGL context (for sharing display lists) */
|
/** The first created OpenGL context (for sharing display lists) */
|
||||||
|
@ -62,6 +62,23 @@ GHOST_ContextCGL::GHOST_ContextCGL(
|
|||||||
m_openGLContext(nil)
|
m_openGLContext(nil)
|
||||||
{
|
{
|
||||||
assert(openGLView != nil);
|
assert(openGLView != nil);
|
||||||
|
|
||||||
|
// for now be very strict about OpenGL version requested
|
||||||
|
switch (contextMajorVersion) {
|
||||||
|
case 2:
|
||||||
|
assert(contextMinorVersion == 1);
|
||||||
|
assert(contextProfileMask == 0);
|
||||||
|
m_coreProfile = false;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
// Apple didn't implement 3.0 or 3.1
|
||||||
|
assert(contextMinorVersion == 2);
|
||||||
|
assert(contextProfileMask == GL_CONTEXT_CORE_PROFILE_BIT);
|
||||||
|
m_coreProfile = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -169,11 +186,15 @@ GHOST_TSuccess GHOST_ContextCGL::updateDrawingContext()
|
|||||||
|
|
||||||
static void makeAttribList(
|
static void makeAttribList(
|
||||||
std::vector<NSOpenGLPixelFormatAttribute>& attribs,
|
std::vector<NSOpenGLPixelFormatAttribute>& attribs,
|
||||||
|
bool coreProfile,
|
||||||
bool stereoVisual,
|
bool stereoVisual,
|
||||||
int numOfAASamples,
|
int numOfAASamples,
|
||||||
bool needAlpha,
|
bool needAlpha,
|
||||||
bool needStencil)
|
bool needStencil)
|
||||||
{
|
{
|
||||||
|
attribs.push_back(NSOpenGLPFAOpenGLProfile);
|
||||||
|
attribs.push_back(coreProfile ? NSOpenGLProfileVersion3_2Core : NSOpenGLProfileVersionLegacy);
|
||||||
|
|
||||||
// Pixel Format Attributes for the windowed NSOpenGLContext
|
// Pixel Format Attributes for the windowed NSOpenGLContext
|
||||||
attribs.push_back(NSOpenGLPFADoubleBuffer);
|
attribs.push_back(NSOpenGLPFADoubleBuffer);
|
||||||
|
|
||||||
@ -248,7 +269,7 @@ GHOST_TSuccess GHOST_ContextCGL::initializeDrawingContext()
|
|||||||
static const bool needStencil = false;
|
static const bool needStencil = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
makeAttribList(attribs, m_stereoVisual, m_numOfAASamples, needAlpha, needStencil);
|
makeAttribList(attribs, m_coreProfile, m_stereoVisual, m_numOfAASamples, needAlpha, needStencil);
|
||||||
|
|
||||||
NSOpenGLPixelFormat *pixelFormat;
|
NSOpenGLPixelFormat *pixelFormat;
|
||||||
|
|
||||||
@ -261,7 +282,7 @@ GHOST_TSuccess GHOST_ContextCGL::initializeDrawingContext()
|
|||||||
// (Now that I think about it, does WGL really require the code that it has for finding a lesser match?)
|
// (Now that I think about it, does WGL really require the code that it has for finding a lesser match?)
|
||||||
|
|
||||||
attribs.clear();
|
attribs.clear();
|
||||||
makeAttribList(attribs, m_stereoVisual, 0, needAlpha, needStencil);
|
makeAttribList(attribs, m_coreProfile, m_stereoVisual, 0, needAlpha, needStencil);
|
||||||
pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:&attribs[0]];
|
pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:&attribs[0]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1087,82 +1087,23 @@ GHOST_TSuccess GHOST_WindowCocoa::setOrder(GHOST_TWindowOrder order)
|
|||||||
GHOST_Context *GHOST_WindowCocoa::newDrawingContext(GHOST_TDrawingContextType type)
|
GHOST_Context *GHOST_WindowCocoa::newDrawingContext(GHOST_TDrawingContextType type)
|
||||||
{
|
{
|
||||||
if (type == GHOST_kDrawingContextTypeOpenGL) {
|
if (type == GHOST_kDrawingContextTypeOpenGL) {
|
||||||
#if !defined(WITH_GL_EGL)
|
|
||||||
|
|
||||||
#if defined(WITH_GL_PROFILE_CORE)
|
|
||||||
GHOST_Context *context = new GHOST_ContextCGL(
|
GHOST_Context *context = new GHOST_ContextCGL(
|
||||||
m_wantStereoVisual,
|
m_wantStereoVisual,
|
||||||
m_wantNumOfAASamples,
|
m_wantNumOfAASamples,
|
||||||
m_window,
|
m_window,
|
||||||
m_openGLView,
|
m_openGLView,
|
||||||
|
|
||||||
|
#if defined(WITH_GL_PROFILE_CORE)
|
||||||
GL_CONTEXT_CORE_PROFILE_BIT,
|
GL_CONTEXT_CORE_PROFILE_BIT,
|
||||||
3, 2,
|
3, 2,
|
||||||
|
#else
|
||||||
|
0, // no profile bit
|
||||||
|
2, 1,
|
||||||
|
#endif
|
||||||
GHOST_OPENGL_CGL_CONTEXT_FLAGS,
|
GHOST_OPENGL_CGL_CONTEXT_FLAGS,
|
||||||
GHOST_OPENGL_CGL_RESET_NOTIFICATION_STRATEGY);
|
GHOST_OPENGL_CGL_RESET_NOTIFICATION_STRATEGY);
|
||||||
#elif defined(WITH_GL_PROFILE_ES20)
|
|
||||||
GHOST_Context *context = new GHOST_ContextCGL(
|
|
||||||
m_wantStereoVisual,
|
|
||||||
m_wantNumOfAASamples,
|
|
||||||
m_window,
|
|
||||||
m_openGLView,
|
|
||||||
CGL_CONTEXT_ES2_PROFILE_BIT_EXT,
|
|
||||||
2, 0,
|
|
||||||
GHOST_OPENGL_CGL_CONTEXT_FLAGS,
|
|
||||||
GHOST_OPENGL_CGL_RESET_NOTIFICATION_STRATEGY);
|
|
||||||
#elif defined(WITH_GL_PROFILE_COMPAT)
|
|
||||||
GHOST_Context *context = new GHOST_ContextCGL(
|
|
||||||
m_wantStereoVisual,
|
|
||||||
m_wantNumOfAASamples,
|
|
||||||
m_window,
|
|
||||||
m_openGLView,
|
|
||||||
0, // profile bit
|
|
||||||
0, 0,
|
|
||||||
GHOST_OPENGL_CGL_CONTEXT_FLAGS,
|
|
||||||
GHOST_OPENGL_CGL_RESET_NOTIFICATION_STRATEGY);
|
|
||||||
#else
|
|
||||||
# error
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#if defined(WITH_GL_PROFILE_CORE)
|
|
||||||
GHOST_Context *context = new GHOST_ContextEGL(
|
|
||||||
m_wantStereoVisual,
|
|
||||||
m_wantNumOfAASamples,
|
|
||||||
m_window,
|
|
||||||
m_openGLView,
|
|
||||||
EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT,
|
|
||||||
3, 2,
|
|
||||||
GHOST_OPENGL_EGL_CONTEXT_FLAGS,
|
|
||||||
GHOST_OPENGL_EGL_RESET_NOTIFICATION_STRATEGY,
|
|
||||||
EGL_OPENGL_API);
|
|
||||||
#elif defined(WITH_GL_PROFILE_ES20)
|
|
||||||
GHOST_Context *context = new GHOST_ContextEGL(
|
|
||||||
m_wantStereoVisual,
|
|
||||||
m_wantNumOfAASamples,
|
|
||||||
m_window,
|
|
||||||
m_openGLView,
|
|
||||||
0, // profile bit
|
|
||||||
2, 0,
|
|
||||||
GHOST_OPENGL_EGL_CONTEXT_FLAGS,
|
|
||||||
GHOST_OPENGL_EGL_RESET_NOTIFICATION_STRATEGY,
|
|
||||||
EGL_OPENGL_ES_API);
|
|
||||||
#elif defined(WITH_GL_PROFILE_COMPAT)
|
|
||||||
GHOST_Context *context = new GHOST_ContextEGL(
|
|
||||||
m_wantStereoVisual,
|
|
||||||
m_wantNumOfAASamples,
|
|
||||||
m_window,
|
|
||||||
m_openGLView,
|
|
||||||
0, // profile bit
|
|
||||||
0, 0,
|
|
||||||
GHOST_OPENGL_EGL_CONTEXT_FLAGS,
|
|
||||||
GHOST_OPENGL_EGL_RESET_NOTIFICATION_STRATEGY,
|
|
||||||
EGL_OPENGL_API);
|
|
||||||
#else
|
|
||||||
# error
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
if (context->initializeDrawingContext())
|
if (context->initializeDrawingContext())
|
||||||
return context;
|
return context;
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user