evas_clip: do not set clip->changed to true
authorShinwoo Kim <cinoo.kim@samsung.com>
Mon, 28 Jan 2019 05:49:02 +0000 (14:49 +0900)
committerTaehyub Kim <taehyub.kim@samsung.com>
Thu, 31 Jan 2019 02:05:21 +0000 (11:05 +0900)
Summary:
[Issuse]
The issue solved by this commit occurs with 'export EVAS_GL_PARTIAL_DISABLE=0'.

The _efl_canvas_object_clip_set set clip->changed to true, but did not add the
clip object to e->pending_objects. So there is no chance to reset it to false.
(Please refer to evas_render_object_recalc.)

The clip->changed is always ture so its clipees cannot change its 'changed'
to true.  Because if 'changed' is true, evas_object_change returns before
calling evas_object_change for its clipees. (Please see evas_object_change.)
So 'changed' of clipees is false always, and clipees cannot call render_pre
in _evas_render_phase1_direct, and eglSwapBuffersWithDamage is not called.
This caused rendering issue.

This could be rare case. The _efl_canvas_object_clip_set is called when the
clipper and its clipees are out of view.

[Solution]
I would like to explain why removing line setting clip->changed to true makes
sense. First, the following commit added line setting clip->changed to true.

(1) committ 5e8d46e884930f109a28147cda4ce002e6836017
    Author: Carsten Haitzler <raster@rasterman.com>
    Date:   Wed Sep 22 04:37:51 2004 +0000

        clip bug fix :)

And following commit removed line calling evas_damage_rectangle_add which is
part of commit (1) above.

(2) commit 8767a80b0dbda4e2c3a6b2a41a04bf35f43a3ed1
    Author: Carsten Haitzler (Rasterman) <raster@rasterman.com>
    Date:   Wed Apr 16 16:14:16 2014 +0900

        fix overdraw issue in evas when clips change

Between above two commits, another commit calling evas_object_change(clip) was
added. This commit sets clip->changed to ture, and adds clip object to
e->pending_objects by evas_object_change -> evas_render_object_recalc.

(3) commit 4aca7949f581eaaf943785759b542acd8fc6794c
    Author: Carsten Haitzler <raster@rasterman.com>
    Date:   Wed Nov 2 04:03:55 2005 +0000

        fix excess overdraw bug

So we do not need the remains of commit (1). REMOVE!! :-]

Reviewers: raster, Hermet, jypark

Reviewed By: Hermet

Subscribers: cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D7767

src/lib/evas/canvas/evas_clip.c

index 54c021f..b4af44e 100644 (file)
@@ -353,22 +353,6 @@ _efl_canvas_object_clip_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Ob
      }
 
    /* clip me */
-   if ((!clip->clip.clipees) && (clip->cur->visible))
-     {
-        /* Basically it just went invisible */
-        clip->changed = 1;
-        e = clip->layer->evas;
-        e->changed = 1;
-/* i know this was to handle a case where a clip starts having children and
- * stops being a solid colored box - no one ever does that... they hide the clp
- * so dont add damages
-        evas_damage_rectangle_add(e->evas,
-                                  clip->cur->geometry.x + e->framespace.x,
-                                  clip->cur->geometry.y + e->framespace.y,
-                                  clip->cur->geometry.w, clip->cur->geometry.h);
- */
-     }
-
    EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
      state_write->clipper = clip;
    EINA_COW_STATE_WRITE_END(obj, state_write, cur);