diff --git a/src/draw/vg_lite/lv_vg_lite_pending.c b/src/draw/vg_lite/lv_vg_lite_pending.c index 044417207a..bacc5932dd 100644 --- a/src/draw/vg_lite/lv_vg_lite_pending.c +++ b/src/draw/vg_lite/lv_vg_lite_pending.c @@ -20,7 +20,9 @@ **********************/ struct _lv_vg_lite_pending_t { - lv_array_t objs; + lv_array_t * arr_act; + lv_array_t arr_1; + lv_array_t arr_2; lv_vg_lite_pending_free_cb_t free_cb; void * user_data; }; @@ -45,7 +47,9 @@ lv_vg_lite_pending_t * lv_vg_lite_pending_create(size_t obj_size, uint32_t capac { lv_vg_lite_pending_t * pending = lv_malloc_zeroed(sizeof(lv_vg_lite_pending_t)); LV_ASSERT_MALLOC(pending); - lv_array_init(&pending->objs, capacity_default, obj_size); + lv_array_init(&pending->arr_1, capacity_default, obj_size); + lv_array_init(&pending->arr_2, capacity_default, obj_size); + pending->arr_act = &pending->arr_1; return pending; } @@ -53,7 +57,8 @@ void lv_vg_lite_pending_destroy(lv_vg_lite_pending_t * pending) { LV_ASSERT_NULL(pending); lv_vg_lite_pending_remove_all(pending); - lv_array_deinit(&pending->objs); + lv_array_deinit(&pending->arr_1); + lv_array_deinit(&pending->arr_2); lv_memzero(pending, sizeof(lv_vg_lite_pending_t)); lv_free(pending); } @@ -71,7 +76,7 @@ void lv_vg_lite_pending_add(lv_vg_lite_pending_t * pending, void * obj) { LV_ASSERT_NULL(pending); LV_ASSERT_NULL(obj); - lv_array_push_back(&pending->objs, obj); + lv_array_push_back(pending->arr_act, obj); } void lv_vg_lite_pending_remove_all(lv_vg_lite_pending_t * pending) @@ -79,17 +84,23 @@ void lv_vg_lite_pending_remove_all(lv_vg_lite_pending_t * pending) LV_ASSERT_NULL(pending); LV_ASSERT_NULL(pending->free_cb); - uint32_t size = lv_array_size(&pending->objs); + uint32_t size = lv_array_size(pending->arr_act); if(size == 0) { return; } /* remove all the pending objects */ for(uint32_t i = 0; i < size; i++) { - pending->free_cb(lv_array_at(&pending->objs, i), pending->user_data); + pending->free_cb(lv_array_at(pending->arr_act, i), pending->user_data); } - lv_array_clear(&pending->objs); + lv_array_clear(pending->arr_act); +} + +void lv_vg_lite_pending_swap(lv_vg_lite_pending_t * pending) +{ + lv_vg_lite_pending_remove_all(pending); + pending->arr_act = (pending->arr_act == &pending->arr_1) ? &pending->arr_2 : &pending->arr_1; } /********************** diff --git a/src/draw/vg_lite/lv_vg_lite_pending.h b/src/draw/vg_lite/lv_vg_lite_pending.h index 8def9dcf55..334daf843b 100644 --- a/src/draw/vg_lite/lv_vg_lite_pending.h +++ b/src/draw/vg_lite/lv_vg_lite_pending.h @@ -65,11 +65,17 @@ void lv_vg_lite_pending_set_free_cb(lv_vg_lite_pending_t * pending, lv_vg_lite_p void lv_vg_lite_pending_add(lv_vg_lite_pending_t * pending, void * obj); /** - * Remove all objects from the pending list + * Remove all objects from the active pending list * @param pending pointer to the pending list */ void lv_vg_lite_pending_remove_all(lv_vg_lite_pending_t * pending); +/** + * Rremove all old objects reference and swap new objects reference + * @param pending pointer to the pending list + */ +void lv_vg_lite_pending_swap(lv_vg_lite_pending_t * pending); + /********************** * MACROS **********************/ diff --git a/src/draw/vg_lite/lv_vg_lite_utils.c b/src/draw/vg_lite/lv_vg_lite_utils.c index 8c69879c8d..e2556f4a7f 100644 --- a/src/draw/vg_lite/lv_vg_lite_utils.c +++ b/src/draw/vg_lite/lv_vg_lite_utils.c @@ -1315,6 +1315,14 @@ void lv_vg_lite_flush(struct _lv_draw_vg_lite_unit_t * u) #endif LV_VG_LITE_CHECK_ERROR(vg_lite_flush(), {}); + + /* Rremove all old caches reference and swap new caches reference */ + if(u->grad_pending) { + lv_vg_lite_pending_swap(u->grad_pending); + } + + lv_vg_lite_pending_swap(u->image_dsc_pending); + u->flush_count = 0; LV_PROFILER_DRAW_END; }