| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) 2007 The Android Open Source Project | 
|  | 3 | * | 
|  | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | 5 | * you may not use this file except in compliance with the License. | 
|  | 6 | * You may obtain a copy of the License at | 
|  | 7 | * | 
|  | 8 | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | 9 | * | 
|  | 10 | * Unless required by applicable law or agreed to in writing, software | 
|  | 11 | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | 13 | * See the License for the specific language governing permissions and | 
|  | 14 | * limitations under the License. | 
|  | 15 | */ | 
|  | 16 |  | 
|  | 17 | #ifndef ANDROID_SURFACE_FLINGER_H | 
|  | 18 | #define ANDROID_SURFACE_FLINGER_H | 
|  | 19 |  | 
|  | 20 | #include <stdint.h> | 
|  | 21 | #include <sys/types.h> | 
|  | 22 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 23 | #include <EGL/egl.h> | 
| Mathias Agopian | 3f84483 | 2013-08-07 21:24:32 -0700 | [diff] [blame] | 24 |  | 
|  | 25 | /* | 
|  | 26 | * NOTE: Make sure this file doesn't include  anything from <gl/ > or <gl2/ > | 
|  | 27 | */ | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 28 |  | 
| Glenn Kasten | 99ed224 | 2011-12-15 09:51:17 -0800 | [diff] [blame] | 29 | #include <cutils/compiler.h> | 
|  | 30 |  | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 31 | #include <utils/Atomic.h> | 
|  | 32 | #include <utils/Errors.h> | 
| Mathias Agopian | 99b4984 | 2011-06-27 16:05:52 -0700 | [diff] [blame] | 33 | #include <utils/KeyedVector.h> | 
| Mathias Agopian | 076b1cc | 2009-04-10 14:24:30 -0700 | [diff] [blame] | 34 | #include <utils/RefBase.h> | 
| Mathias Agopian | 99b4984 | 2011-06-27 16:05:52 -0700 | [diff] [blame] | 35 | #include <utils/SortedVector.h> | 
|  | 36 | #include <utils/threads.h> | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 37 |  | 
| Mathias Agopian | 99b4984 | 2011-06-27 16:05:52 -0700 | [diff] [blame] | 38 | #include <binder/IMemory.h> | 
| Mathias Agopian | 375f563 | 2009-06-15 18:24:59 -0700 | [diff] [blame] | 39 |  | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 40 | #include <ui/PixelFormat.h> | 
| Alan Viverette | 9c5a333 | 2013-09-12 20:04:35 -0700 | [diff] [blame] | 41 | #include <ui/mat4.h> | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 42 |  | 
| Mathias Agopian | 90ac799 | 2012-02-25 18:48:35 -0800 | [diff] [blame] | 43 | #include <gui/ISurfaceComposer.h> | 
|  | 44 | #include <gui/ISurfaceComposerClient.h> | 
| Dan Stoza | e77c766 | 2016-05-13 11:37:28 -0700 | [diff] [blame] | 45 | #include <gui/OccupancyTracker.h> | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 46 |  | 
| Mathias Agopian | 8630320 | 2012-07-24 22:46:10 -0700 | [diff] [blame] | 47 | #include <hardware/hwcomposer_defs.h> | 
|  | 48 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 49 | #include <private/gui/LayerState.h> | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 50 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 51 | #include "Barrier.h" | 
| Mathias Agopian | 92a979a | 2012-08-02 18:32:23 -0700 | [diff] [blame] | 52 | #include "DisplayDevice.h" | 
| Jamie Gennis | faf77cc | 2013-07-30 15:10:32 -0700 | [diff] [blame] | 53 | #include "DispSync.h" | 
| Pablo Ceballos | 40845df | 2016-01-25 17:41:15 -0800 | [diff] [blame] | 54 | #include "FenceTracker.h" | 
| Jamie Gennis | 4b0eba9 | 2013-02-05 13:30:24 -0800 | [diff] [blame] | 55 | #include "FrameTracker.h" | 
|  | 56 | #include "MessageQueue.h" | 
| Mathias Agopian | f1d8e87 | 2009-04-20 19:39:12 -0700 | [diff] [blame] | 57 |  | 
| Mathias Agopian | 8630320 | 2012-07-24 22:46:10 -0700 | [diff] [blame] | 58 | #include "DisplayHardware/HWComposer.h" | 
| Mathias Agopian | ff2ed70 | 2013-09-01 21:36:12 -0700 | [diff] [blame] | 59 | #include "Effects/Daltonizer.h" | 
| Mathias Agopian | 8630320 | 2012-07-24 22:46:10 -0700 | [diff] [blame] | 60 |  | 
| Dan Stoza | e77c766 | 2016-05-13 11:37:28 -0700 | [diff] [blame] | 61 | #include <map> | 
|  | 62 | #include <string> | 
|  | 63 |  | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 64 | namespace android { | 
|  | 65 |  | 
|  | 66 | // --------------------------------------------------------------------------- | 
|  | 67 |  | 
|  | 68 | class Client; | 
| Mathias Agopian | d0566bc | 2011-11-17 17:49:17 -0800 | [diff] [blame] | 69 | class DisplayEventConnection; | 
|  | 70 | class EventThread; | 
| Mathias Agopian | f33e4b6 | 2012-09-20 16:54:14 -0700 | [diff] [blame] | 71 | class IGraphicBufferAlloc; | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 72 | class Layer; | 
| Mathias Agopian | b7e930d | 2010-06-01 15:12:58 -0700 | [diff] [blame] | 73 | class LayerDim; | 
| Mathias Agopian | e3c697f | 2013-02-14 17:11:02 -0800 | [diff] [blame] | 74 | class Surface; | 
| Mathias Agopian | 875d8e1 | 2013-06-07 15:35:48 -0700 | [diff] [blame] | 75 | class RenderEngine; | 
| Jamie Gennis | d170075 | 2013-10-14 12:22:52 -0700 | [diff] [blame] | 76 | class EventControlThread; | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 77 |  | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 78 | // --------------------------------------------------------------------------- | 
|  | 79 |  | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 80 | enum { | 
| Mathias Agopian | e57f292 | 2012-08-09 16:29:12 -0700 | [diff] [blame] | 81 | eTransactionNeeded        = 0x01, | 
|  | 82 | eTraversalNeeded          = 0x02, | 
|  | 83 | eDisplayTransactionNeeded = 0x04, | 
|  | 84 | eTransactionMask          = 0x07 | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 85 | }; | 
|  | 86 |  | 
| Mathias Agopian | 4f4f094 | 2013-08-19 17:26:18 -0700 | [diff] [blame] | 87 | class SurfaceFlinger : public BnSurfaceComposer, | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 88 | private IBinder::DeathRecipient, | 
| Mathias Agopian | 8630320 | 2012-07-24 22:46:10 -0700 | [diff] [blame] | 89 | private HWComposer::EventHandler | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 90 | { | 
|  | 91 | public: | 
| Mathias Agopian | b6df7d0 | 2013-05-09 14:53:35 -0700 | [diff] [blame] | 92 | static char const* getServiceName() ANDROID_API { | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 93 | return "SurfaceFlinger"; | 
|  | 94 | } | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 95 |  | 
| Mathias Agopian | b6df7d0 | 2013-05-09 14:53:35 -0700 | [diff] [blame] | 96 | SurfaceFlinger() ANDROID_API; | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 97 |  | 
| Mathias Agopian | 4f4f094 | 2013-08-19 17:26:18 -0700 | [diff] [blame] | 98 | // must be called before clients can connect | 
|  | 99 | void init() ANDROID_API; | 
|  | 100 |  | 
|  | 101 | // starts SurfaceFlinger main loop in the current thread | 
|  | 102 | void run() ANDROID_API; | 
|  | 103 |  | 
| Mathias Agopian | 8630320 | 2012-07-24 22:46:10 -0700 | [diff] [blame] | 104 | enum { | 
|  | 105 | EVENT_VSYNC = HWC_EVENT_VSYNC | 
|  | 106 | }; | 
|  | 107 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 108 | // post an asynchronous message to the main thread | 
| Mathias Agopian | 3f84483 | 2013-08-07 21:24:32 -0700 | [diff] [blame] | 109 | status_t postMessageAsync(const sp<MessageBase>& msg, nsecs_t reltime = 0, uint32_t flags = 0); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 110 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 111 | // post a synchronous message to the main thread | 
| Mathias Agopian | 3f84483 | 2013-08-07 21:24:32 -0700 | [diff] [blame] | 112 | status_t postMessageSync(const sp<MessageBase>& msg, nsecs_t reltime = 0, uint32_t flags = 0); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 113 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 114 | // force full composition on all displays | 
|  | 115 | void repaintEverything(); | 
| Mathias Agopian | bf2c6a6 | 2010-12-10 16:22:31 -0800 | [diff] [blame] | 116 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 117 | // returns the default Display | 
| Mathias Agopian | 4297734 | 2012-08-05 00:40:46 -0700 | [diff] [blame] | 118 | sp<const DisplayDevice> getDefaultDisplayDevice() const { | 
| Jesse Hall | 692c723 | 2012-11-08 15:41:56 -0800 | [diff] [blame] | 119 | return getDisplayDevice(mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY]); | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 120 | } | 
| Mathias Agopian | b60314a | 2012-04-10 22:09:54 -0700 | [diff] [blame] | 121 |  | 
| Mathias Agopian | 8630320 | 2012-07-24 22:46:10 -0700 | [diff] [blame] | 122 | // utility function to delete a texture on the main thread | 
| Mathias Agopian | 3f84483 | 2013-08-07 21:24:32 -0700 | [diff] [blame] | 123 | void deleteTextureAsync(uint32_t texture); | 
| Mathias Agopian | 8630320 | 2012-07-24 22:46:10 -0700 | [diff] [blame] | 124 |  | 
| Mathias Agopian | 8630320 | 2012-07-24 22:46:10 -0700 | [diff] [blame] | 125 | // enable/disable h/w composer event | 
|  | 126 | // TODO: this should be made accessible only to EventThread | 
| Dan Stoza | 9e56aa0 | 2015-11-02 13:00:03 -0800 | [diff] [blame] | 127 | #ifdef USE_HWC2 | 
|  | 128 | void setVsyncEnabled(int disp, int enabled); | 
|  | 129 | #else | 
| Mathias Agopian | 81cd5d3 | 2012-10-04 02:34:38 -0700 | [diff] [blame] | 130 | void eventControl(int disp, int event, int enabled); | 
| Dan Stoza | 9e56aa0 | 2015-11-02 13:00:03 -0800 | [diff] [blame] | 131 | #endif | 
| Mathias Agopian | 8630320 | 2012-07-24 22:46:10 -0700 | [diff] [blame] | 132 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 133 | // called on the main thread by MessageQueue when an internal message | 
|  | 134 | // is received | 
|  | 135 | // TODO: this should be made accessible only to MessageQueue | 
|  | 136 | void onMessageReceived(int32_t what); | 
| Mathias Agopian | 3094df3 | 2012-06-18 18:06:45 -0700 | [diff] [blame] | 137 |  | 
| Mathias Agopian | cb55857 | 2012-10-04 15:58:54 -0700 | [diff] [blame] | 138 | // for debugging only | 
|  | 139 | // TODO: this should be made accessible only to HWComposer | 
| Jesse Hall | 48bc05b | 2013-03-21 14:06:52 -0700 | [diff] [blame] | 140 | const Vector< sp<Layer> >& getLayerSortedByZForHwcDisplay(int id); | 
| Mathias Agopian | cb55857 | 2012-10-04 15:58:54 -0700 | [diff] [blame] | 141 |  | 
| Mathias Agopian | 875d8e1 | 2013-06-07 15:35:48 -0700 | [diff] [blame] | 142 | RenderEngine& getRenderEngine() const { | 
|  | 143 | return *mRenderEngine; | 
| Jesse Hall | 29c3f35 | 2013-05-21 15:36:55 -0700 | [diff] [blame] | 144 | } | 
|  | 145 |  | 
| Mathias Agopian | 1f339ff | 2011-07-01 17:08:43 -0700 | [diff] [blame] | 146 | private: | 
| Mathias Agopian | 96f0819 | 2010-06-02 23:28:45 -0700 | [diff] [blame] | 147 | friend class Client; | 
| Mathias Agopian | d0566bc | 2011-11-17 17:49:17 -0800 | [diff] [blame] | 148 | friend class DisplayEventConnection; | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 149 | friend class Layer; | 
| Dan Stoza | b9b0883 | 2014-03-13 11:55:57 -0700 | [diff] [blame] | 150 | friend class MonitoredProducer; | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 151 |  | 
| Jamie Gennis | 6547ff4 | 2013-07-16 20:12:42 -0700 | [diff] [blame] | 152 | // This value is specified in number of frames.  Log frame stats at most | 
|  | 153 | // every half hour. | 
|  | 154 | enum { LOG_FRAME_STATS_PERIOD =  30*60*60 }; | 
|  | 155 |  | 
| Dan Stoza | 7d89d06 | 2015-04-30 13:29:25 -0700 | [diff] [blame] | 156 | static const size_t MAX_LAYERS = 4096; | 
|  | 157 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 158 | // We're reference counted, never destroy SurfaceFlinger directly | 
|  | 159 | virtual ~SurfaceFlinger(); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 160 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 161 | /* ------------------------------------------------------------------------ | 
|  | 162 | * Internal data structures | 
|  | 163 | */ | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 164 |  | 
| Mathias Agopian | 13127d8 | 2013-03-05 17:47:11 -0800 | [diff] [blame] | 165 | class LayerVector : public SortedVector< sp<Layer> > { | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 166 | public: | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 167 | LayerVector(); | 
|  | 168 | LayerVector(const LayerVector& rhs); | 
|  | 169 | virtual int do_compare(const void* lhs, const void* rhs) const; | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 170 | }; | 
|  | 171 |  | 
| Mathias Agopian | 92a979a | 2012-08-02 18:32:23 -0700 | [diff] [blame] | 172 | struct DisplayDeviceState { | 
|  | 173 | DisplayDeviceState(); | 
| Pablo Ceballos | 53390e1 | 2015-08-04 11:25:59 -0700 | [diff] [blame] | 174 | DisplayDeviceState(DisplayDevice::DisplayType type, bool isSecure); | 
| Mathias Agopian | 3ee454a | 2012-08-27 16:28:24 -0700 | [diff] [blame] | 175 | bool isValid() const { return type >= 0; } | 
|  | 176 | bool isMainDisplay() const { return type == DisplayDevice::DISPLAY_PRIMARY; } | 
| Mathias Agopian | cde87a3 | 2012-09-13 14:09:01 -0700 | [diff] [blame] | 177 | bool isVirtualDisplay() const { return type >= DisplayDevice::DISPLAY_VIRTUAL; } | 
| Mathias Agopian | 3ee454a | 2012-08-27 16:28:24 -0700 | [diff] [blame] | 178 | DisplayDevice::DisplayType type; | 
| Andy McFadden | 2adaf04 | 2012-12-18 09:49:45 -0800 | [diff] [blame] | 179 | sp<IGraphicBufferProducer> surface; | 
| Mathias Agopian | 92a979a | 2012-08-02 18:32:23 -0700 | [diff] [blame] | 180 | uint32_t layerStack; | 
|  | 181 | Rect viewport; | 
|  | 182 | Rect frame; | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 183 | uint8_t orientation; | 
| Michael Wright | 1f6078a | 2014-06-26 16:01:02 -0700 | [diff] [blame] | 184 | uint32_t width, height; | 
| Andy McFadden | 8dfa92f | 2012-09-17 18:27:17 -0700 | [diff] [blame] | 185 | String8 displayName; | 
| Jamie Gennis | dd3cb84 | 2012-10-19 18:19:11 -0700 | [diff] [blame] | 186 | bool isSecure; | 
| Mathias Agopian | 92a979a | 2012-08-02 18:32:23 -0700 | [diff] [blame] | 187 | }; | 
|  | 188 |  | 
|  | 189 | struct State { | 
|  | 190 | LayerVector layersSortedByZ; | 
| Mathias Agopian | e57f292 | 2012-08-09 16:29:12 -0700 | [diff] [blame] | 191 | DefaultKeyedVector< wp<IBinder>, DisplayDeviceState> displays; | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 192 | }; | 
|  | 193 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 194 | /* ------------------------------------------------------------------------ | 
|  | 195 | * IBinder interface | 
|  | 196 | */ | 
|  | 197 | virtual status_t onTransact(uint32_t code, const Parcel& data, | 
|  | 198 | Parcel* reply, uint32_t flags); | 
|  | 199 | virtual status_t dump(int fd, const Vector<String16>& args); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 200 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 201 | /* ------------------------------------------------------------------------ | 
|  | 202 | * ISurfaceComposer interface | 
|  | 203 | */ | 
|  | 204 | virtual sp<ISurfaceComposerClient> createConnection(); | 
|  | 205 | virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc(); | 
| Jamie Gennis | dd3cb84 | 2012-10-19 18:19:11 -0700 | [diff] [blame] | 206 | virtual sp<IBinder> createDisplay(const String8& displayName, bool secure); | 
| Jesse Hall | 6c913be | 2013-08-08 12:15:49 -0700 | [diff] [blame] | 207 | virtual void destroyDisplay(const sp<IBinder>& display); | 
| Mathias Agopian | e57f292 | 2012-08-09 16:29:12 -0700 | [diff] [blame] | 208 | virtual sp<IBinder> getBuiltInDisplay(int32_t id); | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 209 | virtual void setTransactionState(const Vector<ComposerState>& state, | 
| Mathias Agopian | 8b33f03 | 2012-07-24 20:43:54 -0700 | [diff] [blame] | 210 | const Vector<DisplayState>& displays, uint32_t flags); | 
| Mathias Agopian | 92a979a | 2012-08-02 18:32:23 -0700 | [diff] [blame] | 211 | virtual void bootFinished(); | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 212 | virtual bool authenticateSurfaceTexture( | 
| Andy McFadden | 2adaf04 | 2012-12-18 09:49:45 -0800 | [diff] [blame] | 213 | const sp<IGraphicBufferProducer>& bufferProducer) const; | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 214 | virtual sp<IDisplayEventConnection> createDisplayEventConnection(); | 
| Mathias Agopian | 2a9fc49 | 2013-03-01 13:42:57 -0800 | [diff] [blame] | 215 | virtual status_t captureScreen(const sp<IBinder>& display, | 
|  | 216 | const sp<IGraphicBufferProducer>& producer, | 
| Dan Stoza | c187900 | 2014-05-22 15:59:05 -0700 | [diff] [blame] | 217 | Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, | 
| Dan Stoza | c701401 | 2014-02-14 15:03:43 -0800 | [diff] [blame] | 218 | uint32_t minLayerZ, uint32_t maxLayerZ, | 
| Riley Andrews | c3ebe66 | 2014-09-04 16:20:31 -0700 | [diff] [blame] | 219 | bool useIdentityTransform, ISurfaceComposer::Rotation rotation); | 
| Lajos Molnar | 67d8bd6 | 2014-09-11 14:58:45 -0700 | [diff] [blame] | 220 | virtual status_t getDisplayStats(const sp<IBinder>& display, | 
|  | 221 | DisplayStatInfo* stats); | 
| Dan Stoza | 7f7da32 | 2014-05-02 15:26:25 -0700 | [diff] [blame] | 222 | virtual status_t getDisplayConfigs(const sp<IBinder>& display, | 
|  | 223 | Vector<DisplayInfo>* configs); | 
|  | 224 | virtual int getActiveConfig(const sp<IBinder>& display); | 
| Prashant Malani | 2c9b11f | 2014-05-25 01:36:31 -0700 | [diff] [blame] | 225 | virtual void setPowerMode(const sp<IBinder>& display, int mode); | 
| Dan Stoza | 7f7da32 | 2014-05-02 15:26:25 -0700 | [diff] [blame] | 226 | virtual status_t setActiveConfig(const sp<IBinder>& display, int id); | 
| Svetoslav | d85084b | 2014-03-20 10:28:31 -0700 | [diff] [blame] | 227 | virtual status_t clearAnimationFrameStats(); | 
|  | 228 | virtual status_t getAnimationFrameStats(FrameStats* outStats) const; | 
| Dan Stoza | c4f471e | 2016-03-24 09:31:08 -0700 | [diff] [blame] | 229 | virtual status_t getHdrCapabilities(const sp<IBinder>& display, | 
|  | 230 | HdrCapabilities* outCapabilities) const; | 
| Mathias Agopian | 1b03149 | 2012-06-20 17:51:20 -0700 | [diff] [blame] | 231 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 232 | /* ------------------------------------------------------------------------ | 
|  | 233 | * DeathRecipient interface | 
|  | 234 | */ | 
|  | 235 | virtual void binderDied(const wp<IBinder>& who); | 
| Mathias Agopian | 99ce5cd | 2012-01-31 18:24:27 -0800 | [diff] [blame] | 236 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 237 | /* ------------------------------------------------------------------------ | 
| Mathias Agopian | 4f4f094 | 2013-08-19 17:26:18 -0700 | [diff] [blame] | 238 | * RefBase interface | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 239 | */ | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 240 | virtual void onFirstRef(); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 241 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 242 | /* ------------------------------------------------------------------------ | 
| Mathias Agopian | 8630320 | 2012-07-24 22:46:10 -0700 | [diff] [blame] | 243 | * HWComposer::EventHandler interface | 
|  | 244 | */ | 
| Mathias Agopian | 3ee454a | 2012-08-27 16:28:24 -0700 | [diff] [blame] | 245 | virtual void onVSyncReceived(int type, nsecs_t timestamp); | 
| Mathias Agopian | 148994e | 2012-09-19 17:31:36 -0700 | [diff] [blame] | 246 | virtual void onHotplugReceived(int disp, bool connected); | 
| Mathias Agopian | 8630320 | 2012-07-24 22:46:10 -0700 | [diff] [blame] | 247 |  | 
|  | 248 | /* ------------------------------------------------------------------------ | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 249 | * Message handling | 
|  | 250 | */ | 
|  | 251 | void waitForEvent(); | 
|  | 252 | void signalTransaction(); | 
|  | 253 | void signalLayerUpdate(); | 
|  | 254 | void signalRefresh(); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 255 |  | 
| Andy McFadden | 13a082e | 2012-08-24 10:16:42 -0700 | [diff] [blame] | 256 | // called on the main thread in response to initializeDisplays() | 
|  | 257 | void onInitializeDisplays(); | 
| Michael Lentine | 6c9e34a | 2014-07-14 13:48:55 -0700 | [diff] [blame] | 258 | // called on the main thread in response to setActiveConfig() | 
|  | 259 | void setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode); | 
| Prashant Malani | 2c9b11f | 2014-05-25 01:36:31 -0700 | [diff] [blame] | 260 | // called on the main thread in response to setPowerMode() | 
|  | 261 | void setPowerModeInternal(const sp<DisplayDevice>& hw, int mode); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 262 |  | 
| Dan Stoza | 6b9454d | 2014-11-07 16:00:59 -0800 | [diff] [blame] | 263 | // Returns whether the transaction actually modified any state | 
|  | 264 | bool handleMessageTransaction(); | 
|  | 265 |  | 
|  | 266 | // Returns whether a new buffer has been latched (see handlePageFlip()) | 
|  | 267 | bool handleMessageInvalidate(); | 
|  | 268 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 269 | void handleMessageRefresh(); | 
| Mathias Agopian | 4fec873 | 2012-06-29 14:12:52 -0700 | [diff] [blame] | 270 |  | 
| Mathias Agopian | 87baae1 | 2012-07-31 12:38:26 -0700 | [diff] [blame] | 271 | void handleTransaction(uint32_t transactionFlags); | 
|  | 272 | void handleTransactionLocked(uint32_t transactionFlags); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 273 |  | 
| Riley Andrews | 03414a1 | 2014-07-01 14:22:59 -0700 | [diff] [blame] | 274 | void updateCursorAsync(); | 
|  | 275 |  | 
| Dan Stoza | 6b9454d | 2014-11-07 16:00:59 -0800 | [diff] [blame] | 276 | /* handlePageFlip - latch a new buffer if available and compute the dirty | 
|  | 277 | * region. Returns whether a new buffer has been latched, i.e., whether it | 
|  | 278 | * is necessary to perform a refresh during this vsync. | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 279 | */ | 
| Dan Stoza | 6b9454d | 2014-11-07 16:00:59 -0800 | [diff] [blame] | 280 | bool handlePageFlip(); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 281 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 282 | /* ------------------------------------------------------------------------ | 
|  | 283 | * Transactions | 
|  | 284 | */ | 
|  | 285 | uint32_t getTransactionFlags(uint32_t flags); | 
|  | 286 | uint32_t peekTransactionFlags(uint32_t flags); | 
|  | 287 | uint32_t setTransactionFlags(uint32_t flags); | 
|  | 288 | void commitTransaction(); | 
| Mathias Agopian | 3f84483 | 2013-08-07 21:24:32 -0700 | [diff] [blame] | 289 | uint32_t setClientStateLocked(const sp<Client>& client, const layer_state_t& s); | 
| Mathias Agopian | e57f292 | 2012-08-09 16:29:12 -0700 | [diff] [blame] | 290 | uint32_t setDisplayStateLocked(const DisplayState& s); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 291 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 292 | /* ------------------------------------------------------------------------ | 
|  | 293 | * Layer management | 
|  | 294 | */ | 
| Mathias Agopian | 4d9b822 | 2013-03-12 17:11:48 -0700 | [diff] [blame] | 295 | status_t createLayer(const String8& name, const sp<Client>& client, | 
|  | 296 | uint32_t w, uint32_t h, PixelFormat format, uint32_t flags, | 
|  | 297 | sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 298 |  | 
| Mathias Agopian | 4d9b822 | 2013-03-12 17:11:48 -0700 | [diff] [blame] | 299 | status_t createNormalLayer(const sp<Client>& client, const String8& name, | 
|  | 300 | uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format, | 
|  | 301 | sp<IBinder>* outHandle, sp<IGraphicBufferProducer>* outGbp, | 
|  | 302 | sp<Layer>* outLayer); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 303 |  | 
| Mathias Agopian | 4d9b822 | 2013-03-12 17:11:48 -0700 | [diff] [blame] | 304 | status_t createDimLayer(const sp<Client>& client, const String8& name, | 
|  | 305 | uint32_t w, uint32_t h, uint32_t flags, sp<IBinder>* outHandle, | 
|  | 306 | sp<IGraphicBufferProducer>* outGbp, sp<Layer>* outLayer); | 
| Mathias Agopian | 74c40c0 | 2010-09-29 13:02:36 -0700 | [diff] [blame] | 307 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 308 | // called in response to the window-manager calling | 
|  | 309 | // ISurfaceComposerClient::destroySurface() | 
| Mathias Agopian | ac9fa42 | 2013-02-11 16:40:36 -0800 | [diff] [blame] | 310 | status_t onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle); | 
| Mathias Agopian | b9494d5 | 2012-04-18 02:28:45 -0700 | [diff] [blame] | 311 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 312 | // called when all clients have released all their references to | 
|  | 313 | // this layer meaning it is entirely safe to destroy all | 
|  | 314 | // resources associated to this layer. | 
| Mathias Agopian | 13127d8 | 2013-03-05 17:47:11 -0800 | [diff] [blame] | 315 | status_t onLayerDestroyed(const wp<Layer>& layer); | 
| Mathias Agopian | a491260 | 2012-07-12 14:25:33 -0700 | [diff] [blame] | 316 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 317 | // remove a layer from SurfaceFlinger immediately | 
| Mathias Agopian | 13127d8 | 2013-03-05 17:47:11 -0800 | [diff] [blame] | 318 | status_t removeLayer(const sp<Layer>& layer); | 
| Mathias Agopian | a491260 | 2012-07-12 14:25:33 -0700 | [diff] [blame] | 319 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 320 | // add a layer to SurfaceFlinger | 
| Dan Stoza | 7d89d06 | 2015-04-30 13:29:25 -0700 | [diff] [blame] | 321 | status_t addClientLayer(const sp<Client>& client, | 
| Mathias Agopian | 6710604 | 2013-03-14 19:18:13 -0700 | [diff] [blame] | 322 | const sp<IBinder>& handle, | 
|  | 323 | const sp<IGraphicBufferProducer>& gbc, | 
|  | 324 | const sp<Layer>& lbc); | 
| Mathias Agopian | f1d8e87 | 2009-04-20 19:39:12 -0700 | [diff] [blame] | 325 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 326 | /* ------------------------------------------------------------------------ | 
|  | 327 | * Boot animation, on/off animations and screen capture | 
|  | 328 | */ | 
| Mathias Agopian | bb64124 | 2010-05-18 17:06:55 -0700 | [diff] [blame] | 329 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 330 | void startBootAnim(); | 
| Mathias Agopian | 96f0819 | 2010-06-02 23:28:45 -0700 | [diff] [blame] | 331 |  | 
| Mathias Agopian | 180f10d | 2013-04-10 22:55:41 -0700 | [diff] [blame] | 332 | void renderScreenImplLocked( | 
|  | 333 | const sp<const DisplayDevice>& hw, | 
| Dan Stoza | c187900 | 2014-05-22 15:59:05 -0700 | [diff] [blame] | 334 | Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, | 
| Mathias Agopian | 180f10d | 2013-04-10 22:55:41 -0700 | [diff] [blame] | 335 | uint32_t minLayerZ, uint32_t maxLayerZ, | 
| Riley Andrews | c3ebe66 | 2014-09-04 16:20:31 -0700 | [diff] [blame] | 336 | bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation); | 
| Mathias Agopian | 180f10d | 2013-04-10 22:55:41 -0700 | [diff] [blame] | 337 |  | 
| Mathias Agopian | 2a9fc49 | 2013-03-01 13:42:57 -0800 | [diff] [blame] | 338 | status_t captureScreenImplLocked( | 
|  | 339 | const sp<const DisplayDevice>& hw, | 
| Mathias Agopian | abe815d | 2013-03-19 22:22:21 -0700 | [diff] [blame] | 340 | const sp<IGraphicBufferProducer>& producer, | 
| Dan Stoza | c187900 | 2014-05-22 15:59:05 -0700 | [diff] [blame] | 341 | Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, | 
| Dan Stoza | c701401 | 2014-02-14 15:03:43 -0800 | [diff] [blame] | 342 | uint32_t minLayerZ, uint32_t maxLayerZ, | 
| Pablo Ceballos | b5b3563 | 2016-02-23 11:18:51 -0800 | [diff] [blame] | 343 | bool useIdentityTransform, Transform::orientation_flags rotation, | 
|  | 344 | bool isLocalScreenshot); | 
| Mathias Agopian | abe815d | 2013-03-19 22:22:21 -0700 | [diff] [blame] | 345 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 346 | /* ------------------------------------------------------------------------ | 
|  | 347 | * EGL | 
|  | 348 | */ | 
| Mathias Agopian | 875d8e1 | 2013-06-07 15:35:48 -0700 | [diff] [blame] | 349 | size_t getMaxTextureSize() const; | 
|  | 350 | size_t getMaxViewportDims() const; | 
| Mathias Agopian | a491260 | 2012-07-12 14:25:33 -0700 | [diff] [blame] | 351 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 352 | /* ------------------------------------------------------------------------ | 
| Mathias Agopian | 87baae1 | 2012-07-31 12:38:26 -0700 | [diff] [blame] | 353 | * Display and layer stack management | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 354 | */ | 
| Andy McFadden | 13a082e | 2012-08-24 10:16:42 -0700 | [diff] [blame] | 355 | // called when starting, or restarting after system_server death | 
|  | 356 | void initializeDisplays(); | 
|  | 357 |  | 
| Jesse Hall | 692c723 | 2012-11-08 15:41:56 -0800 | [diff] [blame] | 358 | // Create an IBinder for a builtin display and add it to current state | 
|  | 359 | void createBuiltinDisplayLocked(DisplayDevice::DisplayType type); | 
|  | 360 |  | 
| Mathias Agopian | db9b41f | 2012-10-15 16:51:41 -0700 | [diff] [blame] | 361 | // NOTE: can only be called from the main thread or with mStateLock held | 
| Mathias Agopian | 3ee454a | 2012-08-27 16:28:24 -0700 | [diff] [blame] | 362 | sp<const DisplayDevice> getDisplayDevice(const wp<IBinder>& dpy) const { | 
| Mathias Agopian | 92a979a | 2012-08-02 18:32:23 -0700 | [diff] [blame] | 363 | return mDisplays.valueFor(dpy); | 
|  | 364 | } | 
| Mathias Agopian | db9b41f | 2012-10-15 16:51:41 -0700 | [diff] [blame] | 365 |  | 
|  | 366 | // NOTE: can only be called from the main thread or with mStateLock held | 
|  | 367 | sp<DisplayDevice> getDisplayDevice(const wp<IBinder>& dpy) { | 
| Mathias Agopian | 4297734 | 2012-08-05 00:40:46 -0700 | [diff] [blame] | 368 | return mDisplays.valueFor(dpy); | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 369 | } | 
| Mathias Agopian | 99b4984 | 2011-06-27 16:05:52 -0700 | [diff] [blame] | 370 |  | 
| Mathias Agopian | 87baae1 | 2012-07-31 12:38:26 -0700 | [diff] [blame] | 371 | // mark a region of a layer stack dirty. this updates the dirty | 
|  | 372 | // region of all screens presenting this layer stack. | 
|  | 373 | void invalidateLayerStack(uint32_t layerStack, const Region& dirty); | 
|  | 374 |  | 
| Dan Stoza | 9e56aa0 | 2015-11-02 13:00:03 -0800 | [diff] [blame] | 375 | #ifndef USE_HWC2 | 
| Jesse Hall | 02d8656 | 2013-03-25 14:43:23 -0700 | [diff] [blame] | 376 | int32_t allocateHwcDisplayId(DisplayDevice::DisplayType type); | 
| Dan Stoza | 9e56aa0 | 2015-11-02 13:00:03 -0800 | [diff] [blame] | 377 | #endif | 
| Jesse Hall | 02d8656 | 2013-03-25 14:43:23 -0700 | [diff] [blame] | 378 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 379 | /* ------------------------------------------------------------------------ | 
| Mathias Agopian | 8630320 | 2012-07-24 22:46:10 -0700 | [diff] [blame] | 380 | * H/W composer | 
|  | 381 | */ | 
|  | 382 |  | 
|  | 383 | HWComposer& getHwComposer() const { return *mHwc; } | 
|  | 384 |  | 
| Mathias Agopian | 888c822 | 2012-08-04 21:10:38 -0700 | [diff] [blame] | 385 | /* ------------------------------------------------------------------------ | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 386 | * Compositing | 
|  | 387 | */ | 
|  | 388 | void invalidateHwcGeometry(); | 
| Mathias Agopian | ce3a0a5 | 2012-09-12 15:34:57 -0700 | [diff] [blame] | 389 | static void computeVisibleRegions( | 
|  | 390 | const LayerVector& currentLayers, uint32_t layerStack, | 
| Mathias Agopian | 87baae1 | 2012-07-31 12:38:26 -0700 | [diff] [blame] | 391 | Region& dirtyRegion, Region& opaqueRegion); | 
| Mathias Agopian | cd60f99 | 2012-08-16 16:28:27 -0700 | [diff] [blame] | 392 |  | 
|  | 393 | void preComposition(); | 
| Pablo Ceballos | 40845df | 2016-01-25 17:41:15 -0800 | [diff] [blame] | 394 | void postComposition(nsecs_t refreshStartTime); | 
| Mathias Agopian | cd60f99 | 2012-08-16 16:28:27 -0700 | [diff] [blame] | 395 | void rebuildLayerStacks(); | 
|  | 396 | void setUpHWComposer(); | 
|  | 397 | void doComposition(); | 
|  | 398 | void doDebugFlashRegions(); | 
| Mathias Agopian | 3f84483 | 2013-08-07 21:24:32 -0700 | [diff] [blame] | 399 | void doDisplayComposition(const sp<const DisplayDevice>& hw, const Region& dirtyRegion); | 
| Michael Lentine | 3f121fc | 2014-10-01 11:17:28 -0700 | [diff] [blame] | 400 |  | 
|  | 401 | // compose surfaces for display hw. this fails if using GL and the surface | 
|  | 402 | // has been destroyed and is no longer valid. | 
|  | 403 | bool doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty); | 
| Mathias Agopian | cd60f99 | 2012-08-16 16:28:27 -0700 | [diff] [blame] | 404 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 405 | void postFramebuffer(); | 
| Mathias Agopian | 3f84483 | 2013-08-07 21:24:32 -0700 | [diff] [blame] | 406 | void drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const; | 
| Mathias Agopian | 4da7519 | 2010-08-10 17:19:56 -0700 | [diff] [blame] | 407 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 408 | /* ------------------------------------------------------------------------ | 
| Jamie Gennis | 0bceb84 | 2012-08-23 20:19:38 -0700 | [diff] [blame] | 409 | * Display management | 
|  | 410 | */ | 
| Mathias Agopian | 3ee454a | 2012-08-27 16:28:24 -0700 | [diff] [blame] | 411 |  | 
| Jamie Gennis | faf77cc | 2013-07-30 15:10:32 -0700 | [diff] [blame] | 412 | /* ------------------------------------------------------------------------ | 
|  | 413 | * VSync | 
|  | 414 | */ | 
|  | 415 | void enableHardwareVsync(); | 
| Dan Stoza | 67264e9 | 2016-04-14 16:11:48 +0000 | [diff] [blame] | 416 | void resyncToHardwareVsync(bool makeAvailable); | 
| Tim Murray | 4a4e4a2 | 2016-04-19 16:29:23 +0000 | [diff] [blame] | 417 | void disableHardwareVsync(bool makeUnavailable); | 
|  | 418 | public: | 
|  | 419 | void resyncWithRateLimit(); | 
|  | 420 | private: | 
| Jamie Gennis | 0bceb84 | 2012-08-23 20:19:38 -0700 | [diff] [blame] | 421 |  | 
|  | 422 | /* ------------------------------------------------------------------------ | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 423 | * Debugging & dumpsys | 
|  | 424 | */ | 
| Mathias Agopian | 3f84483 | 2013-08-07 21:24:32 -0700 | [diff] [blame] | 425 | void listLayersLocked(const Vector<String16>& args, size_t& index, String8& result) const; | 
|  | 426 | void dumpStatsLocked(const Vector<String16>& args, size_t& index, String8& result) const; | 
|  | 427 | void clearStatsLocked(const Vector<String16>& args, size_t& index, String8& result); | 
|  | 428 | void dumpAllLocked(const Vector<String16>& args, size_t& index, String8& result) const; | 
| Keun young Park | 63f165f | 2012-08-31 10:53:36 -0700 | [diff] [blame] | 429 | bool startDdmConnection(); | 
| Andy McFadden | 4803b74 | 2012-09-24 19:07:20 -0700 | [diff] [blame] | 430 | static void appendSfConfigString(String8& result); | 
| Mathias Agopian | d555684 | 2013-09-19 17:08:37 -0700 | [diff] [blame] | 431 | void checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr, | 
| Mathias Agopian | fee2b46 | 2013-07-03 12:34:01 -0700 | [diff] [blame] | 432 | const sp<const DisplayDevice>& hw, | 
|  | 433 | uint32_t minLayerZ, uint32_t maxLayerZ); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 434 |  | 
| Jamie Gennis | 6547ff4 | 2013-07-16 20:12:42 -0700 | [diff] [blame] | 435 | void logFrameStats(); | 
|  | 436 |  | 
| Dan Stoza | b90cf07 | 2015-03-05 11:05:59 -0800 | [diff] [blame] | 437 | void dumpStaticScreenStats(String8& result) const; | 
|  | 438 |  | 
| Dan Stoza | e77c766 | 2016-05-13 11:37:28 -0700 | [diff] [blame] | 439 | void recordBufferingStats(const char* layerName, | 
|  | 440 | std::vector<OccupancyTracker::Segment>&& history); | 
|  | 441 | void dumpBufferingStats(String8& result) const; | 
|  | 442 |  | 
| Pablo Ceballos | ce796e7 | 2016-02-04 19:10:51 -0800 | [diff] [blame] | 443 | bool getFrameTimestamps(const Layer& layer, uint64_t frameNumber, | 
|  | 444 | FrameTimestamps* outTimestamps); | 
|  | 445 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 446 | /* ------------------------------------------------------------------------ | 
|  | 447 | * Attributes | 
|  | 448 | */ | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 449 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 450 | // access must be protected by mStateLock | 
|  | 451 | mutable Mutex mStateLock; | 
|  | 452 | State mCurrentState; | 
|  | 453 | volatile int32_t mTransactionFlags; | 
|  | 454 | Condition mTransactionCV; | 
| Jamie Gennis | 2d5e230 | 2012-10-15 18:24:43 -0700 | [diff] [blame] | 455 | bool mTransactionPending; | 
|  | 456 | bool mAnimTransactionPending; | 
| Mathias Agopian | 13127d8 | 2013-03-05 17:47:11 -0800 | [diff] [blame] | 457 | Vector< sp<Layer> > mLayersPendingRemoval; | 
| Mathias Agopian | 6710604 | 2013-03-14 19:18:13 -0700 | [diff] [blame] | 458 | SortedVector< wp<IBinder> > mGraphicBufferProducerList; | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 459 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 460 | // protected by mStateLock (but we could use another lock) | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 461 | bool mLayersRemoved; | 
| Mathias Agopian | ca4d360 | 2011-05-19 15:38:14 -0700 | [diff] [blame] | 462 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 463 | // access must be protected by mInvalidateLock | 
| Mathias Agopian | 87baae1 | 2012-07-31 12:38:26 -0700 | [diff] [blame] | 464 | volatile int32_t mRepaintEverything; | 
| Mathias Agopian | ca4d360 | 2011-05-19 15:38:14 -0700 | [diff] [blame] | 465 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 466 | // constant members (no synchronization needed for access) | 
| Mathias Agopian | 8630320 | 2012-07-24 22:46:10 -0700 | [diff] [blame] | 467 | HWComposer* mHwc; | 
| Mathias Agopian | 875d8e1 | 2013-06-07 15:35:48 -0700 | [diff] [blame] | 468 | RenderEngine* mRenderEngine; | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 469 | nsecs_t mBootTime; | 
| Mathias Agopian | b4b1730 | 2013-03-20 18:36:41 -0700 | [diff] [blame] | 470 | bool mGpuToCpuSupported; | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 471 | sp<EventThread> mEventThread; | 
| Jamie Gennis | 0a645cc | 2013-10-14 20:52:46 -0700 | [diff] [blame] | 472 | sp<EventThread> mSFEventThread; | 
| Jamie Gennis | d170075 | 2013-10-14 12:22:52 -0700 | [diff] [blame] | 473 | sp<EventControlThread> mEventControlThread; | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 474 | EGLContext mEGLContext; | 
| Jesse Hall | 34a09ba | 2012-07-29 22:35:34 -0700 | [diff] [blame] | 475 | EGLDisplay mEGLDisplay; | 
| Jesse Hall | 9e663de | 2013-08-16 14:28:37 -0700 | [diff] [blame] | 476 | sp<IBinder> mBuiltinDisplays[DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES]; | 
| Mathias Agopian | 3094df3 | 2012-06-18 18:06:45 -0700 | [diff] [blame] | 477 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 478 | // Can only accessed from the main thread, these members | 
|  | 479 | // don't need synchronization | 
|  | 480 | State mDrawingState; | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 481 | bool mVisibleRegionsDirty; | 
| Dan Stoza | 9e56aa0 | 2015-11-02 13:00:03 -0800 | [diff] [blame] | 482 | #ifndef USE_HWC2 | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 483 | bool mHwWorkListDirty; | 
| Dan Stoza | 9e56aa0 | 2015-11-02 13:00:03 -0800 | [diff] [blame] | 484 | #else | 
|  | 485 | bool mGeometryInvalid; | 
|  | 486 | #endif | 
| Jamie Gennis | 4b0eba9 | 2013-02-05 13:30:24 -0800 | [diff] [blame] | 487 | bool mAnimCompositionPending; | 
| Dan Stoza | 9e56aa0 | 2015-11-02 13:00:03 -0800 | [diff] [blame] | 488 | #ifdef USE_HWC2 | 
|  | 489 | std::vector<sp<Layer>> mLayersWithQueuedFrames; | 
| Dan Stoza | 05dacfb | 2016-07-01 13:33:38 -0700 | [diff] [blame] | 490 | sp<Fence> mPreviousPresentFence = Fence::NO_FENCE; | 
|  | 491 | bool mHadClientComposition = false; | 
| Dan Stoza | 9e56aa0 | 2015-11-02 13:00:03 -0800 | [diff] [blame] | 492 | #endif | 
| Mathias Agopian | db9b41f | 2012-10-15 16:51:41 -0700 | [diff] [blame] | 493 |  | 
|  | 494 | // this may only be written from the main thread with mStateLock held | 
|  | 495 | // it may be read from other threads with mStateLock held | 
| Mathias Agopian | 3ee454a | 2012-08-27 16:28:24 -0700 | [diff] [blame] | 496 | DefaultKeyedVector< wp<IBinder>, sp<DisplayDevice> > mDisplays; | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 497 |  | 
|  | 498 | // don't use a lock for these, we don't care | 
|  | 499 | int mDebugRegion; | 
|  | 500 | int mDebugDDMS; | 
|  | 501 | int mDebugDisableHWC; | 
|  | 502 | int mDebugDisableTransformHint; | 
|  | 503 | volatile nsecs_t mDebugInSwapBuffers; | 
|  | 504 | nsecs_t mLastSwapBufferTime; | 
|  | 505 | volatile nsecs_t mDebugInTransaction; | 
|  | 506 | nsecs_t mLastTransactionTime; | 
|  | 507 | bool mBootFinished; | 
| Dan Stoza | ee44edd | 2015-03-23 15:50:23 -0700 | [diff] [blame] | 508 | bool mForceFullDamage; | 
| Pablo Ceballos | 40845df | 2016-01-25 17:41:15 -0800 | [diff] [blame] | 509 | FenceTracker mFenceTracker; | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 510 |  | 
|  | 511 | // these are thread safe | 
|  | 512 | mutable MessageQueue mEventQueue; | 
| Jamie Gennis | 4b0eba9 | 2013-02-05 13:30:24 -0800 | [diff] [blame] | 513 | FrameTracker mAnimFrameTracker; | 
| Jamie Gennis | faf77cc | 2013-07-30 15:10:32 -0700 | [diff] [blame] | 514 | DispSync mPrimaryDispSync; | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 515 |  | 
|  | 516 | // protected by mDestroyedLayerLock; | 
|  | 517 | mutable Mutex mDestroyedLayerLock; | 
| Mathias Agopian | 13127d8 | 2013-03-05 17:47:11 -0800 | [diff] [blame] | 518 | Vector<Layer const *> mDestroyedLayers; | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 519 |  | 
| Jamie Gennis | faf77cc | 2013-07-30 15:10:32 -0700 | [diff] [blame] | 520 | // protected by mHWVsyncLock | 
|  | 521 | Mutex mHWVsyncLock; | 
|  | 522 | bool mPrimaryHWVsyncEnabled; | 
| Jesse Hall | 948fe0c | 2013-10-14 12:56:09 -0700 | [diff] [blame] | 523 | bool mHWVsyncAvailable; | 
| Jamie Gennis | faf77cc | 2013-07-30 15:10:32 -0700 | [diff] [blame] | 524 |  | 
| Mathias Agopian | 921e6ac | 2012-07-23 23:11:29 -0700 | [diff] [blame] | 525 | /* ------------------------------------------------------------------------ | 
|  | 526 | * Feature prototyping | 
|  | 527 | */ | 
|  | 528 |  | 
| Mathias Agopian | ff2ed70 | 2013-09-01 21:36:12 -0700 | [diff] [blame] | 529 | Daltonizer mDaltonizer; | 
| Dan Stoza | 9f26a9c | 2016-06-22 14:51:09 -0700 | [diff] [blame] | 530 | #ifndef USE_HWC2 | 
| Mathias Agopian | ff2ed70 | 2013-09-01 21:36:12 -0700 | [diff] [blame] | 531 | bool mDaltonize; | 
| Dan Stoza | 9f26a9c | 2016-06-22 14:51:09 -0700 | [diff] [blame] | 532 | #endif | 
| Alan Viverette | 9c5a333 | 2013-09-12 20:04:35 -0700 | [diff] [blame] | 533 |  | 
| Dan Stoza | 9f26a9c | 2016-06-22 14:51:09 -0700 | [diff] [blame] | 534 | mat4 mPreviousColorMatrix; | 
| Alan Viverette | 9c5a333 | 2013-09-12 20:04:35 -0700 | [diff] [blame] | 535 | mat4 mColorMatrix; | 
|  | 536 | bool mHasColorMatrix; | 
| Dan Stoza | b90cf07 | 2015-03-05 11:05:59 -0800 | [diff] [blame] | 537 |  | 
|  | 538 | // Static screen stats | 
|  | 539 | bool mHasPoweredOff; | 
|  | 540 | static const size_t NUM_BUCKETS = 8; // < 1-7, 7+ | 
|  | 541 | nsecs_t mFrameBuckets[NUM_BUCKETS]; | 
|  | 542 | nsecs_t mTotalTime; | 
| Tim Murray | 4a4e4a2 | 2016-04-19 16:29:23 +0000 | [diff] [blame] | 543 | std::atomic<nsecs_t> mLastSwapTime; | 
| Dan Stoza | e77c766 | 2016-05-13 11:37:28 -0700 | [diff] [blame] | 544 |  | 
|  | 545 | // Double- vs. triple-buffering stats | 
|  | 546 | struct BufferingStats { | 
|  | 547 | BufferingStats() | 
|  | 548 | : numSegments(0), | 
|  | 549 | totalTime(0), | 
|  | 550 | twoBufferTime(0), | 
|  | 551 | doubleBufferedTime(0), | 
|  | 552 | tripleBufferedTime(0) {} | 
|  | 553 |  | 
|  | 554 | size_t numSegments; | 
|  | 555 | nsecs_t totalTime; | 
|  | 556 |  | 
|  | 557 | // "Two buffer" means that a third buffer was never used, whereas | 
|  | 558 | // "double-buffered" means that on average the segment only used two | 
|  | 559 | // buffers (though it may have used a third for some part of the | 
|  | 560 | // segment) | 
|  | 561 | nsecs_t twoBufferTime; | 
|  | 562 | nsecs_t doubleBufferedTime; | 
|  | 563 | nsecs_t tripleBufferedTime; | 
|  | 564 | }; | 
|  | 565 | mutable Mutex mBufferingStatsMutex; | 
|  | 566 | std::unordered_map<std::string, BufferingStats> mBufferingStats; | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 567 | }; | 
|  | 568 |  | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 569 | }; // namespace android | 
|  | 570 |  | 
|  | 571 | #endif // ANDROID_SURFACE_FLINGER_H |