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

目录:Android显示终极宝典

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()执行完,生成了哪些内容呢?如下图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值