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_LAYER_H 18 #define ANDROID_LAYER_H 19 20 #include <stdint.h> 21 #include <sys/types.h> 22 23 #include <EGL/egl.h> 24 #include <EGL/eglext.h> 25 26 #include <utils/RefBase.h> 27 #include <utils/String8.h> 28 #include <utils/Timers.h> 29 30 #include <ui/GraphicBuffer.h> 31 #include <ui/PixelFormat.h> 32 #include <ui/Region.h> 33 34 #include <gui/ISurfaceComposerClient.h> 35 36 #include <private/gui/LayerState.h> 37 38 #include "FrameTracker.h" 39 #include "Client.h" 40 #include "SurfaceFlinger.h" 41 #include "SurfaceFlingerConsumer.h" 42 #include "SurfaceTextureLayer.h" 43 #include "Transform.h" 44 45 #include "DisplayHardware/HWComposer.h" 46 #include "DisplayHardware/FloatRect.h" 47 #include "RenderEngine/Mesh.h" 48 #include "RenderEngine/Texture.h" 49 50 namespace android { 51 52 // --------------------------------------------------------------------------- 53 54 class Client; 55 class Colorizer; 56 class DisplayDevice; 57 class GraphicBuffer; 58 class SurfaceFlinger; 59 60 // --------------------------------------------------------------------------- 61 62 /* 63 * A new BufferQueue and a new SurfaceFlingerConsumer are created when the 64 * Layer is first referenced. 65 * 66 * This also implements onFrameAvailable(), which notifies SurfaceFlinger 67 * that new data has arrived. 68 */ 69 class Layer : public SurfaceFlingerConsumer::FrameAvailableListener { 70 static int32_t sSequence; 71 72 public: 73 mutable bool contentDirty; 74 // regions below are in window-manager space 75 Region visibleRegion; 76 Region coveredRegion; 77 Region visibleNonTransparentRegion; 78 int32_t sequence; 79 80 enum { // flags for doTransaction() 81 eDontUpdateGeometryState = 0x00000001, 82 eVisibleRegion = 0x00000002, 83 }; 84 85 struct Geometry { 86 uint32_t w; 87 uint32_t h; 88 Rect crop; 89 inline bool operator ==(const Geometry& rhs) const { 90 return (w == rhs.w && h == rhs.h && crop == rhs.crop); 91 } 92 inline bool operator !=(const Geometry& rhs) const { 93 return !operator ==(rhs); 94 } 95 }; 96 97 struct State { 98 Geometry active; 99 Geometry requested; 100 uint32_t z; 101 uint32_t layerStack; 102 uint8_t alpha; 103 uint8_t flags; 104 uint8_t reserved[2]; 105 int32_t sequence; // changes when visible regions can change 106 Transform transform; 107 // the transparentRegion hint is a bit special, it's latched only 108 // when we receive a buffer -- this is because it's "content" 109 // dependent. 110 Region activeTransparentRegion; 111 Region requestedTransparentRegion; 112 }; 113 114 // ----------------------------------------------------------------------- 115 116 Layer(SurfaceFlinger* flinger, const sp<Client>& client, 117 const String8& name, uint32_t w, uint32_t h, uint32_t flags); 118 119 virtual ~Layer(); 120 121 // the this layer's size and format 122 status_t setBuffers(uint32_t w, uint32_t h, PixelFormat format, uint32_t flags); 123 124 // modify current state 125 bool setPosition(float x, float y); 126 bool setLayer(uint32_t z); 127 bool setSize(uint32_t w, uint32_t h); 128 bool setAlpha(uint8_t alpha); 129 bool setMatrix(const layer_state_t::matrix22_t& matrix); 130 bool setTransparentRegionHint(const Region& transparent); 131 bool setFlags(uint8_t flags, uint8_t mask); 132 bool setCrop(const Rect& crop); 133 bool setLayerStack(uint32_t layerStack); 134 135 uint32_t getTransactionFlags(uint32_t flags); 136 uint32_t setTransactionFlags(uint32_t flags); 137 138 void computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh) const; 139 Rect computeBounds() const; 140 141 sp<IBinder> getHandle(); 142 sp<IGraphicBufferProducer> getBufferQueue() const; 143 const String8& getName() const; 144 145 // ----------------------------------------------------------------------- 146 // Virtuals 147 getTypeId()148 virtual const char* getTypeId() const { return "Layer"; } 149 150 /* 151 * isOpaque - true if this surface is opaque 152 */ 153 virtual bool isOpaque() const; 154 155 /* 156 * isSecure - true if this surface is secure, that is if it prevents 157 * screenshots or VNC servers. 158 */ isSecure()159 virtual bool isSecure() const { return mSecure; } 160 161 /* 162 * isProtected - true if the layer may contain protected content in the 163 * GRALLOC_USAGE_PROTECTED sense. 164 */ 165 virtual bool isProtected() const; 166 167 /* 168 * isVisible - true if this layer is visible, false otherwise 169 */ 170 virtual bool isVisible() const; 171 172 /* 173 * isFixedSize - true if content has a fixed size 174 */ 175 virtual bool isFixedSize() const; 176 177 protected: 178 /* 179 * onDraw - draws the surface. 180 */ 181 virtual void onDraw(const sp<const DisplayDevice>& hw, const Region& clip) const; 182 183 public: 184 // ----------------------------------------------------------------------- 185 186 void setGeometry(const sp<const DisplayDevice>& hw, 187 HWComposer::HWCLayerInterface& layer); 188 void setPerFrameData(const sp<const DisplayDevice>& hw, 189 HWComposer::HWCLayerInterface& layer); 190 void setAcquireFence(const sp<const DisplayDevice>& hw, 191 HWComposer::HWCLayerInterface& layer); 192 193 /* 194 * called after page-flip 195 */ 196 void onLayerDisplayed(const sp<const DisplayDevice>& hw, 197 HWComposer::HWCLayerInterface* layer); 198 199 /* 200 * called before composition. 201 * returns true if the layer has pending updates. 202 */ 203 bool onPreComposition(); 204 205 /* 206 * called after composition. 207 */ 208 void onPostComposition(); 209 210 /* 211 * draw - performs some global clipping optimizations 212 * and calls onDraw(). 213 */ 214 void draw(const sp<const DisplayDevice>& hw, const Region& clip) const; 215 void draw(const sp<const DisplayDevice>& hw); 216 217 /* 218 * doTransaction - process the transaction. This is a good place to figure 219 * out which attributes of the surface have changed. 220 */ 221 uint32_t doTransaction(uint32_t transactionFlags); 222 223 /* 224 * setVisibleRegion - called to set the new visible region. This gives 225 * a chance to update the new visible region or record the fact it changed. 226 */ 227 void setVisibleRegion(const Region& visibleRegion); 228 229 /* 230 * setCoveredRegion - called when the covered region changes. The covered 231 * region corresponds to any area of the surface that is covered 232 * (transparently or not) by another surface. 233 */ 234 void setCoveredRegion(const Region& coveredRegion); 235 236 /* 237 * setVisibleNonTransparentRegion - called when the visible and 238 * non-transparent region changes. 239 */ 240 void setVisibleNonTransparentRegion(const Region& 241 visibleNonTransparentRegion); 242 243 /* 244 * latchBuffer - called each time the screen is redrawn and returns whether 245 * the visible regions need to be recomputed (this is a fairly heavy 246 * operation, so this should be set only if needed). Typically this is used 247 * to figure out if the content or size of a surface has changed. 248 */ 249 Region latchBuffer(bool& recomputeVisibleRegions); 250 251 /* 252 * called with the state lock when the surface is removed from the 253 * current list 254 */ 255 void onRemoved(); 256 257 258 // Updates the transform hint in our SurfaceFlingerConsumer to match 259 // the current orientation of the display device. 260 void updateTransformHint(const sp<const DisplayDevice>& hw) const; 261 262 /* 263 * returns the rectangle that crops the content of the layer and scales it 264 * to the layer's size. 265 */ 266 Rect getContentCrop() const; 267 268 // ----------------------------------------------------------------------- 269 270 void clearWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip) const; 271 void setFiltering(bool filtering); 272 bool getFiltering() const; 273 274 // only for debugging getActiveBuffer()275 inline const sp<GraphicBuffer>& getActiveBuffer() const { return mActiveBuffer; } 276 getDrawingState()277 inline const State& getDrawingState() const { return mDrawingState; } getCurrentState()278 inline const State& getCurrentState() const { return mCurrentState; } getCurrentState()279 inline State& getCurrentState() { return mCurrentState; } 280 281 282 /* always call base class first */ 283 void dump(String8& result, Colorizer& colorizer) const; 284 void dumpStats(String8& result) const; 285 void clearStats(); 286 void logFrameStats(); 287 288 protected: 289 // constant 290 sp<SurfaceFlinger> mFlinger; 291 292 virtual void onFirstRef(); 293 294 /* 295 * Trivial class, used to ensure that mFlinger->onLayerDestroyed(mLayer) 296 * is called. 297 */ 298 class LayerCleaner { 299 sp<SurfaceFlinger> mFlinger; 300 wp<Layer> mLayer; 301 protected: 302 ~LayerCleaner(); 303 public: 304 LayerCleaner(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer); 305 }; 306 307 308 private: 309 // Interface implementation for SurfaceFlingerConsumer::FrameAvailableListener 310 virtual void onFrameAvailable(); 311 312 void commitTransaction(); 313 314 // needsLinearFiltering - true if this surface's state requires filtering 315 bool needsFiltering(const sp<const DisplayDevice>& hw) const; 316 317 uint32_t getEffectiveUsage(uint32_t usage) const; 318 FloatRect computeCrop(const sp<const DisplayDevice>& hw) const; 319 bool isCropped() const; 320 static bool getOpacityForFormat(uint32_t format); 321 322 // drawing 323 void clearWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip, 324 float r, float g, float b, float alpha) const; 325 void drawWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip) const; 326 327 328 // ----------------------------------------------------------------------- 329 330 // constants 331 sp<SurfaceFlingerConsumer> mSurfaceFlingerConsumer; 332 sp<BufferQueue> mBufferQueue; 333 uint32_t mTextureName; 334 bool mPremultipliedAlpha; 335 String8 mName; 336 mutable bool mDebug; 337 PixelFormat mFormat; 338 bool mOpaqueLayer; 339 340 // these are protected by an external lock 341 State mCurrentState; 342 State mDrawingState; 343 volatile int32_t mTransactionFlags; 344 345 // thread-safe 346 volatile int32_t mQueuedFrames; 347 FrameTracker mFrameTracker; 348 349 // main thread 350 sp<GraphicBuffer> mActiveBuffer; 351 Rect mCurrentCrop; 352 uint32_t mCurrentTransform; 353 uint32_t mCurrentScalingMode; 354 bool mCurrentOpacity; 355 bool mRefreshPending; 356 bool mFrameLatencyNeeded; 357 // Whether filtering is forced on or not 358 bool mFiltering; 359 // Whether filtering is needed b/c of the drawingstate 360 bool mNeedsFiltering; 361 // The mesh used to draw the layer in GLES composition mode 362 mutable Mesh mMesh; 363 // The mesh used to draw the layer in GLES composition mode 364 mutable Texture mTexture; 365 366 // page-flip thread (currently main thread) 367 bool mSecure; // no screenshots 368 bool mProtectedByApp; // application requires protected path to external sink 369 370 // protected by mLock 371 mutable Mutex mLock; 372 // Set to true once we've returned this surface's handle 373 mutable bool mHasSurface; 374 const wp<Client> mClientRef; 375 }; 376 377 // --------------------------------------------------------------------------- 378 379 }; // namespace android 380 381 #endif // ANDROID_LAYER_H 382