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