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