对任何一个dfb应用程序,它在初始化时一定会调用下面两句:
/* DirectFB init */
DirectFBInit( &argc, &argv);
DirectFBCreate(&dfb);
第一步,DirectFBInit主要完成directFB配置的一些初始化。主要包括读取环境变量DIRECTFBPATH,读取directfbrc文件,获取系统配置和用户配置、处理命令行等。
读取到的配置信息保存在dfb_config全局变量中。这样,后面的程序可以通过dfb_config,获取配置信息,不需要自己去读取。
第二步,调用DirectFBCreate(&dfb),获取超级接口IDirectFB,即这里的dfb.有了这个超级接口,应用程序才可以DFB的其他接口或函数,如CreateSurface, CreateFont等。
如果你还不是很明白,分析下这个超级接口的定义和实现,你就会恍然大悟了。在directfb.h头文件里,有下面一句:
DECLARE_INTERFACE( IDirectFB ) 和 DEFINE_INTERFACE(IDirectFB ,......)
这是一个宏,对于IDirectFB,展开后相当于:
typedef struct _IDirectFB IDirectFB;
struct _IDirectFB
{
void *priv;
int magic;
DirectResult (*AddRef)( IDirectFB *thiz );
DirectResult (*Release)( IDirectFB *thiz );
DFBResult (*SetCooperativeLevel) (IDirectFB *thiz, DFBCooperativeLevel level );
...........................(若干函数指针,省略)....................................
DFBResult (*CreateSurface) (IDirectFB *thiz, const DFBSurfaceDescription *desc, IDirectFBSurface **ret_interface );
DFBResult (*GetScreen) (IDirectFB *thiz, DFBScreenID screen_id, IDirectFBScreen **ret_interface);
DFBResult (*GetDisplayLayer) ( IDirectFB *thiz, DFBDisplayLayerID layer_id, IDirectFBDisplayLayer **ret_interface);
DFBResult (*GetInputDevice) ( IDirectFB *thiz, DFBInputDeviceID device_id, IDirectFBInputDevice **ret_interface );
DFBResult (*CreateEventBuffer) ( IDirectFB *thiz, IDirectFBEventBuffer **ret_buffer );
DFBResult (*CreateFont) ( IDirectFB *thiz, const char *filename, const DFBFontDescription *desc, IDirectFBFont **ret_interface );
...........................(若干函数指针,省略)....................................
};
除了IDirectFB这个主接口外,DFB中还有IDirectFBSurface, IDirectFBPalette等接口。所有的接口都是以宏定义的形式实现的。关于这些接口的具体用途,先别急,我会在
下一篇文章对此进行详细解说。
总之,就directFB本身来说,DirectFBCreate主要是在配置已经读取的基础上,完成一系列初始化,并将各种需要的信息保存在IDirectFB指向的数据结构中。它主要调用三
个函数:
(1) direct_initialize()函数:完成线程以及信号量的初始化;
(2) dfb_core_create函数:完成多进程相关的初始化和核心部件的初始化。
(3)IDirectFB_Construct函数:填充IDIRECTFB数据结构,对函数指针CreateSurface等进行赋值、初始化;
我们重点解释下dfb_core_create函数。它主要调用以下函数:
(1) dfb_system_lookup函数:它主要是根据系统库目录,读取和加载系统信息。这里的系统,指的是图形系统,一般frame buffer设备、x11等。
(2) fusion_enter:完成多进程相关的初始化。
(3)fusion_arena_enter:初始化或加入竞技场。它会根据当前进程是否第一个,决定调用initialize或join函数。这里分析第一个进程的情况,即调用最后会调用
dfb_core_initialize函数。
dfb_core_initialize函数一方面会创建surface pool等结构,另一方面调用dfb_core_part_initialize会完成各个核心部件的初始化。核心部件的一个定义如下:
static CorePart *core_parts[] = {
&dfb_clipboard_core,
&dfb_colorhash_core,
&dfb_surface_core,
&dfb_system_core,
&dfb_input_core,
&dfb_graphics_core,
&dfb_screen_core,
&dfb_layer_core,
&dfb_wm_core
};
下文我将进一步以图形系统graphics_core为例,进一步分析显卡驱动相关的初始化。
Smith先生版权所有,如需转载,请注明出处:http://blog.csdn.net/acs713/article/details/7846686