[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(); }