Android Surface对应的Buffer怎么传递给HWC

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值