linuxOS_AP06/buildroot/package/lvgl/lv_drivers/0018-drm-Support-rotate-by-RGA.patch
2025-06-03 12:28:32 +08:00

125 lines
3.8 KiB
Diff

From a5d73baafe5abfd46ba732f9d2d4eb90e785731b Mon Sep 17 00:00:00 2001
From: Jiajian Wu <jair.wu@rock-chips.com>
Date: Sat, 31 Aug 2024 14:43:40 +0800
Subject: [PATCH] drm: Support rotate by RGA
Signed-off-by: Jiajian Wu <jair.wu@rock-chips.com>
---
display/drm.c | 46 ++++++++++++++++++++++++++++++++++++----------
1 file changed, 36 insertions(+), 10 deletions(-)
diff --git a/display/drm.c b/display/drm.c
index e78458e1..45e1e94e 100644
--- a/display/drm.c
+++ b/display/drm.c
@@ -91,6 +91,7 @@ static int lcd_h;
static int lcd_sw;
static char* drm_buff;
static lv_color_t *buf_1;
+static int disp_rot = 0;
static int quit = 0;
static pthread_t drm_thread_pid;
@@ -945,10 +946,13 @@ static void *drm_thread(void *arg)
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);
+ rga_set_rotation(&src, disp_rot);
+ rga_set_rect(&src.rect, 0, 0, gbo->w, gbo->h,
+ gbo->pitch / (LV_COLOR_DEPTH >> 3),
+ gbo->h, RK_FORMAT_BGRA_8888);
+ rga_set_rect(&dst.rect, 0, 0, bo->w, bo->h,
+ bo->pitch / (LV_COLOR_DEPTH >> 3),
+ bo->h, RK_FORMAT_BGRA_8888);
ret = c_RkRgaBlit(&src, &dst, NULL);
if (ret)
printf("c_RkRgaBlit error : %s\n", strerror(errno));
@@ -975,7 +979,7 @@ void drm_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color
int32_t y;
lv_coord_t w = (area->x2 - area->x1 + 1);
lv_coord_t h = (area->y2 - area->y1 + 1);
-#if USE_RGA
+#if 0//USE_RGA
int wstride = w;
int hstride = h;
int lcd_ws = lcd_w;
@@ -998,7 +1002,7 @@ void drm_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color
}
#endif
pthread_mutex_lock(&draw_mutex);
-#if USE_RGA
+#if 0//USE_RGA
rga_info_t src;
rga_info_t dst;
int area_w = area->x2 - area->x1 + 1;
@@ -1033,6 +1037,7 @@ void drm_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color
void disp_init(void)
{
int format = 0;
+ int buf_w, buf_h;
/*You code here*/
drm_init(32);
getdrmresolve(&lcd_w, &lcd_h);
@@ -1042,13 +1047,23 @@ void disp_init(void)
} else {
format = DRM_FORMAT_ARGB8888;
}
+ if ((disp_rot == 0) || (disp_rot == 180))
+ {
+ buf_w = lcd_w;
+ buf_h = lcd_h;
+ }
+ else
+ {
+ buf_w = lcd_h;
+ buf_h = lcd_w;
+ }
#if USE_RGA
- gbo = malloc_drm_bo(lcd_w, lcd_h, format);
+ gbo = malloc_drm_bo(buf_w, buf_h, format);
drm_buff = gbo->ptr;
lcd_sw = gbo->pitch / (LV_COLOR_DEPTH >> 3);
c_RkRgaInit();
#else
- drm_buff = malloc(lcd_w * lcd_h * (LV_COLOR_DEPTH >> 3));
+ drm_buff = malloc(buf_w * buf_h * (LV_COLOR_DEPTH >> 3));
lcd_sw = lcd_w;
#endif
vop_buf[0] = malloc_drm_bo(lcd_w, lcd_h, format);
@@ -1062,6 +1077,9 @@ void drm_disp_drv_init(int rot)
/*-------------------------
* Initialize your display
* -----------------------*/
+#if USE_RGA
+ disp_rot = rot;
+#endif
disp_init();
/*-----------------------------
@@ -1105,8 +1123,16 @@ void drm_disp_drv_init(int rot)
/*Set up the functions to access to your display*/
/*Set the resolution of the display*/
- disp_drv.hor_res = lcd_w;
- disp_drv.ver_res = lcd_h;
+ if ((disp_rot == 0) || (disp_rot == 180))
+ {
+ disp_drv.hor_res = lcd_w;
+ disp_drv.ver_res = lcd_h;
+ }
+ else
+ {
+ disp_drv.hor_res = lcd_h;
+ disp_drv.ver_res = lcd_w;
+ }
disp_drv.sw_rotate = 0;
disp_drv.rotated = LV_DISP_ROT_NONE;
--
2.25.1