123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- From 26d339b91744dab5135ee9ea1d46fda62448ad95 Mon Sep 17 00:00:00 2001
- From: Jan de Groot <jgc@archlinux.org>
- Date: Mon, 11 Apr 2016 14:00:33 +0000
- Subject: [PATCH] Initialize framebuffer objects early so clutter will not
- abort a few operations later.
- Checking offscreen for COGL_INVALID_HANDLE is not sufficient, as cogl_offscreen_new_with_texture doesn't initialize framebuffer objects but lets Cogl solve this the lazy way. cogl_offscreen_new_with_texture will never return COGL_INVALID_HANDLE anyways.
- ---
- src/st/st-theme-node-drawing.c | 35 +++++++++++++++++++++++------------
- src/st/st-theme-node-transition.c | 18 ++++++++++++++++--
- 2 files changed, 39 insertions(+), 14 deletions(-)
- 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..f3350a1 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->new_offscreen = COGL_INVALID_HANDLE;
- + g_return_val_if_fail (priv->new_offscreen != COGL_INVALID_HANDLE, FALSE);
- + }
-
- if (priv->material == NULL)
- {
- --
- 2.7.1
|