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