Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
M1NGS opened this issue Nov 15, 2024 · 1 comment

Comments

@M1NGS
Copy link

M1NGS commented Nov 15, 2024

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

@M1NGS M1NGS changed the title Is it possible to access the drawing buffer directly without using lv_display_set_flush_cb? Is it possible to access the draw buffer directly without using lv_display_set_flush_cb? Nov 15, 2024
@M1NGS
Copy link
Author

M1NGS commented Nov 18, 2024

@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) {

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant