HYL_OK3568_LINUX/buildroot/package/lvgl/lv_drivers/0008-drm-use-ping-pong-buffer-for-vop-output.patch
2025-05-10 21:49:39 +08:00

101 lines
2.9 KiB
Diff

From bbb0cebf7297459234c600bbc1bc3788028a31cc Mon Sep 17 00:00:00 2001
From: Jiajian Wu <jair.wu@rock-chips.com>
Date: Thu, 2 Feb 2023 11:42:48 +0800
Subject: [PATCH 8/8] drm: use ping-pong buffer for vop output
Signed-off-by: Jiajian Wu <jair.wu@rock-chips.com>
---
display/drm.c | 46 +++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 43 insertions(+), 3 deletions(-)
diff --git a/display/drm.c b/display/drm.c
index 26e0d7b..5f937b5 100644
--- a/display/drm.c
+++ b/display/drm.c
@@ -97,6 +97,7 @@ static pthread_t drm_thread_pid;
static pthread_mutex_t draw_mutex;
static int draw_update = 0;
static struct drm_bo *gbo;
+static struct drm_bo *vop_buf[2];
struct device *pdev;
@@ -859,14 +860,47 @@ void getdrmresolve(int *w, int *h)
static void *drm_thread(void *arg)
{
+#define MIN_TICK 16 // 60 FPS
+ struct drm_bo *bo;
+ uint32_t tick = 0, ts;
+#if USE_RGA
+ rga_info_t src;
+ rga_info_t dst;
+ int ret;
+#endif
+
while (!quit) {
+ ts = lv_tick_get();
+ if ((ts - tick) < MIN_TICK) {
+ usleep(5000);
+ continue;
+ }
+ tick = ts;
pthread_mutex_lock(&draw_mutex);
if (draw_update) {
- setdrmdisp(gbo);
+ bo = (bo == vop_buf[0]) ? vop_buf[1] : vop_buf[0];
+
+#if USE_RGA
+ memset(&src, 0, sizeof(rga_info_t));
+ memset(&dst, 0, sizeof(rga_info_t));
+ src.fd = gbo->buf_fd;
+ src.mmuFlag = 1;
+ dst.fd = bo->buf_fd;
+ dst.mmuFlag = 1;
+ rga_set_rect(&src.rect, 0, 0, lcd_w, lcd_h,
+ lcd_sw, lcd_h, RK_FORMAT_BGRA_8888);
+ rga_set_rect(&dst.rect, 0, 0, lcd_w, lcd_h,
+ lcd_sw, lcd_h, RK_FORMAT_BGRA_8888);
+ ret = c_RkRgaBlit(&src, &dst, NULL);
+ if (ret)
+ printf("c_RkRgaBlit error : %s\n", strerror(errno));
+#else
+ memcpy(bo->ptr, gbo->ptr, bo->size);
+#endif
+ setdrmdisp(bo);
draw_update = 0;
}
pthread_mutex_unlock(&draw_mutex);
- usleep(1000);
}
return NULL;
}
@@ -893,7 +927,7 @@ void drm_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color
if (LV_COLOR_DEPTH == 16) {
format = RK_FORMAT_RGB_565;
}else if (LV_COLOR_DEPTH == 32) {
- format = RK_FORMAT_ARGB_8888;
+ format = RK_FORMAT_BGRA_8888;
}else {
format = -1;
printf("drm_flush rga not supported format\n");
@@ -938,9 +972,15 @@ void disp_init(void)
drm_init(32);
getdrmresolve(&lcd_w, &lcd_h);
gbo = malloc_drm_bo(lcd_w, lcd_h, DRM_FORMAT_ARGB8888);
+ vop_buf[0] = malloc_drm_bo(lcd_w, lcd_h, DRM_FORMAT_ARGB8888);
+ vop_buf[1] = malloc_drm_bo(lcd_w, lcd_h, DRM_FORMAT_ARGB8888);
drm_buff = gbo->ptr;
lcd_sw = gbo->pitch / 4;
+#if USE_RGA
+ c_RkRgaInit();
+#endif
+
printf("DRM subsystem and buffer mapped successfully\n");
}
--
2.25.1