标签:合成 注意 提升 渲染 direct 目的 代码 鼠标 处理
1.简介
在DRM(Direct Rendering Manager)中,学习了drmModePageFlip和drmModeSetCrtc的用法。但是这两个接口都只能全屏显示Framebuffer的内容,如何才能在屏幕上只显示framebuffer的一部分内容呢?本篇将介绍DRM另一个重要的刷图接口:drmModeSetPlane。
首先来了解一下,什么是Plane?简单描述Plane的概念,即硬件图层。而详细了解下Plane的概念,即DRM中的Plane和我们常见的YUV/YCbCr图形格式中的Plane完全是两个不同的概念。YUV图形格式中的Plane指的是图像数据在内存中的排列形式,一般Y通道占一段连续的内存块,UV通道占另一段连续的内存块,称之为YUV-2Plane (也叫YUV 2平面),属于软件层面。而DRM中的Plane指的是Display Controller中用于多层合成的单个硬件图层模块,属于硬件层面。二者概念上不要混淆。
1.1Plane的历史
随着软件技术的不断更新,对硬件的性能要求越来越高,在满足功能正常使用的前提下,对功耗的要求也越来越苛刻。本来GPU可以处理所有图形任务,但是由于它运行时的功耗实在太高,设计者们决定将一部分简单的任务交给Display Controller去处理(比如合成),而让GPU专注于绘图(即渲染)这一主要任务,减轻GPU的负担,从而达到降低功耗提升性能的目的。于是,Plane(硬件图层单元)就诞生了。
1.2Plane的功能
Plane是连接FB与CRTC的纽带,是内存的搬运工。
Plane的参数含义:
当 SRC_X/Y 和 CRTC_X/Y 不相等时,就实现了平移的效果;
当 SRC_W/H 和 CRTC_W/H 不相等时,就实现了缩放的效果;
当 SRC_W/H 和 FB_W/H 不相等时,就实现了裁剪的效果;
简单代码图 2.1所示
图 2.1 Plane的代码实现
1.3Plane的类型
在DRM框架中,Plane又分为如下3种类型:Cursor(光标图层,一般用于PC系统,用于显示鼠标)、Overlay(叠加图层,通常用于YUV格式的视频图层)、Primary(主要图层,通常用于仅支持RGB格式的简单图层)。需要注意的是,并不是所有的Display Controller都支持Plane,从前面Single-Buffer 案例中的drmModeSetCrtc函数也能看出,即使没有plane_id,屏幕也能正常显示。比如s3c2440这种ARM9 SoC,它的LCDC就没有Plane的概念。但是DRM框架规定,任何一个CRTC,必须要有1个Primary Plane。 即使像S3C2440这种不带真实Plane硬件的Display Controller,也需要认为它的Primary Plane就是LCDC本身,因为它实现了从Framebuffer到CRTC的数据搬运工作,而这正是一个Plane最基本的功能。
1.4Plane的测试用例
在Google Android工程中external/libdrm/tests/planetest/planetest.c文件,为了演示方便,仅仅实现了一个最简单的drmModeSetPlane()调用。需要注意的是,该函数调用之前,必须先通过drmModeSetCrtc()初始化整个显示链路,否则Plane设置将无效。程序运行后,屏幕显示全屏白色;当输入回车后,屏幕将FrameBuffer中的(100,150)的矩形,显示到屏幕的(50,50)位置;再次输入回车后,程序退出。
标签:合成 注意 提升 渲染 direct 目的 代码 鼠标 处理
原文地址:http://blog.51cto.com/9508662/2344997