[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 圖形系統開篇