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