Android P 显示流程(一)
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