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