1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef ANDROID_SURFACE_FLINGER_H 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_SURFACE_FLINGER_H 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2087670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar#include <memory> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 243f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian/* 253f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * NOTE: Make sure this file doesn't include anything from <gl/ > or <gl2/ > 263f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian */ 27921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 2899ed22412db547c59d3da08114d9d5a586442b30Glenn Kasten#include <cutils/compiler.h> 292716e111df2b7cd2490029f4c88bcc6543c93416Steven Moreland#include <cutils/atomic.h> 3099ed22412db547c59d3da08114d9d5a586442b30Glenn Kasten 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h> 3299b49840d309727678b77403d6cc9f920111623fMathias Agopian#include <utils/KeyedVector.h> 33076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/RefBase.h> 3499b49840d309727678b77403d6cc9f920111623fMathias Agopian#include <utils/SortedVector.h> 3599b49840d309727678b77403d6cc9f920111623fMathias Agopian#include <utils/threads.h> 362713c30843816d3511b39b85a2c268a2b7682047Dan Stoza#include <utils/Trace.h> 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 383d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson#include <ui/FenceTime.h> 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h> 401d77b719d51a01cbd6954a048fb64e79d50a950eMathias Agopian#include <math/mat4.h> 41921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 420a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson#include <gui/FrameTimestamps.h> 4390ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposer.h> 4490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposerClient.h> 454cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr#include <gui/LayerState.h> 464cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr 47e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza#include <gui/OccupancyTracker.h> 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 498630320433bd15aca239522e54e711ef6372ab07Mathias Agopian#include <hardware/hwcomposer_defs.h> 508630320433bd15aca239522e54e711ef6372ab07Mathias Agopian 51357988777218502ed68a56a0c8b247ba64b74721Vishnu Nair#include <serviceutils/PriorityDumper.h> 52357988777218502ed68a56a0c8b247ba64b74721Vishnu Nair 5328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright#include <system/graphics.h> 5428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 55921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include "Barrier.h" 5692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian#include "DisplayDevice.h" 57faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis#include "DispSync.h" 582713c30843816d3511b39b85a2c268a2b7682047Dan Stoza#include "EventThread.h" 594b0eba949cc026ffb2c75313042d8a7bcb3fcf86Jamie Gennis#include "FrameTracker.h" 60068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang#include "LayerStats.h" 612047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr#include "LayerVector.h" 624b0eba949cc026ffb2c75313042d8a7bcb3fcf86Jamie Gennis#include "MessageQueue.h" 63468051e20be19130572231266db306396a56402bIrvel#include "SurfaceInterceptor.h" 641e1a1282846318caa0bfe271500eb3ba24e9a513Adrian Roos#include "SurfaceTracing.h" 65f9b05eeb5f3b3ea92ea196f37a53df06b535690cWei Wang#include "StartPropertySetThread.h" 660102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang#include "TimeStats/TimeStats.h" 672713c30843816d3511b39b85a2c268a2b7682047Dan Stoza#include "VSyncModulator.h" 68f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 69b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas#include "DisplayHardware/HWC2.h" 708630320433bd15aca239522e54e711ef6372ab07Mathias Agopian#include "DisplayHardware/HWComposer.h" 71b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas 72ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian#include "Effects/Daltonizer.h" 738630320433bd15aca239522e54e711ef6372ab07Mathias Agopian 74e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza#include <map> 750a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson#include <mutex> 760a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson#include <queue> 77e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza#include <string> 78b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas#include <thread> 790a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson#include <utility> 80a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw#include "RenderArea.h" 81e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza 821d04428c3cff3503212ec3e76775ca5ba20abc18chaviw#include <layerproto/LayerProtoHeader.h> 831d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 841d04428c3cff3503212ec3e76775ca5ba20abc18chaviwusing namespace android::surfaceflinger; 851d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Client; 91144e116f45f196396f0d59d5fc09766ab618f885Lloyd Piqueclass ColorLayer; 92d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopianclass DisplayEventConnection; 93144e116f45f196396f0d59d5fc09766ab618f885Lloyd Piqueclass EventControlThread; 94d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopianclass EventThread; 9512eb423785adba54be4c7112e5198a80d563896eLloyd Piqueclass IGraphicBufferConsumer; 9612eb423785adba54be4c7112e5198a80d563896eLloyd Piqueclass IGraphicBufferProducer; 97144e116f45f196396f0d59d5fc09766ab618f885Lloyd Piqueclass InjectVSyncSource; 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Layer; 99e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianclass Surface; 100105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodmanclass SurfaceFlingerBE; 101144e116f45f196396f0d59d5fc09766ab618f885Lloyd Piqueclass VSyncSource; 102144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique 1030fcde1b23edcb8105b944df70bf1113cac8f0c15Lloyd Piquenamespace impl { 1040fcde1b23edcb8105b944df70bf1113cac8f0c15Lloyd Piqueclass EventThread; 1050fcde1b23edcb8105b944df70bf1113cac8f0c15Lloyd Pique} // namespace impl 1060fcde1b23edcb8105b944df70bf1113cac8f0c15Lloyd Pique 107144e116f45f196396f0d59d5fc09766ab618f885Lloyd Piquenamespace RE { 108144e116f45f196396f0d59d5fc09766ab618f885Lloyd Piqueclass RenderEngine; 109144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique} 11087670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar 111a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviwtypedef std::function<void(const LayerVector::Visitor&)> TraverseLayersFunction; 112a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw 11387670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaarnamespace dvr { 11487670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaarclass VrFlinger; 11587670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar} // namespace dvr 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectenum { 120e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian eTransactionNeeded = 0x01, 121e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian eTraversalNeeded = 0x02, 122e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian eDisplayTransactionNeeded = 0x04, 123d432a7c40dfa6c5498038ec652db54478df966c1Lloyd Pique eDisplayLayerStackChanged = 0x08, 124d432a7c40dfa6c5498038ec652db54478df966c1Lloyd Pique eTransactionMask = 0x0f, 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 127dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Linenum class DisplayColorSetting : int32_t { 128dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin MANAGED = 0, 129dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin UNMANAGED = 1, 130dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin ENHANCED = 2, 131dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin}; 132dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin 1330959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique// A thin interface to abstract creating instances of Surface (gui/Surface.h) to 1340959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique// use as a NativeWindow. 1350959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Piqueclass NativeWindowSurface { 1360959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Piquepublic: 1370959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique virtual ~NativeWindowSurface(); 1380959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique 1390959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique // Gets the NativeWindow to use for the surface. 1400959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique virtual sp<ANativeWindow> getNativeWindow() const = 0; 1410959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique 1420959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique // Indicates that the surface should allocate its buffers now. 1430959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique virtual void preallocateBuffers() = 0; 1440959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique}; 1450959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique 146105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodmanclass SurfaceFlingerBE 147105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman{ 148105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodmanpublic: 149105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman SurfaceFlingerBE(); 150105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman 151105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // The current hardware composer interface. 152105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // 153105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // The following thread safety rules apply when accessing mHwc, either 154105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // directly or via getHwComposer(): 155105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // 156105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // 1. When recreating mHwc, acquire mStateLock. We currently recreate mHwc 157105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // only when switching into and out of vr. Recreating mHwc must only be 158105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // done on the main thread. 159105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // 160105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // 2. When accessing mHwc on the main thread, it's not necessary to acquire 161105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // mStateLock. 162105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // 163105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // 3. When accessing mHwc on a thread other than the main thread, we always 164105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // need to acquire mStateLock. This is because the main thread could be 165105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // in the process of destroying the current mHwc instance. 166105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // 167105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // The above thread safety rules only apply to SurfaceFlinger.cpp. In 168105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // SurfaceFlinger_hwc1.cpp we create mHwc at surface flinger init and never 169105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // destroy it, so it's always safe to access mHwc from any thread without 170105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // acquiring mStateLock. 171105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman std::unique_ptr<HWComposer> mHwc; 172105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman 173bc8152863f81c9af1038d92c9eb8caca1cfd4027David Sodman const std::string mHwcServiceName; // "default" for real use, something else for testing. 174bc8152863f81c9af1038d92c9eb8caca1cfd4027David Sodman 175bc8152863f81c9af1038d92c9eb8caca1cfd4027David Sodman // constant members (no synchronization needed for access) 176144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique std::unique_ptr<RE::RenderEngine> mRenderEngine; 177bc8152863f81c9af1038d92c9eb8caca1cfd4027David Sodman EGLContext mEGLContext; 178bc8152863f81c9af1038d92c9eb8caca1cfd4027David Sodman EGLDisplay mEGLDisplay; 179fcd86617fb5cbbad3463c828211868859de23329Lloyd Pique 18073bededbdc82a5b6199f0860c8900e75c6f0e467David Sodman FenceTimeline mGlCompositionDoneTimeline; 18173bededbdc82a5b6199f0860c8900e75c6f0e467David Sodman FenceTimeline mDisplayTimeline; 182bc8152863f81c9af1038d92c9eb8caca1cfd4027David Sodman 18399974d2935a520141d77983ac0329350460f2379David Sodman // protected by mCompositorTimingLock; 18499974d2935a520141d77983ac0329350460f2379David Sodman mutable std::mutex mCompositorTimingLock; 18599974d2935a520141d77983ac0329350460f2379David Sodman CompositorTiming mCompositorTiming; 186fcd86617fb5cbbad3463c828211868859de23329Lloyd Pique 18799974d2935a520141d77983ac0329350460f2379David Sodman // Only accessed from the main thread. 18899974d2935a520141d77983ac0329350460f2379David Sodman struct CompositePresentTime { 18999974d2935a520141d77983ac0329350460f2379David Sodman nsecs_t composite { -1 }; 19099974d2935a520141d77983ac0329350460f2379David Sodman std::shared_ptr<FenceTime> display { FenceTime::NO_FENCE }; 19199974d2935a520141d77983ac0329350460f2379David Sodman }; 19299974d2935a520141d77983ac0329350460f2379David Sodman std::queue<CompositePresentTime> mCompositePresentTimes; 19399974d2935a520141d77983ac0329350460f2379David Sodman 1944a36e9384d10fe3a1e57599558d68e95ff51279aDavid Sodman static const size_t NUM_BUCKETS = 8; // < 1-7, 7+ 1954a36e9384d10fe3a1e57599558d68e95ff51279aDavid Sodman nsecs_t mFrameBuckets[NUM_BUCKETS]; 1964a36e9384d10fe3a1e57599558d68e95ff51279aDavid Sodman nsecs_t mTotalTime; 1974a36e9384d10fe3a1e57599558d68e95ff51279aDavid Sodman std::atomic<nsecs_t> mLastSwapTime; 1984a36e9384d10fe3a1e57599558d68e95ff51279aDavid Sodman 199cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman // Double- vs. triple-buffering stats 200cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman struct BufferingStats { 201cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman BufferingStats() 202cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman : numSegments(0), 203cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman totalTime(0), 204cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman twoBufferTime(0), 205cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman doubleBufferedTime(0), 206cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman tripleBufferedTime(0) {} 207cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman 208cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman size_t numSegments; 209cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman nsecs_t totalTime; 210cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman 211cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman // "Two buffer" means that a third buffer was never used, whereas 212cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman // "double-buffered" means that on average the segment only used two 213cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman // buffers (though it may have used a third for some part of the 214cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman // segment) 215cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman nsecs_t twoBufferTime; 216cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman nsecs_t doubleBufferedTime; 217cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman nsecs_t tripleBufferedTime; 218cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman }; 219cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman mutable Mutex mBufferingStatsMutex; 220cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman std::unordered_map<std::string, BufferingStats> mBufferingStats; 221cbaf083d0a916ad4b6264d770594d44e411f4674David Sodman 222105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // The composer sequence id is a monotonically increasing integer that we 223105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // use to differentiate callbacks from different hardware composer 224105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman // instances. Each hardware composer instance gets a different sequence id. 225105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman int32_t mComposerSequenceId; 226105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman}; 227105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman 228105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman 2294f4f0943489d9113c66ac22b58cfba8c21dfa879Mathias Agopianclass SurfaceFlinger : public BnSurfaceComposer, 230357988777218502ed68a56a0c8b247ba64b74721Vishnu Nair public PriorityDumper, 231921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian private IBinder::DeathRecipient, 232b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas private HWC2::ComposerCallback 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 235105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman SurfaceFlingerBE& getBE() { return mBE; } 236105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman const SurfaceFlingerBE& getBE() const { return mBE; } 2370cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard 2380cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // This is the phase offset in nanoseconds of the software vsync event 2390cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // relative to the vsync event reported by HWComposer. The software vsync 2400cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // event is when SurfaceFlinger and Choreographer-based applications run each 2410cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // frame. 2420cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // 2430cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // This phase offset allows adjustment of the minimum latency from application 2440cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // wake-up time (by Choreographer) to the time at which the resulting window 2450cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // image is displayed. This value may be either positive (after the HW vsync) 2460cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // or negative (before the HW vsync). Setting it to 0 will result in a lower 2470cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // latency bound of two vsync periods because the app and SurfaceFlinger 2480cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // will run just after the HW vsync. Setting it to a positive number will 2490cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // result in the minimum latency being: 2500cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // 2510cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // (2 * VSYNC_PERIOD - (vsyncPhaseOffsetNs % VSYNC_PERIOD)) 2520cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // 2530cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // Note that reducing this latency makes it more likely for the applications 2540cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // to not have their window content image ready in time. When this happens 2550cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // the latency will end up being an additional vsync period, and animations 2560cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // will hiccup. Therefore, this latency should be tuned somewhat 2570cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard // conservatively (or at least with awareness of the trade-off being made). 2580cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard static int64_t vsyncPhaseOffsetNs; 2590cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard static int64_t sfVsyncPhaseOffsetNs; 2600cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard 261cbf153bedf2eafc1443bbc97c4e74f97e7973eddFabien Sanglard // If fences from sync Framework are supported. 262cbf153bedf2eafc1443bbc97c4e74f97e7973eddFabien Sanglard static bool hasSyncFramework; 263cbf153bedf2eafc1443bbc97c4e74f97e7973eddFabien Sanglard 264c45a7d9dfdefa07512c5acc07bcbee5362b34e3dFabien Sanglard // The offset in nanoseconds to use when DispSync timestamps present fence 265c45a7d9dfdefa07512c5acc07bcbee5362b34e3dFabien Sanglard // signaling time. 266c45a7d9dfdefa07512c5acc07bcbee5362b34e3dFabien Sanglard static int64_t dispSyncPresentTimeOffset; 267c45a7d9dfdefa07512c5acc07bcbee5362b34e3dFabien Sanglard 268a34ed639c3057b99da0fb703beb12827e30aa508Fabien Sanglard // Some hardware can do RGB->YUV conversion more efficiently in hardware 269a34ed639c3057b99da0fb703beb12827e30aa508Fabien Sanglard // controlled by HWC than in hardware controlled by the video encoder. 270a34ed639c3057b99da0fb703beb12827e30aa508Fabien Sanglard // This instruct VirtualDisplaySurface to use HWC for such conversion on 271a34ed639c3057b99da0fb703beb12827e30aa508Fabien Sanglard // GL composition. 272a34ed639c3057b99da0fb703beb12827e30aa508Fabien Sanglard static bool useHwcForRgbToYuv; 273a34ed639c3057b99da0fb703beb12827e30aa508Fabien Sanglard 274c8e387edfcead55b6e6fb1d05db279c264b644faFabien Sanglard // Maximum dimension supported by HWC for virtual display. 275c8e387edfcead55b6e6fb1d05db279c264b644faFabien Sanglard // Equal to min(max_height, max_width). 276c8e387edfcead55b6e6fb1d05db279c264b644faFabien Sanglard static uint64_t maxVirtualDisplaySize; 277c8e387edfcead55b6e6fb1d05db279c264b644faFabien Sanglard 2781971b63aa4d82db37794f19e0eb01feb1826e422Fabien Sanglard // Controls the number of buffers SurfaceFlinger will allocate for use in 2791971b63aa4d82db37794f19e0eb01feb1826e422Fabien Sanglard // FramebufferSurface 2801971b63aa4d82db37794f19e0eb01feb1826e422Fabien Sanglard static int64_t maxFrameBufferAcquiredBuffers; 2811971b63aa4d82db37794f19e0eb01feb1826e422Fabien Sanglard 2825d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // Indicate if platform supports color management on its 2835d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // wide-color display. This is typically found on devices 2845d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // with wide gamut (e.g. Display-P3) display. 2855d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // This also allows devices with wide-color displays that don't 2865d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // want to support color management to disable color management. 2875d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter static bool hasWideColorDisplay; 2885d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 289b6df7d0e4c2117ca476662bd52b6745b3d8a305fMathias Agopian static char const* getServiceName() ANDROID_API { 290921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian return "SurfaceFlinger"; 291921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian } 292118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian 2932d3ee6dda3547b08b0de3373da5b6b2edb223fa9Lloyd Pique struct SkipInitializationTag {}; 2942d3ee6dda3547b08b0de3373da5b6b2edb223fa9Lloyd Pique static constexpr SkipInitializationTag SkipInitialization; 2952d3ee6dda3547b08b0de3373da5b6b2edb223fa9Lloyd Pique explicit SurfaceFlinger(SkipInitializationTag) ANDROID_API; 296b6df7d0e4c2117ca476662bd52b6745b3d8a305fMathias Agopian SurfaceFlinger() ANDROID_API; 29799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 2984f4f0943489d9113c66ac22b58cfba8c21dfa879Mathias Agopian // must be called before clients can connect 2994f4f0943489d9113c66ac22b58cfba8c21dfa879Mathias Agopian void init() ANDROID_API; 3004f4f0943489d9113c66ac22b58cfba8c21dfa879Mathias Agopian 3014f4f0943489d9113c66ac22b58cfba8c21dfa879Mathias Agopian // starts SurfaceFlinger main loop in the current thread 3024f4f0943489d9113c66ac22b58cfba8c21dfa879Mathias Agopian void run() ANDROID_API; 3034f4f0943489d9113c66ac22b58cfba8c21dfa879Mathias Agopian 3048630320433bd15aca239522e54e711ef6372ab07Mathias Agopian enum { 3058630320433bd15aca239522e54e711ef6372ab07Mathias Agopian EVENT_VSYNC = HWC_EVENT_VSYNC 3068630320433bd15aca239522e54e711ef6372ab07Mathias Agopian }; 3078630320433bd15aca239522e54e711ef6372ab07Mathias Agopian 308921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // post an asynchronous message to the main thread 3093f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian status_t postMessageAsync(const sp<MessageBase>& msg, nsecs_t reltime = 0, uint32_t flags = 0); 310118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian 311921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // post a synchronous message to the main thread 3123f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian status_t postMessageSync(const sp<MessageBase>& msg, nsecs_t reltime = 0, uint32_t flags = 0); 313118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian 314921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // force full composition on all displays 315921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian void repaintEverything(); 316b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian 317921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // returns the default Display 3188722a310c00557195a0703e95564f31d908ab2d5Tomasz Wasilczyk sp<const DisplayDevice> getDefaultDisplayDevice() const { 3197d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk Mutex::Autolock _l(mStateLock); 3207d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk return getDefaultDisplayDeviceLocked(); 321921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian } 322118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian 3238630320433bd15aca239522e54e711ef6372ab07Mathias Agopian // utility function to delete a texture on the main thread 3243f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian void deleteTextureAsync(uint32_t texture); 3258630320433bd15aca239522e54e711ef6372ab07Mathias Agopian 3268630320433bd15aca239522e54e711ef6372ab07Mathias Agopian // enable/disable h/w composer event 3278630320433bd15aca239522e54e711ef6372ab07Mathias Agopian // TODO: this should be made accessible only to EventThread 3289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza void setVsyncEnabled(int disp, int enabled); 3298630320433bd15aca239522e54e711ef6372ab07Mathias Agopian 330921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // called on the main thread by MessageQueue when an internal message 331921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // is received 332921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // TODO: this should be made accessible only to MessageQueue 333921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian void onMessageReceived(int32_t what); 334118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian 335cb55857bbde34a06c19dde3db5064d1717a0173eMathias Agopian // for debugging only 336cb55857bbde34a06c19dde3db5064d1717a0173eMathias Agopian // TODO: this should be made accessible only to HWComposer 33748bc05b56df9919fc39c5f2e3ea6535560eec98fJesse Hall const Vector< sp<Layer> >& getLayerSortedByZForHwcDisplay(int id); 338cb55857bbde34a06c19dde3db5064d1717a0173eMathias Agopian 339144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique RE::RenderEngine& getRenderEngine() const { return *getBE().mRenderEngine; } 34029c3f352797d9d2ddf055d8f888e7694ef8b3947Jesse Hall 3410d48072f6047140119ff194c1194ce402fca2c0bRobert Carr bool authenticateSurfaceTextureLocked( 3420d48072f6047140119ff194c1194ce402fca2c0bRobert Carr const sp<IGraphicBufferProducer>& bufferProducer) const; 3430d48072f6047140119ff194c1194ce402fca2c0bRobert Carr 3447501ed66a05f530062925011d1342e8651216051Iris Chang int getPrimaryDisplayOrientation() const { return mPrimaryDisplayOrientation; } 3457501ed66a05f530062925011d1342e8651216051Iris Chang 3461f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopianprivate: 34796f0819f81293076e652792794a961543e6750d7Mathias Agopian friend class Client; 348d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian friend class DisplayEventConnection; 3490fcde1b23edcb8105b944df70bf1113cac8f0c15Lloyd Pique friend class impl::EventThread; 350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project friend class Layer; 3510c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman friend class BufferLayer; 352b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza friend class MonitoredProducer; 353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 354f58625d9fba0ac42ecc4f6eb41a60a4af51e6c3cLloyd Pique // For unit tests 355f58625d9fba0ac42ecc4f6eb41a60a4af51e6c3cLloyd Pique friend class TestableSurfaceFlinger; 356f58625d9fba0ac42ecc4f6eb41a60a4af51e6c3cLloyd Pique 3576547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis // This value is specified in number of frames. Log frame stats at most 3586547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis // every half hour. 3596547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis enum { LOG_FRAME_STATS_PERIOD = 30*60*60 }; 3606547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 3617d89d06a6fe1bfadfe277f19dbb7e4aa021444e0Dan Stoza static const size_t MAX_LAYERS = 4096; 3627d89d06a6fe1bfadfe277f19dbb7e4aa021444e0Dan Stoza 363921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // We're reference counted, never destroy SurfaceFlinger directly 364921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian virtual ~SurfaceFlinger(); 365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 366921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian /* ------------------------------------------------------------------------ 367921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian * Internal data structures 368921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian */ 369118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian 3702047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr class State { 371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project public: 372738df02be90749afa30316ff70ef0ed425ceb6f0chaviw explicit State(LayerVector::StateSet set) : stateSet(set), layersSortedByZ(set) {} 373412903fce3a93f411c85c54375a1851bfb370400Dan Stoza State& operator=(const State& other) { 374412903fce3a93f411c85c54375a1851bfb370400Dan Stoza // We explicitly don't copy stateSet so that, e.g., mDrawingState 375412903fce3a93f411c85c54375a1851bfb370400Dan Stoza // always uses the Drawing StateSet. 376412903fce3a93f411c85c54375a1851bfb370400Dan Stoza layersSortedByZ = other.layersSortedByZ; 377412903fce3a93f411c85c54375a1851bfb370400Dan Stoza displays = other.displays; 37828f320b443106f1656f9720224f579136dcf0c61Chia-I Wu colorMatrixChanged = other.colorMatrixChanged; 37928f320b443106f1656f9720224f579136dcf0c61Chia-I Wu if (colorMatrixChanged) { 38028f320b443106f1656f9720224f579136dcf0c61Chia-I Wu colorMatrix = other.colorMatrix; 38128f320b443106f1656f9720224f579136dcf0c61Chia-I Wu } 382412903fce3a93f411c85c54375a1851bfb370400Dan Stoza return *this; 383412903fce3a93f411c85c54375a1851bfb370400Dan Stoza } 384412903fce3a93f411c85c54375a1851bfb370400Dan Stoza 385412903fce3a93f411c85c54375a1851bfb370400Dan Stoza const LayerVector::StateSet stateSet = LayerVector::StateSet::Invalid; 386921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian LayerVector layersSortedByZ; 387e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DefaultKeyedVector< wp<IBinder>, DisplayDeviceState> displays; 3882047fae0cfed99c425dc7333f31d309e5b8ee1baRobert Carr 38928f320b443106f1656f9720224f579136dcf0c61Chia-I Wu bool colorMatrixChanged = true; 39028f320b443106f1656f9720224f579136dcf0c61Chia-I Wu mat4 colorMatrix; 39128f320b443106f1656f9720224f579136dcf0c61Chia-I Wu 392412903fce3a93f411c85c54375a1851bfb370400Dan Stoza void traverseInZOrder(const LayerVector::Visitor& visitor) const; 393412903fce3a93f411c85c54375a1851bfb370400Dan Stoza void traverseInReverseZOrder(const LayerVector::Visitor& visitor) const; 394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 396921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian /* ------------------------------------------------------------------------ 397921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian * IBinder interface 398921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian */ 399921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian virtual status_t onTransact(uint32_t code, const Parcel& data, 400921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian Parcel* reply, uint32_t flags); 401357988777218502ed68a56a0c8b247ba64b74721Vishnu Nair virtual status_t dump(int fd, const Vector<String16>& args) { return priorityDump(fd, args); } 402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 403921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian /* ------------------------------------------------------------------------ 404921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian * ISurfaceComposer interface 405921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian */ 406921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian virtual sp<ISurfaceComposerClient> createConnection(); 4071db73f66624e7d151710483dd58e03eed672f064Robert Carr virtual sp<ISurfaceComposerClient> createScopedConnection(const sp<IGraphicBufferProducer>& gbp); 408dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis virtual sp<IBinder> createDisplay(const String8& displayName, bool secure); 4096c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall virtual void destroyDisplay(const sp<IBinder>& display); 410e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian virtual sp<IBinder> getBuiltInDisplay(int32_t id); 411921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian virtual void setTransactionState(const Vector<ComposerState>& state, 4128b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian const Vector<DisplayState>& displays, uint32_t flags); 41392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian virtual void bootFinished(); 414921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian virtual bool authenticateSurfaceTexture( 4152adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden const sp<IGraphicBufferProducer>& bufferProducer) const; 4166b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson virtual status_t getSupportedFrameTimestamps( 4176b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson std::vector<FrameEvent>* outSupported) const; 418b1e2f8deb38353e4bcc9d3ef06bc15bd5e417425Jorim Jaggi virtual sp<IDisplayEventConnection> createDisplayEventConnection( 419b1e2f8deb38353e4bcc9d3ef06bc15bd5e417425Jorim Jaggi ISurfaceComposer::VsyncSource vsyncSource = eVsyncSourceApp); 42040482ff650751819d4104c10a30974838168438cChavi Weingarten virtual status_t captureScreen(const sp<IBinder>& display, sp<GraphicBuffer>* outBuffer, 42140482ff650751819d4104c10a30974838168438cChavi Weingarten Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 42240482ff650751819d4104c10a30974838168438cChavi Weingarten int32_t minLayerZ, int32_t maxLayerZ, bool useIdentityTransform, 42340482ff650751819d4104c10a30974838168438cChavi Weingarten ISurfaceComposer::Rotation rotation); 42440482ff650751819d4104c10a30974838168438cChavi Weingarten virtual status_t captureLayers(const sp<IBinder>& parentHandle, sp<GraphicBuffer>* outBuffer, 425578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr const Rect& sourceCrop, float frameScale, bool childrenOnly); 42667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar virtual status_t getDisplayStats(const sp<IBinder>& display, 42767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar DisplayStatInfo* stats); 4287f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza virtual status_t getDisplayConfigs(const sp<IBinder>& display, 4297f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Vector<DisplayInfo>* configs); 4307f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza virtual int getActiveConfig(const sp<IBinder>& display); 43128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright virtual status_t getDisplayColorModes(const sp<IBinder>& display, 432fd997e0969100418b4df8b8d97d21d497afa76c3Peiyong Lin Vector<ui::ColorMode>* configs); 433fd997e0969100418b4df8b8d97d21d497afa76c3Peiyong Lin virtual ui::ColorMode getActiveColorMode(const sp<IBinder>& display); 434fd997e0969100418b4df8b8d97d21d497afa76c3Peiyong Lin virtual status_t setActiveColorMode(const sp<IBinder>& display, ui::ColorMode colorMode); 4352c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani virtual void setPowerMode(const sp<IBinder>& display, int mode); 4367f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza virtual status_t setActiveConfig(const sp<IBinder>& display, int id); 437d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav virtual status_t clearAnimationFrameStats(); 438d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav virtual status_t getAnimationFrameStats(FrameStats* outStats) const; 439c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza virtual status_t getHdrCapabilities(const sp<IBinder>& display, 440c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza HdrCapabilities* outCapabilities) const; 441c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju virtual status_t enableVSyncInjections(bool enable); 442c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju virtual status_t injectVSync(nsecs_t when); 443a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita virtual status_t getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers) const; 444c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 4451b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 446921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian /* ------------------------------------------------------------------------ 447921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian * DeathRecipient interface 448921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian */ 449921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian virtual void binderDied(const wp<IBinder>& who); 45099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 451921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian /* ------------------------------------------------------------------------ 4524f4f0943489d9113c66ac22b58cfba8c21dfa879Mathias Agopian * RefBase interface 453921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian */ 454921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian virtual void onFirstRef(); 455921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 456921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian /* ------------------------------------------------------------------------ 457b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas * HWC2::ComposerCallback / HWComposer::EventHandler interface 4588630320433bd15aca239522e54e711ef6372ab07Mathias Agopian */ 459b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas void onVsyncReceived(int32_t sequenceId, hwc2_display_t display, 460b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas int64_t timestamp) override; 461b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas void onHotplugReceived(int32_t sequenceId, hwc2_display_t display, 462715a2c13e6a010143761c1822ce7c4975921aa0bLloyd Pique HWC2::Connection connection) override; 463b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas void onRefreshReceived(int32_t sequenceId, hwc2_display_t display) override; 4648630320433bd15aca239522e54e711ef6372ab07Mathias Agopian 4658630320433bd15aca239522e54e711ef6372ab07Mathias Agopian /* ------------------------------------------------------------------------ 466921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian * Message handling 467921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian */ 468921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian void waitForEvent(); 4696d8110b1708171da278782d18886fa1a21971cd9Steven Thomas // Can only be called from the main thread or with mStateLock held 470921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian void signalTransaction(); 4716d8110b1708171da278782d18886fa1a21971cd9Steven Thomas // Can only be called from the main thread or with mStateLock held 472921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian void signalLayerUpdate(); 473921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian void signalRefresh(); 474921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 47513a082e160c2d1d8006b93a555a57035213d568bAndy McFadden // called on the main thread in response to initializeDisplays() 47613a082e160c2d1d8006b93a555a57035213d568bAndy McFadden void onInitializeDisplays(); 4776c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine // called on the main thread in response to setActiveConfig() 4786c9e34a98a63033b80bd1c24c7aa1304f912f10aMichael Lentine void setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode); 4792c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani // called on the main thread in response to setPowerMode() 480b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas void setPowerModeInternal(const sp<DisplayDevice>& hw, int mode, 481b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas bool stateLockHeld); 482921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 48328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright // Called on the main thread in response to setActiveColorMode() 484dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin void setActiveColorModeInternal(const sp<DisplayDevice>& hw, 485dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin ui::ColorMode colorMode, 486d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin ui::Dataspace dataSpace, 487d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin ui::RenderIntent renderIntent); 48828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 4896b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza // Returns whether the transaction actually modified any state 4906b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza bool handleMessageTransaction(); 4916b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 4926b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza // Returns whether a new buffer has been latched (see handlePageFlip()) 4936b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza bool handleMessageInvalidate(); 4946b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 495921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian void handleMessageRefresh(); 496921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 49787baae104a3e4c2059990b01c393476065c558b0Mathias Agopian void handleTransaction(uint32_t transactionFlags); 49887baae104a3e4c2059990b01c393476065c558b0Mathias Agopian void handleTransactionLocked(uint32_t transactionFlags); 499921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 50003414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews void updateCursorAsync(); 50103414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews 5026b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza /* handlePageFlip - latch a new buffer if available and compute the dirty 5036b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza * region. Returns whether a new buffer has been latched, i.e., whether it 5046b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza * is necessary to perform a refresh during this vsync. 505921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian */ 5066b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza bool handlePageFlip(); 507921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 508921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian /* ------------------------------------------------------------------------ 509921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian * Transactions 510921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian */ 511921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian uint32_t getTransactionFlags(uint32_t flags); 512c8251eb7a6ecfdd16b3e4cfbfb442aa4c789c039Fabien Sanglard uint32_t peekTransactionFlags(); 5136d8110b1708171da278782d18886fa1a21971cd9Steven Thomas // Can only be called from the main thread or with mStateLock held 514921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian uint32_t setTransactionFlags(uint32_t flags); 5152713c30843816d3511b39b85a2c268a2b7682047Dan Stoza uint32_t setTransactionFlags(uint32_t flags, VSyncModulator::TransactionStart transactionStart); 516921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian void commitTransaction(); 517ca27f2500cff74ae1e08b3ae06f18e9b3414ffb7chaviw bool containsAnyInvalidClientState(const Vector<ComposerState>& states); 518ca27f2500cff74ae1e08b3ae06f18e9b3414ffb7chaviw uint32_t setClientStateLocked(const ComposerState& composerState); 519e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian uint32_t setDisplayStateLocked(const DisplayState& s); 520ca27f2500cff74ae1e08b3ae06f18e9b3414ffb7chaviw void setDestroyStateLocked(const ComposerState& composerState); 521921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 522921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian /* ------------------------------------------------------------------------ 523921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian * Layer management 524921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian */ 5254d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian status_t createLayer(const String8& name, const sp<Client>& client, 5264d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian uint32_t w, uint32_t h, PixelFormat format, uint32_t flags, 527ccd348460ca25890a8fb709e82e6f780e3ce878erongliu int32_t windowType, int32_t ownerUid, sp<IBinder>* handle, 528479c60c85c40fd3536b0c88036e838dc1a4c56a0Albert Chaulk sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent); 5294d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 5300c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman status_t createBufferLayer(const sp<Client>& client, const String8& name, 5314d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format, 5324d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian sp<IBinder>* outHandle, sp<IGraphicBufferProducer>* outGbp, 5334d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian sp<Layer>* outLayer); 5344d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 53513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw status_t createColorLayer(const sp<Client>& client, const String8& name, 5364d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian uint32_t w, uint32_t h, uint32_t flags, sp<IBinder>* outHandle, 5370c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman sp<Layer>* outLayer); 538921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 539bc7552874052ee33f1b35b4474e20c003d216391Cody Northrop String8 getUniqueLayerName(const String8& name); 540bc7552874052ee33f1b35b4474e20c003d216391Cody Northrop 541921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // called in response to the window-manager calling 542921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // ISurfaceComposerClient::destroySurface() 543ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian status_t onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle); 544921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 545921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // called when all clients have released all their references to 546921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // this layer meaning it is entirely safe to destroy all 547921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // resources associated to this layer. 54813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian status_t onLayerDestroyed(const wp<Layer>& layer); 549921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 550921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // remove a layer from SurfaceFlinger immediately 551515dc9c538b8206b746eeb4906ac0b8aed1fb497Chia-I Wu status_t removeLayer(const sp<Layer>& layer, bool topLevelOnly = false); 552ca27f2500cff74ae1e08b3ae06f18e9b3414ffb7chaviw status_t removeLayerLocked(const Mutex&, const sp<Layer>& layer, bool topLevelOnly = false); 553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 554921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // add a layer to SurfaceFlinger 5557d89d06a6fe1bfadfe277f19dbb7e4aa021444e0Dan Stoza status_t addClientLayer(const sp<Client>& client, 5566710604286401d4205c27235a252dd0e5008cc08Mathias Agopian const sp<IBinder>& handle, 5576710604286401d4205c27235a252dd0e5008cc08Mathias Agopian const sp<IGraphicBufferProducer>& gbc, 5581f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const sp<Layer>& lbc, 5591f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr const sp<Layer>& parent); 560921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 561921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian /* ------------------------------------------------------------------------ 562921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian * Boot animation, on/off animations and screen capture 563921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian */ 564921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 565921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian void startBootAnim(); 566921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 567a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw void renderScreenImplLocked(const RenderArea& renderArea, TraverseLayersFunction traverseLayers, 568a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw bool yswap, bool useIdentityTransform); 569a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw status_t captureScreenCommon(RenderArea& renderArea, TraverseLayersFunction traverseLayers, 57040482ff650751819d4104c10a30974838168438cChavi Weingarten sp<GraphicBuffer>* outBuffer, 571a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw bool useIdentityTransform); 572a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw status_t captureScreenImplLocked(const RenderArea& renderArea, 573a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw TraverseLayersFunction traverseLayers, 574a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw ANativeWindowBuffer* buffer, bool useIdentityTransform, 57503480e23a6abd6c25aa3b689f736eb9c051eb8c3Robert Carr bool forSystem, int* outSyncFd); 576a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw void traverseLayersInDisplay(const sp<const DisplayDevice>& display, int32_t minLayerZ, 577a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw int32_t maxLayerZ, const LayerVector::Visitor& visitor); 578abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian 579f9b05eeb5f3b3ea92ea196f37a53df06b535690cWei Wang sp<StartPropertySetThread> mStartPropertySetThread = nullptr; 580b254fa3a9eccd5ad7d853d687cf50a68dd8ee41cWei Wang 581921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian /* ------------------------------------------------------------------------ 58211d63f4b7d99cc09ff1f8c320bb7a8648ca07fa1Romain Guy * Properties 58311d63f4b7d99cc09ff1f8c320bb7a8648ca07fa1Romain Guy */ 58411d63f4b7d99cc09ff1f8c320bb7a8648ca07fa1Romain Guy void readPersistentProperties(); 58511d63f4b7d99cc09ff1f8c320bb7a8648ca07fa1Romain Guy 58611d63f4b7d99cc09ff1f8c320bb7a8648ca07fa1Romain Guy /* ------------------------------------------------------------------------ 587921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian * EGL 588921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian */ 589875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t getMaxTextureSize() const; 590875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian size_t getMaxViewportDims() const; 591921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 592921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian /* ------------------------------------------------------------------------ 59387baae104a3e4c2059990b01c393476065c558b0Mathias Agopian * Display and layer stack management 594921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian */ 59513a082e160c2d1d8006b93a555a57035213d568bAndy McFadden // called when starting, or restarting after system_server death 59613a082e160c2d1d8006b93a555a57035213d568bAndy McFadden void initializeDisplays(); 59713a082e160c2d1d8006b93a555a57035213d568bAndy McFadden 5983ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian sp<const DisplayDevice> getDisplayDevice(const wp<IBinder>& dpy) const { 5997d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk Mutex::Autolock _l(mStateLock); 6007d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk return getDisplayDeviceLocked(dpy); 6017d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk } 6027d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk 6037d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk sp<DisplayDevice> getDisplayDevice(const wp<IBinder>& dpy) { 6047d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk Mutex::Autolock _l(mStateLock); 6057d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk return getDisplayDeviceLocked(dpy); 6067d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk } 6077d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk 6087d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk // NOTE: can only be called from the main thread or with mStateLock held 6097d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk sp<const DisplayDevice> getDisplayDeviceLocked(const wp<IBinder>& dpy) const { 61092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian return mDisplays.valueFor(dpy); 61192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian } 612db9b41fd157279d1b988a854e0d7c5b43c2fac38Mathias Agopian 613db9b41fd157279d1b988a854e0d7c5b43c2fac38Mathias Agopian // NOTE: can only be called from the main thread or with mStateLock held 6147d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk sp<DisplayDevice> getDisplayDeviceLocked(const wp<IBinder>& dpy) { 6154297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian return mDisplays.valueFor(dpy); 616921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian } 617921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 6187d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk sp<const DisplayDevice> getDefaultDisplayDeviceLocked() const { 6197d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk return getDisplayDeviceLocked(mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY]); 6207d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk } 6217d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk 62228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright int32_t getDisplayType(const sp<IBinder>& display) { 62328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (!display.get()) return NAME_NOT_FOUND; 62428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright for (int i = 0; i < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES; ++i) { 62528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (display == mBuiltinDisplays[i]) { 62628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return i; 62728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 62828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 62928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return NAME_NOT_FOUND; 63028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 63128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 63287baae104a3e4c2059990b01c393476065c558b0Mathias Agopian // mark a region of a layer stack dirty. this updates the dirty 63387baae104a3e4c2059990b01c393476065c558b0Mathias Agopian // region of all screens presenting this layer stack. 634ab0c319824632c463ea624cee6f0bc3c8cd8a779Chia-I Wu void invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty); 63587baae104a3e4c2059990b01c393476065c558b0Mathias Agopian 636921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian /* ------------------------------------------------------------------------ 6378630320433bd15aca239522e54e711ef6372ab07Mathias Agopian * H/W composer 6388630320433bd15aca239522e54e711ef6372ab07Mathias Agopian */ 6398630320433bd15aca239522e54e711ef6372ab07Mathias Agopian 640105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman HWComposer& getHwComposer() const { return *getBE().mHwc; } 6418630320433bd15aca239522e54e711ef6372ab07Mathias Agopian 642888c822c4cb6976aab9256c58bae9e17e3e55c5cMathias Agopian /* ------------------------------------------------------------------------ 643921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian * Compositing 644921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian */ 645921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian void invalidateHwcGeometry(); 646ab0c319824632c463ea624cee6f0bc3c8cd8a779Chia-I Wu void computeVisibleRegions(const sp<const DisplayDevice>& displayDevice, 64787baae104a3e4c2059990b01c393476065c558b0Mathias Agopian Region& dirtyRegion, Region& opaqueRegion); 648cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 649d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson void preComposition(nsecs_t refreshStartTime); 6500a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson void postComposition(nsecs_t refreshStartTime); 6510a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson void updateCompositorTiming( 6520a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime, 6530a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson std::shared_ptr<FenceTime>& presentFenceTime); 654d001058145c2186f454a3fb043388d6d9b84c9d8Brian Anderson void setCompositorTimingSnapped( 655d001058145c2186f454a3fb043388d6d9b84c9d8Brian Anderson nsecs_t vsyncPhase, nsecs_t vsyncInterval, 656d001058145c2186f454a3fb043388d6d9b84c9d8Brian Anderson nsecs_t compositeToPresentLatency); 657cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian void rebuildLayerStacks(); 6585d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 659d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin ui::Dataspace getBestDataspace(const sp<const DisplayDevice>& displayDevice, 660d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin ui::Dataspace* outHdrDataSpace) const; 661d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin 662d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin // Returns the appropriate ColorMode, Dataspace and RenderIntent for the 663d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin // DisplayDevice. The function only returns the supported ColorMode, 664d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin // Dataspace and RenderIntent. 665dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin void pickColorMode(const sp<DisplayDevice>& displayDevice, 666dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin ui::ColorMode* outMode, 667d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin ui::Dataspace* outDataSpace, 668d6fa4a70ba70393816176eda0b64e2b576ce6d6bPeiyong Lin ui::RenderIntent* outRenderIntent) const; 6690147a17adb08a155e1d6f72e6ca5e794fc7f5cc4Romain Guy 670cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian void setUpHWComposer(); 671cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian void doComposition(); 672cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian void doDebugFlashRegions(); 6731e1a1282846318caa0bfe271500eb3ba24e9a513Adrian Roos void doTracing(const char* where); 674068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang void logLayerStats(); 675830b84704b0f33030d0e391a0ea2e7faa5646e2eFabien Sanglard void doDisplayComposition(const sp<const DisplayDevice>& displayDevice, const Region& dirtyRegion); 6763f121fc650d72d0103cef8e6a651093fb1589e0aMichael Lentine 6773f121fc650d72d0103cef8e6a651093fb1589e0aMichael Lentine // compose surfaces for display hw. this fails if using GL and the surface 6783f121fc650d72d0103cef8e6a651093fb1589e0aMichael Lentine // has been destroyed and is no longer valid. 679b02087dbd6a25e9d077fde16039050da8012b413Chia-I Wu bool doComposeSurfaces(const sp<const DisplayDevice>& displayDevice); 680cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 681921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian void postFramebuffer(); 682830b84704b0f33030d0e391a0ea2e7faa5646e2eFabien Sanglard void drawWormhole(const sp<const DisplayDevice>& displayDevice, const Region& region) const; 683921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 684921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian /* ------------------------------------------------------------------------ 6850bceb84773882b796d9dacbaf96167cb15928d78Jamie Gennis * Display management 6860bceb84773882b796d9dacbaf96167cb15928d78Jamie Gennis */ 687715a2c13e6a010143761c1822ce7c4975921aa0bLloyd Pique DisplayDevice::DisplayType determineDisplayType(hwc2_display_t display, 688715a2c13e6a010143761c1822ce7c4975921aa0bLloyd Pique HWC2::Connection connection) const; 6890959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique sp<DisplayDevice> setupNewDisplayDeviceInternal(const wp<IBinder>& display, int hwcId, 6900959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique const DisplayDeviceState& state, 6910959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique const sp<DisplaySurface>& dispSurface, 6920959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique const sp<IGraphicBufferProducer>& producer); 693347200f079e004495aa46d6e1d5c1dec2632bbc6Lloyd Pique void processDisplayChangesLocked(); 694ba04e6237fb6ae1aede76b543028da101412b11dLloyd Pique void processDisplayHotplugEventsLocked(); 6953ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian 696faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis /* ------------------------------------------------------------------------ 697faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis * VSync 698faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis */ 6990a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson void enableHardwareVsync(); 7000a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson void resyncToHardwareVsync(bool makeAvailable); 7010a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson void disableHardwareVsync(bool makeUnavailable); 7021f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 7034a4e4a239f034cb8af2df9a438b26c3bc088889cTim Murraypublic: 7040a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson void resyncWithRateLimit(); 7050a61b0c813f5991bf462e36a2314dda062727a10Brian Anderson void getCompositorTiming(CompositorTiming* compositorTiming); 7064a4e4a239f034cb8af2df9a438b26c3bc088889cTim Murrayprivate: 7070bceb84773882b796d9dacbaf96167cb15928d78Jamie Gennis 7080bceb84773882b796d9dacbaf96167cb15928d78Jamie Gennis /* ------------------------------------------------------------------------ 709921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian * Debugging & dumpsys 710921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian */ 711357988777218502ed68a56a0c8b247ba64b74721Vishnu Nairpublic: 7126a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair status_t dumpCritical(int fd, const Vector<String16>& /*args*/, bool asProto) { 7136a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair return doDump(fd, Vector<String16>(), asProto); 7146a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair } 7156a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair 7166a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair status_t dumpAll(int fd, const Vector<String16>& args, bool asProto) { 7176a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair return doDump(fd, args, asProto); 718357988777218502ed68a56a0c8b247ba64b74721Vishnu Nair } 719357988777218502ed68a56a0c8b247ba64b74721Vishnu Nair 720357988777218502ed68a56a0c8b247ba64b74721Vishnu Nairprivate: 7213f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian void listLayersLocked(const Vector<String16>& args, size_t& index, String8& result) const; 7223f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian void dumpStatsLocked(const Vector<String16>& args, size_t& index, String8& result) const; 7233f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian void clearStatsLocked(const Vector<String16>& args, size_t& index, String8& result); 7243f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian void dumpAllLocked(const Vector<String16>& args, size_t& index, String8& result) const; 72563f165fd6b86d04be94d4023e845e98560504a96Keun young Park bool startDdmConnection(); 72663a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard void appendSfConfigString(String8& result) const; 727d555684cb36dfb959694db76962e570184f98838Mathias Agopian void checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr, 728a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw TraverseLayersFunction traverseLayers); 729921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 7306547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis void logFrameStats(); 7316547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 732b90cf07f8b3a8fe76e40b997924c2509d04575f4Dan Stoza void dumpStaticScreenStats(String8& result) const; 733d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson // Not const because each Layer needs to query Fences and cache timestamps. 734d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson void dumpFrameEventsLocked(String8& result); 735b90cf07f8b3a8fe76e40b997924c2509d04575f4Dan Stoza 736e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza void recordBufferingStats(const char* layerName, 737e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza std::vector<OccupancyTracker::Segment>&& history); 738e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza void dumpBufferingStats(String8& result) const; 739f3b2de10caa2a96e65f3e8ebecb2730ff28aeeb1Courtney Goeltzenleuchter void dumpWideColorInfo(String8& result) const; 7408e0af3679ec73e07775142825d592448b255f61cJorim Jaggi LayersProto dumpProtoInfo(LayerVector::StateSet stateSet) const; 741068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang LayersProto dumpVisibleLayersProtoInfo(int32_t hwcId) const; 742e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza 74363a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard bool isLayerTripleBufferingDisabled() const { 74463a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard return this->mLayerTripleBufferingDisabled; 74563a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard } 7466a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair status_t doDump(int fd, const Vector<String16>& args, bool asProto); 74787670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar 74887670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar /* ------------------------------------------------------------------------ 74987670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar * VrFlinger 75087670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar */ 751b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas void resetDisplayState(); 75287670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar 753050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas // Check to see if we should handoff to vr flinger. 754050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas void updateVrFlinger(); 75587670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar 75628f320b443106f1656f9720224f579136dcf0c61Chia-I Wu void updateColorMatrixLocked(); 75728f320b443106f1656f9720224f579136dcf0c61Chia-I Wu 758921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian /* ------------------------------------------------------------------------ 759921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian * Attributes 760921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian */ 761921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 762921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // access must be protected by mStateLock 763921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian mutable Mutex mStateLock; 764412903fce3a93f411c85c54375a1851bfb370400Dan Stoza State mCurrentState{LayerVector::StateSet::Current}; 765921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian volatile int32_t mTransactionFlags; 766921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian Condition mTransactionCV; 7672d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis bool mTransactionPending; 7682d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis bool mAnimTransactionPending; 7691f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr SortedVector< sp<Layer> > mLayersPendingRemoval; 770101d8dc00001bd282f09a25f10058c77f982c11cDan Stoza 77128f320b443106f1656f9720224f579136dcf0c61Chia-I Wu // global color transform states 77228f320b443106f1656f9720224f579136dcf0c61Chia-I Wu Daltonizer mDaltonizer; 77328f320b443106f1656f9720224f579136dcf0c61Chia-I Wu float mGlobalSaturationFactor = 1.0f; 77428f320b443106f1656f9720224f579136dcf0c61Chia-I Wu mat4 mClientColorMatrix; 77528f320b443106f1656f9720224f579136dcf0c61Chia-I Wu 776101d8dc00001bd282f09a25f10058c77f982c11cDan Stoza // Can't be unordered_set because wp<> isn't hashable 777101d8dc00001bd282f09a25f10058c77f982c11cDan Stoza std::set<wp<IBinder>> mGraphicBufferProducerList; 7780a0158c25c74de41770a9fa2f8d7da234a0daceeDan Stoza size_t mMaxGraphicBufferProducerListSize = MAX_LAYERS; 779921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 780921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // protected by mStateLock (but we could use another lock) 781921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian bool mLayersRemoved; 7821f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr bool mLayersAdded; 783921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 784921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // access must be protected by mInvalidateLock 78587baae104a3e4c2059990b01c393476065c558b0Mathias Agopian volatile int32_t mRepaintEverything; 786921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 78787670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar // constant members (no synchronization needed for access) 788921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian nsecs_t mBootTime; 789b4b1730abb7824dc084468c4942f010d94a7e039Mathias Agopian bool mGpuToCpuSupported; 790e83f93151800f4f7999f7e0c3b727de9267a5f5fLloyd Pique std::unique_ptr<EventThread> mEventThread; 791e83f93151800f4f7999f7e0c3b727de9267a5f5fLloyd Pique std::unique_ptr<EventThread> mSFEventThread; 792e83f93151800f4f7999f7e0c3b727de9267a5f5fLloyd Pique std::unique_ptr<EventThread> mInjectorEventThread; 793e83f93151800f4f7999f7e0c3b727de9267a5f5fLloyd Pique std::unique_ptr<VSyncSource> mEventThreadSource; 794e83f93151800f4f7999f7e0c3b727de9267a5f5fLloyd Pique std::unique_ptr<VSyncSource> mSfEventThreadSource; 795e83f93151800f4f7999f7e0c3b727de9267a5f5fLloyd Pique std::unique_ptr<InjectVSyncSource> mVSyncInjector; 796755e319d6a656dc92bd4f2b486d8f5a44b0e7350Lloyd Pique std::unique_ptr<EventControlThread> mEventControlThread; 7979e663de4fe1dcc872373ee530c60a375624671c3Jesse Hall sp<IBinder> mBuiltinDisplays[DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES]; 798921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 7992713c30843816d3511b39b85a2c268a2b7682047Dan Stoza VSyncModulator mVsyncModulator; 8002713c30843816d3511b39b85a2c268a2b7682047Dan Stoza 801921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // Can only accessed from the main thread, these members 802921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // don't need synchronization 803412903fce3a93f411c85c54375a1851bfb370400Dan Stoza State mDrawingState{LayerVector::StateSet::Drawing}; 804921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian bool mVisibleRegionsDirty; 8059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool mGeometryInvalid; 8064b0eba949cc026ffb2c75313042d8a7bcb3fcf86Jamie Gennis bool mAnimCompositionPending; 8079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza std::vector<sp<Layer>> mLayersWithQueuedFrames; 80805dacfb68af895fce3cc8ebb0b4aa06c6c336e26Dan Stoza sp<Fence> mPreviousPresentFence = Fence::NO_FENCE; 80905dacfb68af895fce3cc8ebb0b4aa06c6c336e26Dan Stoza bool mHadClientComposition = false; 810db9b41fd157279d1b988a854e0d7c5b43c2fac38Mathias Agopian 811ba04e6237fb6ae1aede76b543028da101412b11dLloyd Pique struct HotplugEvent { 812ba04e6237fb6ae1aede76b543028da101412b11dLloyd Pique hwc2_display_t display; 813ba04e6237fb6ae1aede76b543028da101412b11dLloyd Pique HWC2::Connection connection = HWC2::Connection::Invalid; 814ba04e6237fb6ae1aede76b543028da101412b11dLloyd Pique }; 815ba04e6237fb6ae1aede76b543028da101412b11dLloyd Pique // protected by mStateLock 816ba04e6237fb6ae1aede76b543028da101412b11dLloyd Pique std::vector<HotplugEvent> mPendingHotplugEvents; 817ba04e6237fb6ae1aede76b543028da101412b11dLloyd Pique 818db9b41fd157279d1b988a854e0d7c5b43c2fac38Mathias Agopian // this may only be written from the main thread with mStateLock held 819db9b41fd157279d1b988a854e0d7c5b43c2fac38Mathias Agopian // it may be read from other threads with mStateLock held 8203ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian DefaultKeyedVector< wp<IBinder>, sp<DisplayDevice> > mDisplays; 821921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 822921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // don't use a lock for these, we don't care 823921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian int mDebugRegion; 824921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian int mDebugDDMS; 825921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian int mDebugDisableHWC; 826921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian int mDebugDisableTransformHint; 827921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian volatile nsecs_t mDebugInSwapBuffers; 828921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian nsecs_t mLastSwapBufferTime; 829921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian volatile nsecs_t mDebugInTransaction; 830921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian nsecs_t mLastTransactionTime; 831921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian bool mBootFinished; 832ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza bool mForceFullDamage; 833c5da271eec001da9e11a2786f2618a45257439c3Dan Stoza bool mPropagateBackpressure = true; 8344d2348551e73b4990aedc83db17a336b533316e6Lloyd Pique std::unique_ptr<SurfaceInterceptor> mInterceptor = 8354d2348551e73b4990aedc83db17a336b533316e6Lloyd Pique std::make_unique<impl::SurfaceInterceptor>(this); 8361e1a1282846318caa0bfe271500eb3ba24e9a513Adrian Roos SurfaceTracing mTracing; 837068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang LayerStats mLayerStats; 8380102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang TimeStats& mTimeStats = TimeStats::getInstance(); 839642b23d70f7b513e88680c1d8400c1c1cfe6edd3Fabien Sanglard bool mUseHwcVirtualDisplays = false; 840921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 84163a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard // Restrict layers to use two buffers in their bufferqueues. 84263a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard bool mLayerTripleBufferingDisabled = false; 84363a5fcd2aa55c8eb0ccba621517a4215d8504df6Fabien Sanglard 844921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // these are thread safe 8459123ae5f9da83f1d0efd2260c5ecd84f66a11fb7Lloyd Pique mutable std::unique_ptr<MessageQueue> mEventQueue{std::make_unique<impl::MessageQueue>()}; 8464b0eba949cc026ffb2c75313042d8a7bcb3fcf86Jamie Gennis FrameTracker mAnimFrameTracker; 847faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis DispSync mPrimaryDispSync; 8487501ed66a05f530062925011d1342e8651216051Iris Chang int mPrimaryDisplayOrientation = DisplayState::eOrientationDefault; 849921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 850921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian // protected by mDestroyedLayerLock; 851921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian mutable Mutex mDestroyedLayerLock; 85213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian Vector<Layer const *> mDestroyedLayers; 853921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 854faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis // protected by mHWVsyncLock 855faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis Mutex mHWVsyncLock; 856faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis bool mPrimaryHWVsyncEnabled; 857948fe0ce74c13e1bbff233883c158519fa8fb293Jesse Hall bool mHWVsyncAvailable; 858faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis 8592b6d38e8eca1fe7137757b8269c6c19c6d1a04e4Dan Stoza std::atomic<bool> mRefreshPending{false}; 8602b6d38e8eca1fe7137757b8269c6c19c6d1a04e4Dan Stoza 861921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian /* ------------------------------------------------------------------------ 862921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian * Feature prototyping 863921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian */ 864921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 865c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju bool mInjectVSyncs; 866c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 867b90cf07f8b3a8fe76e40b997924c2509d04575f4Dan Stoza // Static screen stats 868b90cf07f8b3a8fe76e40b997924c2509d04575f4Dan Stoza bool mHasPoweredOff; 869e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza 8701f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr size_t mNumLayers; 8711f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 8726e8e98a23592c2522396b673145814a4bbee69dbFabien Sanglard // Verify that transaction is being called by an approved process: 8736e8e98a23592c2522396b673145814a4bbee69dbFabien Sanglard // either AID_GRAPHICS or AID_SYSTEM. 8746e8e98a23592c2522396b673145814a4bbee69dbFabien Sanglard status_t CheckTransactCodeCredentials(uint32_t code); 87587670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar 876b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas std::unique_ptr<dvr::VrFlinger> mVrFlinger; 877050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas std::atomic<bool> mVrFlingerRequestsDisplay; 878050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas static bool useVrFlinger; 879b02664ddc146893e6bbe7939ee2b948d54e7166aSteven Thomas std::thread::id mMainThreadId; 8800147a17adb08a155e1d6f72e6ca5e794fc7f5cc4Romain Guy 881dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin DisplayColorSetting mDisplayColorSetting = DisplayColorSetting::MANAGED; 882dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin // Applied on sRGB layers when the render intent is non-colorimetric. 883dd9b2ae8500d85a6aba82de15e8b40d14a921ca6Peiyong Lin mat4 mLegacySrgbSaturationMatrix; 884105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman 88512eb423785adba54be4c7112e5198a80d563896eLloyd Pique using CreateBufferQueueFunction = 88612eb423785adba54be4c7112e5198a80d563896eLloyd Pique std::function<void(sp<IGraphicBufferProducer>* /* outProducer */, 88712eb423785adba54be4c7112e5198a80d563896eLloyd Pique sp<IGraphicBufferConsumer>* /* outConsumer */, 88812eb423785adba54be4c7112e5198a80d563896eLloyd Pique bool /* consumerIsSurfaceFlinger */)>; 88912eb423785adba54be4c7112e5198a80d563896eLloyd Pique CreateBufferQueueFunction mCreateBufferQueue; 89012eb423785adba54be4c7112e5198a80d563896eLloyd Pique 8910959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique using CreateNativeWindowSurfaceFunction = 8920959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique std::function<std::unique_ptr<NativeWindowSurface>(const sp<IGraphicBufferProducer>&)>; 8930959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique CreateNativeWindowSurfaceFunction mCreateNativeWindowSurface; 8940959483fe3a2e4f70c91d4a0579ddbe03c9d3262Lloyd Pique 895105b7dcf6b2e3e4af368cabeec275008b7e73806David Sodman SurfaceFlingerBE mBE; 8960147a17adb08a155e1d6f72e6ca5e794fc7f5cc4Romain Guy}; 897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_SURFACE_FLINGER_H 900