DirectFB概览

1 简介

DirectFB是一个提供了硬件图形加速、输入设备处理和抽象的轻量级的图形库,它集成了支持半透明窗体的视窗系统(window system)以及在LinuxFramebuffer Device之上的多显示层。它是一个具有软件回退(software fallbacks)的无需依靠底层硬件的可用于任意图形运算的完整的硬件抽象层。DirectFB是为嵌入式系统(embeddedsystems)而设计的。它以最小的资源使用和总开销实现了最大的硬件加速。

1.1 目标

  • 占用小块的内存
  • 实现最大限度的硬件加速
  • 提供包含多层alpha混合模型的高级的图形运算
  • 利用现有的标准无需修改内核(kernel)
  • 不依赖于库(除libc)
  • 符合MHP(Member of     Multimedia Home Platform)的标准

1.2 特性

1.2.1 图形运算

DirectFB支持以下的图形运算。这些运算可以是由芯片驱动支持的硬件,或软件回退实现:

  •  Rectangle filling/drawing
  •  Triangle filling/drawing
  •  Line drawing
  •  (Stretched) blitting
  •  Blending with an alphachannel (a.k.a.     texture alpha)
  •  Blending with a constant alpha blend     factor (a.k.a. alpha modulation)
  •  Nine different blending functions     respectively for source and destination, so all Porter/Duff rules are     supported
  •  Colorizing (a.k.a. color modulation)
  •  Source color keying
  •  Destination color keying

1.2.2 视窗系统(Windowing System)

DirectFB集成了一个支持半透明窗体的快速完全的视窗系统。窗体使用了ARGB页面(ARGB Surfaces)允许以每个像素为基础进行混合。另外每个窗体有它自己的全局透明度。

1.2.3 资源管理

DirectFB有它自己的针对视频内存的资源管理器。象显示层、输入设备等资源允许被锁定来进行互斥访问,如:进行全屏游戏。DirectFB为象显示层、窗体以及各种通用的目标页面(surfaces)等不同的图形目标提供了抽象。这个设计的成果把从窗体切换到全屏以及后台最小化设置到了理想的协作级别。

1.2.4 图形驱动

DirectFB对于硬件加速使用了可加载的驱动模块。

1.2.5 输入驱动

DirectFB支持以下的输入驱动:

  •  standard keyboards
  •  serial and PS/2 mice
  •  joysticks
  •  devices using the linux input layer
  •  infrared remote controls (using lirc)
  •  iPAQ touchscreen
  • ucb 1x00 touchscreen
  •  Microtouch touchscreen
  •  Sony PI Jogdial

它可能是直接的查询硬件,或使用一个事件缓冲器。

1.2.6 图像加载

DirectFB包含了图像的支持,以下的图像格式是被允许直接加载到DirectFB页面的:

  • JPEG (using libjpeg)
  • PNG (using libpng2)
  • GIF (integrated, no library     required)
  • various other image formats     (using Imlib2)

1.2.7 视频播放

DirectFB包含了视频的支持,以下的视频格式是被允许使用到DirectFB页面的:

  •  video4linux (/dev/video)
  •  mpeg1/2 (using libmpeg3)
  •  AVI (using avifile)
  •  MOV (using OpenQuicktime)
  • macromedia flash (using     libflash)

1.2.8 字体渲染

DirectFB支持反锯齿的文本描绘以及包含了字体的支持,以下的字体格式允许被加载:

  • DirectFB bitmap font
  • TrueType (using FreeType2)

 

2 DirectFB架构

2.1 DirectFB的结构

DirectFB的结构图:

对于上层的GUI高级框架来说,DirectFB是透明的。

对于底层的驱动来说,DirectFB里面负责和硬件打交道的显卡的驱动(gfxdriver)和显示系统(system),这里面gfxdriver是和各个硬件平台相关的,有可能需要自己写。

DirectFb的内部结构图:

下面在看看DirectFB内部各个接口如何工作的,一般还是分为data,event(蓝色部分),和GUI(土黄色部分)。各个接口在IDirectFB的管理下,接受event,处理数据,最后通过layer显示出来。

 

2.2 通过DirectFB访问图形硬件

DirectFB依靠内核中framebuffer设备(/dev/fb)提供的现有接口来访问图形硬件。这也就意味着DirectFB必须运行在一个工作的framebuffer驱动上。对于有些芯片组在linux内核中有一个特定的framebuffer驱动。而对于没有被支持的芯片组一个VESA framebuffer也可以工作(虽然有些限制)。不管图形加速是否被使用,DirectFB都会使用framebuffer设备来执行以下的任务:

  • 设置视频模式(分辨率,颜色深度,计时)
  • 显卡内存映射到framebuffer
  • 改变framebuffer的视口(为doublebuffering)

如果一张显卡被DirectFB和一个存在于linux内核中的特定芯片组的framebuffer驱动支持,那么DirectFB将使用framebuffer设备执行除上述提到的以下额外任务:

  • 显卡内存映射到内存映像IO端口
  • 关闭framebuffer驱动的内部加速

当执行一个特殊的图形运算(例如:blitting of asurface)时,DirectFB芯片驱动将访问图形硬件的内存映像IO端口来递交命令到显卡的加速引擎。这意味着实际的硬件加速完全是在用户空间中工作。参见第5页的图2.1

2.3 通过DirectFB访问输入设备

DirectFB使用linux内核提供的标准设备接口来访问输入设备。DirectFB不直接访问输入设备。

图2.1:通过一个DirectFB的应用程序来访问framebuffer设备以及图形硬件

2.4 DirectFB的重要术语

2.4.1 位图复制(Blitting)

位图复制指的是复制图像数据的过程。最简单的示例是两个有相同的大小,深度和像素类型的页面(Surface),从一个页面块复制(Blit)到另一个。在这种情况下内存只是被复制而没有被处理(就像复制任意类型的数据)。位图复制的高级类型包含了含有一个alpha通道的位块复制,或从一个像素类型到另一个的块复制。大多数的显卡包含了一个硬件块传送器可以执行各种位图复制。

2.4.2 页面(Surface)

一个页面就是在内存中为存储特定像素类型的一个图像像素数据的一个预留空间。一个页面可以驻留在视频以及系统内存中。可以在一个页面上完成绘制操作,或者从一个页面块复制(Blit)到另一个(参见1.2.1节)。

在全屏模式中,屏幕可位图复制视区由主页面(Primary Surface)表示,以此它允许在屏幕可视区上直接完成对图形运算。

每个页面可以选择使用双缓存(doublebuffering),图形运算先在次层缓存(secondary buffer)执行,然后在调用Flip()方法后成为有效的。为了避免屏幕闪烁建议在大多数时在主页面上使用双缓存。

2.4.3 次页面(SubSurface)

一个次页面使用跟一个普通页面相同的接口。它表示了一个父页面(parent Surface)的部分以及没有分配给任何系统或视频的内存空间。

2.4.4 层(Layer)

根据图形硬件,可以有一个或多个显示层。一个标准PC的显卡只有一个层,但是先进的设备,如电视机顶盒(TV set top boxes)可以支持两个或两个以上的层 。层次(Layers)在显存上占据着不同的区域,一般通过使用alpha混合(alpha blending)来组合。这些都是由显示硬件自动完成。如果底层的内容被改变,没经重绘,该层以上的层次内容将保持不变。现在,许多PC显卡也支持一个额外的层(视频层),它可以被缩放及完成从YUV到RGB的色彩转换。这种层一般不能进行混合和保持完全的不透明。视频层次(Video layers)通过variosDirectFB图形驱动被支持。

2.4.5 窗体/窗体堆(Window/Windowstack)

通常一个层的页面的内容通过集成视窗系统的控制来显现在一个可配置的背景上窗体属于这个层。每个窗体有它自己的用于视窗系统产生图像组成重叠窗口的页面。选择应用程序,尤其是游戏可以互斥的访问这个层。这种方式应用程序已经直接控制了整个的层的页面和它的内容,没有窗体显示。

2.5 层/窗体配置示例

 

 

图2.2:有三个layer,最下面的layer是一幅背景图,中间的layer是一个透明的带有一个“igel”的layer,最上面是一个透明的带有subtitlelayer,最后我们在显示器中看到的就是各个layer的混合。

 

 

图2.3:

lower layer是一个全屏模式的layer,它的背景图片渲染在自己的surface上面。Video area是一个subsurface,用来显示videoUpper layer通过window stack/window来显示应用程序的内容,而且upperlayer是一个透明的layer,这样混合之后,可以透过上面的layer看到下面的video

3 DirectFB API Concept

DirectFBAPI是结构化的使用接口。一个接口就是一个包含函数指针的C的结构体(structure)。根据接口的实现这些指针指向不同的核心函数。一个好的示例是IDirectFBSurface接口,它可以描绘全屏,一个窗体的内容以及一个次页面(SubSurface)。应用程序可以在各个情况使用相同的API和相同的代码。

3.1 DirectFB的超类(Super)接口

IDirectFB是唯一一个通过全局函数(DirectFBCreate())创建的超类接口。其他的接口都可以通过这个接口获得。新的接口(如:IDirectFBSurface)可通过调用IDirectFB接口函数来创建。现有的接口(象现有的输入设备接口)也可以被枚举和通过IDirectFB访问。

3.2 接口框图

图3.1:DirectFB接口之间的关联

3.3 可加载模块

以下的DirectFB接口允许作为可加载模块使用:

  • IDirectFBImageProvider     (当前的实现参见1.2.6)
  • IDirectFBVideoProvider     (当前的实现参见1.2.7)
  • IDirectFBFont (当前的实现参见1.2.8)
  • IDirectFBInputDevice     (当前的实现参见1.2.5)
  • GfxCard (只是个内部接口,不能被应用程序访问,     显卡支持情况参见1.2.4)

如有需要,这些接口的一个具体实现可只加载在运行时刻。例如:加载一个图像,IDirectFBImageProvider的具体实现将被详细描述。如果这个图像是一个PNG格式的图像,那么PNG模块的Probe()函数将通知它可处理的文件。寻找一个视频格式的合适实现使用相同的方式。

输入驱动和显卡驱动根据DirectFB运行时的系统的硬件配置在DirectFB初始化时被加载。它允许在没有修改和重新编译DirectFB时实现和使用新的显卡驱动,输入驱动以及多媒体支持。

3.4 示例代码

以下列出的是一个简单完整的DirectFB程序,用来显示DirectFB接口的用法。它加载和显示了一个图像。

#include<directfb.h>

/*DirectFB的接口 */

IDirectFB *dfb;

IDirectFBSurface *primary;

IDirectFBImageProvider*provider;

 

/* 描述大小,像素类型以及surface的性能 */

DFBSurfaceDescription dsc;

 

int main( int argc, char*argv[] )

{

/* 传递参数来初始化DirectFB*/

DirectFBInit(&argc, &argv );

 

/* 创建超类接口 */

DirectFBCreate(&dfb );

 

/* 设置协作级为DFSCL_FULLSCREEN来互斥访问主层 */

dfb->SetCooperativeLevel(dfb, DFSCL_FULLSCREEN );

 

/* 获得主页面,也就是用页的主层来进行互斥访问 */

memset(&dsc, 0, sizeof(DFBSurfaceDescription) );

 

/* 只有当描述的caps域有效时,高度、宽度和像素类型不用被设置, 这是因为当前的视频模型

* 决定了分辨率和像素类型 */

dsc.flags= DSDESC_CAPS;

 

/* 设置我们期望的主页面(全屏) */

dsc.caps= DSCAPS_PRIMARY;

 

/* 由于我们在全屏模型中没有创建新的页面被创建,整个屏幕将通过IDirectFBSurface接口来访问 */

dfb->CreateSurface(dfb, &dsc, &primary );

 

/* 创建一个图像接口用来加载图像 */

dfb->CreateImageProvider(dfb, "tux.png", &provider );

 

/* 绘制图像到屏幕 */

provider->RenderTo(provider, primary, NULL );

 

/* 移除图像端口,不过这不是必要的 */

provider->Release(provider );

 

sleep(5);

 

/* 清除 */

primary->Release(primary );

dfb->Release(dfb );

}

 

4、DirectFB应用

4.1、DirectFB在系统中的位置

 

从结构来讲,对于一般的MMP,DTV和STB来说,上面两幅图是比较经典的结构。DirectFB都处于QTGTK+这样的高级GUI框架的下面,系统驱动的上面。

 

4.2 DirectFB的主要作用:

图形,文字的处理(DirectFB把TS经过Decoder处理之后的码流,再加上图形和文字,一起传给视频的芯片)

 

 

 

4.3 DirectFB定制开发

有时候我们需要把DirectFB移植到特殊的平台上面,这样我们需要写一些特有的驱动。

我们可以定制的模块有:

  • System(可选),位于sytems/*目录下面
  • Graphics Devices
  • Graphic Drivers,位于gfxdrivers/目录下面
  • Screens
  • Layers

要实现每一个模块,我们必须实现一些接口,以被DirectFB内部调用。下图列举了我们需要实现的函数:

这部分可以参考:

http://www.directfb.org/docs/ELCE2007/elce2007_directfb_gfx.pdf

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值