Android Surface对应的Buffer怎么传递给HWC
引言
因为要预研Android Video overlay,需要将SurfaceView对应的GraphicBuffer从drm_hwcomposer中剥离出来,这就需要们了解SurfaceView对应的GraphicBuffer的前世今生,以及它的数据流向以及在各个模块之间的对应关系。这篇博客,我们分析下该GraphicBuffer是如何传递到HWC的。
参考源码基于Android 13 AOSP!
Surface的Buffer是怎么传递给HWC呢
我们通过代码流程来看看:
using LayerFESet = std::unordered_set<sp<LayerFE>, LayerFESpHash>;
SurfaceFlinger::composite(...)
compositionengine::CompositionRefreshArgs refreshArgs;
mDrawingState.traverseInZOrder([&refreshArgs](Layer* layer) {
if (auto layerFE = layer->getCompositionEngineLayerFE())
refreshArgs.layers.push_back(layerFE);
});
android::compositionengine::impl::CompositionEngine::present
LayerFESet latchedLayers;
for (const auto& output : args.outputs) {
output->prepare(args, latchedLayers);//impl::Output
rebuildLayerStacks(refreshArgs, geomSnapshots)
compositionengine::Output::CoverageState coverage{
layerFESet};
collectVisibleLayers(refreshArgs, coverage);
for (auto layer : reversed(refreshArgs.layers)) {
ensureOutputLayerIfVisible(layer, coverage);
if (!coverage.latchedLayers.count(layerFE)) {
coverage.latchedLayers.insert(layerFE);
layerFE->prepareCompositionState(compositionengine::LayerFE::StateSubset::BasicGeometry);
}
if (!coverage.latchedLayers.count(layerFE)) {
coverage.latchedLayers.insert(layerFE);
layerFE->prepareCompositionState(compositionengine::LayerFE::StateSubset::BasicGeometry);
}
const auto* layerFEState = layerFE->getCompositionState();
ensureOutputLayer(prevOutputLayerIndex, layerFE)
}
}
updateLayerStateFromFE(args)
for (const auto& output : args.outputs) {
output->present(args);//impl::Output frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp
updateCompositionState(refreshArgs)
writeCompositionState(refreshArgs)//impl::Output
layer->writeStateToHWC(...)//impl::OutputLayer
writeOutputIndependentPerFrameStateToHWC(...)
writeBufferStateToHWC(...)
hwcLayer->setBuffer(...)//HWC2::impl::Layer
mComposer.setLayerBuffer(...)//Hwc2::impl::Composer
}
这里output实际上是Display,但是Display中没有实现prepare,因为Display继承自Output,使用的是父类Output的prepare方法。
ensureOutputLayerIfVisible
这里我们看下ensureOutputLayerIfVisible的作用,主要是构建出来看见的OutputLayer.
//frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp
void Output::ensureOutputLayerIfVisible(sp<compositionengine::LayerFE>& layerFE,
compositionengine::Output::CoverageState& coverage)
layerFE->prepareCompositionState(compositionengine::LayerFE::StateSubset::BasicGeometry)
const