场景选择
ArtinChip 平台在进行屏幕旋转时,兼容单 buffer 和双 buffer 的应用程序。
双绘制 buffer 和双显示 buffer
Board options --->
Graphics Support --->
Graphics support
[*] Display Support
[*] Support double framebuffer
framebuffer rotation degree (90) --->
/** * FB ROTATION options */ /* drawing buf for GUI, range [1, 2] */ #define AIC_FB_DRAW_BUF_NUM 2
内存使用情况如下所示:
+-------------------------+ | 绘制 buf 0 | +-------------------------+ | 绘制 buf 1 | +-----+-------------------+ | | | 显 | | 示 | | buf | | 0 | | | +-----+ | | | 显 | | 示 | | buf | | 1 | | | +-----+
GUI 在绘制 buf0 绘制完界面后,底层驱动会把数据旋转到显示 buf0 进行显示,绘制 buf1 同理。
这种使用方式的优缺点如下:
-
优势
对应用非常友好,不需要修改上层应用,只修改 dts 配置即可达成竖屏横用。
-
劣势
占用的内存资源多,需要 4 块 buf,有一块绘制 buf 是可以节省下来的。720x1280 的屏幕显示 32 位 RGB 数据时,需要约 14M 的物理连续内存。
内存资源来源于 CMA 内存,需要确保 CMA 内存 size 满足需求,不然无法生成 /dev/fb0,详细配置可参看参数配置章节。
显示 buffer 的双 buf 由 menuconfig 中的
Support double framebuffer
选项使能。
单绘制 buffer 和双显示 buffer
Board options --->
Graphics Support --->
Graphics support
[*] Display Support
[*] Support double framebuffer
framebuffer rotation degree (90) --->
/** * FB ROTATION options */ /* drawing buf for GUI, range [1, 2] */ #define AIC_FB_DRAW_BUF_NUM 1
该场景需要修改 disp_conf.h 头文件,将绘制 buf 修改为 1 个,并通过 menuconfig 中的
Support double framebuffer
选项使能显示双 buf。
+-------------------------+ | 绘制 buf 0 | +-----+-------------------+ | | | 显 | | 示 | | buf | | 0 | | | +-----+ | | | 显 | | 示 | | buf | | 1 | | | +-----+
GUI 绘制完界面,下发调用 ioctl pan_display ,底层驱动会自动切换显示 buf,避免撕裂现象的发生。GUI 应用程序不需要关注显示 buf 的切换。
int buf_id = 0; int zero = 0; if (mpp_fb_ioctl(fbfd, FBIOPAN_DISPLAY, buf_id) == 0) { if (mpp_fb_ioctl(fbfd, FBIO_WAITFORVSYNC, &zero) < 0) { printf("ioctl FBIO_WAITFORVSYNC fail\n"); return; } } else { printf("pan display err\n"); }
单绘制 buffer 和单显示 buffer
Board options ---> Graphics Support ---> Graphics support [*] Display Support framebuffer rotation degree (90) --->
/** * FB ROTATION options */ /* drawing buf for GUI, range [1, 2] */ #define AIC_FB_DRAW_BUF_NUM 1
该场景需要修改 disp_conf.h 头文件,将绘制 buf 修改为 1 个,并取消 menuconfig 中的
Support double framebuffer
选。
+-------------------------+ | 绘制 buf 0 | +-----+-------------------+ | | | 显 | | 示 | | buf | | 0 | | | +-----+
GUI 在绘制 buf0 绘制完界面后,需要手工调用 ioctl pan_display 才可以触发屏幕旋转。
display engine 无法确定 CPU 绘制完成的时机,需要应用手动触发更新。
这种方式优劣如下所示:
-
优势
占用的内存资源最小
-
劣势
-
需要手动触发旋转,必须修改应用
-
只有一块显示 buf,撕裂现象不可避免
int buf_id = 0; int zero = 0; if (mpp_fb_ioctl(fbfd, FBIOPAN_DISPLAY, buf_id) == 0) { if (mpp_fb_ioctl(fbfd, FBIO_WAITFORVSYNC, &zero) < 0) { printf("ioctl FBIO_WAITFORVSYNC fail\n"); return; } } else { printf("pan display err\n"); }
-