【编撰】Directfb 深入 001 初始化简介 01

来源:互联网 发布:双色球组合数据 编辑:程序博客网 时间:2024/05/01 09:26

Franklin 只是对排版做了优化,然后对笔者自己实践的地方,【】加了更多的解释和注释。

全文转载:DFB初始化简介

地址:http://blog.csdn.net/acs713/article/details/7846686

作者:Smith先生

===============================================================================================================================

1 初始化DFB应用接口函数:

 对任何一个dfb应用程序,它在初始化时一定会调用下面两句:

      /* DirectFB init */
     DirectFBInit( &argc, &argv);
     DirectFBCreate(&dfb);

1.1 接口函数DirectFBInit介绍

 第一步,DirectFBInit主要完成directFB配置的一些初始化。

主要包括读取环境变量DIRECTFBPATH,读取directfbrc文件,【可以通过getenv("DIRECTFBPATH")】获取系统配置和用户配置、处理命令行等。
读取到的配置信息保存在dfb_config全局变量中。这样,后面的程序可以通过dfb_config,获取配置信息,不需要自己去读取。


 1.2 接口函数DirectFBCreate的介绍

 第二步,调用DirectFBCreate(&dfb),获取【&dfb】的超级接口IDirectFB,即这里的dfb.有了这个超级接口,应用程序才可以DFB的其他接口或函数,如CreateSurface, CreateFont等。【笔者加了更多的理解】

1.2.1 IDirectFB的结构

     如果你还不是很明白,分析下这个超级接口的定义和实现,你就会恍然大悟了。在directfb.h头文件里,有下面一句:
      DECLARE_INTERFACE( IDirectFB ) 和 DEFINE_INTERFACE(IDirectFB ,......)
    这是一个宏,对于IDirectFB,展开后相当于:


    typedef struct _IDirectFB IDirectFB;
     struct _IDirectFB
    {                            
          void          *priv;                    //【私有数据】
          int            magic;                   //【magic字用于区分】
                                                         //【下面是一大波注册回调的接口函数,定义了DFB模块和资源所需的各自初始化函数】
          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等接口。所有的接口都是以宏定义的形式实现的。关于这些接口的具体用途,先别急,我会在
下一篇文章对此进行详细解说。
     

1.2.2 IDirectFB结构的初始化主要步骤和接口函数


总之,就directFB本身来说,DirectFBCreate主要是在配置已经读取的基础上,完成一系列初始化,并将各种需要的信息保存在IDirectFB指向的数据结构中。

1.2.2.1 它主要调用三个函数:

    (1) direct_initialize()函数:完成线程以及信号量的初始化;
    (2) dfb_core_create函数:完成多进程相关的初始化和核心部件的初始化。
    (3)IDirectFB_Construct函数:填充IDIRECTFB数据结构,对函数指针CreateSurface等进行赋值、初始化;

1.2.2.2 dfb_core_create函数:

     我们重点解释下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为例,进一步分析显卡驱动相关的初始化。



0 0
原创粉丝点击