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进程。