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 */
|
||||
NSOpenGLContext *m_openGLContext;
|
||||
|
||||
bool m_coreProfile;
|
||||
|
||||
//static CGLEWContext *s_cglewContext;
|
||||
|
||||
/** The first created OpenGL context (for sharing display lists) */
|
||||
|
@ -62,6 +62,23 @@ GHOST_ContextCGL::GHOST_ContextCGL(
|
||||
m_openGLContext(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(
|
||||
std::vector<NSOpenGLPixelFormatAttribute>& attribs,
|
||||
bool coreProfile,
|
||||
bool stereoVisual,
|
||||
int numOfAASamples,
|
||||
bool needAlpha,
|
||||
bool needStencil)
|
||||
{
|
||||
attribs.push_back(NSOpenGLPFAOpenGLProfile);
|
||||
attribs.push_back(coreProfile ? NSOpenGLProfileVersion3_2Core : NSOpenGLProfileVersionLegacy);
|
||||
|
||||
// Pixel Format Attributes for the windowed NSOpenGLContext
|
||||
attribs.push_back(NSOpenGLPFADoubleBuffer);
|
||||
|
||||
@ -248,7 +269,7 @@ GHOST_TSuccess GHOST_ContextCGL::initializeDrawingContext()
|
||||
static const bool needStencil = false;
|
||||
#endif
|
||||
|
||||
makeAttribList(attribs, m_stereoVisual, m_numOfAASamples, needAlpha, needStencil);
|
||||
makeAttribList(attribs, m_coreProfile, m_stereoVisual, m_numOfAASamples, needAlpha, needStencil);
|
||||
|
||||
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?)
|
||||
|
||||
attribs.clear();
|
||||
makeAttribList(attribs, m_stereoVisual, 0, needAlpha, needStencil);
|
||||
makeAttribList(attribs, m_coreProfile, m_stereoVisual, 0, needAlpha, needStencil);
|
||||
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)
|
||||
{
|
||||
if (type == GHOST_kDrawingContextTypeOpenGL) {
|
||||
#if !defined(WITH_GL_EGL)
|
||||
|
||||
#if defined(WITH_GL_PROFILE_CORE)
|
||||
GHOST_Context *context = new GHOST_ContextCGL(
|
||||
m_wantStereoVisual,
|
||||
m_wantNumOfAASamples,
|
||||
m_window,
|
||||
m_openGLView,
|
||||
|
||||
#if defined(WITH_GL_PROFILE_CORE)
|
||||
GL_CONTEXT_CORE_PROFILE_BIT,
|
||||
3, 2,
|
||||
#else
|
||||
0, // no profile bit
|
||||
2, 1,
|
||||
#endif
|
||||
GHOST_OPENGL_CGL_CONTEXT_FLAGS,
|
||||
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())
|
||||
return context;
|
||||
else
|
||||
|
Loading…
Reference in New Issue
Block a user