[Android禅修之路] SurfaceFlinger 中的一些对象
theme: channing-cyan
附录1 - SurfaceFlinger中的一些对象
在 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
// 安全显示,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
OutputCompositionState
封装了所有的与为输出组合层(composing Layer)相关的数据
```cpp //获取输出的原始合成状态数据 virtual const OutputCompositionState& getState() const = 0;
//获取显示器的 HWC DisplayId
virtual const std::optional
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();
}
- Activity启动源码解析(Android12)
- 从MediaServer看Binder的使用方式(一)
- 从MediaServer看Binder的使用方式(二)
- [Android禅修之路] 解读Layer
- [Android禅修之路] Android图形系统,从Activity到Surface
- [Android禅修之路] 解读 GraphicBuffer 之 Framework 层
- [Android禅修之路] 解读SurfaceFlinger中的BufferQueue
- [Android禅修之路] SurfaceFlinger 合成中的工作
- [Android禅修之路] SurfaceFlinger 中的一些对象
- [Android禅修之路] SurfaceFlinger 合成前的预处理
- [Android禅修之路] SurfaceFlinger合成总览
- [Android禅修之路] SurfaceFlinger的启动过程
- [Android禅修之路] Android 图形系统开篇