clutter/offscreen-effect: Clear offscreen when pre-paint fails
Some ClutterOffscreenEffect subclasses, such as ClutterBrightnessContrastEffect, early-return FALSE in pre-paint before chaining up. It's an important optimization that avoids creating or updating the offscreen framebuffer. However, if an offscreen framebuffer already exists by the time pre-paint fails, it will be used *without* repaint the actor over it. That causes an old picture of the actor to be displayed. Fix that by always clearing the offscreen framebuffer when pre-paint fails. Fixes https://gitlab.gnome.org/GNOME/mutter/issues/810 https://gitlab.gnome.org/GNOME/mutter/merge_requests/992
This commit is contained in:
parent
bf594e9fb6
commit
64685f4b20
@ -474,10 +474,17 @@ clutter_offscreen_effect_paint (ClutterEffect *effect,
|
|||||||
*/
|
*/
|
||||||
if (priv->offscreen == NULL || (flags & CLUTTER_EFFECT_PAINT_ACTOR_DIRTY))
|
if (priv->offscreen == NULL || (flags & CLUTTER_EFFECT_PAINT_ACTOR_DIRTY))
|
||||||
{
|
{
|
||||||
/* Chain up to the parent paint method which will call the pre and
|
ClutterEffectClass *effect_class = CLUTTER_EFFECT_GET_CLASS (effect);
|
||||||
post paint functions to update the image */
|
gboolean pre_paint_succeeded;
|
||||||
CLUTTER_EFFECT_CLASS (clutter_offscreen_effect_parent_class)->
|
|
||||||
paint (effect, paint_context, flags);
|
pre_paint_succeeded = effect_class->pre_paint (effect, paint_context);
|
||||||
|
|
||||||
|
clutter_actor_continue_paint (priv->actor, paint_context);
|
||||||
|
|
||||||
|
if (pre_paint_succeeded)
|
||||||
|
effect_class->post_paint (effect, paint_context);
|
||||||
|
else
|
||||||
|
g_clear_pointer (&priv->offscreen, cogl_object_unref);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
clutter_offscreen_effect_paint_texture (self, paint_context);
|
clutter_offscreen_effect_paint_texture (self, paint_context);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user