Android P 显示流程(一)---Display设备初始化过程分析

SurfaceFlinger

SurfaceFlinger在Android中是显示的核心部分,所以我们今天从SurfaceFlinger开始来研究。

SurfaceFlinger的启动

SurfaceFlinger的启动要从main_surfaceflinger.cpp开始看:

int main(int, char**){
   
	...
	//启动 Hal层的IAllocator : hardware::graphics::allocator::V2.0::IAllocator
	startGraphicsAllocatorService();
	...
	//instantiate surfaceflinger
	sp<SurfaceFlinger> flinger = new SurfaceFlinger();
	//initialize before clients can connect
	flinger->init();
	//publish surface flinger
	sp<IServiceManager> sm(defaultServiceManager());
	sm->addService(String16(SrufaceFlinger::getServiceName()), flinger, false, 
		IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL | IServiceManager::DUMP_FLAG_PROTO);
	//启动DisplayService
	startDisplayService();
	//run surface flinger in this thread
	flinger->run();
}

重点来看SurfaceFlinger实例化,以及init(), run()…

void SurfaceFlinger::init(){
   
	...
	//初始化mBE 即 SurfaceFlingerBE
	getBE().mRenderEngine = RE::impl::RenderEngine::create(HAL_PIXEL_FORMAT_RGBA_8888, hasWideColorDisplay? RE::RenderEngine::WIDE_COLOR_SUPPORT:0);
	getBE().mHwc.reset(new HWComposer(std::make_unique<Hwc2::impl::Composer>(getBe().mHwcServiceName)));
	//注册HAL事件上报的回调
	getBE().mHwc->registerCallback(this, getBE().mComposerSequenceId);
	//处理HAL层上报的事件回调
	processDisplayHotplugEventsLocked();
	getBE().mRenderEngine->primeCache();
	//初始化Displays
	initializeDisplays();
}

void SurfaceFlinger::run(){
   
	do{
   
		waitForEvent();
	}while(true);
}

init中有一部分是用来初始化SurfaceFlingerBE中的属性变量。主要是将SurfaceFlinger与Hal层的Composer连接起来。getBE()中的mHwc 就可以关联到HWComposer。
上面init()里主要有三步,第一步是注册回调,第二步为回调事件处理,第三步为显示的初始化。因为SurfaceFlinger启动时,kernel里的DRM的显示屏一般已经初始化好了,然后通过onHotPlug事件报上来了,这里再来获取配置相关参数。

注册HAL层事件回调

HWComposer->registerCallback(this, getBE().mComposerSequenceId)---->
HWC2::Device->registerCallback(callback, sequenceId)---->
HWC2::impl::Composer->registerCallback(new ComposerCallbackBridge(callback, sequenceId))---->
IComposerClient->registerCallback(callback)---->
HwcHalImpl->registerEventCallback(make_unique(callback, mResources.get())---->
mDispatch.registerCallback(mDevice, HWC2_CALLBACK_HOTPLUG, this,reinterpret_cast<hwc2_function_pointer_t>(hotplugHook))---->
HWC2On1Adapter::registerCallbackHook(mDevice, HWC2_CALLBACK_HOTPLUG, this,reinterpret_cast<hwc2_function_pointer_t>(hotplugHook)) ---->
HWC2On1Adapter::registerCallback(HWC2_CALLBACK_HOTPLUG,
hwc2_callback_data_t callbackData, reinterpret_cast<hwc2_function_pointer_t>(hotplugHook))
以上为完整的registerCallback的调用链。

Error HWC2On1Adapter::registerCallback(Callback descriptor,
        hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer)
{
   
	...
	 std::vector<std::pair<hwc2_display_t, int>> pendingHotplugs;
	 } else if (descriptor == Callback::Hotplug) {
   
        // Hotplug the primary display
        pendingHotplugs.emplace_back(mHwc1DisplayMap[HWC_DISPLAY_PRIMARY],
                static_cast<int32_t>(Connection::Connected));
		for (auto pending : mPendingHotplugs) {
   
            auto hwc1DisplayId 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值