HWC2.h revision 7d7ae7345abfb91be55c4aed6c9be9d09a144e4c
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> 277d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza 28651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <utils/Log.h> 29651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <utils/StrongPointer.h> 30651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <utils/Timers.h> 31651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 32651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <functional> 33651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <string> 34651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <unordered_map> 35651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <vector> 36651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 37651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozanamespace android { 38651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza class Fence; 39651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza class FloatRect; 40651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza class GraphicBuffer; 41651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza class Rect; 42651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza class Region; 43651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 44651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 45651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozanamespace HWC2 { 46651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 47651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Display; 48651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Layer; 49651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 50651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozatypedef std::function<void(std::shared_ptr<Display>, Connection)> 51651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HotplugCallback; 52651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozatypedef std::function<void(std::shared_ptr<Display>)> RefreshCallback; 53651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozatypedef std::function<void(std::shared_ptr<Display>, nsecs_t)> VsyncCallback; 54651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 55651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Device 56651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 57651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozapublic: 58651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Device(hwc2_device_t* device); 59651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ~Device(); 60651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 61651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza friend class HWC2::Display; 62651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza friend class HWC2::Layer; 63651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 64651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Required by HWC2 65651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 66651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::string dump() const; 67651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 68651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const std::vector<Capability>& getCapabilities() const { 69651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return mCapabilities; 70651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza }; 71651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 72651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t getMaxVirtualDisplayCount() const; 73651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Error createVirtualDisplay(uint32_t width, uint32_t height, 74651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::shared_ptr<Display>* outDisplay); 75651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 76651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void registerHotplugCallback(HotplugCallback hotplug); 77651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void registerRefreshCallback(RefreshCallback refresh); 78651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void registerVsyncCallback(VsyncCallback vsync); 79651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 80651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // For use by callbacks 81651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 82651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void callHotplug(std::shared_ptr<Display> display, Connection connected); 83651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void callRefresh(std::shared_ptr<Display> display); 84651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void callVsync(std::shared_ptr<Display> display, nsecs_t timestamp); 85651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 86651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Other Device methods 87651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 88651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // This will create a Display if one is not found, but it will not be marked 89651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // as connected 90651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::shared_ptr<Display> getDisplayById(hwc2_display_t id); 91651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 92651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaprivate: 93651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Initialization methods 94651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 95651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza template <typename PFN> 96651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] bool loadFunctionPointer( 97651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza FunctionDescriptor desc, PFN& outPFN) { 98651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto intDesc = static_cast<int32_t>(desc); 99651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto pfn = mHwcDevice->getFunction(mHwcDevice, intDesc); 100651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (pfn != nullptr) { 101651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outPFN = reinterpret_cast<PFN>(pfn); 102651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return true; 103651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 104651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("Failed to load function %s", to_string(desc).c_str()); 105651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return false; 106651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 107651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 108651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 109651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza template <typename PFN, typename HOOK> 110651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void registerCallback(Callback callback, HOOK hook) { 111651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza static_assert(std::is_same<PFN, HOOK>::value, 112651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza "Incompatible function pointer"); 113651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto intCallback = static_cast<int32_t>(callback); 114651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto callbackData = static_cast<hwc2_callback_data_t>(this); 115651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto pfn = reinterpret_cast<hwc2_function_pointer_t>(hook); 116651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mRegisterCallback(mHwcDevice, intCallback, callbackData, pfn); 117651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 118651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 119651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void loadCapabilities(); 120651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void loadFunctionPointers(); 121651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void registerCallbacks(); 122651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 123651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // For use by Display 124651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 125651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void destroyVirtualDisplay(hwc2_display_t display); 126651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 127651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Member variables 128651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 129651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_device_t* mHwcDevice; 130651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 131651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Device function pointers 132651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_CREATE_VIRTUAL_DISPLAY mCreateVirtualDisplay; 133651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_DESTROY_VIRTUAL_DISPLAY mDestroyVirtualDisplay; 134651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_DUMP mDump; 135651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_GET_MAX_VIRTUAL_DISPLAY_COUNT mGetMaxVirtualDisplayCount; 136651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_REGISTER_CALLBACK mRegisterCallback; 137651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 138651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Display function pointers 139651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_ACCEPT_DISPLAY_CHANGES mAcceptDisplayChanges; 140651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_CREATE_LAYER mCreateLayer; 141651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_DESTROY_LAYER mDestroyLayer; 142651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_GET_ACTIVE_CONFIG mGetActiveConfig; 143651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_GET_CHANGED_COMPOSITION_TYPES mGetChangedCompositionTypes; 144651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_GET_DISPLAY_ATTRIBUTE mGetDisplayAttribute; 145651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_GET_DISPLAY_CONFIGS mGetDisplayConfigs; 146651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_GET_DISPLAY_NAME mGetDisplayName; 147651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_GET_DISPLAY_REQUESTS mGetDisplayRequests; 148651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_GET_DISPLAY_TYPE mGetDisplayType; 149651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_GET_DOZE_SUPPORT mGetDozeSupport; 1507d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza HWC2_PFN_GET_HDR_CAPABILITIES mGetHdrCapabilities; 151651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_GET_RELEASE_FENCES mGetReleaseFences; 152651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_PRESENT_DISPLAY mPresentDisplay; 153651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_SET_ACTIVE_CONFIG mSetActiveConfig; 154651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_SET_CLIENT_TARGET mSetClientTarget; 155651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_SET_OUTPUT_BUFFER mSetOutputBuffer; 156651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_SET_POWER_MODE mSetPowerMode; 157651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_SET_VSYNC_ENABLED mSetVsyncEnabled; 158651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_VALIDATE_DISPLAY mValidateDisplay; 159651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 160651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Layer function pointers 161651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_SET_CURSOR_POSITION mSetCursorPosition; 162651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_SET_LAYER_BUFFER mSetLayerBuffer; 163651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_SET_LAYER_SURFACE_DAMAGE mSetLayerSurfaceDamage; 164651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_SET_LAYER_BLEND_MODE mSetLayerBlendMode; 165651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_SET_LAYER_COLOR mSetLayerColor; 166651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_SET_LAYER_COMPOSITION_TYPE mSetLayerCompositionType; 167651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_SET_LAYER_DISPLAY_FRAME mSetLayerDisplayFrame; 168651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_SET_LAYER_PLANE_ALPHA mSetLayerPlaneAlpha; 169651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_SET_LAYER_SIDEBAND_STREAM mSetLayerSidebandStream; 170651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_SET_LAYER_SOURCE_CROP mSetLayerSourceCrop; 171651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_SET_LAYER_TRANSFORM mSetLayerTransform; 172651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_SET_LAYER_VISIBLE_REGION mSetLayerVisibleRegion; 173651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HWC2_PFN_SET_LAYER_Z_ORDER mSetLayerZOrder; 174651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 175651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<Capability> mCapabilities; 176651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::unordered_map<hwc2_display_t, std::shared_ptr<Display>> mDisplays; 177651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 178651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza HotplugCallback mHotplug; 179651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<std::pair<std::shared_ptr<Display>, Connection>> 180651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mPendingHotplugs; 181651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza RefreshCallback mRefresh; 182651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<std::shared_ptr<Display>> mPendingRefreshes; 183651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza VsyncCallback mVsync; 184651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<std::pair<std::shared_ptr<Display>, nsecs_t>> mPendingVsyncs; 185651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}; 186651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 187651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Display : public std::enable_shared_from_this<Display> 188651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 189651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozapublic: 190651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Display(Device& device, hwc2_display_t id); 191651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ~Display(); 192651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 193651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza friend class HWC2::Device; 194651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza friend class HWC2::Layer; 195651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 196651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza class Config 197651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza { 198651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza public: 199651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza class Builder 200651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza { 201651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza public: 202651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Builder(Display& display, hwc2_config_t id); 203651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 204651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::shared_ptr<const Config> build() { 205651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return std::const_pointer_cast<const Config>( 206651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::move(mConfig)); 207651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 208651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 209651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Builder& setWidth(int32_t width) { 210651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mConfig->mWidth = width; 211651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return *this; 212651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 213651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Builder& setHeight(int32_t height) { 214651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mConfig->mHeight = height; 215651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return *this; 216651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 217651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Builder& setVsyncPeriod(int32_t vsyncPeriod) { 218651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mConfig->mVsyncPeriod = vsyncPeriod; 219651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return *this; 220651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 221651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Builder& setDpiX(int32_t dpiX) { 222651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (dpiX == -1) { 223651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mConfig->mDpiX = getDefaultDensity(); 224651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 225651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mConfig->mDpiX = dpiX / 1000.0f; 226651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 227651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return *this; 228651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 229651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Builder& setDpiY(int32_t dpiY) { 230651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (dpiY == -1) { 231651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mConfig->mDpiY = getDefaultDensity(); 232651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 233651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mConfig->mDpiY = dpiY / 1000.0f; 234651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 235651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return *this; 236651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 237651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 238651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza private: 239651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza float getDefaultDensity(); 240651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::shared_ptr<Config> mConfig; 241651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza }; 242651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 243651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_display_t getDisplayId() const { return mDisplay.getId(); } 244651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_config_t getId() const { return mId; } 245651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 246651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t getWidth() const { return mWidth; } 247651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t getHeight() const { return mHeight; } 248651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza nsecs_t getVsyncPeriod() const { return mVsyncPeriod; } 249651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza float getDpiX() const { return mDpiX; } 250651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza float getDpiY() const { return mDpiY; } 251651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 252651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza private: 253651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Config(Display& display, hwc2_config_t id); 254651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 255651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Display& mDisplay; 256651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_config_t mId; 257651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 258651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t mWidth; 259651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t mHeight; 260651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza nsecs_t mVsyncPeriod; 261651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza float mDpiX; 262651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza float mDpiY; 263651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza }; 264651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 265651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Required by HWC2 266651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 267651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error acceptChanges(); 268651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error createLayer( 269651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::shared_ptr<Layer>* outLayer); 270651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error getActiveConfig( 271651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::shared_ptr<const Config>* outConfig) const; 272651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error getChangedCompositionTypes( 273651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::unordered_map<std::shared_ptr<Layer>, Composition>* outTypes); 274651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 275651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Doesn't call into the HWC2 device, so no errors are possible 276651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<std::shared_ptr<const Config>> getConfigs() const; 277651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 278651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error getName(std::string* outName) const; 279651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error getRequests( 280651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza DisplayRequest* outDisplayRequests, 281651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::unordered_map<std::shared_ptr<Layer>, LayerRequest>* 282651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outLayerRequests); 283651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error getType(DisplayType* outType) const; 284651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error supportsDoze(bool* outSupport) const; 2857d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza [[clang::warn_unused_result]] Error getHdrCapabilities( 2867d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza std::unique_ptr<android::HdrCapabilities>* outCapabilities) const; 287651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error getReleaseFences( 288651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::unordered_map<std::shared_ptr<Layer>, 289651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza android::sp<android::Fence>>* outFences) const; 290651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error present( 291651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza android::sp<android::Fence>* outRetireFence); 292651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setActiveConfig( 293651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const std::shared_ptr<const Config>& config); 294651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setClientTarget( 295651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza buffer_handle_t target, 296651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const android::sp<android::Fence>& acquireFence, 297651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza android_dataspace_t dataspace); 298651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setOutputBuffer( 299651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const android::sp<android::GraphicBuffer>& buffer, 300651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const android::sp<android::Fence>& releaseFence); 301651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setPowerMode(PowerMode mode); 302651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setVsyncEnabled(Vsync enabled); 303651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error validate(uint32_t* outNumTypes, 304651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t* outNumRequests); 305651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 306651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Other Display methods 307651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 308651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Device& getDevice() const { return mDevice; } 309651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_display_t getId() const { return mId; } 310651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza bool isConnected() const { return mIsConnected; } 311651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 312651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaprivate: 313651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // For use by Device 314651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 315651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Virtual displays are always connected 316651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void setVirtual() { 317651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mIsVirtual = true; 318651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mIsConnected = true; 319651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 320651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 321651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void setConnected(bool connected) { mIsConnected = connected; } 322651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t getAttribute(hwc2_config_t configId, Attribute attribute); 323651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void loadConfig(hwc2_config_t configId); 324651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void loadConfigs(); 325651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 326651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // For use by Layer 327651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza void destroyLayer(hwc2_layer_t layerId); 328651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 329651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // This may fail (and return a null pointer) if no layer with this ID exists 330651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // on this display 331651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::shared_ptr<Layer> getLayerById(hwc2_layer_t id) const; 332651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 333651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Member variables 334651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 335651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Device& mDevice; 336651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_display_t mId; 337651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza bool mIsConnected; 338651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza bool mIsVirtual; 339651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::unordered_map<hwc2_layer_t, std::weak_ptr<Layer>> mLayers; 340651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::unordered_map<hwc2_config_t, std::shared_ptr<const Config>> mConfigs; 341651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}; 342651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 343651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaclass Layer 344651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 345651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozapublic: 346651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Layer(const std::shared_ptr<Display>& display, hwc2_layer_t id); 347651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ~Layer(); 348651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 349651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza bool isAbandoned() const { return mDisplay.expired(); } 350651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_layer_t getId() const { return mId; } 351651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 352651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setCursorPosition(int32_t x, int32_t y); 353651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setBuffer(buffer_handle_t buffer, 354651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const android::sp<android::Fence>& acquireFence); 355651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setSurfaceDamage( 356651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const android::Region& damage); 357651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 358651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setBlendMode(BlendMode mode); 359651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setColor(hwc_color_t color); 360651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setCompositionType(Composition type); 361651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setDisplayFrame( 362651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const android::Rect& frame); 363651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setPlaneAlpha(float alpha); 364651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setSidebandStream( 365651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const native_handle_t* stream); 366651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setSourceCrop( 367651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const android::FloatRect& crop); 368651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setTransform(Transform transform); 369651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setVisibleRegion( 370651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const android::Region& region); 371651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza [[clang::warn_unused_result]] Error setZOrder(uint32_t z); 372651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 373651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaprivate: 374651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::weak_ptr<Display> mDisplay; 375651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_display_t mDisplayId; 376651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza Device& mDevice; 377651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_layer_t mId; 378651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza}; 379651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 380651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} // namespace HWC2 381651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 382651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#endif // ANDROID_SF_HWC2_H 383