DirectFb总结.docx
- 文档编号:3639535
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:15
- 大小:50.93KB
DirectFb总结.docx
《DirectFb总结.docx》由会员分享,可在线阅读,更多相关《DirectFb总结.docx(15页珍藏版)》请在冰豆网上搜索。
DirectFb总结
DirectFB总结
第一、DirectFB简介
1、DirectFB是一个轻量级的提供硬件图形加速,输入设备处理和抽象的图形库,它集成了支持半透明的视窗系统以及在LinuxFramebuffer驱动之上的多层显示。
它是一个用软件封装当前硬件无法支持的图形算法来完成硬件加速的层。
DirectFB是为嵌入式系统而设计。
它是以最小的资源开销来实现最高的硬件加速性能。
2、DirectFB所处结构层次如图:
DirectFB依赖于FrameBuffer层。
在使用DirectFb之前,必须先对FB进行初始化。
通常GenericGFXDriver模块主要是检查是否有能被DirectFb加速的硬件,如果有,就由GFXdrivers模块对硬件进行加速。
如果没有,则直接软件操作。
下图为DirectFB的组成模块:
从这五个文件可以看出,DirectFb主要由这五部分组成:
Gfxdrivers:
上面有所介绍,主要是对硬件进行加速。
Inputdrivers:
主要是对输入设备的驱动,如(鼠标,键盘等输入设备)。
Interfaces:
主要包括图片解码接口,视频解码接口,字库接口等。
Systems:
系统接口,如(处理时钟,多线程处理等)。
Wm:
用于窗口管理等。
第二、DirectFB中一些主要数据类型之间的关系
层(Layers)
表示一块儿独立的图像缓冲区。
大多数的嵌入式设备都有多个层。
他们由硬件使用合适的alpha值来blending,然后显示。
表面(Surface)
用来保存像素数据的保留内存区域。
DirectFB的Drawing和blitting操作最终都是作用于表面(surfaces)上.表面的内存可以从显存(videomemory)(MMZ)得到,也可以从系统内存(systemmeomroy)得到,这由给定的限制决定。
主层(PrimarySurface)
表示特定层的framebuffer的特殊表面。
如果主表面是单缓冲的,任何作用到这个主层的操作,都会直接在屏幕上见到。
他们之间的关系主要是一些一对一或是一对多的关系:
1IDirectFB(顶层)<-->N屏幕(Screens)
1屏幕(Screen)<-->N层(Layers)
1层(Layer)<-->1主表面(PrimarySurface)
1层(Layer)<-->N窗口(Windows)
1窗口(Window)<-->1窗口表面(WindowSurface)
1表面(Surface)<-->N子表面(Subsurfaces)
通常的状况是一个屏幕有一个显示层,但是DFB支持他们每个有多个实例
层(Layers)和屏幕(Screens)
每一个屏幕可以有一个或是多个层,通常,一个屏幕只有一个层,但是某些支持overlays的系统,由于硬件支持一层显示在另一层上面,可以有多层。
屏幕(Screens)和(Windows)
屏幕不能直接创建窗口(Window),但是你能请求得到一个屏幕(Screen)的主层(PrimaryLayer)的ID,然后请求IDirectFB接口(interface)给你那个层(Layer)的接口,然后通过这个接口来创建窗口。
表面(Surfaces)和(Windows)
每一个窗口有一个和它关联的表面,画在表面上的内容并不会马上显示在屏幕上,因为窗口管理器会负责将窗口的所有表面组合到主表面上---基于所要刷新的区域和堆栈顺序。
当有变化的时候,表面的Flip()函数会通知窗口管理器。
表面(Surfaces)和(Layers)
一个层同样有一个和他关联的表面;这个表面是这个层的屏幕内存的直接表现,在独占(exclusive)模式下,你只能访问这个表面,否则,你只能创建一个窗口,然后用窗口管理器来绘制这个表面。
第三、DirectFB虚拟机环境搭建
1.首先下载一下两个包并解压。
tar-zxvfDirectFB-xxxx.tar.gz
tar-zxvfDirectFB-examples-xxxx.tar.gz
2.安装DirectFB
cd/home/DirectFB-xxxx
./configure
make
makeinstall
3.安装DirectFB-example
a).vi/boot/grub/grub.conf在kernel后面加上vga=0x0317把frambuffer启动,如:
#****************start*************#
titleFedoraCore(2.6.9-1.667)
root(hd0,0)
kernel/vmlinuz-2.6.9-1.667roroot=LABEL=/rhgbquietvga=0x0317
initrd/initrd-2.6.9-1.667.img
#****************stop**************#
#更新数据库:
b).updatedb
c).locatedirectfb.pc
找到directfb.pc的路径,例如我的是这样的:
/usr/local/lib/pkgconfig/directfb.pc
/home/DirectFB-1.0.0/directfb.pc
/home/DirectFB-1.0.0/directfb.pc.in
d).接着设置环境,将第3步得到的pkgconfig库目录加入环境之中:
exportPKG_CONFIG_PATH=/usr/local/lib/pkgconfig
(这样只能在当前终端可以运行,关机后还得自已运行些命令,才能运行dfb程序,如要永久性加入可这样:
如你用的是root用户,可以vi/root/.bash_profile中加入:
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:
/usr/lib/pkgconfig)
e). ./configure
make
f).makeinstall
g).将指定directfb的库目录:
vi/etc/ld.so.conf在最后一行加入:
/usr/local/lib,保存退出。
ldconfig
然后reboot重启计算机...
到此为止,DFB的配置就完成了,但是在应用的过程中可能出现一个问题,运行程序的时候在全屏的状态下运行,这样为调试就带来了麻烦。
可以通过一下方法解决。
如果想让dfb运行在窗口中,除了正常的安装外,请配置:
在(~)目录下创建.directfbrc文件,加入以下内容
wm=default
mode=800x600
depth=32
system=sdl
修改/etc/grub.conf,在倒数第二行kenerl最后面加上vga=791,重启虚拟机
第四、DirectFB嵌入式环境搭建
该部分有SDK组完成.主要根据海思的
第五、DirectFB常用接口说明
5.1﹑DirectFBInit
*函数功能:
对DirectFB进行初始化
*参数说明:
argc:
指向main()'sargc
argv[]:
指向main()'sargv
*函数原型:
DFBResultDirectFBInit(
int*argc,
char*(*argv[])
);
5.2﹑DirectFBCreate
*函数功能:
创建DirectFB接口
*参数说明:
Interface:
指向所创建的接口
*函数原型:
DFBResultDirectFBCreate(
IDirectFB**interface
);
5.3﹑CreateImageProvider
*函数功能:
创建图片解码接口
*参数说明:
thiz:
指向DirectFB接口
filename:
图片路径
IDirectFBImageProvider:
指向图片解码接口
*函数原型:
DFBResult(*CreateImageProvider)(
IDirectFB*thiz,
constchar*filename,
IDirectFBImageProvider**ret_interface
);
5.4﹑SetCooperativeLevel
*函数功能:
创建图片解码接口
*参数说明:
thiz:
指向DirectFB接口
level:
图层协作级别
*函数原型:
DFBResult(*SetCooperativeLevel)(
IDirectFB*thiz,
DFBCooperativeLevellevel
);
*涉及到的机构体:
typedefenum{
DFSCL_NORMAL=0x00000000,/*(共享级别)
Normalsharedaccess,primary
surfacewillbethebufferofan
implicitlycreatedwindowatthe
resolutiongivenbySetVideoMode().
*/
DFSCL_FULLSCREEN,/*(独占式)
Applicationgrabstheprimarylayer,
SetVideoModeautomateslayer
control.Primarysurfaceisthe
primarylayersurface.*/
DFSCL_EXCLUSIVE/*(独占式)
Allbuttheprimarylayerwillbe
disabled,theapplicationhasfull
controloverlayersifdesired,
otherapplicationshaveno
input/output/control.Primary
surfaceistheprimarylayer
surface.*/
}DFBCooperativeLevel;
5.5﹑CreateFont
*函数功能:
创建字库接口,加载字库
*参数说明:
thiz:
指向DirectFB接口
filename:
字库文件路径
desc:
字体属性设置
ret_interface:
指向字库接口
*函数原型:
DFBResult(*CreateFont)(
IDirectFB*thiz,
constchar*filename,
constDFBFontDescription*desc,
IDirectFBFont**ret_interface
);
*涉及到的机构体:
typedefstruct{
DFBFontDescriptionFlagsflags;//需要改变的字体属性,如字体大小,等
DFBFontAttributesattributes;
intheight;//字体高度
intwidth;//字体宽度
unsignedintindex;
intfixed_advance;
intfract_height;
intfract_width;
intoutline_width;
intoutline_opacity;
}DFBFontDescription;
5.6﹑CreateSurface
*函数功能:
创建surface
*参数说明:
thiz:
指向DirectFB接口
desc:
字库文件路径
desc:
字体属性设置
interface:
指向字库接口
*函数原型:
DFBResult(*CreateSurface)(
IDirectFB*thiz,
constDFBSurfaceDescription*desc,
IDirectFBSurface**ret_interface
);
*涉及到的机构体:
typedefstruct{
DFBSurfaceDescriptionFlagsflags;//改变surface的一些属性,如大小,颜色格式等
DFBSurfaceCapabilitiescaps;/*capabilities*/
intwidth;//宽
intheight;//高
DFBSurfacePixelFormatpixelformat;//像素格式
struct{
void*data;//buffur指针
intpitch;//每行所占的像素总数
}preallocated[2];
struct{
constDFBColor*entries;//调色板索引
unsignedintsize;//颜色位数
}palette;//调色板设置
unsignedlongresource_id;//资源标识
DFBSurfaceHintFlagshints;//surface类型
}DFBSurfaceDescription;
//具体改变的属性参数
typedefenum{
DSDESC_NONE=0x00000000,
DSDESC_CAPS=0x00000001,
DSDESC_WIDTH=0x00000002,
DSDESC_HEIGHT=0x00000004,
DSDESC_PIXELFORMAT=0x00000008,
DSDESC_PREALLOCATED=0x00000010,
DSDESC_PALETTE=0x00000020,
DSDESC_RESOURCE_ID=0x00000100,
DSDESC_HINTS=0x00000200,
DSDESC_ALL=0x0000033F
}DFBSurfaceDescriptionFlags;
//Surface的一些具体属性
typedefenum{
DSCAPS_NONE=0x00000000,
DSCAPS_PRIMARY=0x00000001,//主surface
DSCAPS_SYSTEMONLY=0x00000002,//surface数据空间由系统内存分配
DSCAPS_VIDEOONLY=0x00000004,//surface数据空间由显卡内存分配
DSCAPS_DOUBLE=0x00000010,//双缓存类型
DSCAPS_SUBSURFACE=0x00000020,//子surface类型
DSCAPS_INTERLACED=0x00000040,
isahalfofthesurface'sheight.*/
DSCAPS_SEPARATED=0x00000080,
DSCAPS_STATIC_ALLOC=0x00000100,
DSCAPS_TRIPLE=0x00000200,//三缓存类型
DSCAPS_PREMULTIPLIED=0x00001000,
DSCAPS_DEPTH=0x00010000,//深度缓存
DSCAPS_SHARED=0x00100000,//共享surface
DSCAPS_ROTATED=0x01000000,
DSCAPS_ALL=0x011113F7,
DSCAPS_FLIPPING=DSCAPS_DOUBLE|DSCAPS_TRIPLE
}DFBSurfaceCapabilities;
typedefenum{
DSHF_NONE=0x00000000,
DSHF_LAYER=0x00000001,//用于层
DSHF_WINDOW=0x00000002,//窗体
DSHF_CURSOR=0x00000004,//鼠标
DSHF_FONT=0x00000008,//字体
DSHF_ALL=0x0000000F
}DFBSurfaceHintFlags;
//所支持的像素格式
typedefenum{
DSPF_UNKNOWN=0x00000000,/*unknownorunspecifiedformat*/
DSPF_ARGB1555=DFB_SURFACE_PIXELFORMAT(0,15,1,1,0,2,0,0,0,0,0),
DSPF_RGB16=DFB_SURFACE_PIXELFORMAT(1,16,0,0,0,2,0,0,0,0,0),
DSPF_RGB24=DFB_SURFACE_PIXELFORMAT(2,24,0,0,0,3,0,0,0,0,0),
DSPF_RGB32=DFB_SURFACE_PIXELFORMAT(3,24,0,0,0,4,0,0,0,0,0),
DSPF_ARGB=DFB_SURFACE_PIXELFORMAT(4,24,8,1,0,4,0,0,0,0,0),
DSPF_A8=DFB_SURFACE_PIXELFORMAT(5,0,8,1,0,1,0,0,0,0,0),
DSPF_YUY2=DFB_SURFACE_PIXELFORMAT(6,16,0,0,0,2,0,0,0,0,0),
DSPF_RGB332=DFB_SURFACE_PIXELFORMAT(7,8,0,0,0,1,0,0,0,0,0),
DSPF_UYVY=DFB_SURFACE_PIXELFORMAT(8,16,0,0,0,2,0,0,0,0,0),
DSPF_I420=DFB_SURFACE_PIXELFORMAT(9,12,0,0,0,1,0,2,0,0,0),
DSPF_YV12=DFB_SURFACE_PIXELFORMAT(10,12,0,0,0,1,0,2,0,0,0),
DSPF_LUT8=DFB_SURFACE_PIXELFORMAT(11,8,0,1,0,1,0,0,0,1,0),
DSPF_ALUT44=DFB_SURFACE_PIXELFORMAT(12,4,4,1,0,1,0,0,0,1,0),
DSPF_AiRGB=DFB_SURFACE_PIXELFORMAT(13,24,8,1,0,4,0,0,0,0,1),
DSPF_A1=DFB_SURFACE_PIXELFORMAT(14,0,1,1,1,0,7,0,0,0,0),
DSPF_NV12=DFB_SURFACE_PIXELFORMAT(15,12,0,0,0,1,0,2,0,0,0),
DSPF_NV16=DFB_SURFACE_PIXELFORMAT(16,24,0,0,0,1,0,0,1,0,0),
DSPF_ARGB2554=DFB_SURFACE_PIXELFORMAT(17,14,2,1,0,2,0,0,0,0,0),
DSPF_ARGB4444=DFB_SURFACE_PIXELFORMAT(18,12,4,1,0,2,0,0,0,0,0),
DSPF_RGBA4444=DFB_SURFACE_PIXELFORMAT(19,12,4,1,0,2,0,0,0,0,0),
DSPF_NV21=DFB_SURFACE_PIXELFORMAT(20,12,0,0,0,1,0,2,0,0,0),
DSPF_AYUV=DFB_SURFACE_PIXELFORMAT(21,24,8,1,0,4,0,0,0,0,0),
DSPF_A4=DFB_SURFACE_PIXELFORMAT(22,0,4,1,4,0,1,0,0,0,0),
DSPF_ARGB1666=DFB_SURFACE_PIXELFORMAT(23,18,1,1,0,3,0,0,0,0,0),
DSPF_ARGB6666=DFB_SURFACE_PIXELFORMAT(24,18,6,1,0,3,0,0,0,0,0),
DSPF_RGB18=DFB_SURFACE_PIXELFORMAT(25,18,0,0,0,3,0,0,0,0,0),
DSPF_LUT2=DFB_SURFACE_PIXELFORMAT(26,2,0,1,2,0,3,0,0,1,0),
DSPF_RGB444=DFB_SURFACE_PIXELFORMAT(27,12,0,0,0,2,0,0,0,0,0),
DSPF_RGB555=DFB_SURFACE_PIXELFORMAT(28,15,0,0,0,2,0,0,0,0,0),
DSPF_BGR555=DFB_SURFACE_PIXELFORMAT(29,15,0,0,0,2,0,0,0,0,0),
DSPF_RGBA5551=DFB_SURFACE_PIXELFORMAT(30,15,1,1,0,2,0,0,0,0,0)
}DFBSurfacePixelFormat;
5.7﹑Read
*函数功能:
读取surface中的像素信息
*参数说明:
thiz:
指向surface
rect:
读取大小
ptr:
存储的内存地址
*函数原型:
DFBResult(*Read)(
IDirectFBSurface*thiz,
constDFBRectangle*rect,
void*ptr,
intpitch
);
5.8﹑Write
*函数功能:
写入像素信息到surface中
*参数说明:
thiz:
指向surface
rect:
写入大小
ptr:
存储的内存地址
*函数原型:
DFBResult(*Write)(
IDirectFBSurface*thiz,
constDFBRectangle*rect,
void*ptr,
intpitch
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DirectFb 总结