刚刚想全面梳理下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 {
...

文章详细介绍了Android系统中SurfaceFlinger如何创建和管理FramebufferSurface与RenderSurface。通过BufferQueue,RenderSurface作为生产者获取合成的图形数据,而FramebufferSurface作为消费者负责消费这些数据,将图像送至屏幕显示。整个过程涉及EGL操作和硬件Composer(HWC)的协同工作。
最低0.47元/天 解锁文章
1175

被折叠的 条评论
为什么被折叠?



