1651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza/* 2651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * Copyright 2015 The Android Open Source Project 3651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * 4651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * Licensed under the Apache License, Version 2.0 (the "License"); 5651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * you may not use this file except in compliance with the License. 6651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * You may obtain a copy of the License at 7651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * 8651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * http://www.apache.org/licenses/LICENSE-2.0 9651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * 10651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * Unless required by applicable law or agreed to in writing, software 11651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * distributed under the License is distributed on an "AS IS" BASIS, 12651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * See the License for the specific language governing permissions and 14651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * limitations under the License. 15651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza */ 16651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 17651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#ifndef ANDROID_SF_HWC2_H 18651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#define ANDROID_SF_HWC2_H 19651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 20651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#define HWC2_INCLUDE_STRINGIFICATION 21651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#define HWC2_USE_CPP11 22651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <hardware/hwcomposer2.h> 23651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#undef HWC2_INCLUDE_STRINGIFICATION 24651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#undef HWC2_USE_CPP11 25651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 267d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza#include <ui/HdrCapabilities.h> 271d77b719d51a01cbd6954a048fb64e79d50a950eMathias Agopian#include <math/mat4.h> 287d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza 29651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <utils/Log.h> 30651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <utils/StrongPointer.h> 31651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <utils/Timers.h> 32651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 33651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <functional> 34651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <string> 35651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <unordered_map> 369f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza#include <unordered_set> 37651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <vector> 38c175253b6d0738aec6235ef1c2e723ad36fcd346Alistair Strachan#include <map> 39651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 40651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozanamespace android { 41651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza class Fence; 425a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza class FloatRect; 43651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza class GraphicBuffer; 44651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza class Rect; 45651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza class Region; 46aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu namespace Hwc2 { 47aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu class Composer; 4871bded513d37a6c1260b4a62c69ecc0d24be95f7Dan Stoza } 49651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 50651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 51651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozanamespace HWC2 { 52651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 53651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Display; 54651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Layer; 55651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 56651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozatypedef std::function<void(std::shared_ptr<Display>, Connection)> 57651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HotplugCallback; 58651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozatypedef std::function<void(std::shared_ptr<Display>)> RefreshCallback; 59651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozatypedef std::function<void(std::shared_ptr<Display>, nsecs_t)> VsyncCallback; 60651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 61339607072fbc0ca39e6e13ce197cb720ef971d91Fabien Sanglard// C++ Wrapper around hwc2_device_t. Load all functions pointers 62339607072fbc0ca39e6e13ce197cb720ef971d91Fabien Sanglard// and handle callback registration. 63651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Device 64651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 65651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozapublic: 6687670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar // useVrComposer is passed to the composer HAL. When true, the composer HAL 6787670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar // will use the vr composer service, otherwise it uses the real hardware 6887670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar // composer. 6987670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar Device(bool useVrComposer); 70651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ~Device(); 71651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 72651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza friend class HWC2::Display; 73651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza friend class HWC2::Layer; 74651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 75651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Required by HWC2 76651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 77651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::string dump() const; 78651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 799f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza const std::unordered_set<Capability>& getCapabilities() const { 80651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return mCapabilities; 81651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza }; 82651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 83651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t getMaxVirtualDisplayCount() const; 84651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Error createVirtualDisplay(uint32_t width, uint32_t height, 855cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza android_pixel_format_t* format, 86651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::shared_ptr<Display>* outDisplay); 87651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 88651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void registerHotplugCallback(HotplugCallback hotplug); 89651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void registerRefreshCallback(RefreshCallback refresh); 90651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void registerVsyncCallback(VsyncCallback vsync); 91651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 92651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // For use by callbacks 93651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 94651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void callHotplug(std::shared_ptr<Display> display, Connection connected); 95651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void callRefresh(std::shared_ptr<Display> display); 96651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void callVsync(std::shared_ptr<Display> display, nsecs_t timestamp); 97651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 98651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Other Device methods 99651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 100651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // This will create a Display if one is not found, but it will not be marked 10138628986f2bb3b392dd4b519aacb9354320e409fDan Stoza // as connected. This Display may be null if the display has been torn down 10238628986f2bb3b392dd4b519aacb9354320e409fDan Stoza // but has not been removed from the map yet. 103651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::shared_ptr<Display> getDisplayById(hwc2_display_t id); 104651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 10509e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza bool hasCapability(HWC2::Capability capability) const; 10609e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza 10787670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar android::Hwc2::Composer* getComposer() { return mComposer.get(); } 10887670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar 109651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaprivate: 110651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Initialization methods 111651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 112651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void loadCapabilities(); 113651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void registerCallbacks(); 114651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 115651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // For use by Display 116651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 117651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void destroyVirtualDisplay(hwc2_display_t display); 118651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 119651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Member variables 120aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::unique_ptr<android::Hwc2::Composer> mComposer; 121651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1229f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza std::unordered_set<Capability> mCapabilities; 12338628986f2bb3b392dd4b519aacb9354320e409fDan Stoza std::unordered_map<hwc2_display_t, std::weak_ptr<Display>> mDisplays; 124651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 125651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HotplugCallback mHotplug; 126651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<std::pair<std::shared_ptr<Display>, Connection>> 127651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mPendingHotplugs; 128651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza RefreshCallback mRefresh; 129651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<std::shared_ptr<Display>> mPendingRefreshes; 130651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza VsyncCallback mVsync; 131651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<std::pair<std::shared_ptr<Display>, nsecs_t>> mPendingVsyncs; 132651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}; 133651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 134339607072fbc0ca39e6e13ce197cb720ef971d91Fabien Sanglard// Convenience C++ class to access hwc2_device_t Display functions directly. 135651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Display : public std::enable_shared_from_this<Display> 136651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 137651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozapublic: 138651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Display(Device& device, hwc2_display_t id); 139651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ~Display(); 140651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 141651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza friend class HWC2::Device; 142651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza friend class HWC2::Layer; 143651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 144651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza class Config 145651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza { 146651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza public: 147651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza class Builder 148651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza { 149651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza public: 150651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Builder(Display& display, hwc2_config_t id); 151651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 152651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::shared_ptr<const Config> build() { 153651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return std::const_pointer_cast<const Config>( 154651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::move(mConfig)); 155651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 156651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 157651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Builder& setWidth(int32_t width) { 158651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mConfig->mWidth = width; 159651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return *this; 160651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 161651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Builder& setHeight(int32_t height) { 162651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mConfig->mHeight = height; 163651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return *this; 164651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 165651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Builder& setVsyncPeriod(int32_t vsyncPeriod) { 166651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mConfig->mVsyncPeriod = vsyncPeriod; 167651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return *this; 168651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 169651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Builder& setDpiX(int32_t dpiX) { 170651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (dpiX == -1) { 171651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mConfig->mDpiX = getDefaultDensity(); 172651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 173651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mConfig->mDpiX = dpiX / 1000.0f; 174651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 175651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return *this; 176651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 177651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Builder& setDpiY(int32_t dpiY) { 178651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (dpiY == -1) { 179651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mConfig->mDpiY = getDefaultDensity(); 180651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 181651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mConfig->mDpiY = dpiY / 1000.0f; 182651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 183651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return *this; 184651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 185651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 186651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza private: 187651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza float getDefaultDensity(); 188651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::shared_ptr<Config> mConfig; 189651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza }; 190651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 191651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_display_t getDisplayId() const { return mDisplay.getId(); } 192651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_config_t getId() const { return mId; } 193651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 194651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t getWidth() const { return mWidth; } 195651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t getHeight() const { return mHeight; } 196651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza nsecs_t getVsyncPeriod() const { return mVsyncPeriod; } 197651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza float getDpiX() const { return mDpiX; } 198651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza float getDpiY() const { return mDpiY; } 199651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 200651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza private: 201651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Config(Display& display, hwc2_config_t id); 202651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 203651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Display& mDisplay; 204651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_config_t mId; 205651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 206651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t mWidth; 207651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t mHeight; 208651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza nsecs_t mVsyncPeriod; 209651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza float mDpiX; 210651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza float mDpiY; 211651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza }; 212651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 213651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Required by HWC2 214651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 215651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error acceptChanges(); 216651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error createLayer( 217651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::shared_ptr<Layer>* outLayer); 218651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error getActiveConfig( 219651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::shared_ptr<const Config>* outConfig) const; 220651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error getChangedCompositionTypes( 221651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::unordered_map<std::shared_ptr<Layer>, Composition>* outTypes); 222076ac670262e448c531e6db7727cfade325866caDan Stoza [[clang::warn_unused_result]] Error getColorModes( 22328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright std::vector<android_color_mode_t>* outModes) const; 224651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 225651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Doesn't call into the HWC2 device, so no errors are possible 226651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<std::shared_ptr<const Config>> getConfigs() const; 227651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 228651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error getName(std::string* outName) const; 229651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error getRequests( 230651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza DisplayRequest* outDisplayRequests, 231651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::unordered_map<std::shared_ptr<Layer>, LayerRequest>* 232651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outLayerRequests); 233651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error getType(DisplayType* outType) const; 234651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error supportsDoze(bool* outSupport) const; 2357d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza [[clang::warn_unused_result]] Error getHdrCapabilities( 2367d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza std::unique_ptr<android::HdrCapabilities>* outCapabilities) const; 237651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error getReleaseFences( 238651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::unordered_map<std::shared_ptr<Layer>, 239651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza android::sp<android::Fence>>* outFences) const; 240651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error present( 24111d0fc38ad8d2e5bb5bc0a282336cabe28dbf9d6Fabien Sanglard android::sp<android::Fence>* outPresentFence); 242651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setActiveConfig( 243651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const std::shared_ptr<const Config>& config); 244651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setClientTarget( 2451f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara uint32_t slot, const android::sp<android::GraphicBuffer>& target, 246651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const android::sp<android::Fence>& acquireFence, 247651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza android_dataspace_t dataspace); 24828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright [[clang::warn_unused_result]] Error setColorMode(android_color_mode_t mode); 2495df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza [[clang::warn_unused_result]] Error setColorTransform( 2505df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza const android::mat4& matrix, android_color_transform_t hint); 251651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setOutputBuffer( 252651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const android::sp<android::GraphicBuffer>& buffer, 253651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const android::sp<android::Fence>& releaseFence); 254651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setPowerMode(PowerMode mode); 255651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setVsyncEnabled(Vsync enabled); 256651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error validate(uint32_t* outNumTypes, 257651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t* outNumRequests); 258249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard [[clang::warn_unused_result]] Error presentOrValidate(uint32_t* outNumTypes, 259249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard uint32_t* outNumRequests, 260249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard android::sp<android::Fence>* outPresentFence, uint32_t* state); 261651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 262801ad647015810abc856f93ff1e90bb930714ec9Chia-I Wu // Most methods in this class write a command to a command buffer. The 263801ad647015810abc856f93ff1e90bb930714ec9Chia-I Wu // command buffer is implicitly submitted in validate, present, and 264801ad647015810abc856f93ff1e90bb930714ec9Chia-I Wu // presentOrValidate. This method provides a way to discard the commands, 265801ad647015810abc856f93ff1e90bb930714ec9Chia-I Wu // which can be used to discard stale commands. 266801ad647015810abc856f93ff1e90bb930714ec9Chia-I Wu void discardCommands(); 267801ad647015810abc856f93ff1e90bb930714ec9Chia-I Wu 268651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Other Display methods 269651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 270651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Device& getDevice() const { return mDevice; } 271651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_display_t getId() const { return mId; } 272651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza bool isConnected() const { return mIsConnected; } 273651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 274651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaprivate: 275651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // For use by Device 276651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 277651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void setConnected(bool connected) { mIsConnected = connected; } 278651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t getAttribute(hwc2_config_t configId, Attribute attribute); 279651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void loadConfig(hwc2_config_t configId); 280651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void loadConfigs(); 281651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 282651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // For use by Layer 283651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void destroyLayer(hwc2_layer_t layerId); 284651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 285651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // This may fail (and return a null pointer) if no layer with this ID exists 286651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // on this display 287651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::shared_ptr<Layer> getLayerById(hwc2_layer_t id) const; 288651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 289651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Member variables 290651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 291651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Device& mDevice; 292651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_display_t mId; 293651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza bool mIsConnected; 294016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes DisplayType mType; 295651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::unordered_map<hwc2_layer_t, std::weak_ptr<Layer>> mLayers; 296c175253b6d0738aec6235ef1c2e723ad36fcd346Alistair Strachan // The ordering in this map matters, for getConfigs(), when it is 297c175253b6d0738aec6235ef1c2e723ad36fcd346Alistair Strachan // converted to a vector 298c175253b6d0738aec6235ef1c2e723ad36fcd346Alistair Strachan std::map<hwc2_config_t, std::shared_ptr<const Config>> mConfigs; 299651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}; 300651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 301339607072fbc0ca39e6e13ce197cb720ef971d91Fabien Sanglard// Convenience C++ class to access hwc2_device_t Layer functions directly. 302651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Layer 303651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 304651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozapublic: 305651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Layer(const std::shared_ptr<Display>& display, hwc2_layer_t id); 306651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ~Layer(); 307651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 308651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza bool isAbandoned() const { return mDisplay.expired(); } 309651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_layer_t getId() const { return mId; } 310651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 311651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setCursorPosition(int32_t x, int32_t y); 31206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu [[clang::warn_unused_result]] Error setBuffer(uint32_t slot, 3131f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const android::sp<android::GraphicBuffer>& buffer, 314651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const android::sp<android::Fence>& acquireFence); 315651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setSurfaceDamage( 316651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const android::Region& damage); 317651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 318651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setBlendMode(BlendMode mode); 319651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setColor(hwc_color_t color); 320651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setCompositionType(Composition type); 3215df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza [[clang::warn_unused_result]] Error setDataspace( 3225df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza android_dataspace_t dataspace); 323651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setDisplayFrame( 324651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const android::Rect& frame); 325651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setPlaneAlpha(float alpha); 326651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setSidebandStream( 327651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const native_handle_t* stream); 328651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setSourceCrop( 3295a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza const android::FloatRect& crop); 330651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setTransform(Transform transform); 331651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setVisibleRegion( 332651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const android::Region& region); 333651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setZOrder(uint32_t z); 3342f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara [[clang::warn_unused_result]] Error setInfo(uint32_t type, uint32_t appId); 335651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 336651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaprivate: 337651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::weak_ptr<Display> mDisplay; 338651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_display_t mDisplayId; 339651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Device& mDevice; 340651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_layer_t mId; 341651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}; 342651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 343651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} // namespace HWC2 344651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 345651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#endif // ANDROID_SF_HWC2_H 346