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 <list>
     40 
     41 #include "FrameTracker.h"
     42 #include "Client.h"
     43 #include "MonitoredProducer.h"
     44 #include "SurfaceFlinger.h"
     45 #include "SurfaceFlingerConsumer.h"
     46 #include "Transform.h"
     47 
     48 #include "DisplayHardware/HWComposer.h"
     49 #include "DisplayHardware/FloatRect.h"
     50 #include "RenderEngine/Mesh.h"
     51 #include "RenderEngine/Texture.h"
     52 
     53 namespace android {
     54 
     55 // ---------------------------------------------------------------------------
     56 
     57 class Client;
     58 class Colorizer;
     59 class DisplayDevice;
     60 class GraphicBuffer;
     61 class SurfaceFlinger;
     62 
     63 // ---------------------------------------------------------------------------
     64 
     65 /*
     66  * A new BufferQueue and a new SurfaceFlingerConsumer are created when the
     67  * Layer is first referenced.
     68  *
     69  * This also implements onFrameAvailable(), which notifies SurfaceFlinger
     70  * that new data has arrived.
     71  */
     72 class Layer : public SurfaceFlingerConsumer::ContentsChangedListener {
     73     static int32_t sSequence;
     74 
     75 public:
     76     mutable bool contentDirty;
     77     // regions below are in window-manager space
     78     Region visibleRegion;
     79     Region coveredRegion;
     80     Region visibleNonTransparentRegion;
     81     Region surfaceDamageRegion;
     82 
     83     // Layer serial number.  This gives layers an explicit ordering, so we
     84     // have a stable sort order when their layer stack and Z-order are
     85     // the same.
     86     int32_t sequence;
     87 
     88     enum { // flags for doTransaction()
     89         eDontUpdateGeometryState = 0x00000001,
     90         eVisibleRegion = 0x00000002,
     91     };
     92 
     93     struct Geometry {
     94         uint32_t w;
     95         uint32_t h;
     96         Transform transform;
     97 
     98         inline bool operator ==(const Geometry& rhs) const {
     99           return (w == rhs.w && h == rhs.h);
    100         }
    101         inline bool operator !=(const Geometry& rhs) const {
    102             return !operator ==(rhs);
    103         }
    104     };
    105 
    106     struct State {
    107         Geometry active;
    108         Geometry requested;
    109         uint32_t z;
    110         uint32_t layerStack;
    111 #ifdef USE_HWC2
    112         float alpha;
    113 #else
    114         uint8_t alpha;
    115 #endif
    116         uint8_t flags;
    117         uint8_t mask;
    118         uint8_t reserved[2];
    119         int32_t sequence; // changes when visible regions can change
    120         bool modified;
    121 
    122         Rect crop;
    123         Rect finalCrop;
    124 
    125         // If set, defers this state update until the Layer identified by handle
    126         // receives a frame with the given frameNumber
    127         sp<IBinder> handle;
    128         uint64_t frameNumber;
    129 
    130         // the transparentRegion hint is a bit special, it's latched only
    131         // when we receive a buffer -- this is because it's "content"
    132         // dependent.
    133         Region activeTransparentRegion;
    134         Region requestedTransparentRegion;
    135     };
    136 
    137     // -----------------------------------------------------------------------
    138 
    139     Layer(SurfaceFlinger* flinger, const sp<Client>& client,
    140             const String8& name, uint32_t w, uint32_t h, uint32_t flags);
    141 
    142     virtual ~Layer();
    143 
    144     // the this layer's size and format
    145     status_t setBuffers(uint32_t w, uint32_t h, PixelFormat format, uint32_t flags);
    146 
    147     // modify current state
    148     bool setPosition(float x, float y, bool immediate);
    149     bool setLayer(uint32_t z);
    150     bool setSize(uint32_t w, uint32_t h);
    151 #ifdef USE_HWC2
    152     bool setAlpha(float alpha);
    153 #else
    154     bool setAlpha(uint8_t alpha);
    155 #endif
    156     bool setMatrix(const layer_state_t::matrix22_t& matrix);
    157     bool setTransparentRegionHint(const Region& transparent);
    158     bool setFlags(uint8_t flags, uint8_t mask);
    159     bool setCrop(const Rect& crop);
    160     bool setFinalCrop(const Rect& crop);
    161     bool setLayerStack(uint32_t layerStack);
    162     void deferTransactionUntil(const sp<IBinder>& handle, uint64_t frameNumber);
    163     bool setOverrideScalingMode(int32_t overrideScalingMode);
    164 
    165     // If we have received a new buffer this frame, we will pass its surface
    166     // damage down to hardware composer. Otherwise, we must send a region with
    167     // one empty rect.
    168     void useSurfaceDamage();
    169     void useEmptyDamage();
    170 
    171     uint32_t getTransactionFlags(uint32_t flags);
    172     uint32_t setTransactionFlags(uint32_t flags);
    173 
    174     void computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh,
    175             bool useIdentityTransform) const;
    176     Rect computeBounds(const Region& activeTransparentRegion) const;
    177     Rect computeBounds() const;
    178 
    179     class Handle;
    180     sp<IBinder> getHandle();
    181     sp<IGraphicBufferProducer> getProducer() const;
    182     const String8& getName() const;
    183 
    184     int32_t getSequence() const { return sequence; }
    185 
    186     // -----------------------------------------------------------------------
    187     // Virtuals
    188 
    189     virtual const char* getTypeId() const { return "Layer"; }
    190 
    191     /*
    192      * isOpaque - true if this surface is opaque
    193      *
    194      * This takes into account the buffer format (i.e. whether or not the
    195      * pixel format includes an alpha channel) and the "opaque" flag set
    196      * on the layer.  It does not examine the current plane alpha value.
    197      */
    198     virtual bool isOpaque(const Layer::State& s) const;
    199 
    200     /*
    201      * isSecure - true if this surface is secure, that is if it prevents
    202      * screenshots or VNC servers.
    203      */
    204     virtual bool isSecure() const;
    205 
    206     /*
    207      * isProtected - true if the layer may contain protected content in the
    208      * GRALLOC_USAGE_PROTECTED sense.
    209      */
    210     virtual bool isProtected() const;
    211 
    212     /*
    213      * isVisible - true if this layer is visible, false otherwise
    214      */
    215     virtual bool isVisible() const;
    216 
    217     /*
    218      * isFixedSize - true if content has a fixed size
    219      */
    220     virtual bool isFixedSize() const;
    221 
    222 protected:
    223     /*
    224      * onDraw - draws the surface.
    225      */
    226     virtual void onDraw(const sp<const DisplayDevice>& hw, const Region& clip,
    227             bool useIdentityTransform) const;
    228 
    229 public:
    230     // -----------------------------------------------------------------------
    231 
    232 #ifdef USE_HWC2
    233     void setGeometry(const sp<const DisplayDevice>& displayDevice);
    234     void forceClientComposition(int32_t hwcId);
    235     void setPerFrameData(const sp<const DisplayDevice>& displayDevice);
    236 
    237     // callIntoHwc exists so we can update our local state and call
    238     // acceptDisplayChanges without unnecessarily updating the device's state
    239     void setCompositionType(int32_t hwcId, HWC2::Composition type,
    240             bool callIntoHwc = true);
    241     HWC2::Composition getCompositionType(int32_t hwcId) const;
    242 
    243     void setClearClientTarget(int32_t hwcId, bool clear);
    244     bool getClearClientTarget(int32_t hwcId) const;
    245 
    246     void updateCursorPosition(const sp<const DisplayDevice>& hw);
    247 #else
    248     void setGeometry(const sp<const DisplayDevice>& hw,
    249             HWComposer::HWCLayerInterface& layer);
    250     void setPerFrameData(const sp<const DisplayDevice>& hw,
    251             HWComposer::HWCLayerInterface& layer);
    252     void setAcquireFence(const sp<const DisplayDevice>& hw,
    253             HWComposer::HWCLayerInterface& layer);
    254 
    255     Rect getPosition(const sp<const DisplayDevice>& hw);
    256 #endif
    257 
    258     /*
    259      * called after page-flip
    260      */
    261 #ifdef USE_HWC2
    262     void onLayerDisplayed(const sp<Fence>& releaseFence);
    263 #else
    264     void onLayerDisplayed(const sp<const DisplayDevice>& hw,
    265             HWComposer::HWCLayerInterface* layer);
    266 #endif
    267 
    268     bool shouldPresentNow(const DispSync& dispSync) const;
    269 
    270     /*
    271      * called before composition.
    272      * returns true if the layer has pending updates.
    273      */
    274     bool onPreComposition();
    275 
    276     /*
    277      *  called after composition.
    278      */
    279     void onPostComposition();
    280 
    281 #ifdef USE_HWC2
    282     // If a buffer was replaced this frame, release the former buffer
    283     void releasePendingBuffer();
    284 #endif
    285 
    286     /*
    287      * draw - performs some global clipping optimizations
    288      * and calls onDraw().
    289      */
    290     void draw(const sp<const DisplayDevice>& hw, const Region& clip) const;
    291     void draw(const sp<const DisplayDevice>& hw, bool useIdentityTransform) const;
    292     void draw(const sp<const DisplayDevice>& hw) const;
    293 
    294     /*
    295      * doTransaction - process the transaction. This is a good place to figure
    296      * out which attributes of the surface have changed.
    297      */
    298     uint32_t doTransaction(uint32_t transactionFlags);
    299 
    300     /*
    301      * setVisibleRegion - called to set the new visible region. This gives
    302      * a chance to update the new visible region or record the fact it changed.
    303      */
    304     void setVisibleRegion(const Region& visibleRegion);
    305 
    306     /*
    307      * setCoveredRegion - called when the covered region changes. The covered
    308      * region corresponds to any area of the surface that is covered
    309      * (transparently or not) by another surface.
    310      */
    311     void setCoveredRegion(const Region& coveredRegion);
    312 
    313     /*
    314      * setVisibleNonTransparentRegion - called when the visible and
    315      * non-transparent region changes.
    316      */
    317     void setVisibleNonTransparentRegion(const Region&
    318             visibleNonTransparentRegion);
    319 
    320     /*
    321      * latchBuffer - called each time the screen is redrawn and returns whether
    322      * the visible regions need to be recomputed (this is a fairly heavy
    323      * operation, so this should be set only if needed). Typically this is used
    324      * to figure out if the content or size of a surface has changed.
    325      */
    326     Region latchBuffer(bool& recomputeVisibleRegions);
    327 
    328     bool isPotentialCursor() const { return mPotentialCursor;}
    329 
    330     /*
    331      * called with the state lock when the surface is removed from the
    332      * current list
    333      */
    334     void onRemoved();
    335 
    336 
    337     // Updates the transform hint in our SurfaceFlingerConsumer to match
    338     // the current orientation of the display device.
    339     void updateTransformHint(const sp<const DisplayDevice>& hw) const;
    340 
    341     /*
    342      * returns the rectangle that crops the content of the layer and scales it
    343      * to the layer's size.
    344      */
    345     Rect getContentCrop() const;
    346 
    347     /*
    348      * Returns if a frame is queued.
    349      */
    350     bool hasQueuedFrame() const { return mQueuedFrames > 0 ||
    351             mSidebandStreamChanged || mAutoRefresh; }
    352 
    353 #ifdef USE_HWC2
    354     // -----------------------------------------------------------------------
    355 
    356     bool hasHwcLayer(int32_t hwcId) {
    357         if (mHwcLayers.count(hwcId) == 0) {
    358             return false;
    359         }
    360         if (mHwcLayers[hwcId].layer->isAbandoned()) {
    361             ALOGI("Erasing abandoned layer %s on %d", mName.string(), hwcId);
    362             mHwcLayers.erase(hwcId);
    363             return false;
    364         }
    365         return true;
    366     }
    367 
    368     std::shared_ptr<HWC2::Layer> getHwcLayer(int32_t hwcId) {
    369         if (mHwcLayers.count(hwcId) == 0) {
    370             return nullptr;
    371         }
    372         return mHwcLayers[hwcId].layer;
    373     }
    374 
    375     void setHwcLayer(int32_t hwcId, std::shared_ptr<HWC2::Layer>&& layer) {
    376         if (layer) {
    377             mHwcLayers[hwcId].layer = layer;
    378         } else {
    379             mHwcLayers.erase(hwcId);
    380         }
    381     }
    382 
    383 #endif
    384     // -----------------------------------------------------------------------
    385 
    386     void clearWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip) const;
    387     void setFiltering(bool filtering);
    388     bool getFiltering() const;
    389 
    390     // only for debugging
    391     inline const sp<GraphicBuffer>& getActiveBuffer() const { return mActiveBuffer; }
    392 
    393     inline  const State&    getDrawingState() const { return mDrawingState; }
    394     inline  const State&    getCurrentState() const { return mCurrentState; }
    395     inline  State&          getCurrentState()       { return mCurrentState; }
    396 
    397 
    398     /* always call base class first */
    399     void dump(String8& result, Colorizer& colorizer) const;
    400     void dumpFrameStats(String8& result) const;
    401     void clearFrameStats();
    402     void logFrameStats();
    403     void getFrameStats(FrameStats* outStats) const;
    404 
    405     void getFenceData(String8* outName, uint64_t* outFrameNumber,
    406             bool* outIsGlesComposition, nsecs_t* outPostedTime,
    407             sp<Fence>* outAcquireFence, sp<Fence>* outPrevReleaseFence) const;
    408 
    409 protected:
    410     // constant
    411     sp<SurfaceFlinger> mFlinger;
    412 
    413     virtual void onFirstRef();
    414 
    415     /*
    416      * Trivial class, used to ensure that mFlinger->onLayerDestroyed(mLayer)
    417      * is called.
    418      */
    419     class LayerCleaner {
    420         sp<SurfaceFlinger> mFlinger;
    421         wp<Layer> mLayer;
    422     protected:
    423         ~LayerCleaner();
    424     public:
    425         LayerCleaner(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer);
    426     };
    427 
    428 
    429 private:
    430     // Interface implementation for SurfaceFlingerConsumer::ContentsChangedListener
    431     virtual void onFrameAvailable(const BufferItem& item) override;
    432     virtual void onFrameReplaced(const BufferItem& item) override;
    433     virtual void onSidebandStreamChanged() override;
    434 
    435     void commitTransaction(const State& stateToCommit);
    436 
    437     // needsLinearFiltering - true if this surface's state requires filtering
    438     bool needsFiltering(const sp<const DisplayDevice>& hw) const;
    439 
    440     uint32_t getEffectiveUsage(uint32_t usage) const;
    441     FloatRect computeCrop(const sp<const DisplayDevice>& hw) const;
    442     bool isCropped() const;
    443     static bool getOpacityForFormat(uint32_t format);
    444 
    445     // drawing
    446     void clearWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip,
    447             float r, float g, float b, float alpha) const;
    448     void drawWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip,
    449             bool useIdentityTransform) const;
    450 
    451     // Temporary - Used only for LEGACY camera mode.
    452     uint32_t getProducerStickyTransform() const;
    453 
    454     // -----------------------------------------------------------------------
    455 
    456     class SyncPoint
    457     {
    458     public:
    459         SyncPoint(uint64_t frameNumber) : mFrameNumber(frameNumber),
    460                 mFrameIsAvailable(false), mTransactionIsApplied(false) {}
    461 
    462         uint64_t getFrameNumber() const {
    463             return mFrameNumber;
    464         }
    465 
    466         bool frameIsAvailable() const {
    467             return mFrameIsAvailable;
    468         }
    469 
    470         void setFrameAvailable() {
    471             mFrameIsAvailable = true;
    472         }
    473 
    474         bool transactionIsApplied() const {
    475             return mTransactionIsApplied;
    476         }
    477 
    478         void setTransactionApplied() {
    479             mTransactionIsApplied = true;
    480         }
    481 
    482     private:
    483         const uint64_t mFrameNumber;
    484         std::atomic<bool> mFrameIsAvailable;
    485         std::atomic<bool> mTransactionIsApplied;
    486     };
    487 
    488     // SyncPoints which will be signaled when the correct frame is at the head
    489     // of the queue and dropped after the frame has been latched. Protected by
    490     // mLocalSyncPointMutex.
    491     Mutex mLocalSyncPointMutex;
    492     std::list<std::shared_ptr<SyncPoint>> mLocalSyncPoints;
    493 
    494     // SyncPoints which will be signaled and then dropped when the transaction
    495     // is applied
    496     std::list<std::shared_ptr<SyncPoint>> mRemoteSyncPoints;
    497 
    498     uint64_t getHeadFrameNumber() const;
    499 
    500     // Returns false if the relevant frame has already been latched
    501     bool addSyncPoint(const std::shared_ptr<SyncPoint>& point);
    502 
    503     void pushPendingState();
    504     void popPendingState(State* stateToCommit);
    505     bool applyPendingStates(State* stateToCommit);
    506 
    507     // Returns mCurrentScaling mode (originating from the
    508     // Client) or mOverrideScalingMode mode (originating from
    509     // the Surface Controller) if set.
    510     uint32_t getEffectiveScalingMode() const;
    511 public:
    512     void notifyAvailableFrames();
    513 private:
    514 
    515     // -----------------------------------------------------------------------
    516 
    517     // constants
    518     sp<SurfaceFlingerConsumer> mSurfaceFlingerConsumer;
    519     sp<IGraphicBufferProducer> mProducer;
    520     uint32_t mTextureName;      // from GLES
    521     bool mPremultipliedAlpha;
    522     String8 mName;
    523     PixelFormat mFormat;
    524 
    525     // these are protected by an external lock
    526     State mCurrentState;
    527     State mDrawingState;
    528     volatile int32_t mTransactionFlags;
    529 
    530     // Accessed from main thread and binder threads
    531     Mutex mPendingStateMutex;
    532     Vector<State> mPendingStates;
    533 
    534     // thread-safe
    535     volatile int32_t mQueuedFrames;
    536     volatile int32_t mSidebandStreamChanged; // used like an atomic boolean
    537     FrameTracker mFrameTracker;
    538 
    539     // main thread
    540     sp<GraphicBuffer> mActiveBuffer;
    541     sp<NativeHandle> mSidebandStream;
    542     Rect mCurrentCrop;
    543     uint32_t mCurrentTransform;
    544     uint32_t mCurrentScalingMode;
    545     // We encode unset as -1.
    546     int32_t mOverrideScalingMode;
    547     bool mCurrentOpacity;
    548     std::atomic<uint64_t> mCurrentFrameNumber;
    549     bool mRefreshPending;
    550     bool mFrameLatencyNeeded;
    551     // Whether filtering is forced on or not
    552     bool mFiltering;
    553     // Whether filtering is needed b/c of the drawingstate
    554     bool mNeedsFiltering;
    555     // The mesh used to draw the layer in GLES composition mode
    556     mutable Mesh mMesh;
    557     // The texture used to draw the layer in GLES composition mode
    558     mutable Texture mTexture;
    559 
    560 #ifdef USE_HWC2
    561     // HWC items, accessed from the main thread
    562     struct HWCInfo {
    563         HWCInfo()
    564           : layer(),
    565             forceClientComposition(false),
    566             compositionType(HWC2::Composition::Invalid),
    567             clearClientTarget(false) {}
    568 
    569         std::shared_ptr<HWC2::Layer> layer;
    570         bool forceClientComposition;
    571         HWC2::Composition compositionType;
    572         bool clearClientTarget;
    573     };
    574     std::unordered_map<int32_t, HWCInfo> mHwcLayers;
    575 #else
    576     bool mIsGlesComposition;
    577 #endif
    578 
    579     // page-flip thread (currently main thread)
    580     bool mProtectedByApp; // application requires protected path to external sink
    581 
    582     // protected by mLock
    583     mutable Mutex mLock;
    584     // Set to true once we've returned this surface's handle
    585     mutable bool mHasSurface;
    586     const wp<Client> mClientRef;
    587 
    588     // This layer can be a cursor on some displays.
    589     bool mPotentialCursor;
    590 
    591     // Local copy of the queued contents of the incoming BufferQueue
    592     mutable Mutex mQueueItemLock;
    593     Condition mQueueItemCondition;
    594     Vector<BufferItem> mQueueItems;
    595     std::atomic<uint64_t> mLastFrameNumberReceived;
    596     bool mUpdateTexImageFailed; // This is only modified from the main thread
    597 
    598     bool mAutoRefresh;
    599     bool mFreezePositionUpdates;
    600 };
    601 
    602 // ---------------------------------------------------------------------------
    603 
    604 }; // namespace android
    605 
    606 #endif // ANDROID_LAYER_H
    607