From 1341b889867238991f97394d0551fba444d84e4f Mon Sep 17 00:00:00 2001 From: Neo Xu Date: Wed, 7 Feb 2024 12:26:41 +0800 Subject: [PATCH] feat(draw_buf): use draw_buf as parameter of invalidate_cache API (#5602) Signed-off-by: Xu Xingliang --- src/draw/lv_draw_buf.c | 15 ++++++++++++-- src/draw/lv_draw_buf.h | 12 +++++------ src/draw/nxp/pxp/lv_draw_buf_pxp.c | 6 +++++- src/draw/nxp/pxp/lv_draw_pxp.c | 2 +- src/draw/nxp/pxp/lv_draw_pxp_layer.c | 2 +- src/draw/nxp/vglite/lv_draw_buf_vglite.c | 6 +++++- src/draw/nxp/vglite/lv_draw_vglite.c | 2 +- src/draw/nxp/vglite/lv_draw_vglite_label.c | 2 +- src/draw/nxp/vglite/lv_draw_vglite_layer.c | 2 +- src/draw/renesas/dave2d/lv_draw_dave2d.c | 16 ++++++++------- src/draw/vg_lite/lv_vg_lite_decoder.c | 18 ++--------------- src/drivers/nuttx/lv_nuttx_cache.c | 23 +++++++++------------- 12 files changed, 53 insertions(+), 53 deletions(-) diff --git a/src/draw/lv_draw_buf.c b/src/draw/lv_draw_buf.c index 2505eb83e..9132a5f3b 100644 --- a/src/draw/lv_draw_buf.c +++ b/src/draw/lv_draw_buf.c @@ -70,9 +70,20 @@ void * lv_draw_buf_align(void * data, lv_color_format_t color_format) else return NULL; } -void lv_draw_buf_invalidate_cache(void * buf, uint32_t stride, lv_color_format_t color_format, const lv_area_t * area) +void lv_draw_buf_invalidate_cache(lv_draw_buf_t * draw_buf, const lv_area_t * area) { - if(handlers.invalidate_cache_cb) handlers.invalidate_cache_cb(buf, stride, color_format, area); + if(handlers.invalidate_cache_cb) { + LV_ASSERT_NULL(draw_buf); + const lv_image_header_t * header = &draw_buf->header; + lv_area_t full; + if(area == NULL) { + full = (lv_area_t) { + 0, 0, header->w - 1, header->h - 1 + }; + area = &full; + } + handlers.invalidate_cache_cb(draw_buf, area); + } } void lv_draw_buf_clear(lv_draw_buf_t * draw_buf, const lv_area_t * a) diff --git a/src/draw/lv_draw_buf.h b/src/draw/lv_draw_buf.h index 2628412e2..23d3b19b3 100644 --- a/src/draw/lv_draw_buf.h +++ b/src/draw/lv_draw_buf.h @@ -73,8 +73,7 @@ typedef void (*lv_draw_buf_free_cb)(void * draw_buf); typedef void * (*lv_draw_buf_align_cb)(void * buf, lv_color_format_t color_format); -typedef void (*lv_draw_buf_invalidate_cache_cb)(void * buf, uint32_t stride, lv_color_format_t color_format, - const lv_area_t * area); +typedef void (*lv_draw_buf_invalidate_cache_cb)(lv_draw_buf_t * draw_buf, const lv_area_t * area); typedef uint32_t (*lv_draw_buf_width_to_stride_cb)(uint32_t w, lv_color_format_t color_format); @@ -112,12 +111,11 @@ void * lv_draw_buf_align(void * buf, lv_color_format_t color_format); /** * Invalidate the cache of the buffer - * @param buf a memory address to invalidate - * @param stride stride of the buffer - * @param color_format color format of the buffer - * @param area the area to invalidate in the buffer + * @param draw_buf the draw buffer needs to be invalidated + * @param area the area to invalidate in the buffer, + * use NULL to invalidate the whole draw buffer address range */ -void lv_draw_buf_invalidate_cache(void * buf, uint32_t stride, lv_color_format_t color_format, const lv_area_t * area); +void lv_draw_buf_invalidate_cache(lv_draw_buf_t * draw_buf, const lv_area_t * area); /** * Calculate the stride in bytes based on a width and color format diff --git a/src/draw/nxp/pxp/lv_draw_buf_pxp.c b/src/draw/nxp/pxp/lv_draw_buf_pxp.c index 7ba894e12..d28777517 100644 --- a/src/draw/nxp/pxp/lv_draw_buf_pxp.c +++ b/src/draw/nxp/pxp/lv_draw_buf_pxp.c @@ -58,8 +58,12 @@ void lv_draw_buf_pxp_init_handlers(void) * STATIC FUNCTIONS **********************/ -static void _invalidate_cache(void * buf, uint32_t stride, lv_color_format_t cf, const lv_area_t * area) +static void _invalidate_cache(lv_draw_buf_t * draw_buf, const lv_area_t * area) { + const lv_image_header_t * header = &draw_buf->header; + uint32_t stride = header->stride; + lv_color_format_t cf = header->cf; + if(area->y1 == 0) { uint16_t size = stride * lv_area_get_height(area); diff --git a/src/draw/nxp/pxp/lv_draw_pxp.c b/src/draw/nxp/pxp/lv_draw_pxp.c index 3bd0c8ba4..b8fd14cd8 100644 --- a/src/draw/nxp/pxp/lv_draw_pxp.c +++ b/src/draw/nxp/pxp/lv_draw_pxp.c @@ -380,7 +380,7 @@ static void _pxp_execute_drawing(lv_draw_pxp_unit_t * u) lv_area_move(&draw_area, -layer->buf_area.x1, -layer->buf_area.y1); /* Invalidate only the drawing area */ - lv_draw_buf_invalidate_cache(draw_buf->data, draw_buf->header.stride, draw_buf->header.cf, &draw_area); + lv_draw_buf_invalidate_cache(draw_buf, &draw_area); switch(t->type) { case LV_DRAW_TASK_TYPE_FILL: diff --git a/src/draw/nxp/pxp/lv_draw_pxp_layer.c b/src/draw/nxp/pxp/lv_draw_pxp_layer.c index ee474d721..28245f964 100644 --- a/src/draw/nxp/pxp/lv_draw_pxp_layer.c +++ b/src/draw/nxp/pxp/lv_draw_pxp_layer.c @@ -68,7 +68,7 @@ void lv_draw_pxp_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * d .x2 = draw_buf->header.w - 1, .y2 = draw_buf->header.h - 1 }; - lv_draw_buf_invalidate_cache(draw_buf->data, draw_buf->header.stride, draw_buf->header.cf, &area_to_draw); + lv_draw_buf_invalidate_cache(draw_buf, &area_to_draw); lv_draw_image_dsc_t new_draw_dsc = *draw_dsc; new_draw_dsc.src = draw_buf; diff --git a/src/draw/nxp/vglite/lv_draw_buf_vglite.c b/src/draw/nxp/vglite/lv_draw_buf_vglite.c index 393c9a6b2..041264472 100644 --- a/src/draw/nxp/vglite/lv_draw_buf_vglite.c +++ b/src/draw/nxp/vglite/lv_draw_buf_vglite.c @@ -90,8 +90,12 @@ static void * _buf_align(void * buf, lv_color_format_t cf) return buf_u8; } -static void _invalidate_cache(void * buf, uint32_t stride, lv_color_format_t cf, const lv_area_t * area) +static void _invalidate_cache(lv_draw_buf_t * draw_buf, const lv_area_t * area) { + const lv_image_header_t * header = &draw_buf->header; + uint32_t stride = header->stride; + lv_color_format_t cf = header->cf; + if(area->y1 == 0) { uint16_t size = stride * lv_area_get_height(area); diff --git a/src/draw/nxp/vglite/lv_draw_vglite.c b/src/draw/nxp/vglite/lv_draw_vglite.c index f701f6800..fc36a3035 100644 --- a/src/draw/nxp/vglite/lv_draw_vglite.c +++ b/src/draw/nxp/vglite/lv_draw_vglite.c @@ -352,7 +352,7 @@ static void _vglite_execute_drawing(lv_draw_vglite_unit_t * u) return; /*Fully clipped, nothing to do*/ /* Invalidate the drawing area */ - lv_draw_buf_invalidate_cache(draw_buf->data, draw_buf->header.stride, draw_buf->header.cf, &draw_area); + lv_draw_buf_invalidate_cache(draw_buf, &draw_area); /* Set scissor area */ vglite_set_scissor(&clip_area); diff --git a/src/draw/nxp/vglite/lv_draw_vglite_label.c b/src/draw/nxp/vglite/lv_draw_vglite_label.c index 3655f26d9..9c9dbe4a9 100644 --- a/src/draw/nxp/vglite/lv_draw_vglite_label.c +++ b/src/draw/nxp/vglite/lv_draw_vglite_label.c @@ -134,7 +134,7 @@ static void _draw_vglite_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t /* Set vgmatrix. */ vglite_set_translation_matrix(&blend_area); - lv_draw_buf_invalidate_cache((void *)mask_buf, mask_stride, LV_COLOR_FORMAT_A8, &mask_area); + lv_draw_buf_invalidate_cache(draw_buf, &mask_area); _vglite_draw_letter(&mask_area, glyph_draw_dsc->color, glyph_draw_dsc->opa); } diff --git a/src/draw/nxp/vglite/lv_draw_vglite_layer.c b/src/draw/nxp/vglite/lv_draw_vglite_layer.c index 3a46a142c..65283d0e2 100644 --- a/src/draw/nxp/vglite/lv_draw_vglite_layer.c +++ b/src/draw/nxp/vglite/lv_draw_vglite_layer.c @@ -68,7 +68,7 @@ void lv_draw_vglite_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t .x2 = draw_buf->header.w - 1, .y2 = draw_buf->header.h - 1 }; - lv_draw_buf_invalidate_cache(draw_buf->data, draw_buf->header.stride, draw_buf->header.cf, &area_to_draw); + lv_draw_buf_invalidate_cache(draw_buf, &area_to_draw); lv_draw_image_dsc_t new_draw_dsc = *draw_dsc; new_draw_dsc.src = draw_buf; diff --git a/src/draw/renesas/dave2d/lv_draw_dave2d.c b/src/draw/renesas/dave2d/lv_draw_dave2d.c index 029a1b5a2..c792c2e8e 100644 --- a/src/draw/renesas/dave2d/lv_draw_dave2d.c +++ b/src/draw/renesas/dave2d/lv_draw_dave2d.c @@ -28,10 +28,9 @@ static void execute_drawing(lv_draw_dave2d_unit_t * u); #if defined(RENESAS_CORTEX_M85) -#if (BSP_CFG_DCACHE_ENABLED) -static void _dave2d_buf_invalidate_cache_cb(void * buf, uint32_t stride, lv_color_format_t color_format, - const lv_area_t * area); -#endif + #if (BSP_CFG_DCACHE_ENABLED) + static void _dave2d_buf_invalidate_cache_cb(lv_draw_buf_t * draw_buf, const lv_area_t * area); + #endif #endif static int32_t _dave2d_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); @@ -123,9 +122,12 @@ static void lv_draw_buf_dave2d_init_handlers(void) #if defined(RENESAS_CORTEX_M85) #if (BSP_CFG_DCACHE_ENABLED) -static void _dave2d_buf_invalidate_cache_cb(void * buf, uint32_t stride, lv_color_format_t color_format, - const lv_area_t * area) +static void _dave2d_buf_invalidate_cache_cb(lv_draw_buf_t * draw_buf, const lv_area_t * area) { + const lv_image_header_t * header = &draw_buf->header; + uint32_t stride = header->stride; + lv_color_format_t cf = header->cf; + uint8_t * address = buf; int32_t i = 0; uint32_t bytes_per_pixel = lv_color_format_get_size(color_format); @@ -473,7 +475,7 @@ static void execute_drawing(lv_draw_dave2d_unit_t * u) lv_area_move(&clipped_area, x, y); /* Invalidate cache */ - lv_draw_buf_invalidate_cache(layer->draw_buf->data, layer->draw_buf->header.stride, layer->color_format, &clipped_area); + lv_draw_buf_invalidate_cache(layer->draw_buf, &clipped_area); #endif #endif diff --git a/src/draw/vg_lite/lv_vg_lite_decoder.c b/src/draw/vg_lite/lv_vg_lite_decoder.c index f0312ef1a..e575b3970 100644 --- a/src/draw/vg_lite/lv_vg_lite_decoder.c +++ b/src/draw/vg_lite/lv_vg_lite_decoder.c @@ -44,9 +44,6 @@ static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_d static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); static void decoder_cache_free(lv_image_cache_data_t * cached_data, void * user_data); static void image_color32_pre_mul(lv_color32_t * img_data, uint32_t px_size); -static void image_invalidate_cache(void * buf, uint32_t stride, - uint32_t width, uint32_t height, - lv_color_format_t cf); /********************** * STATIC VARIABLES @@ -92,16 +89,6 @@ static void image_color32_pre_mul(lv_color32_t * img_data, uint32_t px_size) } } -static void image_invalidate_cache(void * buf, uint32_t stride, - uint32_t width, uint32_t height, - lv_color_format_t cf) -{ - width = lv_vg_lite_width_align(width); - lv_area_t image_area; - lv_area_set(&image_area, 0, 0, width - 1, height - 1); - lv_draw_buf_invalidate_cache(buf, stride, cf, &image_area); -} - static uint32_t image_stride(const lv_image_header_t * header) { /* use stride in header */ @@ -250,8 +237,7 @@ static lv_result_t decoder_open_variable(lv_image_decoder_t * decoder, lv_image_ } /* invalidate D-Cache */ - image_invalidate_cache(draw_buf->data, dest_stride, width, height, DEST_IMG_FORMAT); - + lv_draw_buf_invalidate_cache(draw_buf, NULL); LV_LOG_INFO("image %p (W%" LV_PRId32 " x H%" LV_PRId32 ", buffer: %p, cf: %d) decode finish", image_data, width, height, draw_buf->data, src_cf); @@ -349,7 +335,7 @@ static lv_result_t decoder_open_file(lv_image_decoder_t * decoder, lv_image_deco lv_fs_close(&file); /* invalidate D-Cache */ - image_invalidate_cache(draw_buf->data, dest_stride, width, height, src_header.cf); + lv_draw_buf_invalidate_cache(draw_buf, NULL); LV_LOG_INFO("image %s (W%" LV_PRId32 " x H%" LV_PRId32 ", buffer: %p cf: %d) decode finish", path, width, height, draw_buf->data, src_header.cf); diff --git a/src/drivers/nuttx/lv_nuttx_cache.c b/src/drivers/nuttx/lv_nuttx_cache.c index 173ad5428..832377e91 100644 --- a/src/drivers/nuttx/lv_nuttx_cache.c +++ b/src/drivers/nuttx/lv_nuttx_cache.c @@ -26,7 +26,7 @@ * STATIC PROTOTYPES **********************/ -static void invalidate_cache(void * buf, uint32_t stride, lv_color_format_t color_format, const lv_area_t * area); +static void invalidate_cache(lv_draw_buf_t * draw_buf, const lv_area_t * area); /********************** * STATIC VARIABLES @@ -50,24 +50,19 @@ void lv_nuttx_cache_init(void) * STATIC FUNCTIONS **********************/ -static void invalidate_cache(void * buf, uint32_t stride, lv_color_format_t color_format, const lv_area_t * area) +static void invalidate_cache(lv_draw_buf_t * draw_buf, const lv_area_t * area) { - LV_UNUSED(color_format); - LV_ASSERT_NULL(buf); + LV_ASSERT_NULL(draw_buf); + void * buf = draw_buf->data; + uint32_t stride = draw_buf->header.stride; + lv_color_format_t cf = draw_buf->header.cf; lv_uintptr_t start; lv_uintptr_t end; - if(area) { - int32_t h = lv_area_get_height(area); - start = (lv_uintptr_t)buf + area->y1 * stride; - end = start + h * stride; - } - else { - /* If area is empty, use stride as length */ - start = (lv_uintptr_t)buf; - end = start + stride; - } + int32_t h = lv_area_get_height(area); + start = (lv_uintptr_t)buf + area->y1 * stride; + end = start + h * stride; LV_UNUSED(start); LV_UNUSED(end);