1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-28 07:03:00 +08:00

perf(refresh) optimize where to wait for lv_disp_flush_ready with 2 buffers

This commit is contained in:
Gabor Kiss-Vamosi 2021-06-04 20:23:10 +02:00
parent 38ebcd8154
commit d0172f14a4

View File

@ -488,8 +488,12 @@ static void lv_refr_area_part(const lv_area_t * area_p)
{ {
lv_disp_draw_buf_t * draw_buf = lv_disp_get_draw_buf(disp_refr); lv_disp_draw_buf_t * draw_buf = lv_disp_get_draw_buf(disp_refr);
while(draw_buf->flushing) { /* Below the `area_p` area will be redrawn into the draw buffer.
if(disp_refr->driver->wait_cb) disp_refr->driver->wait_cb(disp_refr->driver); * In single buffered mode wait here until the buffer is freed.*/
if(draw_buf->buf1 && !draw_buf->buf2) {
while(draw_buf->flushing) {
if(disp_refr->driver->wait_cb) disp_refr->driver->wait_cb(disp_refr->driver);
}
} }
lv_obj_t * top_act_scr = NULL; lv_obj_t * top_act_scr = NULL;
@ -893,15 +897,23 @@ static void draw_buf_flush(void)
lv_disp_draw_buf_t * draw_buf = lv_disp_get_draw_buf(disp_refr); lv_disp_draw_buf_t * draw_buf = lv_disp_get_draw_buf(disp_refr);
lv_color_t * color_p = draw_buf->buf_act; lv_color_t * color_p = draw_buf->buf_act;
draw_buf->flushing = 1;
if(disp_refr->driver->draw_buf->last_area && disp_refr->driver->draw_buf->last_part) draw_buf->flushing_last = 1;
else draw_buf->flushing_last = 0;
/*Flush the rendered content to the display*/ /*Flush the rendered content to the display*/
lv_disp_t * disp = _lv_refr_get_disp_refreshing(); lv_disp_t * disp = _lv_refr_get_disp_refreshing();
if(disp->driver->gpu_wait_cb) disp->driver->gpu_wait_cb(disp->driver); if(disp->driver->gpu_wait_cb) disp->driver->gpu_wait_cb(disp->driver);
/* In double buffered mode wait until the other buffer is freed
* and driver is ready to receive the new buffer */
if(draw_buf->buf1 && draw_buf->buf2) {
while(draw_buf->flushing) {
if(disp_refr->driver->wait_cb) disp_refr->driver->wait_cb(disp_refr->driver);
}
}
draw_buf->flushing = 1;
if(disp_refr->driver->draw_buf->last_area && disp_refr->driver->draw_buf->last_part) draw_buf->flushing_last = 1;
else draw_buf->flushing_last = 0;
if(disp->driver->flush_cb) { if(disp->driver->flush_cb) {
/*Rotate the buffer to the display's native orientation if necessary*/ /*Rotate the buffer to the display's native orientation if necessary*/
if(disp->driver->rotated != LV_DISP_ROT_NONE && disp->driver->sw_rotate) { if(disp->driver->rotated != LV_DISP_ROT_NONE && disp->driver->sw_rotate) {