Home | History | Annotate | Download | only in surfaceflinger
      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 
    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      */
    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 
    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      */
    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
    299     inline const sp<GraphicBuffer>& getActiveBuffer() const { return mActiveBuffer; }
    300 
    301     inline  const State&    getDrawingState() const { return mDrawingState; }
    302     inline  const State&    getCurrentState() const { return mCurrentState; }
    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