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