Description
I use LVGL to display an OSD over a video. The majority of the time i just have simple fullscreen (1080p) lv_canvas displaying a DRM_FORMAT_ARGB8888 formatted image. Only on user input i switch to the OSD screen to have user interaction.
Background Info (not really important i think): The image is constantly updated from a third party application. I directly mapped the output buffer of the third party application to the lv_canvas draw buffer:
lv_canvas_set_buffer(canvas, shm_data, lv_display_get_horizontal_resolution(NULL), lv_display_get_vertical_resolution(NULL), LV_COLOR_FORMAT_ARGB8888);
All this works as expected. I see the live video and the transparent image with it’s contents. The image upate loop runs at 10 FPS.
However this spends a whole CPU core in argb8888_image_blend()
which is completly unnecessary for my use case, see below.
What MCU/Processor/Board and compiler are you using?
Linux DRM
What LVGL version are you using?
master
What do you want to achieve?
I it possible to bypass argb8888_image_blend()
and simply reley on the already existing image data ?
All this pixel by pixel work through in argb8888_image_blend()
is uneeded work for this usecase.
What have you tried so far?
I already tried this which brings the CPU load down by 80% but i assume this will break other things.
diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c b/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c
index fc063b277..691a8dcf8 100644
--- a/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c
+++ b/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c
@@ -6,6 +6,7 @@
/*********************
* INCLUDES
*********************/
+#include <string.h>
#include "lv_draw_sw_blend_to_argb8888.h"
#if LV_USE_DRAW_SW
@@ -880,6 +881,9 @@ static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_ds
int32_t x;
int32_t y;
+ memcpy(dest_buf_c32,src_buf_c32, h * dest_stride);
+ return;
+
if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) {
if(mask_buf == NULL && opa >= LV_OPA_MAX) {
if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888(dsc)) {