1381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza/* 2381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza * Copyright 2015 The Android Open Source Project 3381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza * 4381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza * Licensed under the Apache License, Version 2.0 (the "License"); 5381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza * you may not use this file except in compliance with the License. 6381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza * You may obtain a copy of the License at 7381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza * 8381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza * http://www.apache.org/licenses/LICENSE-2.0 9381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza * 10381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza * Unless required by applicable law or agreed to in writing, software 11381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza * distributed under the License is distributed on an "AS IS" BASIS, 12381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza * See the License for the specific language governing permissions and 14381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza * limitations under the License. 15381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza */ 16381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 17381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza#ifndef ANDROID_SF_HWC2_ON_1_ADAPTER_H 18381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza#define ANDROID_SF_HWC2_ON_1_ADAPTER_H 19381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 20381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza#define HWC2_INCLUDE_STRINGIFICATION 21381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza#define HWC2_USE_CPP11 22381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza#include <hardware/hwcomposer2.h> 23381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza#undef HWC2_INCLUDE_STRINGIFICATION 24381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza#undef HWC2_USE_CPP11 25381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 26381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza#include <ui/Fence.h> 27381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 28381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza#include <atomic> 29381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza#include <map> 30381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza#include <mutex> 31381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza#include <queue> 32381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza#include <set> 33381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza#include <unordered_map> 34381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza#include <unordered_set> 35381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza#include <vector> 36381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 37381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stozastruct hwc_composer_device_1; 38381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stozastruct hwc_display_contents_1; 39381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stozastruct hwc_layer_1; 40381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 41381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stozanamespace android { 42381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 43381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stozaclass HWC2On1Adapter : public hwc2_device_t 44381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza{ 45381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stozapublic: 46381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza explicit HWC2On1Adapter(struct hwc_composer_device_1* hwc1Device); 47381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza ~HWC2On1Adapter(); 48381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 49381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza struct hwc_composer_device_1* getHwc1Device() const { return mHwc1Device; } 50381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza uint8_t getHwc1MinorVersion() const { return mHwc1MinorVersion; } 51381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 52381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stozaprivate: 53381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static inline HWC2On1Adapter* getAdapter(hwc2_device_t* device) { 54381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return static_cast<HWC2On1Adapter*>(device); 55381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 56381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 57381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // getCapabilities 58381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 59381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void doGetCapabilities(uint32_t* outCount, 60381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza int32_t* /*hwc2_capability_t*/ outCapabilities); 61381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static void getCapabilitiesHook(hwc2_device_t* device, uint32_t* outCount, 62381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza int32_t* /*hwc2_capability_t*/ outCapabilities) { 63381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza getAdapter(device)->doGetCapabilities(outCount, outCapabilities); 64381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 65381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 66381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // getFunction 67381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 68381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_function_pointer_t doGetFunction(HWC2::FunctionDescriptor descriptor); 69381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static hwc2_function_pointer_t getFunctionHook(hwc2_device_t* device, 70381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza int32_t intDesc) { 71381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto descriptor = static_cast<HWC2::FunctionDescriptor>(intDesc); 72381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return getAdapter(device)->doGetFunction(descriptor); 73381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 74381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 75381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // Device functions 76381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 77381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error createVirtualDisplay(uint32_t width, uint32_t height, 78381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_display_t* outDisplay); 79381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static int32_t createVirtualDisplayHook(hwc2_device_t* device, 80381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza uint32_t width, uint32_t height, int32_t* /*format*/, 81381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_display_t* outDisplay) { 82381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // HWC1 implementations cannot override the buffer format requested by 83381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // the consumer 84381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto error = getAdapter(device)->createVirtualDisplay(width, height, 85381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza outDisplay); 86381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return static_cast<int32_t>(error); 87381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 88381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 89381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error destroyVirtualDisplay(hwc2_display_t display); 90381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static int32_t destroyVirtualDisplayHook(hwc2_device_t* device, 91381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_display_t display) { 92381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto error = getAdapter(device)->destroyVirtualDisplay(display); 93381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return static_cast<int32_t>(error); 94381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 95381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 96381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::string mDumpString; 97381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void dump(uint32_t* outSize, char* outBuffer); 98381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static void dumpHook(hwc2_device_t* device, uint32_t* outSize, 99381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza char* outBuffer) { 100381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza getAdapter(device)->dump(outSize, outBuffer); 101381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 102381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 103381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza uint32_t getMaxVirtualDisplayCount(); 104381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static uint32_t getMaxVirtualDisplayCountHook(hwc2_device_t* device) { 105381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return getAdapter(device)->getMaxVirtualDisplayCount(); 106381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 107381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 108381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error registerCallback(HWC2::Callback descriptor, 109381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer); 110381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static int32_t registerCallbackHook(hwc2_device_t* device, 111381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza int32_t intDesc, hwc2_callback_data_t callbackData, 112381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_function_pointer_t pointer) { 113381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto descriptor = static_cast<HWC2::Callback>(intDesc); 114381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto error = getAdapter(device)->registerCallback(descriptor, 115381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza callbackData, pointer); 116381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return static_cast<int32_t>(error); 117381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 118381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 119381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // Display functions 120381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 121381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza class Layer; 122381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 123381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza class SortLayersByZ { 124381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza public: 125381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool operator()(const std::shared_ptr<Layer>& lhs, 126381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza const std::shared_ptr<Layer>& rhs); 127381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza }; 128381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 129381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza class DisplayContentsDeleter { 130381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza public: 131381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void operator()(struct hwc_display_contents_1* contents); 132381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza }; 133381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 134381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza class DeferredFence { 135381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza public: 136381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza DeferredFence() 137381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza : mMutex(), 138381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mFences({Fence::NO_FENCE, Fence::NO_FENCE}) {} 139381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 140381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void add(int32_t fenceFd) { 141381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mFences.emplace(new Fence(fenceFd)); 142381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mFences.pop(); 143381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 144381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 145381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza const sp<Fence>& get() const { 146381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return mFences.front(); 147381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 148381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 149381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza private: 150381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mutable std::mutex mMutex; 151381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::queue<sp<Fence>> mFences; 152381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza }; 153381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 154381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza class FencedBuffer { 155381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza public: 156381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza FencedBuffer() : mBuffer(nullptr), mFence(Fence::NO_FENCE) {} 157381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 158381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void setBuffer(buffer_handle_t buffer) { mBuffer = buffer; } 159381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void setFence(int fenceFd) { mFence = new Fence(fenceFd); } 160381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 161381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza buffer_handle_t getBuffer() const { return mBuffer; } 162381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza int getFence() const { return mFence->dup(); } 163381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 164381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza private: 165381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza buffer_handle_t mBuffer; 166381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza sp<Fence> mFence; 167381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza }; 168381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 169381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza class Display { 170381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza public: 171381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza typedef std::unique_ptr<hwc_display_contents_1, 172381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza DisplayContentsDeleter> HWC1Contents; 173381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 174381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza Display(HWC2On1Adapter& device, HWC2::DisplayType type); 175381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 176381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_display_t getId() const { return mId; } 177381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2On1Adapter& getDevice() const { return mDevice; } 178381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 179381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // Does not require locking because it is set before adding the 180381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // Displays to the Adapter's list of displays 181381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void setHwc1Id(int32_t id) { mHwc1Id = id; } 182381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza int32_t getHwc1Id() const { return mHwc1Id; } 183381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 184381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void incDirty() { ++mDirtyCount; } 185381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void decDirty() { --mDirtyCount; } 186381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool isDirty() const { return mDirtyCount > 0 || mZIsDirty; } 187381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 188381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // HWC2 Display functions 189381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error acceptChanges(); 190381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error createLayer(hwc2_layer_t* outLayerId); 191381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error destroyLayer(hwc2_layer_t layerId); 192381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error getActiveConfig(hwc2_config_t* outConfigId); 193381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error getAttribute(hwc2_config_t configId, 194381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Attribute attribute, int32_t* outValue); 195381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error getChangedCompositionTypes(uint32_t* outNumElements, 196381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_layer_t* outLayers, int32_t* outTypes); 197381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error getColorModes(uint32_t* outNumModes, int32_t* outModes); 198381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error getConfigs(uint32_t* outNumConfigs, 199381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_config_t* outConfigIds); 200381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error getDozeSupport(int32_t* outSupport); 201381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error getHdrCapabilities(uint32_t* outNumTypes, 202381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza int32_t* outTypes, float* outMaxLuminance, 203381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza float* outMaxAverageLuminance, float* outMinLuminance); 204381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error getName(uint32_t* outSize, char* outName); 205381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error getReleaseFences(uint32_t* outNumElements, 206381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_layer_t* outLayers, int32_t* outFences); 207381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error getRequests(int32_t* outDisplayRequests, 208381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza uint32_t* outNumElements, hwc2_layer_t* outLayers, 209381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza int32_t* outLayerRequests); 210381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error getType(int32_t* outType); 211381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error present(int32_t* outRetireFence); 212381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setActiveConfig(hwc2_config_t configId); 213381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setClientTarget(buffer_handle_t target, 214381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza int32_t acquireFence, int32_t dataspace, 215381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc_region_t damage); 216381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setColorMode(android_color_mode_t mode); 217381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setColorTransform(android_color_transform_t hint); 218381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setOutputBuffer(buffer_handle_t buffer, 219381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza int32_t releaseFence); 220381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setPowerMode(HWC2::PowerMode mode); 221381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setVsyncEnabled(HWC2::Vsync enabled); 222381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error validate(uint32_t* outNumTypes, 223381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza uint32_t* outNumRequests); 224381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 225381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error updateLayerZ(hwc2_layer_t layerId, uint32_t z); 226381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 227381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // Read configs from HWC1 device 228381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void populateConfigs(); 229381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 230381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // Set configs for a virtual display 231381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void populateConfigs(uint32_t width, uint32_t height); 232381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 233381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool prepare(); 234381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC1Contents cloneRequestedContents() const; 235381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void setReceivedContents(HWC1Contents contents); 236381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool hasChanges() const; 237381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error set(hwc_display_contents_1& hwcContents); 238381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void addRetireFence(int fenceFd); 239381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void addReleaseFences(const hwc_display_contents_1& hwcContents); 240381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 241381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool hasColorTransform() const; 242381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 243381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::string dump() const; 244381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 245381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza private: 246381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza class Config { 247381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza public: 248381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza Config(Display& display) 249381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza : mDisplay(display), 250381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mId(0), 251381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mAttributes() {} 252381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 253381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool isOnDisplay(const Display& display) const { 254381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return display.getId() == mDisplay.getId(); 255381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 256381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 257381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void setAttribute(HWC2::Attribute attribute, int32_t value); 258381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza int32_t getAttribute(HWC2::Attribute attribute) const; 259381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 260381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void setHwc1Id(uint32_t id); 261381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool hasHwc1Id(uint32_t id) const; 262381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error getColorModeForHwc1Id(uint32_t id, 263381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza android_color_mode_t *outMode) const; 264381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error getHwc1IdForColorMode(android_color_mode_t mode, 265381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza uint32_t* outId) const; 266381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 267381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void setId(hwc2_config_t id) { mId = id; } 268381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_config_t getId() const { return mId; } 269381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 270381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // Attempts to merge two configs that differ only in color 271381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // mode. Returns whether the merge was successful 272381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool merge(const Config& other); 273381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 274381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::set<android_color_mode_t> getColorModes() const; 275381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 276381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // splitLine divides the output into two lines suitable for 277381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // dumpsys SurfaceFlinger 278381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::string toString(bool splitLine = false) const; 279381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 280381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza private: 281381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza Display& mDisplay; 282381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_config_t mId; 283381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::unordered_map<HWC2::Attribute, int32_t> mAttributes; 284381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 285381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // Maps from color transform to HWC1 config ID 286381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::unordered_map<android_color_mode_t, uint32_t> mHwc1Ids; 287381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza }; 288381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 289381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza class Changes { 290381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza public: 291381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza uint32_t getNumTypes() const { 292381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return static_cast<uint32_t>(mTypeChanges.size()); 293381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 294381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 295381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza uint32_t getNumLayerRequests() const { 296381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return static_cast<uint32_t>(mLayerRequests.size()); 297381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 298381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 299381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza const std::unordered_map<hwc2_layer_t, HWC2::Composition>& 300381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza getTypeChanges() const { 301381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return mTypeChanges; 302381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 303381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 304381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza const std::unordered_map<hwc2_layer_t, HWC2::LayerRequest>& 305381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza getLayerRequests() const { 306381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return mLayerRequests; 307381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 308381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 309381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza int32_t getDisplayRequests() const { 310381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza int32_t requests = 0; 311381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza for (auto request : mDisplayRequests) { 312381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza requests |= static_cast<int32_t>(request); 313381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 314381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return requests; 315381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 316381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 317381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void addTypeChange(hwc2_layer_t layerId, 318381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Composition type) { 319381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mTypeChanges.insert({layerId, type}); 320381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 321381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 322381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void clearTypeChanges() { mTypeChanges.clear(); } 323381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 324381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void addLayerRequest(hwc2_layer_t layerId, 325381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::LayerRequest request) { 326381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mLayerRequests.insert({layerId, request}); 327381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 328381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 329381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza private: 330381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::unordered_map<hwc2_layer_t, HWC2::Composition> 331381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mTypeChanges; 332381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::unordered_map<hwc2_layer_t, HWC2::LayerRequest> 333381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mLayerRequests; 334381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::unordered_set<HWC2::DisplayRequest> mDisplayRequests; 335381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza }; 336381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 337381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::shared_ptr<const Config> 338381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza getConfig(hwc2_config_t configId) const; 339381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 340381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void populateColorModes(); 341381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void initializeActiveConfig(); 342381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 343381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void reallocateHwc1Contents(); 344381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void assignHwc1LayerIds(); 345381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 346381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void updateTypeChanges(const struct hwc_layer_1& hwc1Layer, 347381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza const Layer& layer); 348381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void updateLayerRequests(const struct hwc_layer_1& hwc1Layer, 349381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza const Layer& layer); 350381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 351381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void prepareFramebufferTarget(); 352381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 353381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static std::atomic<hwc2_display_t> sNextId; 354381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza const hwc2_display_t mId; 355381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2On1Adapter& mDevice; 356381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 357381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::atomic<size_t> mDirtyCount; 358381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 359381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // The state of this display should only be modified from 360381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // SurfaceFlinger's main loop, with the exception of when dump is 361381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // called. To prevent a bad state from crashing us during a dump 362381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // call, all public calls into Display must acquire this mutex. 363381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // 364381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // It is recursive because we don't want to deadlock in validate 365381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // (or present) when we call HWC2On1Adapter::prepareAllDisplays 366381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // (or setAllDisplays), which calls back into Display functions 367381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // which require locking. 368381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mutable std::recursive_mutex mStateMutex; 369381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 370381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool mZIsDirty; 371381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC1Contents mHwc1RequestedContents; 372381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC1Contents mHwc1ReceivedContents; 373381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza DeferredFence mRetireFence; 374381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 375381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // Will only be non-null after the layer has been validated but 376381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // before it has been presented 377381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::unique_ptr<Changes> mChanges; 378381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 379381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza int32_t mHwc1Id; 380381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 381381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::vector<std::shared_ptr<Config>> mConfigs; 382381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::shared_ptr<const Config> mActiveConfig; 383381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::set<android_color_mode_t> mColorModes; 384381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza android_color_mode_t mActiveColorMode; 385381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::string mName; 386381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::DisplayType mType; 387381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::PowerMode mPowerMode; 388381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Vsync mVsyncEnabled; 389381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 390381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza FencedBuffer mClientTarget; 391381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza FencedBuffer mOutputBuffer; 392381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 393381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool mHasColorTransform; 394381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 395381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::multiset<std::shared_ptr<Layer>, SortLayersByZ> mLayers; 396381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::unordered_map<size_t, std::shared_ptr<Layer>> mHwc1LayerMap; 397381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza }; 398381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 399381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza template <typename ...Args> 400381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static int32_t callDisplayFunction(hwc2_device_t* device, 401381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_display_t displayId, HWC2::Error (Display::*member)(Args...), 402381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza Args... args) { 403381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto display = getAdapter(device)->getDisplay(displayId); 404381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza if (!display) { 405381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return static_cast<int32_t>(HWC2::Error::BadDisplay); 406381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 407381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto error = ((*display).*member)(std::forward<Args>(args)...); 408381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return static_cast<int32_t>(error); 409381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 410381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 411381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza template <typename MF, MF memFunc, typename ...Args> 412381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static int32_t displayHook(hwc2_device_t* device, hwc2_display_t displayId, 413381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza Args... args) { 414381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return HWC2On1Adapter::callDisplayFunction(device, displayId, memFunc, 415381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::forward<Args>(args)...); 416381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 417381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 418381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static int32_t getDisplayAttributeHook(hwc2_device_t* device, 419381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_display_t display, hwc2_config_t config, 420381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza int32_t intAttribute, int32_t* outValue) { 421381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto attribute = static_cast<HWC2::Attribute>(intAttribute); 422381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return callDisplayFunction(device, display, &Display::getAttribute, 423381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza config, attribute, outValue); 424381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 425381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 426381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static int32_t setColorTransformHook(hwc2_device_t* device, 427381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_display_t display, const float* /*matrix*/, 428381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza int32_t /*android_color_transform_t*/ intHint) { 429381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // We intentionally throw away the matrix, because if the hint is 430381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // anything other than IDENTITY, we have to fall back to client 431381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // composition anyway 432381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto hint = static_cast<android_color_transform_t>(intHint); 433381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return callDisplayFunction(device, display, &Display::setColorTransform, 434381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hint); 435381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 436381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 437381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static int32_t setColorModeHook(hwc2_device_t* device, 438381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_display_t display, int32_t /*android_color_mode_t*/ intMode) { 439381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto mode = static_cast<android_color_mode_t>(intMode); 440381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return callDisplayFunction(device, display, &Display::setColorMode, mode); 441381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 442381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 443381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static int32_t setPowerModeHook(hwc2_device_t* device, 444381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_display_t display, int32_t intMode) { 445381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto mode = static_cast<HWC2::PowerMode>(intMode); 446381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return callDisplayFunction(device, display, &Display::setPowerMode, 447381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mode); 448381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 449381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 450381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static int32_t setVsyncEnabledHook(hwc2_device_t* device, 451381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_display_t display, int32_t intEnabled) { 452381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto enabled = static_cast<HWC2::Vsync>(intEnabled); 453381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return callDisplayFunction(device, display, &Display::setVsyncEnabled, 454381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza enabled); 455381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 456381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 457381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // Layer functions 458381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 459381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza template <typename T> 460381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza class LatchedState { 461381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza public: 462381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza LatchedState(Layer& parent, T initialValue) 463381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza : mParent(parent), 464381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mPendingValue(initialValue), 465381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mValue(initialValue) {} 466381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 467381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void setPending(T value) { 468381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza if (value == mPendingValue) { 469381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return; 470381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 471381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza if (mPendingValue == mValue) { 472381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mParent.incDirty(); 473381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } else if (value == mValue) { 474381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mParent.decDirty(); 475381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 476381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mPendingValue = value; 477381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 478381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 479381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza T getValue() const { return mValue; } 480381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza T getPendingValue() const { return mPendingValue; } 481381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 482381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool isDirty() const { return mPendingValue != mValue; } 483381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 484381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void latch() { 485381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza if (isDirty()) { 486381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mValue = mPendingValue; 487381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza mParent.decDirty(); 488381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 489381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 490381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 491381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza private: 492381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza Layer& mParent; 493381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza T mPendingValue; 494381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza T mValue; 495381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza }; 496381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 497381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza class Layer { 498381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza public: 499381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza explicit Layer(Display& display); 500381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 501381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool operator==(const Layer& other) { return mId == other.mId; } 502381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool operator!=(const Layer& other) { return !(*this == other); } 503381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 504381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_layer_t getId() const { return mId; } 505381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza Display& getDisplay() const { return mDisplay; } 506381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 507381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void incDirty() { if (mDirtyCount++ == 0) mDisplay.incDirty(); } 508381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void decDirty() { if (--mDirtyCount == 0) mDisplay.decDirty(); } 509381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool isDirty() const { return mDirtyCount > 0; } 510381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 511381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // HWC2 Layer functions 512381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setBuffer(buffer_handle_t buffer, int32_t acquireFence); 513381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setCursorPosition(int32_t x, int32_t y); 514381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setSurfaceDamage(hwc_region_t damage); 515381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 516381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // HWC2 Layer state functions 517381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setBlendMode(HWC2::BlendMode mode); 518381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setColor(hwc_color_t color); 519381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setCompositionType(HWC2::Composition type); 520381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setDataspace(android_dataspace_t dataspace); 521381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setDisplayFrame(hwc_rect_t frame); 522381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setPlaneAlpha(float alpha); 523381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setSidebandStream(const native_handle_t* stream); 524381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setSourceCrop(hwc_frect_t crop); 525381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setTransform(HWC2::Transform transform); 526381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setVisibleRegion(hwc_region_t visible); 527381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setZ(uint32_t z); 528381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 529381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Composition getCompositionType() const { 530381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return mCompositionType.getValue(); 531381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 532381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza uint32_t getZ() const { return mZ; } 533381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 534381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void addReleaseFence(int fenceFd); 535381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza const sp<Fence>& getReleaseFence() const; 536381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 537381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void setHwc1Id(size_t id) { mHwc1Id = id; } 538381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza size_t getHwc1Id() const { return mHwc1Id; } 539381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 540381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void applyState(struct hwc_layer_1& hwc1Layer, bool applyAllState); 541381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 542381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::string dump() const; 543381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 544381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza private: 545381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void applyCommonState(struct hwc_layer_1& hwc1Layer, 546381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool applyAllState); 547381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void applySolidColorState(struct hwc_layer_1& hwc1Layer, 548381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool applyAllState); 549381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void applySidebandState(struct hwc_layer_1& hwc1Layer, 550381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool applyAllState); 551381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void applyBufferState(struct hwc_layer_1& hwc1Layer); 552381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void applyCompositionType(struct hwc_layer_1& hwc1Layer, 553381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool applyAllState); 554381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 555381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static std::atomic<hwc2_layer_t> sNextId; 556381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza const hwc2_layer_t mId; 557381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza Display& mDisplay; 558381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza size_t mDirtyCount; 559381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 560381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza FencedBuffer mBuffer; 561381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::vector<hwc_rect_t> mSurfaceDamage; 562381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 563381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza LatchedState<HWC2::BlendMode> mBlendMode; 564381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza LatchedState<hwc_color_t> mColor; 565381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza LatchedState<HWC2::Composition> mCompositionType; 566381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza LatchedState<hwc_rect_t> mDisplayFrame; 567381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza LatchedState<float> mPlaneAlpha; 568381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza LatchedState<const native_handle_t*> mSidebandStream; 569381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza LatchedState<hwc_frect_t> mSourceCrop; 570381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza LatchedState<HWC2::Transform> mTransform; 571381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza LatchedState<std::vector<hwc_rect_t>> mVisibleRegion; 572381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza uint32_t mZ; 573381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 574381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza DeferredFence mReleaseFence; 575381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 576381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza size_t mHwc1Id; 577381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool mHasUnsupportedDataspace; 578381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool mHasUnsupportedPlaneAlpha; 579381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza }; 580381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 581381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza template <typename ...Args> 582381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static int32_t callLayerFunction(hwc2_device_t* device, 583381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_display_t displayId, hwc2_layer_t layerId, 584381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error (Layer::*member)(Args...), Args... args) { 585381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto result = getAdapter(device)->getLayer(displayId, layerId); 586381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto error = std::get<HWC2::Error>(result); 587381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza if (error == HWC2::Error::None) { 588381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto layer = std::get<Layer*>(result); 589381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza error = ((*layer).*member)(std::forward<Args>(args)...); 590381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 591381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return static_cast<int32_t>(error); 592381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 593381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 594381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza template <typename MF, MF memFunc, typename ...Args> 595381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static int32_t layerHook(hwc2_device_t* device, hwc2_display_t displayId, 596381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_layer_t layerId, Args... args) { 597381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return HWC2On1Adapter::callLayerFunction(device, displayId, layerId, 598381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza memFunc, std::forward<Args>(args)...); 599381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 600381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 601381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // Layer state functions 602381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 603381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static int32_t setLayerBlendModeHook(hwc2_device_t* device, 604381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_display_t display, hwc2_layer_t layer, int32_t intMode) { 605381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto mode = static_cast<HWC2::BlendMode>(intMode); 606381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return callLayerFunction(device, display, layer, 607381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza &Layer::setBlendMode, mode); 608381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 609381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 610381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static int32_t setLayerCompositionTypeHook(hwc2_device_t* device, 611381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_display_t display, hwc2_layer_t layer, int32_t intType) { 612381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto type = static_cast<HWC2::Composition>(intType); 613381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return callLayerFunction(device, display, layer, 614381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza &Layer::setCompositionType, type); 615381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 616381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 617381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static int32_t setLayerDataspaceHook(hwc2_device_t* device, 618381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_display_t display, hwc2_layer_t layer, int32_t intDataspace) { 619381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto dataspace = static_cast<android_dataspace_t>(intDataspace); 620381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return callLayerFunction(device, display, layer, &Layer::setDataspace, 621381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza dataspace); 622381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 623381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 624381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static int32_t setLayerTransformHook(hwc2_device_t* device, 625381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_display_t display, hwc2_layer_t layer, int32_t intTransform) { 626381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza auto transform = static_cast<HWC2::Transform>(intTransform); 627381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return callLayerFunction(device, display, layer, &Layer::setTransform, 628381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza transform); 629381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 630381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 631381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza static int32_t setLayerZOrderHook(hwc2_device_t* device, 632381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_display_t display, hwc2_layer_t layer, uint32_t z) { 633381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza return callDisplayFunction(device, display, &Display::updateLayerZ, 634381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza layer, z); 635381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza } 636381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 637381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // Adapter internals 638381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 639381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void populateCapabilities(); 640381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza Display* getDisplay(hwc2_display_t id); 641381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::tuple<Layer*, HWC2::Error> getLayer(hwc2_display_t displayId, 642381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_layer_t layerId); 643381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void populatePrimary(); 644381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 645381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool prepareAllDisplays(); 646381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::vector<struct hwc_display_contents_1*> mHwc1Contents; 647381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza HWC2::Error setAllDisplays(); 648381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 649381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void hwc1Invalidate(); 650381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void hwc1Vsync(int hwc1DisplayId, int64_t timestamp); 651381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza void hwc1Hotplug(int hwc1DisplayId, int connected); 652381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 653381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // These are set in the constructor and before any asynchronous events are 654381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // possible 655381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 656381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza struct hwc_composer_device_1* const mHwc1Device; 657381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza const uint8_t mHwc1MinorVersion; 658381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool mHwc1SupportsVirtualDisplays; 659381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 660381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza class Callbacks; 661381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza const std::unique_ptr<Callbacks> mHwc1Callbacks; 662381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 663381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::unordered_set<HWC2::Capability> mCapabilities; 664381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 665381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // These are only accessed from the main SurfaceFlinger thread (not from 666381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // callbacks or dump 667381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 668381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::map<hwc2_layer_t, std::shared_ptr<Layer>> mLayers; 669381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::shared_ptr<Display> mHwc1VirtualDisplay; 670381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 671381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // These are potentially accessed from multiple threads, and are protected 672381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // by this mutex. This needs to be recursive, since the HWC1 implementation 673381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // can call back into the invalidate callback on the same thread that is 674381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza // calling prepare. 675381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::recursive_timed_mutex mStateMutex; 676381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 677381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza struct CallbackInfo { 678381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_callback_data_t data; 679381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza hwc2_function_pointer_t pointer; 680381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza }; 681381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::unordered_map<HWC2::Callback, CallbackInfo> mCallbacks; 682381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza bool mHasPendingInvalidate; 683381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::vector<std::pair<int, int64_t>> mPendingVsyncs; 684381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::vector<std::pair<int, int>> mPendingHotplugs; 685381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 686381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::map<hwc2_display_t, std::shared_ptr<Display>> mDisplays; 687381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza std::unordered_map<int, hwc2_display_t> mHwc1DisplayMap; 688381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza}; 689381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 690381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza} // namespace android 691381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza 692381004a9272e611facccf3fa17c9b14f5b28bad3Dan Stoza#endif 693