evas vg: fix a regression bug in caching logic. 38/198638/1
authorHermet Park <hermetpark@gmail.com>
Mon, 28 Jan 2019 08:27:20 +0000 (17:27 +0900)
committerHermet Park <hermetpark@gmail.com>
Mon, 28 Jan 2019 08:31:03 +0000 (17:31 +0900)
drop previous cached surface if new caching surface is coming,
Now, evas vg could keep only 1 surface cache ignoring size.

Change-Id: I0144cbe1fac839e82d730370f27dca3e7b878688

src/lib/evas/canvas/efl_canvas_vg_object.c

index 0d1104b..5ba8265 100644 (file)
@@ -620,6 +620,10 @@ _cache_vg_entry_render(Evas_Object_Protected_Data *obj,
               size.h = h;
           }
 
+        //Size is changed, cached data is invalid.
+        if ((size.w != vg_entry->w) || (size.h != vg_entry->h))
+          drop_cache = EINA_TRUE;
+
         vg_entry = evas_cache_vg_entry_resize(vg_entry, size.w, size.h);
         evas_cache_vg_entry_del(pd->vg_entry);
         pd->vg_entry = vg_entry;
@@ -632,21 +636,21 @@ _cache_vg_entry_render(Evas_Object_Protected_Data *obj,
         w = size.w;
         h = size.h;
 
-        //Size is changed, cached data is invalid.
-        drop_cache = EINA_TRUE;
      }
    root = evas_cache_vg_tree_get(vg_entry, pd->frame_idx);
    if (!root) return;
 
    if (cacheable)
      {
+        //if the size doesn't match, drop previous cache surface.
         if (drop_cache)
-          {
-             //if the size doesn't match, drop previous cache surface.
-             ENFN->ector_surface_cache_drop(engine, (void *) root);
-          }
+          ENFN->ector_surface_cache_drop(engine, (void *) root);
+        //Cache Hit!
         else if (pd->frame_idx == pd->cached_frame_idx)
           buffer = ENFN->ector_surface_cache_get(engine, (void *) root);
+        //Drop invalid one.
+        else
+          ENFN->ector_surface_cache_drop(engine, (void *) root);
      }
 
    if (!buffer)