Is it possible to access the draw buffer directly without using lv_display_set_flush_cb?
M1NGS opened this issue · comments
M1NG 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
M1NG 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) {