先还是大体的来看下流程图,这个比hwc1复杂了好多,不是太好理解:
1.SurfaceFlinger.init
"Starting with vr flinger active is not currently supported.");
mRealHwc = new HWComposer(false);
mHwc = mRealHwc;
mHwc->setEventHandler(static_cast<HWComposer::EventHandler*>(this));
Mutex::Autolock _l(mStateLock);
在这里只关注hwcomposer实例生成的具体过程,上面代码主要二个作用:
1.生成一个HWComposer实例
2.生成实例后,注意消息回调函数。是surfaceflinger与composer Hidl服务层通信的唯一通道
2.HWComposer
HWComposer::HWComposer(bool useVrComposer)
: mHwcDevice(),
mDisplayData(2),
mFreeDisplaySlots(),
mHwcDisplaySlots(),
mCBContext(),
mEventHandler(nullptr),
mVSyncCounts(),
mRemainingHwcVirtualDisplays(0)
{
for (size_t i=0 ; i<HWC_NUM_PHYSICAL_DISPLAY_TYPES ; i++) {
mLastHwVSync[i] = 0;
mVSyncCounts[i] = 0;
}
loadHwcModule(useVrComposer);
}
来看看其构造函数,除了初始化一些基本的成员变量。剩下的就是loadHwcModule这个API的调用了,这个调用就是获取hwc2的实例
3.loadHwcModule
文件:HWComposer.cpp
void HWComposer::loadHwcModule(bool useVrComposer)
{
ALOGV("loadHwcModule");
//获取HWC2::Device类实例,这是这个函数的唯一作用
mHwcDevice = std::make_unique<HWC2::Device>(useVrComposer);
mRemainingHwcVirtualDisplays = mHwcDevice->getMaxVirtualDisplayCount();
}
4.HWC2::Device
文件:hwc2.cpp
Device::Device(bool useVrComposer)
: mComposer(std::make_unique<Hwc2::Composer>(useVrComposer)),
mCapabilities(),
mDisplays(),
mHotplug(),
mPendingHotplugs(),
mRefresh(),
mPendingRefreshes(),
mVsync(),
mPendingVsyncs()
{
loadCapabilities();
registerCallbacks();
}
这个函数比较重要的有二个:
1.mComposer成员的初始化
2.向composer HIDL服务注册回调函数registerCallbacks
5.Composer
文件:ComposerHal.cpp
Composer::Composer(bool useVrComposer)
: mWriter(kWriterInitialSize),
mIsUsingVrComposer(useVrComposer)
{
if (mIsUsingVrComposer) {
mComposer = IComposer::getService("vr");
} else {
mComposer = IComposer::getService(); // use default name
}
if (mComposer == nullptr) {
LOG_ALWAYS_FATAL("failed to get hwcomposer service");
}
mComposer->createClient(
[&](const auto& tmpError, const auto& tmpClient)
{
if (tmpError == Error::NONE) {
mClient = tmpClient;
}
});