[Android禅修之路] SurfaceFlinger 中的一些对象

3,066 阅读4分钟

附录1 - SurfaceFlinger中的一些对象

Android禅修之路

在 SurfaceFlinger 工作中会遇到很多贯穿始终的封装对象或者结构体,这篇的主要目的就是将这些对象全部都记录在一处,方便查询和阅读了解。

DisplayDevice

DisplayDevice 即用来描述系统中的显示设备,它里面封装了显示设备的一些常用参数,最常用的就是 通过 getCompositionDisplay 获取它的 Display 对象

compositionengine::Display

它是一个合成目标对象,它是由硬件合成器 (hardware composer) 显示设备支持的,继承自frameworks/native/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h,它里面定义了 HWC 的一些相关参数

一般都是通过displayDevice->getCompositionDisplay()获取得到

[frameworks/native/services/surfaceflinger/DisplayDevice.h]
std::shared_ptr<compositionengine::Display> getCompositionDisplay() const {
    return mCompositionDisplay;
}

compositionengine::Display 的定义

继承自 Output 的一个封装了显示参数点对象

// Display 是一个由硬件合成器 (hwc) 显示设备支持的合成目标
class Display : public virtual Output {
public:
    // 获取 hwc 的 Display Id
    virtual const std::optional<DisplayId>& getId() const = 0;

    // 安全显示,true 表示是
    virtual bool isSecure() const = 0;

    // 是否是虚拟显示,true 表示是
    virtual bool isVirtual() const = 0;

    // 释放 hwc 资源
    virtual void disconnect() = 0;

    // 为 Display 创建渲染颜色模式
    virtual void createDisplayColorProfile(const DisplayColorProfileCreationArgs&) = 0;

    // 为 Display 创建渲染 surface 模式
    virtual void createRenderSurface(const RenderSurfaceCreationArgs&) = 0;

  	// 创建缓存以缓存重复的客户端合成请求,并在需要时跳过类似的请求
    virtual void createClientCompositionCache(uint32_t cacheSize) = 0;

protected:
    ~Display() = default;
};

Output

Display 的父类,定义如下

// 封装了用于输出的合成图层的所有状态
class Output {
public:

    using OutputLayers = std::vector<std::unique_ptr<compositionengine::OutputLayer>>;

    virtual ~Output();

    // Returns true if the output is valid. This is meant to be checked post-
    // construction and prior to use,as not everything is set up by the
    // constructor.
    // 返回true表示这个输出有效,
    // 这意味着要在施工后和使用前进行检查,因为并非所有内容都是由创建者设置的
    virtual bool isValid() const = 0;

    // 启用(或禁用)此输出上的合成
    virtual void setCompositionEnabled(bool) = 0;

    // 设置要使用的投影状态
    virtual void setProjection(const ui::Transform&,int32_t orientation,const Rect& frame,
                               const Rect& viewport,const Rect& scissor,bool needsFiltering) = 0;
    // 设置要使用的边界
    virtual void setBounds(const ui::Size&) = 0;

    // Sets the layer stack filtering settings for this output. See
    // belongsInOutput for full details.
    // 设置此输出的图层堆栈的过滤配置。有关详细信息,请参见下文“输出”
    virtual void setLayerStackFilter(uint32_t layerStackId,bool isInternal) = 0;

    // 设置要使用的颜色变换矩阵
    virtual void setColorTransform(const mat4&) = 0;

    // 设置输出颜色模式
    virtual void setColorMode(ui::ColorMode,ui::Dataspace,ui::RenderIntent) = 0;

    // 输出 output 的状态
    virtual void dump(std::string&) const = 0;

    // 获取 output 用于调试的名称
    virtual const std::string& getName() const = 0;

    // 设置 output 用于调试的名称
    virtual void setName(const std::string&) = 0;

    // 获取 output 当前渲染颜色模式
    virtual DisplayColorProfile* getDisplayColorProfile() const = 0;

    // 获取 output 当前渲染 surface
    virtual RenderSurface* getRenderSurface() const = 0;

    using OutputCompositionState = compositionengine::impl::OutputCompositionState;

    // 获取 output 的原始合成状态数据:一旦仅在内部调用它,就将其设置为受保护
    virtual const OutputCompositionState& getState() const = 0;

    // 允许对 output 的原始合成状态数据进行读写,这意味着作为合成过程一部分的各种函数都可以使用。仅在内部调用时对其进行保护
    virtual OutputCompositionState& editState() = 0;

    // 获取层堆栈空间中的脏区域。如果 repaintEverything 为 true,这将是 display 的 bounds
    virtual Region getDirtyRegion(bool repaintEverything) const = 0;

    // Tests whether a given layerStackId belongs in this output. A layer belongs to the output if its layerStackId matches the of the output layerStackId,unless the layer should display on the primary output only and this is not the primary output

    // layerStackId 是否匹配 output ,如果匹配,则这个图层属于此 output
    // 此外,只有 output 允许时,图层才能显示在显示器中
    virtual bool belongsInOutput(uint32_t layerStackId,bool internalOnly) const = 0;

    // 传入一个 output 的图层,返回相应的 OutputLayer 指针,如果不存在则返回 nullptr
    virtual OutputLayer* getOutputLayerForLayer(Layer*) const = 0;

    // 传入一个当前 output 的 DisplayId 和 Layer ,返回相应的 OutputLayer ,如果没有则创建一个
    virtual std::unique_ptr<OutputLayer> getOrCreateOutputLayer(std::optional<DisplayId>,
                                                                std::shared_ptr<Layer>,
                                                                sp<LayerFE>) = 0;

    // 为此 output 设置一个新的输出 layers 的排序
    virtual void setOutputLayersOrderedByZ(OutputLayers&&) = 0;

    // Gets the ordered set of output layers for this output
    // 获取此 output 的输出 layers 的排序
    virtual const OutputLayers& getOutputLayersOrderedByZ() const = 0;

protected:
    virtual void setDisplayColorProfile(std::unique_ptr<DisplayColorProfile>) = 0;
    virtual void setRenderSurface(std::unique_ptr<RenderSurface>) = 0;
};

OutputCompositionState

封装了所有的与为输出组合层(composing Layer)相关的数据

//获取输出的原始合成状态数据
virtual const OutputCompositionState& getState() const = 0;

//获取显示器的 HWC DisplayId
virtual const std::optional<DisplayId>& getId() const = 0;

OutputCompositionState

[frameworks/native/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputCompositionState.h]
//是否执行显示合成,false的时候不执行
bool isEnabled{false};

getRenderSurface

Output::getRenderSurface,获取到的其实是它对应的 DisplaySurface ,而 DisplaySurface 它是一个父类,有2个子类,例如

  • FramebufferSurface: 我们常用的 Surface ,一般都是调用到它
  • VirtualDisplaySurface: 虚拟显示,用得较少. 但是实现录屏功能时会用到

getRenderEngine 获取渲染引擎,在 SurfaceFlinger 中其实就是 GLESRenderEngine ,它封装了 OpenGL 中的一些方法 CompositionEngine - 合成引擎 RenderEngine - 渲染引擎

[frameworks/native/services/surfaceflinger/CompositionEngine/include/compositionengine/CompositionEngine.h]
renderengine::RenderEngine& SurfaceFlinger::getRenderEngine() const {
    return mCompositionEngine->getRenderEngine();
}

getHwComposer

HWComposer& SurfaceFlinger::getHwComposer() const {
    return mCompositionEngine->getHwComposer();
}