SurfaceFlinger::init()
上节看完了initScheduler(),本节将看看processDisplayHotplugEventsLocked()中的最后一个方法:processDisplayChangesLocked()。
processDisplayChangesLocked()
SurfaceFLinger初始化阶段,这个函数内只会执行processDisplayAdded()方法,因为mDrawingState里面还没有任何内容。
//frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
void SurfaceFlinger::processDisplayChangesLocked() {
const KeyedVector<wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
const KeyedVector<wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
if (!curr.isIdenticalTo(draw)) {
//省略
for (size_t i = 0; i < curr.size(); i++) {
const wp<IBinder>& displayToken = curr.keyAt(i);
if (draw.indexOfKey(displayToken) < 0) {
processDisplayAdded(displayToken, curr[i]);
}
}
}
mDrawingState.displays = mCurrentState.displays;
}
理论上,每个display只会执行一次processDisplayAdded()方法,下面看看这个里面做 了哪些事情:
//frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
void SurfaceFlinger::processDisplayAdded(const wp<IBinder>& displayToken,
const DisplayDeviceState& state) {
ui::Size resolution(0, 0);
ui::PixelFormat pixelFormat = static_cast<ui::PixelFormat>(PIXEL_FORMAT_UNKNOWN);
if (state.physical) {
resolution = state.physical->activeMode->getSize();
pixelFormat = static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888);
} else if (state.surface != nullptr) {
//省略
} else {
//省略
}
compositionengine::DisplayCreationArgsBuilder builder;
if (const auto& physical = state.physical) {
builder.setId(physical->id);
builder.setConnectionType(physical->type);
} else {
//省略
}
builder.setPixels(resolution);
builder.setIsSecure(state.isSecure);
builder.setLayerStackId(state.layerStack);
builder.setPowerAdvisor(&mPowerAdvisor);
builder.setName(state.displayName);
auto compositionDisplay = getCompositionEngine().createDisplay(builder.build());
compositionDisplay->setLayerCachingEnabled(mLayerCachingEnabled);
sp<compositionengine::DisplaySurface> displaySurface;
sp<IGraphicBufferProducer> producer;
sp<IGraphicBufferProducer> bqProducer;
sp<IGraphicBufferConsumer> bqConsumer;
getFactory().createBufferQueue(&bqProducer, &bqConsumer, /*consumerIsSurfaceFlinger =*/false);
if (state.isVirtual()) {
//省略
} else {
ALOGE_IF(state.surface != nullptr,
"adding a supported display, but rendering "
"surface is provided (%p), ignoring it",
state.surface.get());
const auto displayId = PhysicalDisplayId::tryCast(compositionDisplay->getId());
LOG_FATAL_IF(!displayId);
displaySurface =
sp<FramebufferSurface>::make(getHwComposer(), *displayId, bqConsumer,
state.physical->activeMode->getSize(),
ui::Size(maxGraphicsWidth, maxGraphicsHeight));
producer = bqProducer;
}
LOG_FATAL_IF(!displaySurface);
const auto display = setupNewDisplayDeviceInternal(displayToken, std::move(compositionDisplay),
state, displaySurface, producer);
mDisplays.emplace(displayToken, display);
if (!state.isVirtual()) {
dispatchDisplayHotplugEvent(display->getPhysicalId(), true);
}
if (display->isPrimary()) {
mScheduler->onPrimaryDisplayAreaChanged(display->getWidth() * display->getHeight());
getRenderEngine().onPrimaryDisplaySizeChanged(display->getSize());
}
}
上面的代码中省略了virtualDisplay以及其他通常不会走的逻辑。下面简单描述这段代码:
- 根据DisplayDeviceState的信息填充/构造出一个DisplayCreationArgsBuilder,为创建Output做准备。
- 创建一套生产者/消费者(BufferQueueProducer/BufferQueueCore/BufferQueueConsumer),作为生成/消费SurfaceFlinger合成的图像的桥梁。
- 创建FramebufferSurface封装BufferQueueConsumer,主要完成送显合成后的图像。
- 创建一个DisplayDevice并保存到mDisplays中,这里内部完成如下内容:
- 创建一个nativeWindowSurface,用来封装BufferQueueProducer。
- 从hwcomposer获取colorMode及HDR相关信息。
- 将所有有用信息构建出一个DisplayDeviceCreationArgs参数。
- 根据以上参数创建出DisplayDevice。
- 根据DisplayDeviceState信息初始化DisplayDevice和Output内部的一些变量。
- 对mAppConnectionHandle和mSfConnectionHandle所绑定的EventThread线程都发起一次hotplug消息。
- 如果是primary display,则更新一下Scheduler及RenderEnigne的display size信息。
(代码中关于std:swap请参见Android常用C++特性之std::swap)
到此,processDisplayAdded()方法讲完了,返回到processDisplayChangesLocked()中,末尾会将mCurrentState.displays的内容更新到mDrawingState.displays中,这里也是mDrawingState的首次更新内容。processDisplayHotplugEventsLocked()到这里也就结束了。
那么本节processDisplayChangesLocked()执行完,生成了哪些内容呢?如下图: