Android12 显示框架之SurfaceFlinger启动(二)

目录:Android显示终极宝典

SurfaceFlinger::init()

我们开始init的第二阶段的学习:

	//frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp  
	void SurfaceFlinger::init() {  
	    //省略  
	    //mHwcServiceName = “default”  
	    mCompositionEngine->setHwComposer(getFactory().createHWComposer(mHwcServiceName));  
	    mCompositionEngine->getHwComposer().setCallback(this);  
	    //省略  
	}  

先看createHWComposer做了什么事情(std::make_unique参见Android常用C++特性之std::make_unique):

	//frameworks/native/services/surfaceflinger/SurfaceFlingerDefaultFactory.cpp  
	std::unique_ptr<HWComposer> DefaultFactory::createHWComposer(const std::string& serviceName) {  
	    return std::make_unique<android::impl::HWComposer>(serviceName);  
	}  
	  
	//frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer.cpp  
	HWComposer::HWComposer(const std::string& composerServiceName)  
	      : HWComposer(std::make_unique<Hwc2::impl::Composer>(composerServiceName)) {}  
	  
	HWComposer::HWComposer(std::unique_ptr<Hwc2::Composer> composer)  
	      : mComposer(std::move(composer)),  
	        mMaxVirtualDisplayDimension(static_cast<size_t>(sysprop::max_virtual_display_dimension(0))),  
	        mUpdateDeviceProductInfoOnHotplugReconnect(  
	                sysprop::update_device_product_info_on_hotplug_reconnect(false)) {}  

这里就是想构造一个HWComposer,构造时传入的name值为“default”。俄罗斯套娃,又来构造一个Composer,并保存到它的mComposer中。再来看看Composer的构造函数:

	//frameworks/native/services/surfaceflinger/DisplayHardware/ComposerHal.cpp  
	Composer::Composer(const std::string& serviceName) : mWriter(kWriterInitialSize) {  
	    mComposer = V2_1::IComposer::getService(serviceName);  
	  
	    if (mComposer == nullptr) {  
	        LOG_ALWAYS_FATAL("failed to get hwcomposer service");  
	    }  
	  
	    if (sp<IComposer> composer_2_4 = IComposer::castFrom(mComposer)) {  
	        composer_2_4->createClient_2_4([&](const auto& tmpError, const auto& tmpClient) {  
	            if (tmpError == V2_4::Error::NONE) {  
	                mClient = tmpClient;  
	                mClient_2_2 = tmpClient;  
	                mClient_2_3 = tmpClient;  
	                mClient_2_4 = tmpClient;  
	            }  
	        });  
	    } else if (sp<V2_3::IComposer> composer_2_3 = V2_3::IComposer::castFrom(mComposer)) {  
	        composer_2_3->createClient_2_3([&](const auto& tmpError, const auto& tmpClient) {  
	            if (tmpError == Error::NONE) {  
	                mClient = tmpClient;  
	                mClient_2_2 = tmpClient;  
	                mClient_2_3 = tmpClient;  
	            }  
	        });  
	    } else {  
	        mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {  
	            if (tmpError != Error::NONE) {  
	                return;  
	            }  
	  
	            mClient = tmpClient;  
	            if (sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer)) {  
	                mClient_2_2 = V2_2::IComposerClient::castFrom(mClient);  
	                LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr,  
	                                    "IComposer 2.2 did not return IComposerClient 2.2");  
	            }  
	        });  
	    }  
	  
	    if (mClient == nullptr) {  
	        LOG_ALWAYS_FATAL("failed to create composer client");  
	    }  
	}  

首先,获取IComposer对应的名字为“default”的service,为什么要名字为“default”的service呢?我们来看看composer service的中间件:

	//out/soong/.intermediates/hardware/interfaces/graphics/composer/2.1/android.hardware.graphics.composer@2.1_genc++_headers/gen/android/hardware/graphics/composer/2.1/IComposer.h  
	struct IComposer : public ::android::hidl::base::V1_0::IBase {  
	    //省略  
	    __attribute__ ((warn_unused_result))::android::status_t registerAsService(const std::string &serviceName="default");  
	    //省略  
	}  
	  
	//out/soong/.intermediates/hardware/interfaces/graphics/composer/2.1/android.hardware.graphics.composer@2.1_genc++/gen/android/hardware/graphics/composer/2.1/ComposerAll.cpp  
	::android::status_t IComposer::registerAsService(const std::string &serviceName) {  
	    return ::android::hardware::details::registerAsServiceInternal(this, serviceName);  
	}  
	  
	//system/libhidl/transport/ServiceManagement.cpp  
	status_t registerAsServiceInternal(const sp<IBase>& service, const std::string& name) {  
	    //省略  
	}  

所以,可以很清楚的看到registerAsService的参数就是默认值:“default”。最终,就是把创建出来的composer service注册到hwservicemanager里面去了。

回过头来继续看Composer的构造函数的后半段,由于我们暂时只实现了composer的2.1版本,所以只会走进最后的else分支:

	//frameworks/native/services/surfaceflinger/DisplayHardware/ComposerHal.cpp  
	Composer::Composer(const std::string& serviceName) : mWriter(kWriterInitialSize) {  
	    //省略  
	    mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {  
	        if (tmpError != Error::NONE) {  
	            return;  
	        }  
	  
	        mClient = tmpClient;  
	        if (sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer)) {  
	            mClient_2_2 = V2_2::IComposerClient::castFrom(mClient);  
	            LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr,  
	                                "IComposer 2.2 did not return IComposerClient 2.2");  
	        }  
	    });  
	    //省略  
	}  

前面获取到了composer service的代理,这里直接跨binder调用其createClient()创建一个IComposerClient保存在mClient中,下面看看createClient()的具体行为(std::unique_lock参见Android常用C++特性之std::unique_lock):

	//hardware/interfaces/graphics/composer/2.1/utils/hal/include/composer-hal/2.1/Composer.h  
	Return<void> createClient(IComposer::createClient_cb hidl_cb) override {  
	    std::unique_lock<std::mutex> lock(mClientMutex);  
	    if (!waitForClientDestroyedLocked(lock)) {  
	        hidl_cb(Error::NO_RESOURCES, nullptr);  
	        return Void();  
	    }  
	  
	    sp<IComposerClient> client = createClient();  
	    if (!client) {  
	        hidl_cb(Error::NO_RESOURCES, nullptr);  
	        return Void();  
	    }  
	  
	    mClient = client;  
	    hidl_cb(Error::NONE, client);  
	    return Void();  
	}  
	  
	virtual IComposerClient* createClient() {  
	    auto client = ComposerClient::create(mHal.get());  
	    if (!client) {  
	        return nullptr;  
	    }  
	  
	    auto clientDestroyed = [this]() { onClientDestroyed(); };  
	    client->setOnClientDestroyed(clientDestroyed);  
	  
	    return client.release();  
	}  

这里有个mHal成员变量,它是怎么来的这里不做分析,在后面的HWComposer章节中再进行解析。这里直接给出答案,它实际上就是我们hal层的HWC的实现的实体。继续看ComposerClient::create做了什么:

	//hardware/interfaces/graphics/composer/2.1/utils/hal/include/composer-hal/2.1/ComposerClient.h  
	static std::unique_ptr<ComposerClientImpl> create(Hal* hal) {  
	    auto client = std::make_unique<ComposerClientImpl>(hal);  
	    return client->init() ? std::move(client) : nullptr;  
	}  
	  
	ComposerClientImpl(Hal* hal) : mHal(hal) {}  
	  
	bool init() {  
	    mResources = createResources();  
	    if (!mResources) {  
	        ALOGE("failed to create composer resources");  
	        return false;  
	    }  
	  
	    mCommandEngine = createCommandEngine();  
	  
	    return true;  
	}  

可以看到,这里就是创建了一个ComposerClientImpl返回上去。有了这个实例,后面surfaceflinger就可以通过它来直接调用HWC的接口了。关于ComposerClientImpl,先简单介绍几句,具体后面再分析。它在init()里还创建了一个ComposerResources和一个ComposerCommandEngine。ComposerResources可以把它理解为资源管理功能,surfaceflinger设置的一些参数在这里可以保存,上面每次设置或者获取一些参数时,不需要都往HWC里面去调用,本地就有备份。Surfaceflinger调用HWC的接口有些是通过ComposerClientImpl客户端直接调用,还有一些则是先将参数及接口对应的command打包放入command buffer(messagequeue)中并执行execute(),然后进入ComposerCommandEngine中从command buffer中取出参数,最后调用HWC对应的接口。

看到这里,我们的setHwComposer已经结束了。下面继续看看setCallback():

	//frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp    
	void SurfaceFlinger::init() {    
	    //省略    
	    mCompositionEngine->getHwComposer().setCallback(this);    
	    //省略    
	}    
	  
	//frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer.cpp  
	void HWComposer::setCallback(HWC2::ComposerCallback* callback) {  
	    //省略  
	  
	    mComposer->registerCallback(  
	            sp<ComposerCallbackBridge>::make(callback, mComposer->isVsyncPeriodSwitchSupported()));  
	}  
	  
	//frameworks/native/services/surfaceflinger/DisplayHardware/ComposerHal.cpp  
	void Composer::registerCallback(const sp<IComposerCallback>& callback)  
	{  
	    android::hardware::setMinSchedulerPolicy(callback, SCHED_FIFO, 2);  
	    auto ret = [&]() {  
	        if (mClient_2_4) {  
	            return mClient_2_4->registerCallback_2_4(callback);  
	        }  
	        return mClient->registerCallback(callback);  
	    }();  
	    if (!ret.isOk()) {  
	        ALOGE("failed to register IComposerCallback");  
	    }  
	}  

首先,它将surfaceflinger本身保存到创建的ComposerCallbackBridge实例的内部。然后,再将ComposerCallbackBridge跨binder注册到ComposerClient中,注册的时候在本地又创建了一个HalEventCallback实例来保存ComposerCallbackBridge的代理。最后,将HalEventCallback注册到HwcHalImpl中去:

	//hardware/interfaces/graphics/composer/2.1/utils/hal/include/composer-hal/2.1/ComposerClient.h  
	Return<void> registerCallback(const sp<IComposerCallback>& callback) override {  
	    // no locking as we require this function to be called only once  
	    mHalEventCallback = std::make_unique<HalEventCallback>(mHal, callback, mResources.get());  
	    mHal->registerEventCallback(mHalEventCallback.get());  
	    return Void();  
	}  
	  
	//hardware/interfaces/graphics/composer/2.1/utils/passthrough/include/composer-passthrough/2.1/HwcHal.h  
	void registerEventCallback(hal::ComposerHal::EventCallback* callback) override {  
	    mEventCallback = callback;  
	  
	    mDispatch.registerCallback(mDevice, HWC2_CALLBACK_HOTPLUG, this,  
	                               reinterpret_cast<hwc2_function_pointer_t>(hotplugHook));  
	    mDispatch.registerCallback(mDevice, HWC2_CALLBACK_REFRESH, this,  
	                               reinterpret_cast<hwc2_function_pointer_t>(refreshHook));  
	    mDispatch.registerCallback(mDevice, HWC2_CALLBACK_VSYNC, this,  
	                               reinterpret_cast<hwc2_function_pointer_t>(vsyncHook));  
	}  

这里注册了3个消息通知:hotplug/refresh/vsync,需要注意的是,注册hotplug接口到HWC的同时会立即回调到surfaceflinger,surfaceflinger会将这个消息保存到mPendingHotplugEvents成员中,在后面的步骤会处理这个消息(std::this_thread参见Android常用C++特性之std::this_thread):

	//frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp  
	void SurfaceFlinger::onComposerHalHotplug(hal::HWDisplayId hwcDisplayId,  
	                                          hal::Connection connection) {  
	    ALOGI("%s(%" PRIu64 ", %s)", __func__, hwcDisplayId,  
	          connection == hal::Connection::CONNECTED ? "connected" : "disconnected");  
	  
	    // Only lock if we're not on the main thread. This function is normally  
	    // called on a hwbinder thread, but for the primary display it's called on  
	    // the main thread with the state lock already held, so don't attempt to  
	    // acquire it here.  
	    ConditionalLock lock(mStateLock, std::this_thread::get_id() != mMainThreadId);  
	  
	    mPendingHotplugEvents.emplace_back(HotplugEvent{hwcDisplayId, connection});  
	  
	    if (std::this_thread::get_id() == mMainThreadId) {  
	        // Process all pending hot plug events immediately if we are on the main thread.  
	        processDisplayHotplugEventsLocked();  
	    }  
	  
	    setTransactionFlags(eDisplayTransactionNeeded);  
	}  

好了,init()第二阶段走到这一步,我们来看看surfaceflinger又创建了哪些内容:

 大家可以思考下图中哪些模块位于surfaceflinger进程,哪些位于composer service进程。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值