lvgl / lvgl

Embedded graphics library to create beautiful UIs for any MCU, MPU and display type.

Home Page:https://lvgl.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Is it possible to access the draw buffer directly without using lv_display_set_flush_cb?

M1NGS opened this issue · comments

commented

Introduce the problem

LVGL 9.3.0(master)

such as

...
disp = lv_display_create(640, 480);
//lv_display_set_flush_cb(disp, flush_cb);
lv_indev_set_display(indev, disp);
lv_display_set_color_format(disp, LV_COLOR_FORMAT_ARGB8888);
lv_display_set_buffers(disp, buf, NULL, buf_size, LV_DISPLAY_RENDER_MODE_DIRECT);
while(1)
{
    lv_tick_inc(33);
    lv_timer_handler();
    SDL_UpdateTexture(menu, NULL, buf, 640 * 4);
    lv_display_flush_ready(disp);
    ...
}

I tried it, and it gets stuck in lv_timer_handler when the display has input events or animations are running.
The reason I don't use callbacks is simply to keep the code simple and intuitive enough. If this is not feasible, it doesn't matter. I just want to explore some possibilities. Thank you guys so much.

BTW, can lv_indev also be achieved through non-callback methods? I didn't find the relevant API.

Proposal

No response

commented

@kisvegabor Can I create this pull request to implement flushing display buffer without callback?

diff --git a/src/core/lv_refr.c b/src/core/lv_refr.c
index 33aed28aa..86a2976b6 100644
--- a/src/core/lv_refr.c
+++ b/src/core/lv_refr.c
@@ -1260,6 +1260,9 @@ static void draw_buf_flush(lv_display_t * disp)
     if(disp->flush_cb) {
         call_flush_cb(disp, &disp->refreshed_area, layer->draw_buf->data);
     }
+    else {
+        lv_display_flush_ready(disp);
+    }
     /*If there are 2 buffers swap them. With direct mode swap only on the last area*/
     if(lv_display_is_double_buffered(disp) && (disp->render_mode != LV_DISPLAY_RENDER_MODE_DIRECT || flushing_last)) {
         if(disp->buf_act == disp->buf_1) {