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

语言: CN / TW / HK

theme: channing-cyan

附录1 - SurfaceFlinger中的一些对象

Android禅修之路

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

DisplayDevice

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

compositionengine::Display

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

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

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

compositionengine::Display 的定义

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

```c // Display 是一个由硬件合成器 (hwc) 显示设备支持的合成目标 class Display : public virtual Output { public: // 获取 hwc 的 Display Id virtual const std::optional& 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 的父类,定义如下

```c // 封装了用于输出的合成图层的所有状态 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) = 0; virtual void setRenderSurface(std::unique_ptr) = 0; }; ```

OutputCompositionState

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

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

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

OutputCompositionState

```cpp [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 - 渲染引擎

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

getHwComposer

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