DirectFB学习之图形加速驱动的匹配

DirectFB学习之图形加速驱动的匹配

通过前面对DirectFB中用类似面向对象的设计方法分析后,同理可知我们的gfxdrivers也是一个个的so被加载进来的,那问题来,当gfxdrivers下存在多个gfx驱动的时它是匹配哪一个呢?

我们先找到初始化gfxdrivers的地方,它在文件src/core/gfxcard.c中,如下:

static DFBResult
dfb_graphics_core_initialize( CoreDFB               *core,
                              DFBGraphicsCore       *data,
                              DFBGraphicsCoreShared *shared )
{
.............................
     /* Build a list of available drivers. */
     direct_modules_explore_directory( &dfb_graphics_drivers );

     /* Load driver */
     if (dfb_system_caps() & CSCAPS_ACCELERATION)
          dfb_gfxcard_find_driver( core );
.............................
}

如上一章所说direct_modules_explore_directory()函数会加载gfxdrivers目录下的所有drive,匹配则是发生在dfb_gfxcard_find_driver()中,可见匹配前先判断了该system是否支持图形加速,我们再进到里面如下:

static void dfb_gfxcard_find_driver( CoreDFB *core )
{
.............................

     while (direct_list_check_link( link )) {

          DirectModuleEntry *module = (DirectModuleEntry*) link;

          link = link->next;

          const GraphicsDriverFuncs *funcs = direct_module_ref( module );

          if (!funcs)
               continue;

          if (!card->module && funcs->Probe( card )) {
               funcs->GetDriverInfo( card, &card->shared->driver_info );

               card->module       = module;
               card->driver_funcs = funcs;

               card->shared->module_name = SHSTRDUP( pool, module->name );
          }
          else {
               /* can result in immediate removal, so "link" must already be on next */
               direct_module_unref( module );
          }
     }
}

可见成功匹配的条件是if (!card->module && funcs->Probe( card )) 即card中还没有匹配过图形驱动card->module == NULL并且funcs->Probe( card )返回要为真,所以那我们应该去看图像驱动的Probe函数,如下是一个具体图像驱动的Probe函数:

static int
driver_probe( CoreGraphicsDevice *device )
{
     D_DEBUG_AT( SH7722_Driver, "%s()\n", __FUNCTION__ );

     return dfb_gfxcard_get_accelerator( device ) == 0x2D47;
}

由此看见它是通过一个ID来匹配,那dfb_gfxcard_get_accelerator( device )的ID从哪里来呢,往里面进去我们会发现它是来自system的GetAccelerator()接口,如下:

int
dfb_system_get_accelerator( void )
{
     D_ASSERT( system_funcs != NULL );

     return system_funcs->GetAccelerator();
}

以fbdev为例这个ID当然是从framebuff驱动信息里面读取的,这个在内核驱动里面设置。到这里图像加速驱动的匹配就结束了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值