刚刚想全面梳理下surfaceflinger中一个GraphicBuffer的完整旅程,发现流程实在是太长,而且涉及到EGL相关的操作比较复杂,不得不暂停前一篇博客,先启动梳理下RenderSurface与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 数据。
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,作为生产者。
通过前面的代码分析可以知道,surfacefliger需要做合成layer图形的工作,创建了一个BufferQueue用于缓存合成后的图形数据,其中RenderSurface中的mNativeWindow持有该BufferQueue的producer, 从BufferQueue中取出一个buffer并调用RenderEngine将layer的数据合成到此buffer上,然后通知该BufferQueue的消费者FramebufferSurface来消费此buffer,FramebufferSurface通过consumer取出合成后的数据送到HWC中上屏显示。具体类关系图如下: