DFB初始化简介

    对任何一个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


 

 

你可能感兴趣的:(DFB初始化简介)