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驱动信息里面读取的,这个在内核驱动里面设置。到这里图像加速驱动的匹配就结束了。