diff --git a/src/st/st-theme-node-drawing.c b/src/st/st-theme-node-drawing.c index 1f28ed9..4a6a234 100644 --- a/src/st/st-theme-node-drawing.c +++ b/src/st/st-theme-node-drawing.c @@ -2247,22 +2247,33 @@ st_theme_node_prerender_shadow (StThemeNodePaintState *state) COGL_TEXTURE_NO_SLICING, COGL_PIXEL_FORMAT_ANY); if (buffer != COGL_INVALID_HANDLE) - offscreen = cogl_offscreen_new_with_texture (buffer); - - if (offscreen != COGL_INVALID_HANDLE) { - ClutterActorBox box = { 0, 0, state->box_shadow_width, state->box_shadow_height}; + CoglError *error = NULL; + + offscreen = cogl_offscreen_new_with_texture (buffer); + + if (cogl_framebuffer_allocate (COGL_FRAMEBUFFER (offscreen), &error)) + { + ClutterActorBox box = { 0, 0, state->box_shadow_width, state->box_shadow_height}; + + cogl_framebuffer_orthographic (offscreen, 0, 0, + state->box_shadow_width, + state->box_shadow_height, 0, 1.0); + cogl_framebuffer_clear4f (offscreen, COGL_BUFFER_BIT_COLOR, 0, 0, 0, 0); - cogl_framebuffer_orthographic (offscreen, 0, 0, - state->box_shadow_width, - state->box_shadow_height, 0, 1.0); - cogl_framebuffer_clear4f (offscreen, COGL_BUFFER_BIT_COLOR, 0, 0, 0, 0); + st_theme_node_paint_borders (state, offscreen, &box, 0xFF); - st_theme_node_paint_borders (state, offscreen, &box, 0xFF); - cogl_handle_unref (offscreen); + cogl_handle_unref (offscreen); - state->box_shadow_pipeline = _st_create_shadow_pipeline (st_theme_node_get_box_shadow (node), - buffer); + state->box_shadow_pipeline = _st_create_shadow_pipeline (st_theme_node_get_box_shadow (node), + buffer); + } + else + { + cogl_handle_unref (offscreen); + + cogl_error_free (error); + } } if (buffer != COGL_INVALID_HANDLE) diff --git a/src/st/st-theme-node-transition.c b/src/st/st-theme-node-transition.c index 1eef17b..3fef16d 100644 --- a/src/st/st-theme-node-transition.c +++ b/src/st/st-theme-node-transition.c @@ -242,6 +242,8 @@ setup_framebuffers (StThemeNodeTransition *transition, StThemeNodeTransitionPrivate *priv = transition->priv; guint width, height; + CoglError *catch_error = NULL; + /* template material to avoid unnecessary shader compilation */ static CoglHandle material_template = COGL_INVALID_HANDLE; @@ -269,13 +271,25 @@ setup_framebuffers (StThemeNodeTransition *transition, if (priv->old_offscreen) cogl_handle_unref (priv->old_offscreen); priv->old_offscreen = cogl_offscreen_new_with_texture (priv->old_texture); + if (!cogl_framebuffer_allocate (COGL_FRAMEBUFFER (priv->old_offscreen), &catch_error)) + { + cogl_object_unref (priv->old_offscreen); + cogl_error_free (catch_error); + priv->old_offscreen = COGL_INVALID_HANDLE; + g_return_val_if_fail (priv->old_offscreen != COGL_INVALID_HANDLE, FALSE); + } if (priv->new_offscreen) cogl_handle_unref (priv->new_offscreen); priv->new_offscreen = cogl_offscreen_new_with_texture (priv->new_texture); - g_return_val_if_fail (priv->old_offscreen != COGL_INVALID_HANDLE, FALSE); - g_return_val_if_fail (priv->new_offscreen != COGL_INVALID_HANDLE, FALSE); + if (!cogl_framebuffer_allocate (COGL_FRAMEBUFFER (priv->new_offscreen), &catch_error)) + { + cogl_object_unref (priv->new_offscreen); + cogl_error_free (catch_error); + priv->old_offscreen = COGL_INVALID_HANDLE; + g_return_val_if_fail (priv->new_offscreen != COGL_INVALID_HANDLE, FALSE); + } if (priv->material == NULL) {