1 FramebufferSurface 概述
FramebufferSurface 根据名字解析:
1: Surface 说明它是一个Surface, 那么它就会拥有一个 BufferQuere, 用于显示。
2: FrameBuffer 这和 Linux 的 framebuffer 是完全不同的。 但是作用有些类似, SurfaceFlinger 在上面作画, 并把它交给HWC, 最终由HWC负责真正的显示。
1.1 FrameBufferSurface创建
SurfaceFlinger启动时会在SurfaceFlinger::init()中通过processDisplayHotplugEventsLocked()->processDisplayChangesLocked()->processDisplayAdded(displayToken, curr[i])中:
900 void SurfaceFlinger::init() {
.....
924 mCompositionEngine->setHwComposer(getFactory().createHWComposer(getBE().mHwcServiceName));
925 mCompositionEngine->getHwComposer().setConfiguration(this, getBE().mComposerSequenceId);
926 // Process any initial hotplug and resulting display changes.
927 processDisplayHotplugEventsLocked();
928 const auto display = getDefaultDisplayDeviceLocked();
processDisplayAdded()方法如下,其创建了BufferQueue和FrameBufferSurface,简单理解为连接上了显示屏幕(Display),那就要给准备一个BufferQueue,以便GPU合成图层时,可以向这个BufferQueue索要GraphicBuffer来存储合成后的数据,再呈现到屏幕上去。
3209 void SurfaceFlinger::processDisplayAdded(const wp<IBinder>& displayToken,
3210 const DisplayDeviceState& state) {
.....
3265 sp<compositionengine::DisplaySurface> displaySurface;
3266 sp<IGraphicBufferProducer> producer;
//创建BufferQueue,获取到生产者和消费者,而且消费者不是SurfaceFlinger。
3267 sp<IGraphicBufferProducer> bqProducer;
3268 sp<IGraphicBufferConsumer> bqConsumer;
3269 getFactory().createBufferQueue(&bqProducer, &bqConsumer, /*consumerIsSurfaceFlinger =*/false);
3270
3271 std::optional<DisplayId> displayId = compositionDisplay->getId();
3272
3273 if (state.isVirtual()) {//虚拟屏幕
3274 sp<VirtualDisplaySurface> vds =
3275 new VirtualDisplaySurface(getHwComposer(), displayId, state.surface,
3276 bqProducer, bqConsumer, state.displayName,
3277 state.isSecure);
3278
3279 displaySurface = vds;
3280 producer = vds;
3281 } else {
3282 ALOGE_IF(state.surface != nullptr,
3283 "adding a supported display, but rendering "
3284 "surface is provided (%p), ignoring it",
3285 state.surface.get());
3286
3287 LOG_ALWAYS_FATAL_IF(!displayId);
//创建了FrameBufferSurface对象,及继承自compositionengine::DisplaySurface
//FrameBufferSurface作为消费者的角色工作,消费SF GPU合成后的数据
3288 displaySurface = new FramebufferSurface(getHwComposer(), *displayId, bqConsumer,
3289 maxGraphicsWidth, maxGraphicsHeight);
3290 producer = bqProducer;
3291 }
3292
3293 LOG_FATAL_IF(!displaySurface);
//创建DisplayDevice,其又去创建RenderSurface,作为生产者角色工作,displaySurface就是FramebufferSurface对象
3294 const auto display = setupNewDisplayDeviceInternal(displayToken, compositionDisplay, state,
3295 displaySurface, producer);
3296 mDisplays.emplace(displayToken, display);
.....
然后FrameBufferSurface的构造函数,只是一些设置,初始化一些成员:
59 FramebufferSurface::FramebufferSurface(HWComposer& hwc, DisplayId displayId,
60 const sp<IGraphicBufferConsumer>& consumer,
61 uint32_t maxWidth, uint32_t maxHeight)
62 : ConsumerBase(consumer),
63 mDisplayId(displayId),
64 mMaxWidth(maxWidth),
65 mMaxHeight(maxHeight),
66 mCurrentBufferSlot(-1),
67 mCurrentBuffer(),
68 mCurrentFence(Fence::NO_FENCE),
69 mHwc(hwc),
70 mHasPendingRelease(false),
71 mPreviousBufferSlot(BufferQueue::INVALID_BUFFER_SLOT),
72 mPreviousBuffer() {
73 ALOGV("Creating for display %s", to_string(displayId).c_str());
74
75 mName = "FramebufferSurface";
76 mConsumer->setConsumerName(mName);
77 mConsumer->setConsumerUsageBits(GRALLOC_USAGE_HW_FB |
78 GRALLOC_USAGE_HW_RENDER |
79 GRALLOC_USAGE_HW_COMPOSER);
80 const auto& activeConfig = mHwc.getActiveConfig(displayId);
81 ui::Size limitedSize =
82 limitFramebufferSize(activeConfig->getWidth(), activeConfig->getHeight());
83 mConsumer->setDefaultBufferSize(limitedSize.width, limitedSize.height);
84 mConsumer->setMaxAcquiredBufferCount(
85 SurfaceFlinger::maxFrameBufferAcquiredBuffers - 1);
86 }
再进到surfaceflinger::setupNewDisplayDeviceInternal()中:
3123 sp<DisplayDevice> SurfaceFlinger::setupNewDisplayDeviceInternal(
3124 const wp<IBinder>& displayToken,
3125 std::shared_ptr<compositionengine::Display> compositionDisplay,
3126 const DisplayDeviceState& state,
3127 const sp<compositionengine::DisplaySurface>& displaySurface,
3128 const sp<IGraphicBufferProducer>& producer) {
.....
3133 creationArgs.displaySurface = displaySurface;
.....
//创建对应的surface
31