mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-26 05:31:07 +00:00
mac: Try all different OpenGL profiles
.. and pick the best one that is supported. Also make sure that the resulting context has at least the desired version, otherwise bail.
This commit is contained in:
parent
5f833f1d31
commit
d33b82249b
@ -327,7 +327,7 @@ create_pixel_format (GdkGLVersion *version,
|
||||
GError **error)
|
||||
{
|
||||
CGLPixelFormatAttribute attrs[] = {
|
||||
kCGLPFAOpenGLProfile, (CGLPixelFormatAttribute)kCGLOGLPVersion_Legacy,
|
||||
kCGLPFAOpenGLProfile, 0,
|
||||
kCGLPFAAllowOfflineRenderers, /* allow sharing across GPUs */
|
||||
kCGLPFADepthSize, 0,
|
||||
kCGLPFAStencilSize, 0,
|
||||
@ -338,11 +338,21 @@ create_pixel_format (GdkGLVersion *version,
|
||||
CGLPixelFormatObj format = NULL;
|
||||
GLint n_format = 1;
|
||||
|
||||
if (gdk_gl_version_get_major (version) == 3)
|
||||
attrs[1] = (CGLPixelFormatAttribute)kCGLOGLPVersion_GL3_Core;
|
||||
else
|
||||
attrs[1] = (CGLPixelFormatAttribute)kCGLOGLPVersion_GL4_Core;
|
||||
if (gdk_gl_version_get_major (version) >= 4)
|
||||
{
|
||||
attrs[1] = (CGLPixelFormatAttribute)kCGLOGLPVersion_GL4_Core;
|
||||
if (CGLChoosePixelFormat (attrs, &format, &n_format))
|
||||
return g_steal_pointer (&format);
|
||||
}
|
||||
|
||||
if (gdk_gl_version_greater_equal (version, &GDK_GL_MIN_GL_VERSION))
|
||||
{
|
||||
attrs[1] = (CGLPixelFormatAttribute)kCGLOGLPVersion_GL3_Core;
|
||||
if (CGLChoosePixelFormat (attrs, &format, &n_format))
|
||||
return g_steal_pointer (&format);
|
||||
}
|
||||
|
||||
attrs[1] = (CGLPixelFormatAttribute) kCGLOGLPVersion_Legacy;
|
||||
if (!CHECK (error, CGLChoosePixelFormat (attrs, &format, &n_format)))
|
||||
return NULL;
|
||||
|
||||
@ -365,7 +375,7 @@ gdk_macos_gl_context_real_realize (GdkGLContext *context,
|
||||
GLint validate = 0;
|
||||
GLint renderer_id = 0;
|
||||
GLint swapRect[4];
|
||||
GdkGLVersion version;
|
||||
GdkGLVersion min_version, version;
|
||||
|
||||
g_assert (GDK_IS_MACOS_GL_CONTEXT (self));
|
||||
|
||||
@ -399,9 +409,9 @@ gdk_macos_gl_context_real_realize (GdkGLContext *context,
|
||||
|
||||
GDK_DISPLAY_DEBUG (display, OPENGL,
|
||||
"Creating CGLContextObj (version %d.%d)",
|
||||
gdk_gl_version_get_major (&version), gdk_gl_version_get_minor (&version));
|
||||
gdk_gl_version_get_major (&min_version), gdk_gl_version_get_minor (&min_version));
|
||||
|
||||
if (!(pixelFormat = create_pixel_format (&version, error)))
|
||||
if (!(pixelFormat = create_pixel_format (&min_version, error)))
|
||||
return 0;
|
||||
|
||||
if (!CHECK (error, CGLCreateContext (pixelFormat, shared_gl_context, &cgl_context)))
|
||||
@ -413,6 +423,13 @@ gdk_macos_gl_context_real_realize (GdkGLContext *context,
|
||||
CGLSetCurrentContext (cgl_context);
|
||||
CGLReleasePixelFormat (pixelFormat);
|
||||
|
||||
gdk_gl_version_init_epoxy (&version);
|
||||
if (!gdk_gl_version_greater_equal (&version, &min_version))
|
||||
{
|
||||
CGLReleaseContext (cgl_context);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (validate)
|
||||
CHECK (NULL, CGLEnable (cgl_context, kCGLCEStateValidation));
|
||||
|
||||
@ -444,6 +461,8 @@ gdk_macos_gl_context_real_realize (GdkGLContext *context,
|
||||
cgl_context,
|
||||
get_renderer_name (renderer_id));
|
||||
|
||||
gdk_gl_context_set_version (context, &version);
|
||||
|
||||
self->cgl_context = g_steal_pointer (&cgl_context);
|
||||
|
||||
if (existing != NULL)
|
||||
|
Loading…
Reference in New Issue
Block a user