1*4882a593SmuzhiyunFrom acae83e9502dd420b25b73fb7e580dca73918d2e Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: ZiHan Huang <zack.huang@rock-chips.com>
3*4882a593SmuzhiyunDate: Thu, 5 Jan 2023 14:25:03 +0800
4*4882a593SmuzhiyunSubject: [PATCH 7/8] Added rga Acceleration: rga copy instead of memcpy
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunSigned-off-by: ZiHan Huang <zack.huang@rock-chips.com>
7*4882a593Smuzhiyun---
8*4882a593Smuzhiyun CMakeLists.txt |  9 +++++++++
9*4882a593Smuzhiyun display/drm.c  | 45 +++++++++++++++++++++++++++++++++++++++++++--
10*4882a593Smuzhiyun display/drm.h  |  5 +++++
11*4882a593Smuzhiyun 3 files changed, 57 insertions(+), 2 deletions(-)
12*4882a593Smuzhiyun
13*4882a593Smuzhiyundiff --git a/CMakeLists.txt b/CMakeLists.txt
14*4882a593Smuzhiyunindex 278e964..48500e9 100644
15*4882a593Smuzhiyun--- a/CMakeLists.txt
16*4882a593Smuzhiyun+++ b/CMakeLists.txt
17*4882a593Smuzhiyun@@ -23,6 +23,11 @@ endif()
18*4882a593Smuzhiyun if (LV_DRV_USE_DRM)
19*4882a593Smuzhiyun     add_definitions(-DUSE_DRM=1)
20*4882a593Smuzhiyun endif()
21*4882a593Smuzhiyun+if (LV_DRV_USE_RGA)
22*4882a593Smuzhiyun+    add_definitions(-DUSE_RGA=1)
23*4882a593Smuzhiyun+    include_directories(${CMAKE_SYSROOT}/usr/include/rga/)
24*4882a593Smuzhiyun+endif()
25*4882a593Smuzhiyun+
26*4882a593Smuzhiyun add_definitions(-g -DLV_CONF_INCLUDE_SIMPLE)
27*4882a593Smuzhiyun include_directories(${CMAKE_SYSROOT}/usr/include/libdrm/)
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun@@ -32,6 +37,10 @@ find_package(PkgConfig)
30*4882a593Smuzhiyun pkg_check_modules(PKG_WAYLAND wayland-client wayland-cursor wayland-protocols xkbcommon)
31*4882a593Smuzhiyun target_link_libraries(lv_drivers PUBLIC lvgl ${PKG_WAYLAND_LIBRARIES})
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun+if (LV_DRV_USE_RGA)
34*4882a593Smuzhiyun+    target_link_libraries(lv_drivers PUBLIC rga)
35*4882a593Smuzhiyun+endif()
36*4882a593Smuzhiyun+
37*4882a593Smuzhiyun if("${LIB_INSTALL_DIR}" STREQUAL "")
38*4882a593Smuzhiyun   set(LIB_INSTALL_DIR "lib")
39*4882a593Smuzhiyun endif()
40*4882a593Smuzhiyundiff --git a/display/drm.c b/display/drm.c
41*4882a593Smuzhiyunindex 17af072..26e0d7b 100644
42*4882a593Smuzhiyun--- a/display/drm.c
43*4882a593Smuzhiyun+++ b/display/drm.c
44*4882a593Smuzhiyun@@ -866,7 +866,7 @@ static void *drm_thread(void *arg)
45*4882a593Smuzhiyun             draw_update = 0;
46*4882a593Smuzhiyun         }
47*4882a593Smuzhiyun         pthread_mutex_unlock(&draw_mutex);
48*4882a593Smuzhiyun-        usleep(10000);
49*4882a593Smuzhiyun+        usleep(1000);
50*4882a593Smuzhiyun     }
51*4882a593Smuzhiyun     return NULL;
52*4882a593Smuzhiyun }
53*4882a593Smuzhiyun@@ -876,14 +876,55 @@ void drm_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color
54*4882a593Smuzhiyun    /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/
55*4882a593Smuzhiyun     int32_t x;
56*4882a593Smuzhiyun     int32_t y;
57*4882a593Smuzhiyun-
58*4882a593Smuzhiyun+    lv_coord_t w = (area->x2 - area->x1 + 1);
59*4882a593Smuzhiyun+    lv_coord_t h = (area->y2 - area->y1 + 1);
60*4882a593Smuzhiyun+#if USE_RGA
61*4882a593Smuzhiyun+    int wstride = w;
62*4882a593Smuzhiyun+    int hstride = h;
63*4882a593Smuzhiyun+    int lcd_ws = lcd_w;
64*4882a593Smuzhiyun+    int lcd_hs = lcd_h;
65*4882a593Smuzhiyun+    int format = 0;
66*4882a593Smuzhiyun+    if(lcd_ws % 32 != 0) {
67*4882a593Smuzhiyun+        lcd_ws = (lcd_ws + 32) & (~31);
68*4882a593Smuzhiyun+    }
69*4882a593Smuzhiyun+    if(lcd_hs % 32 != 0) {
70*4882a593Smuzhiyun+        lcd_hs = (lcd_hs + 32) & (~31);
71*4882a593Smuzhiyun+    }
72*4882a593Smuzhiyun+    if (LV_COLOR_DEPTH == 16) {
73*4882a593Smuzhiyun+        format = RK_FORMAT_RGB_565;
74*4882a593Smuzhiyun+    }else if (LV_COLOR_DEPTH == 32) {
75*4882a593Smuzhiyun+        format = RK_FORMAT_ARGB_8888;
76*4882a593Smuzhiyun+    }else {
77*4882a593Smuzhiyun+        format = -1;
78*4882a593Smuzhiyun+        printf("drm_flush rga not supported format\n");
79*4882a593Smuzhiyun+        return;
80*4882a593Smuzhiyun+    }
81*4882a593Smuzhiyun+#endif
82*4882a593Smuzhiyun     pthread_mutex_lock(&draw_mutex);
83*4882a593Smuzhiyun+#if USE_RGA
84*4882a593Smuzhiyun+    rga_info_t src;
85*4882a593Smuzhiyun+    rga_info_t dst;
86*4882a593Smuzhiyun+    int area_w = area->x2 - area->x1 + 1;
87*4882a593Smuzhiyun+    int area_h = area->y2 - area->y1 + 1;
88*4882a593Smuzhiyun+    memset(&src, 0, sizeof(rga_info_t));
89*4882a593Smuzhiyun+    memset(&dst, 0, sizeof(rga_info_t));
90*4882a593Smuzhiyun+    src.virAddr = color_p;
91*4882a593Smuzhiyun+    src.mmuFlag = 1;
92*4882a593Smuzhiyun+    dst.fd = gbo->buf_fd;
93*4882a593Smuzhiyun+    dst.mmuFlag = 1;
94*4882a593Smuzhiyun+    rga_set_rect(&src.rect, 0, 0, area_w, area_h, wstride, hstride, format);
95*4882a593Smuzhiyun+    rga_set_rect(&dst.rect, area->x1, area->y1, area_w, area_h, lcd_ws, lcd_hs, format);
96*4882a593Smuzhiyun+    int ret = c_RkRgaBlit(&src, &dst, NULL);
97*4882a593Smuzhiyun+    if (ret)
98*4882a593Smuzhiyun+        printf("c_RkRgaBlit2 error : %s\n", strerror(errno));
99*4882a593Smuzhiyun+#else
100*4882a593Smuzhiyun     for(y = area->y1; y <= area->y2; y++) {
101*4882a593Smuzhiyun         int area_w = area->x2 - area->x1 + 1;
102*4882a593Smuzhiyun         lv_color_t *disp = (lv_color_t*)(drm_buff + (y * lcd_sw + area->x1) * 4);
103*4882a593Smuzhiyun         memcpy(disp, color_p, area_w * 4);
104*4882a593Smuzhiyun         color_p += area_w;
105*4882a593Smuzhiyun     }
106*4882a593Smuzhiyun+#endif
107*4882a593Smuzhiyun     draw_update = 1;
108*4882a593Smuzhiyun     pthread_mutex_unlock(&draw_mutex);
109*4882a593Smuzhiyun     /*IMPORTANT!!!
110*4882a593Smuzhiyundiff --git a/display/drm.h b/display/drm.h
111*4882a593Smuzhiyunindex 74695a9..1b98217 100644
112*4882a593Smuzhiyun--- a/display/drm.h
113*4882a593Smuzhiyun+++ b/display/drm.h
114*4882a593Smuzhiyun@@ -29,6 +29,11 @@ extern "C" {
115*4882a593Smuzhiyun #include "lvgl/lvgl.h"
116*4882a593Smuzhiyun #endif
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun+#if USE_RGA
119*4882a593Smuzhiyun+#include <rga/im2d.h>
120*4882a593Smuzhiyun+#include <rga/rga.h>
121*4882a593Smuzhiyun+#include <rga/RgaApi.h>
122*4882a593Smuzhiyun+#endif
123*4882a593Smuzhiyun /*********************
124*4882a593Smuzhiyun  *      DEFINES
125*4882a593Smuzhiyun  *********************/
126*4882a593Smuzhiyun--
127*4882a593Smuzhiyun2.25.1
128*4882a593Smuzhiyun
129