【surfaceflinger源码分析】RenderSurface与FramebufferSurface之间的关系

刚刚想全面梳理下surfaceflinger中一个GraphicBuffer的完整旅程,发现流程实在是太长,而且涉及到EGL相关的操作比较复杂,不得不暂停前一篇博客,先启动梳理下RenderSurface与FramebufferSurface的关系以及其作用。

RenderSurface与FramebufferSurface的创建

创建FramebufferSurface

void SurfaceFlinger::processDisplayAdded(const wp<IBinder>& displayToken,
                                         const DisplayDeviceState& state) {
    .............................................;
    compositionengine::DisplayCreationArgsBuilder builder;
    if (const auto& physical = state.physical) {
        builder.setPhysical({physical->id, physical->type});
    }
    builder.setPixels(ui::Size(width, height));
    builder.setPixelFormat(pixelFormat);
    builder.setIsSecure(state.isSecure);
    builder.setLayerStackId(state.layerStack);
    builder.setPowerAdvisor(&mPowerAdvisor);
    builder.setUseHwcVirtualDisplays(mUseHwcVirtualDisplays || getHwComposer().isUsingVrComposer());
    builder.setName(state.displayName);
    //创建Display这个类, surfaceflinger\CompositionEngine\src\Display.cpp
    const auto compositionDisplay = getCompositionEngine().createDisplay(builder.build());

    sp<compositionengine::DisplaySurface> displaySurface;
    sp<IGraphicBufferProducer> producer;
    sp<IGraphicBufferProducer> bqProducer;
    sp<IGraphicBufferConsumer> bqConsumer;
    //创建一个bufferQueue,获取到bufferqueue的bqProducer和bqConsumer
    getFactory().createBufferQueue(&bqProducer, &bqConsumer, /*consumerIsSurfaceFlinger =*/false);

    std::optional<DisplayId> displayId = compositionDisplay->getId();
    if (state.isVirtual()) {
       ................'
    } else {
        ............................;
        //将bufferqueue的bqConsumer传递到FramebufferSurface,看起来FramebufferSurface是消费者。
        displaySurface = new FramebufferSurface(getHwComposer(), *displayId, bqConsumer,
                                                maxGraphicsWidth, maxGraphicsHeight);
        producer = bqProducer;
    }

    LOG_FATAL_IF(!displaySurface);
    //这个接口传入了producer,看看最终将producer给了谁,谁就是bufferqueue的生产者,对应的消费者为FramebufferSurface
    const auto display = setupNewDisplayDeviceInternal(displayToken, compositionDisplay, state,
                                                       displaySurface, producer);
    mDisplays.emplace(displayToken, display);
    .........................;
}

通过上面的代码可以看出在surfaceflinger中创建了一个bufferqueue,其中FramebufferSurface持有这个bufferqueue的consumer,用于消费buffer 数据。

创建RenderSurface

sp<DisplayDevice> SurfaceFlinger::setupNewDisplayDeviceInternal(
        const wp<IBinder>& displayToken,
        std::shared_ptr<compositionengine::Display> compositionDisplay,
        const DisplayDeviceState& state,
        const sp<compositionengine::DisplaySurface>& displaySurface, //这个displaySurface就是指FramebufferSurface
        const sp<IGraphicBufferProducer>& producer) {
    auto displayId = compositionDisplay->getDisplayId();
    DisplayDeviceCreationArgs creationArgs(this, displayToken, compositionDisplay); 
    creationArgs.sequenceId = state.sequenceId;
    creationArgs.isSecure = state.isSecure;
    creationArgs.displaySurface = displaySurface;//--------------> 重要
    creationArgs.hasWideColorGamut = false;
    creationArgs.supportedPerFrameMetadata = 0;
    .............................................;
    //将producer传递给到了nativeWindowSurface
    auto nativeWindowSurface = getFactory().createNativeWindowSurface(producer); --->重点看下这个接口
    auto nativeWindow = nativeWindowSurface->getNativeWindow();
    creationArgs.nativeWindow = nativeWindow;
    ..............................................;
    //再继续看下创建后的surface被谁持有了?
    sp<DisplayDevice> display = getFactory().createDisplayDevice(creationArgs);

    if (maxFrameBufferAcquiredBuffers >= 3) {
        nativeWindowSurface->preallocateBuffers();
    }
    ..............................................;
    display->setLayerStack(state.layerStack);
    display->setProjection(state.orientation, state.viewport, state.frame);
    display->setDisplayName(state.displayName);
    return display;
}

std::unique_ptr<surfaceflinger::NativeWindowSurface> DefaultFactory::createNativeWindowSurface(
        const sp<IGraphicBufferProducer>& producer) {
    return surfaceflinger::impl::createNativeWindowSurface(producer);
}

namespace impl {
std::unique_ptr<surfaceflinger::NativeWindowSurface> createNativeWindowSurface(
        const sp<IGraphicBufferProducer>& producer) {
    //定义class NativeWindowSurface
    class NativeWindowSurface final : public surfaceflinger::NativeWindowSurface {
	    public:
	        //------> 用producer创建了一个真实的Surface对象.
	        explicit NativeWindowSurface(const sp<IGraphicBufferProducer>& producer)
	              : mSurface(new Surface(producer, /* controlledByApp */ false)) {}
	        ~NativeWindowSurface() override = default;
	        sp<ANativeWindow> getNativeWindow() const override { return mSurface; }
	        void preallocateBuffers() override { mSurface->allocateBuffers(); }
	    private:
	        sp<Surface> mSurface;
    };
    //创建class NativeWindowSurface的实例
    return std::make_unique<NativeWindowSurface>(producer);
}
}

上面一代码中利用producer创建了一个surface,产生数据给FramebufferSurface消费。 下面再看看Surface被谁最终持有

//这个nativeWindow实际上就是Surface这个类
 auto nativeWindow = nativeWindowSurface->getNativeWindow();
 creationArgs.nativeWindow = nativeWindow;
sp<DisplayDevice> display = getFactory().createDisplayDevice(creationArgs);

sp<DisplayDevice> DefaultFactory::createDisplayDevice(DisplayDeviceCreationArgs& creationArgs) {
    return new DisplayDevice(creationArgs);
}

DisplayDevice::DisplayDevice(DisplayDeviceCreationArgs& args)
      : mFlinger(args.flinger),
        mDisplayToken(args.displayToken),
        mSequenceId(args.sequenceId),
        mConnectionType(args.connectionType),
        mCompositionDisplay{args.compositionDisplay},
        mPhysicalOrientation(args.physicalOrientation),
        mIsPrimary(args.isPrimary) {
    mCompositionDisplay->editState().isSecure = args.isSecure;
    //args.nativeWindow为Surface类, args.displaySurface为FrameBuffer类
    // args.compositionDisplay为Output这个类
    mCompositionDisplay->createRenderSurface(
            compositionengine::RenderSurfaceCreationArgs{ANativeWindow_getWidth(
                                                                 args.nativeWindow.get()),
                                                         ANativeWindow_getHeight(
                                                                 args.nativeWindow.get()),
                                                         args.nativeWindow, args.displaySurface});

    if (!mFlinger->mDisableClientCompositionCache &&
        SurfaceFlinger::maxFrameBufferAcquiredBuffers > 0) {
        mCompositionDisplay->createClientCompositionCache(
                static_cast<uint32_t>(SurfaceFlinger::maxFrameBufferAcquiredBuffers));
    }
    ....................................;
    mCompositionDisplay->getRenderSurface()->initialize();
    ...................................;
}

void Display::createRenderSurface(const RenderSurfaceCreationArgs& args) {
    setRenderSurface(
            compositionengine::impl::createRenderSurface(getCompositionEngine(), *this, args));
}

//可以看到最终Output中的mRenderSurface持有RenderSurface
void Output::setRenderSurface(std::unique_ptr<compositionengine::RenderSurface> surface) {
    mRenderSurface = std::move(surface);
    editState().bounds = Rect(mRenderSurface->getSize());
    dirtyEntireOutput();
}

std::unique_ptr<compositionengine::RenderSurface> createRenderSurface(
        const compositionengine::CompositionEngine& compositionEngine,
        compositionengine::Display& display,
        const compositionengine::RenderSurfaceCreationArgs& args) {
    return std::make_unique<RenderSurface>(compositionEngine, display, args);
}

RenderSurface::RenderSurface(const CompositionEngine& compositionEngine, Display& display,
                             const RenderSurfaceCreationArgs& args)
      : mCompositionEngine(compositionEngine),
        mDisplay(display),
        mNativeWindow(args.nativeWindow), //surface
        mDisplaySurface(args.displaySurface), //framebufferSurface
        mSize(args.displayWidth, args.displayHeight) {
    LOG_ALWAYS_FATAL_IF(!mNativeWindow);
}

RenderSurface中的mNativeWindow即Surface对象持有bufferqueue的producer,作为生产者。

RenderSurface与FramebufferSurface的作用

通过前面的代码分析可以知道,surfacefliger需要做合成layer图形的工作,创建了一个BufferQueue用于缓存合成后的图形数据,其中RenderSurface中的mNativeWindow持有该BufferQueue的producer, 从BufferQueue中取出一个buffer并调用RenderEngine将layer的数据合成到此buffer上,然后通知该BufferQueue的消费者FramebufferSurface来消费此buffer,FramebufferSurface通过consumer取出合成后的数据送到HWC中上屏显示。具体类关系图如下:
【surfaceflinger源码分析】RenderSurface与FramebufferSurface之间的关系_第1张图片

你可能感兴趣的:(图形/窗口,surfaceflinger,合成,RenderSurface,composeSurfaces)