1From bbb0cebf7297459234c600bbc1bc3788028a31cc Mon Sep 17 00:00:00 2001 2From: Jiajian Wu <jair.wu@rock-chips.com> 3Date: Thu, 2 Feb 2023 11:42:48 +0800 4Subject: [PATCH 8/8] drm: use ping-pong buffer for vop output 5 6Signed-off-by: Jiajian Wu <jair.wu@rock-chips.com> 7--- 8 display/drm.c | 46 +++++++++++++++++++++++++++++++++++++++++++--- 9 1 file changed, 43 insertions(+), 3 deletions(-) 10 11diff --git a/display/drm.c b/display/drm.c 12index 26e0d7b..5f937b5 100644 13--- a/display/drm.c 14+++ b/display/drm.c 15@@ -97,6 +97,7 @@ static pthread_t drm_thread_pid; 16 static pthread_mutex_t draw_mutex; 17 static int draw_update = 0; 18 static struct drm_bo *gbo; 19+static struct drm_bo *vop_buf[2]; 20 21 struct device *pdev; 22 23@@ -859,14 +860,47 @@ void getdrmresolve(int *w, int *h) 24 25 static void *drm_thread(void *arg) 26 { 27+#define MIN_TICK 16 // 60 FPS 28+ struct drm_bo *bo; 29+ uint32_t tick = 0, ts; 30+#if USE_RGA 31+ rga_info_t src; 32+ rga_info_t dst; 33+ int ret; 34+#endif 35+ 36 while (!quit) { 37+ ts = lv_tick_get(); 38+ if ((ts - tick) < MIN_TICK) { 39+ usleep(5000); 40+ continue; 41+ } 42+ tick = ts; 43 pthread_mutex_lock(&draw_mutex); 44 if (draw_update) { 45- setdrmdisp(gbo); 46+ bo = (bo == vop_buf[0]) ? vop_buf[1] : vop_buf[0]; 47+ 48+#if USE_RGA 49+ memset(&src, 0, sizeof(rga_info_t)); 50+ memset(&dst, 0, sizeof(rga_info_t)); 51+ src.fd = gbo->buf_fd; 52+ src.mmuFlag = 1; 53+ dst.fd = bo->buf_fd; 54+ dst.mmuFlag = 1; 55+ rga_set_rect(&src.rect, 0, 0, lcd_w, lcd_h, 56+ lcd_sw, lcd_h, RK_FORMAT_BGRA_8888); 57+ rga_set_rect(&dst.rect, 0, 0, lcd_w, lcd_h, 58+ lcd_sw, lcd_h, RK_FORMAT_BGRA_8888); 59+ ret = c_RkRgaBlit(&src, &dst, NULL); 60+ if (ret) 61+ printf("c_RkRgaBlit error : %s\n", strerror(errno)); 62+#else 63+ memcpy(bo->ptr, gbo->ptr, bo->size); 64+#endif 65+ setdrmdisp(bo); 66 draw_update = 0; 67 } 68 pthread_mutex_unlock(&draw_mutex); 69- usleep(1000); 70 } 71 return NULL; 72 } 73@@ -893,7 +927,7 @@ void drm_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color 74 if (LV_COLOR_DEPTH == 16) { 75 format = RK_FORMAT_RGB_565; 76 }else if (LV_COLOR_DEPTH == 32) { 77- format = RK_FORMAT_ARGB_8888; 78+ format = RK_FORMAT_BGRA_8888; 79 }else { 80 format = -1; 81 printf("drm_flush rga not supported format\n"); 82@@ -938,9 +972,15 @@ void disp_init(void) 83 drm_init(32); 84 getdrmresolve(&lcd_w, &lcd_h); 85 gbo = malloc_drm_bo(lcd_w, lcd_h, DRM_FORMAT_ARGB8888); 86+ vop_buf[0] = malloc_drm_bo(lcd_w, lcd_h, DRM_FORMAT_ARGB8888); 87+ vop_buf[1] = malloc_drm_bo(lcd_w, lcd_h, DRM_FORMAT_ARGB8888); 88 drm_buff = gbo->ptr; 89 lcd_sw = gbo->pitch / 4; 90 91+#if USE_RGA 92+ c_RkRgaInit(); 93+#endif 94+ 95 printf("DRM subsystem and buffer mapped successfully\n"); 96 } 97 98-- 992.25.1 100 101