diff --git a/src/draw/vg_lite/lv_draw_vg_lite_fill.c b/src/draw/vg_lite/lv_draw_vg_lite_fill.c index d0fd89aaec..37cb372e8d 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite_fill.c +++ b/src/draw/vg_lite/lv_draw_vg_lite_fill.c @@ -58,6 +58,14 @@ void lv_draw_vg_lite_fill(lv_draw_task_t * t, const lv_draw_fill_dsc_t * dsc, co vg_lite_matrix_t matrix = u->global_matrix; + /* Improve GPU rendering efficiency using simpler fill modes */ + if(dsc->radius == 0 && dsc->opa >= LV_OPA_MAX && dsc->grad.dir == LV_GRAD_DIR_NONE && + lv_matrix_is_identity((lv_matrix_t *)&matrix)) { + lv_vg_lite_clear(&u->target_buffer, &clip_area, lv_vg_lite_color(dsc->color, LV_OPA_COVER, false)); + LV_PROFILER_DRAW_END; + return; + } + lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); lv_vg_lite_path_set_quality(path, dsc->radius == 0 ? VG_LITE_LOW : VG_LITE_HIGH); lv_vg_lite_path_set_bounding_box_area(path, &clip_area); diff --git a/src/draw/vg_lite/lv_draw_vg_lite_vector.c b/src/draw/vg_lite/lv_draw_vg_lite_vector.c index 0698a7ec76..3799560ee3 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite_vector.c +++ b/src/draw/vg_lite/lv_draw_vg_lite_vector.c @@ -276,15 +276,7 @@ static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vec /* clear area */ if(!path) { vg_lite_color_t c = lv_color32_to_vg(dsc->fill_dsc.color, OPA_MIX(dsc->fill_dsc.opa, u->task_act->opa)); - vg_lite_rectangle_t rect; - lv_vg_lite_rect(&rect, &scissor_area); - LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_clear"); - LV_VG_LITE_CHECK_ERROR(vg_lite_clear(&u->target_buffer, &rect, c), { - lv_vg_lite_buffer_dump_info(&u->target_buffer); - LV_LOG_ERROR("rect: X%d Y%d W%d H%d", rect.x, rect.y, rect.width, rect.height); - lv_vg_lite_color_dump_info(c); - }); - LV_PROFILER_DRAW_END_TAG("vg_lite_clear"); + lv_vg_lite_clear(&u->target_buffer, &scissor_area, c); LV_PROFILER_DRAW_END; return; } diff --git a/src/draw/vg_lite/lv_vg_lite_utils.h b/src/draw/vg_lite/lv_vg_lite_utils.h index 4ecc82bb80..27804849d2 100644 --- a/src/draw/vg_lite/lv_vg_lite_utils.h +++ b/src/draw/vg_lite/lv_vg_lite_utils.h @@ -293,6 +293,19 @@ static inline void lv_vg_lite_blit_rect(vg_lite_buffer_t * target, LV_PROFILER_DRAW_END_TAG("vg_lite_blit_rect"); } +static inline void lv_vg_lite_clear(vg_lite_buffer_t * target, const lv_area_t * area, vg_lite_color_t color) +{ + vg_lite_rectangle_t rect; + lv_vg_lite_rect(&rect, area); + LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_clear"); + LV_VG_LITE_CHECK_ERROR(vg_lite_clear(target, &rect, color), { + lv_vg_lite_buffer_dump_info(target); + LV_LOG_ERROR("rect: X%d Y%d W%d H%d", rect.x, rect.y, rect.width, rect.height); + lv_vg_lite_color_dump_info(color); + }); + LV_PROFILER_DRAW_END_TAG("vg_lite_clear"); +} + /********************** * MACROS **********************/