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