gl: Make gdk_gl_context_make_current() return void

Its not really reasonable to handle failures to make_current, it
basically only happens if you pass invalid arguments to it, and
thats not something we trap on similar things on the X drawing side.

If GL is not supported that should be handled by the context creation
failing, and anything going wrong after that is essentially a critical
(or an async X error).
This commit is contained in:
Alexander Larsson 2014-10-09 17:24:21 +02:00 committed by Matthias Clasen
parent 017775f288
commit fdeb4f8c16
13 changed files with 52 additions and 91 deletions

View File

@ -2258,17 +2258,15 @@ gdk_display_destroy_gl_context (GdkDisplay *display,
* *
* Makes the given @context the current GL context, or unsets * Makes the given @context the current GL context, or unsets
* the current GL context if @context is %NULL. * the current GL context if @context is %NULL.
*
* Returns: %TRUE if successful
*/ */
gboolean void
gdk_display_make_gl_context_current (GdkDisplay *display, gdk_display_make_gl_context_current (GdkDisplay *display,
GdkGLContext *context) GdkGLContext *context)
{ {
GdkGLContext *current = gdk_display_get_current_gl_context (display); GdkGLContext *current = gdk_display_get_current_gl_context (display);
if (current == context) if (current == context)
return TRUE; return;
if (context == NULL) if (context == NULL)
g_object_set_data (G_OBJECT (display), "-gdk-gl-current-context", NULL); g_object_set_data (G_OBJECT (display), "-gdk-gl-current-context", NULL);
@ -2277,7 +2275,7 @@ gdk_display_make_gl_context_current (GdkDisplay *display,
g_object_ref (context), g_object_ref (context),
(GDestroyNotify) g_object_unref); (GDestroyNotify) g_object_unref);
return GDK_DISPLAY_GET_CLASS (display)->make_gl_context_current (display, context); GDK_DISPLAY_GET_CLASS (display)->make_gl_context_current (display, context);
} }
/*< private > /*< private >

View File

@ -225,7 +225,7 @@ struct _GdkDisplayClass
gchar * (*utf8_to_string_target) (GdkDisplay *display, gchar * (*utf8_to_string_target) (GdkDisplay *display,
const gchar *text); const gchar *text);
gboolean (*make_gl_context_current) (GdkDisplay *display, void (*make_gl_context_current) (GdkDisplay *display,
GdkGLContext *context); GdkGLContext *context);
void (*destroy_gl_context) (GdkDisplay *display, void (*destroy_gl_context) (GdkDisplay *display,
GdkGLContext *context); GdkGLContext *context);
@ -310,7 +310,7 @@ GdkWindow * _gdk_display_create_window (GdkDisplay *display
void gdk_display_destroy_gl_context (GdkDisplay *display, void gdk_display_destroy_gl_context (GdkDisplay *display,
GdkGLContext *context); GdkGLContext *context);
gboolean gdk_display_make_gl_context_current (GdkDisplay *display, void gdk_display_make_gl_context_current (GdkDisplay *display,
GdkGLContext *context); GdkGLContext *context);
GdkGLContext * gdk_display_get_current_gl_context (GdkDisplay *display); GdkGLContext * gdk_display_get_current_gl_context (GdkDisplay *display);

View File

@ -98,8 +98,7 @@ gdk_cairo_draw_from_gl (cairo_t *cr,
clip_region = gdk_cairo_region_from_clip (cr); clip_region = gdk_cairo_region_from_clip (cr);
if (!gdk_gl_context_make_current (context)) gdk_gl_context_make_current (context);
g_error ("make current failed");
glGenFramebuffersEXT (1, &framebuffer); glGenFramebuffersEXT (1, &framebuffer);
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, framebuffer); glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, framebuffer);

View File

@ -270,18 +270,16 @@ gdk_gl_context_flush_buffer (GdkGLContext *context,
* *
* Makes the @context the current one. * Makes the @context the current one.
* *
* Returns: %TRUE if the context is current
*
* Since: 3.16 * Since: 3.16
*/ */
gboolean void
gdk_gl_context_make_current (GdkGLContext *context) gdk_gl_context_make_current (GdkGLContext *context)
{ {
GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (context); GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (context);
g_return_val_if_fail (GDK_IS_GL_CONTEXT (context), FALSE); g_return_if_fail (GDK_IS_GL_CONTEXT (context));
return gdk_display_make_gl_context_current (gdk_window_get_display (priv->window), context); gdk_display_make_gl_context_current (gdk_window_get_display (priv->window), context);
} }
/** /**

View File

@ -48,7 +48,7 @@ GDK_AVAILABLE_IN_3_16
GdkWindow * gdk_gl_context_get_window (GdkGLContext *context); GdkWindow * gdk_gl_context_get_window (GdkGLContext *context);
GDK_AVAILABLE_IN_3_16 GDK_AVAILABLE_IN_3_16
gboolean gdk_gl_context_make_current (GdkGLContext *context); void gdk_gl_context_make_current (GdkGLContext *context);
GDK_AVAILABLE_IN_3_16 GDK_AVAILABLE_IN_3_16
GdkGLContext * gdk_gl_context_get_current (void); GdkGLContext * gdk_gl_context_get_current (void);
GDK_AVAILABLE_IN_3_16 GDK_AVAILABLE_IN_3_16

View File

@ -2887,13 +2887,14 @@ gdk_window_begin_paint_region (GdkWindow *window,
int wh = gdk_window_get_height (window) * gdk_window_get_scale_factor (window); int wh = gdk_window_get_height (window) * gdk_window_get_scale_factor (window);
context = gdk_window_get_paint_gl_context (window, NULL); context = gdk_window_get_paint_gl_context (window, NULL);
if (context == NULL || !gdk_gl_context_make_current (context)) if (context == NULL)
{ {
g_warning ("gl rendering failed, context: %p", context); g_warning ("gl rendering failed, context: %p", context);
window->current_paint.use_gl = FALSE; window->current_paint.use_gl = FALSE;
} }
else else
{ {
gdk_gl_context_make_current (context);
/* With gl we always need a surface to combine the gl /* With gl we always need a surface to combine the gl
drawing with the native drawing. */ drawing with the native drawing. */
needs_surface = TRUE; needs_surface = TRUE;
@ -3060,8 +3061,7 @@ gdk_window_end_paint (GdkWindow *window)
cairo_region_subtract (opaque_region, window->current_paint.flushed_region); cairo_region_subtract (opaque_region, window->current_paint.flushed_region);
cairo_region_subtract (opaque_region, window->current_paint.need_blend_region); cairo_region_subtract (opaque_region, window->current_paint.need_blend_region);
if (!gdk_gl_context_make_current (window->gl_paint_context)) gdk_gl_context_make_current (window->gl_paint_context);
g_error ("make current failed");
if (!cairo_region_is_empty (opaque_region)) if (!cairo_region_is_empty (opaque_region))
gdk_gl_texture_from_surface (window->current_paint.surface, gdk_gl_texture_from_surface (window->current_paint.surface,

View File

@ -41,8 +41,7 @@ gdk_wayland_gl_context_update (GdkGLContext *context)
GdkWindow *window = gdk_gl_context_get_window (context); GdkWindow *window = gdk_gl_context_get_window (context);
int width, height; int width, height;
if (!gdk_gl_context_make_current (context)) gdk_gl_context_make_current (context);
return;
width = gdk_window_get_width (window); width = gdk_window_get_width (window);
height = gdk_window_get_height (window); height = gdk_window_get_height (window);
@ -76,10 +75,12 @@ gdk_wayland_window_invalidate_for_new_frame (GdkWindow *window,
egl_surface = gdk_wayland_window_get_egl_surface (window->impl_window, egl_surface = gdk_wayland_window_get_egl_surface (window->impl_window,
context_wayland->egl_config); context_wayland->egl_config);
if (display_wayland->have_egl_buffer_age && if (display_wayland->have_egl_buffer_age)
gdk_gl_context_make_current (window->gl_paint_context)) {
eglQuerySurface (display_wayland->egl_display, egl_surface, gdk_gl_context_make_current (window->gl_paint_context);
EGL_BUFFER_AGE_EXT, &buffer_age); eglQuerySurface (display_wayland->egl_display, egl_surface,
EGL_BUFFER_AGE_EXT, &buffer_age);
}
invalidate_all = FALSE; invalidate_all = FALSE;
if (buffer_age == 0 || buffer_age >= 4) if (buffer_age == 0 || buffer_age >= 4)
@ -126,8 +127,7 @@ gdk_wayland_gl_context_flush_buffer (GdkGLContext *context,
GdkWaylandGLContext *context_wayland = GDK_WAYLAND_GL_CONTEXT (context); GdkWaylandGLContext *context_wayland = GDK_WAYLAND_GL_CONTEXT (context);
EGLSurface egl_surface; EGLSurface egl_surface;
if (!gdk_gl_context_make_current (context)) gdk_gl_context_make_current (context);
return;
egl_surface = gdk_wayland_window_get_egl_surface (window->impl_window, egl_surface = gdk_wayland_window_get_egl_surface (window->impl_window,
context_wayland->egl_config); context_wayland->egl_config);
@ -391,7 +391,7 @@ gdk_wayland_display_destroy_gl_context (GdkDisplay *display,
} }
} }
gboolean void
gdk_wayland_display_make_gl_context_current (GdkDisplay *display, gdk_wayland_display_make_gl_context_current (GdkDisplay *display,
GdkGLContext *context) GdkGLContext *context)
{ {
@ -404,7 +404,7 @@ gdk_wayland_display_make_gl_context_current (GdkDisplay *display,
{ {
eglMakeCurrent(display_wayland->egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, eglMakeCurrent(display_wayland->egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE,
EGL_NO_CONTEXT); EGL_NO_CONTEXT);
return TRUE; return;
} }
context_wayland = GDK_WAYLAND_GL_CONTEXT (context); context_wayland = GDK_WAYLAND_GL_CONTEXT (context);
@ -421,9 +421,7 @@ gdk_wayland_display_make_gl_context_current (GdkDisplay *display,
context_wayland->egl_config); context_wayland->egl_config);
} }
if (!eglMakeCurrent(display_wayland->egl_display, egl_surface, if (!eglMakeCurrent (display_wayland->egl_display, egl_surface,
egl_surface, context_wayland->egl_context)) egl_surface, context_wayland->egl_context))
return FALSE; g_critical ("eglMakeCurrent failed");
return TRUE;
} }

View File

@ -57,7 +57,7 @@ void gdk_wayland_window_invalidate_for_new_frame (GdkWindow
cairo_region_t *update_area); cairo_region_t *update_area);
void gdk_wayland_display_destroy_gl_context (GdkDisplay *display, void gdk_wayland_display_destroy_gl_context (GdkDisplay *display,
GdkGLContext *context); GdkGLContext *context);
gboolean gdk_wayland_display_make_gl_context_current (GdkDisplay *display, void gdk_wayland_display_make_gl_context_current (GdkDisplay *display,
GdkGLContext *context); GdkGLContext *context);
G_END_DECLS G_END_DECLS

View File

@ -96,8 +96,7 @@ gdk_x11_gl_context_update (GdkGLContext *context)
GdkWindow *window = gdk_gl_context_get_window (context); GdkWindow *window = gdk_gl_context_get_window (context);
int width, height; int width, height;
if (!gdk_gl_context_make_current (context)) gdk_gl_context_make_current (context);
return;
width = gdk_window_get_width (window); width = gdk_window_get_width (window);
height = gdk_window_get_height (window); height = gdk_window_get_height (window);
@ -155,10 +154,12 @@ gdk_x11_window_invalidate_for_new_frame (GdkWindow *window,
buffer_age = 0; buffer_age = 0;
if (display_x11->has_glx_buffer_age && if (display_x11->has_glx_buffer_age)
gdk_gl_context_make_current (window->gl_paint_context)) {
glXQueryDrawable(dpy, context_x11->drawable, gdk_gl_context_make_current (window->gl_paint_context);
GLX_BACK_BUFFER_AGE_EXT, &buffer_age); glXQueryDrawable(dpy, context_x11->drawable,
GLX_BACK_BUFFER_AGE_EXT, &buffer_age);
}
invalidate_all = FALSE; invalidate_all = FALSE;
if (buffer_age == 0 || buffer_age >= 4) if (buffer_age == 0 || buffer_age >= 4)
@ -826,7 +827,7 @@ gdk_x11_display_destroy_gl_context (GdkDisplay *display,
} }
} }
gboolean void
gdk_x11_display_make_gl_context_current (GdkDisplay *display, gdk_x11_display_make_gl_context_current (GdkDisplay *display,
GdkGLContext *context) GdkGLContext *context)
{ {
@ -839,14 +840,11 @@ gdk_x11_display_make_gl_context_current (GdkDisplay *display,
if (context == NULL) if (context == NULL)
{ {
glXMakeContextCurrent (dpy, None, None, NULL); glXMakeContextCurrent (dpy, None, None, NULL);
return TRUE; return;
} }
context_x11 = GDK_X11_GL_CONTEXT (context); context_x11 = GDK_X11_GL_CONTEXT (context);
if (context_x11->glx_context == NULL)
return FALSE;
window = gdk_gl_context_get_window (context); window = gdk_gl_context_get_window (context);
// If the WM is compositing there is no particular need to delay // If the WM is compositing there is no particular need to delay
@ -862,8 +860,6 @@ gdk_x11_display_make_gl_context_current (GdkDisplay *display,
g_print ("Making GLX context current to drawable %lu\n", g_print ("Making GLX context current to drawable %lu\n",
(unsigned long) context_x11->drawable)); (unsigned long) context_x11->drawable));
gdk_x11_display_error_trap_push (display);
glXMakeContextCurrent (dpy, context_x11->drawable, context_x11->drawable, glXMakeContextCurrent (dpy, context_x11->drawable, context_x11->drawable,
context_x11->glx_context); context_x11->glx_context);
@ -874,14 +870,6 @@ gdk_x11_display_make_gl_context_current (GdkDisplay *display,
else else
glXSwapIntervalSGI (0); glXSwapIntervalSGI (0);
} }
if (gdk_x11_display_error_trap_pop (display))
{
g_critical ("X Error received while calling glXMakeContextCurrent()");
return FALSE;
}
return TRUE;
} }
/** /**

View File

@ -66,7 +66,7 @@ void gdk_x11_window_invalidate_for_new_frame (GdkWindow
cairo_region_t *update_area); cairo_region_t *update_area);
void gdk_x11_display_destroy_gl_context (GdkDisplay *display, void gdk_x11_display_destroy_gl_context (GdkDisplay *display,
GdkGLContext *context); GdkGLContext *context);
gboolean gdk_x11_display_make_gl_context_current (GdkDisplay *display, void gdk_x11_display_make_gl_context_current (GdkDisplay *display,
GdkGLContext *context); GdkGLContext *context);
G_END_DECLS G_END_DECLS

View File

@ -219,15 +219,9 @@ gtk_gl_area_realize (GtkWidget *widget)
NULL); NULL);
if (priv->context != NULL) if (priv->context != NULL)
{ {
if (gdk_gl_context_make_current (priv->context)) gdk_gl_context_make_current (priv->context);
{ glGenFramebuffersEXT (1, &priv->framebuffer);
glGenFramebuffersEXT (1, &priv->framebuffer); glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, priv->framebuffer);
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, priv->framebuffer);
}
else
{
g_warning ("Unable to make new context current");
}
} }
} }
@ -239,8 +233,9 @@ gtk_gl_area_unrealize (GtkWidget *widget)
if (priv->context != NULL) if (priv->context != NULL)
{ {
if (priv->framebuffer != 0 && gtk_gl_area_make_current (self)) if (priv->framebuffer != 0)
{ {
gtk_gl_area_make_current (self);
/* Bind 0, which means render to back buffer, as a result, fb is unbound */ /* Bind 0, which means render to back buffer, as a result, fb is unbound */
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0); glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0);
glDeleteFramebuffersEXT (1, &priv->framebuffer); glDeleteFramebuffersEXT (1, &priv->framebuffer);
@ -276,8 +271,7 @@ gtk_gl_area_draw (GtkWidget *widget,
if (priv->context == NULL) if (priv->context == NULL)
return FALSE; return FALSE;
if (!gtk_gl_area_make_current (self)) gtk_gl_area_make_current (self);
return FALSE;
scale = gtk_widget_get_scale_factor (widget); scale = gtk_widget_get_scale_factor (widget);
w = gtk_widget_get_allocated_width (widget) * scale; w = gtk_widget_get_allocated_width (widget) * scale;
@ -332,8 +326,7 @@ gtk_gl_area_draw (GtkWidget *widget,
color_tex ? GL_TEXTURE : GL_RENDERBUFFER, color_tex ? GL_TEXTURE : GL_RENDERBUFFER,
scale, 0, 0, w, h); scale, 0, 0, w, h);
if (!gtk_gl_area_make_current (self)) gtk_gl_area_make_current (self);
g_error ("can't make old context current again");
} }
else else
{ {
@ -613,24 +606,20 @@ gtk_gl_area_get_context (GtkGLArea *area)
* #GtkGLArea::render signal, and should not be called by * #GtkGLArea::render signal, and should not be called by
* application code. * application code.
* *
* Returns: %TRUE if the context was associated successfully with
* the widget
*
* Since: 3.16 * Since: 3.16
*/ */
gboolean void
gtk_gl_area_make_current (GtkGLArea *area) gtk_gl_area_make_current (GtkGLArea *area)
{ {
GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (area); GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (area);
GtkWidget *widget; GtkWidget *widget;
g_return_val_if_fail (GTK_IS_GL_AREA (area), FALSE); g_return_if_fail (GTK_IS_GL_AREA (area));
widget = GTK_WIDGET (area); widget = GTK_WIDGET (area);
g_return_val_if_fail (gtk_widget_get_realized (widget), FALSE);
if (priv->context == NULL) g_return_if_fail (gtk_widget_get_realized (widget));
return FALSE;
return gdk_gl_context_make_current (priv->context); if (priv->context)
gdk_gl_context_make_current (priv->context);
} }

View File

@ -98,7 +98,7 @@ GDK_AVAILABLE_IN_3_16
GdkGLContext * gtk_gl_area_get_context (GtkGLArea *area); GdkGLContext * gtk_gl_area_get_context (GtkGLArea *area);
GDK_AVAILABLE_IN_3_16 GDK_AVAILABLE_IN_3_16
gboolean gtk_gl_area_make_current (GtkGLArea *area); void gtk_gl_area_make_current (GtkGLArea *area);
G_END_DECLS G_END_DECLS

View File

@ -292,12 +292,7 @@ gtk_gears_size_allocate (GtkWidget *widget,
if (gtk_widget_get_realized (widget)) if (gtk_widget_get_realized (widget))
{ {
if (!gtk_gl_area_make_current (glarea)) gtk_gl_area_make_current (glarea);
{
g_warning ("Unable to make gl context current");
return;
}
reshape (allocation->width, allocation->height); reshape (allocation->width, allocation->height);
} }
} }
@ -316,11 +311,7 @@ gtk_gears_realize (GtkWidget *widget)
GTK_WIDGET_CLASS (gtk_gears_parent_class)->realize (widget); GTK_WIDGET_CLASS (gtk_gears_parent_class)->realize (widget);
if (!gtk_gl_area_make_current (glarea)) gtk_gl_area_make_current (glarea);
{
g_warning ("Unable to make gl context current");
return;
}
glLightfv(GL_LIGHT0, GL_POSITION, pos); glLightfv(GL_LIGHT0, GL_POSITION, pos);
glEnable(GL_CULL_FACE); glEnable(GL_CULL_FACE);