return TRUE;
}
+static gboolean
+gdk_gl_context_real_is_current (GdkGLContext *self)
+{
+#ifdef HAVE_EGL
+ GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (self);
+
+ return priv->egl_context == eglGetCurrentContext ();
+#else
+ return TRUE;
+#endif
+}
+
static gboolean
gdk_gl_context_real_clear_current (GdkGLContext *context)
{
klass->is_shared = gdk_gl_context_real_is_shared;
klass->make_current = gdk_gl_context_real_make_current;
klass->clear_current = gdk_gl_context_real_clear_current;
+ klass->is_current = gdk_gl_context_real_is_current;
klass->get_default_framebuffer = gdk_gl_context_real_get_default_framebuffer;
draw_context_class->begin_frame = gdk_gl_context_real_begin_frame;
priv->extensions_checked = TRUE;
}
+static gboolean
+gdk_gl_context_check_is_current (GdkGLContext *context)
+{
+ return GDK_GL_CONTEXT_GET_CLASS (context)->is_current (context);
+}
+
/**
* gdk_gl_context_make_current:
* @context: a `GdkGLContext`
masked_context = mask_context (context, surfaceless);
current = g_private_get (&thread_current_context);
- if (current == masked_context)
+ if (current == masked_context && gdk_gl_context_check_is_current (context))
return;
/* we need to realize the GdkGLContext if it wasn't explicitly realized */
gdk_gl_context_get_current (void)
{
MaskedContext *current;
+ GdkGLContext *context;
current = g_private_get (&thread_current_context);
+ context = unmask_context (current);
+
+ if (context && !gdk_gl_context_check_is_current (context))
+ {
+ g_private_replace (&thread_current_context, NULL);
+ context = NULL;
+ }
- return unmask_context (current);
+ return context;
}
gboolean
gboolean (* make_current) (GdkGLContext *context,
gboolean surfaceless);
gboolean (* clear_current) (GdkGLContext *context);
+ gboolean (* is_current) (GdkGLContext *context);
cairo_region_t * (* get_damage) (GdkGLContext *context);
gboolean (* is_shared) (GdkGLContext *self,
return TRUE;
}
+static gboolean
+gdk_macos_gl_context_is_current (GdkGLContext *context)
+{
+ GdkMacosGLContext *self = GDK_MACOS_GL_CONTEXT (context);
+
+ return self->cgl_context == CGLGetCurrentContext ();
+}
+
static gboolean
gdk_macos_gl_context_make_current (GdkGLContext *context,
gboolean surfaceless)
gl_class->get_damage = gdk_macos_gl_context_get_damage;
gl_class->clear_current = gdk_macos_gl_context_clear_current;
+ gl_class->is_current = gdk_macos_gl_context_is_current;
gl_class->make_current = gdk_macos_gl_context_make_current;
gl_class->realize = gdk_macos_gl_context_real_realize;
gl_class->get_default_framebuffer = gdk_macos_gl_context_get_default_framebuffer;
return wglMakeCurrent (NULL, NULL);
}
+static gboolean
+gdk_win32_gl_context_wgl_is_current (GdkGLContext *context)
+{
+ GdkWin32GLContextWGL *self = GDK_WIN32_GL_CONTEXT_WGL (context);
+
+ return self->wgl_context == wglGetCurrentContext ();
+}
+
static gboolean
gdk_win32_gl_context_wgl_make_current (GdkGLContext *context,
gboolean surfaceless)
context_class->realize = gdk_win32_gl_context_wgl_realize;
context_class->make_current = gdk_win32_gl_context_wgl_make_current;
context_class->clear_current = gdk_win32_gl_context_wgl_clear_current;
+ context_class->is_current = gdk_win32_gl_context_wgl_is_current;
draw_context_class->begin_frame = gdk_win32_gl_context_wgl_begin_frame;
draw_context_class->end_frame = gdk_win32_gl_context_wgl_end_frame;
return TRUE;
}
+static gboolean
+gdk_x11_gl_context_glx_is_current (GdkGLContext *context)
+{
+ GdkX11GLContextGLX *self = GDK_X11_GL_CONTEXT_GLX (context);
+
+ return self->glx_context == glXGetCurrentContext ();
+}
+
static gboolean
gdk_x11_gl_context_glx_make_current (GdkGLContext *context,
gboolean surfaceless)
context_class->realize = gdk_x11_gl_context_glx_realize;
context_class->make_current = gdk_x11_gl_context_glx_make_current;
context_class->clear_current = gdk_x11_gl_context_glx_clear_current;
+ context_class->is_current = gdk_x11_gl_context_glx_is_current;
context_class->get_damage = gdk_x11_gl_context_glx_get_damage;
draw_context_class->end_frame = gdk_x11_gl_context_glx_end_frame;