wayland/gl: Ensure we use the 3.2 core profile

Emit an error if the profile is different.

https://bugzilla.gnome.org/show_bug.cgi?id=741946
This commit is contained in:
Emmanuele Bassi 2015-02-09 15:56:18 +00:00
parent cc45e828df
commit 2d9081d117

View File

@ -100,6 +100,8 @@ gdk_wayland_window_invalidate_for_new_frame (GdkWindow *window,
} }
} }
#define N_EGL_ATTRS 16
static gboolean static gboolean
gdk_wayland_gl_context_realize (GdkGLContext *context, gdk_wayland_gl_context_realize (GdkGLContext *context,
GError **error) GError **error)
@ -110,36 +112,46 @@ gdk_wayland_gl_context_realize (GdkGLContext *context,
GdkGLProfile profile = gdk_gl_context_get_profile (context); GdkGLProfile profile = gdk_gl_context_get_profile (context);
GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display); GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display);
EGLContext ctx; EGLContext ctx;
EGLint context_attribs[16]; EGLint context_attribs[N_EGL_ATTRS];
int i; int major, minor, flags;
gboolean debug_bit, forward_bit;
int i = 0;
i = 0; if (profile != GDK_GL_PROFILE_3_2_CORE)
if (profile == GDK_GL_PROFILE_3_2_CORE)
{ {
int major, minor, flags; g_set_error_literal (error, GDK_GL_ERROR,
gboolean debug_bit, forward_bit; GDK_GL_ERROR_UNSUPPORTED_PROFILE,
_("Unsupported profile for a GL context"));
gdk_gl_context_get_required_version (context, &major, &minor); return FALSE;
debug_bit = gdk_gl_context_get_debug_enabled (context);
forward_bit = gdk_gl_context_get_forward_compatible (context);
flags = 0;
if (debug_bit)
flags |= EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR;
if (forward_bit)
flags |= EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR;
context_attribs[i++] = EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR;
context_attribs[i++] = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR;
context_attribs[i++] = EGL_CONTEXT_MAJOR_VERSION_KHR;
context_attribs[i++] = major;
context_attribs[i++] = EGL_CONTEXT_MINOR_VERSION_KHR;
context_attribs[i++] = minor;
context_attribs[i++] = EGL_CONTEXT_FLAGS_KHR;
context_attribs[i++] = flags;
} }
gdk_gl_context_get_required_version (context, &major, &minor);
debug_bit = gdk_gl_context_get_debug_enabled (context);
forward_bit = gdk_gl_context_get_forward_compatible (context);
flags = 0;
if (debug_bit)
flags |= EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR;
if (forward_bit)
flags |= EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR;
/* We want a core profile */
context_attribs[i++] = EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR;
context_attribs[i++] = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR;
/* Specify the version */
context_attribs[i++] = EGL_CONTEXT_MAJOR_VERSION_KHR;
context_attribs[i++] = major;
context_attribs[i++] = EGL_CONTEXT_MINOR_VERSION_KHR;
context_attribs[i++] = minor;
/* Specify the flags */
context_attribs[i++] = EGL_CONTEXT_FLAGS_KHR;
context_attribs[i++] = flags;
context_attribs[i++] = EGL_NONE; context_attribs[i++] = EGL_NONE;
g_assert (i < N_EGL_ATTRS);
ctx = eglCreateContext (display_wayland->egl_display, ctx = eglCreateContext (display_wayland->egl_display,
context_wayland->egl_config, context_wayland->egl_config,