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     void dumpFrameStats(String8& result) const;
    406     void clearFrameStats();
    407     void logFrameStats();
    408     void getFrameStats(FrameStats* outStats) const;
    409 
    410     void getFenceData(String8* outName, uint64_t* outFrameNumber,
    411             bool* outIsGlesComposition, nsecs_t* outPostedTime,
    412             sp<Fence>* outAcquireFence, sp<Fence>* outPrevReleaseFence) const;
    413 
    414     std::vector<OccupancyTracker::Segment> getOccupancyHistory(bool forceFlush);
    415 
    416     bool getFrameTimestamps(uint64_t frameNumber,
    417             FrameTimestamps* outTimestamps) const {
    418         return mFlinger->getFrameTimestamps(*this, frameNumber, outTimestamps);
    419     }
    420 
    421     bool getTransformToDisplayInverse() const;
    422 
    423 protected:
    424     // constant
    425     sp<SurfaceFlinger> mFlinger;
    426 
    427     virtual void onFirstRef();
    428 
    429     /*
    430      * Trivial class, used to ensure that mFlinger->onLayerDestroyed(mLayer)
    431      * is called.
    432      */
    433     class LayerCleaner {
    434         sp<SurfaceFlinger> mFlinger;
    435         wp<Layer> mLayer;
    436     protected:
    437         ~LayerCleaner();
    438     public:
    439         LayerCleaner(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer);
    440     };
    441 
    442 
    443 private:
    444     // Interface implementation for SurfaceFlingerConsumer::ContentsChangedListener
    445     virtual void onFrameAvailable(const BufferItem& item) override;
    446     virtual void onFrameReplaced(const BufferItem& item) override;
    447     virtual void onSidebandStreamChanged() override;
    448 
    449     void commitTransaction(const State& stateToCommit);
    450 
    451     // needsLinearFiltering - true if this surface's state requires filtering
    452     bool needsFiltering(const sp<const DisplayDevice>& hw) const;
    453 
    454     uint32_t getEffectiveUsage(uint32_t usage) const;
    455     FloatRect computeCrop(const sp<const DisplayDevice>& hw) const;
    456     bool isCropped() const;
    457     static bool getOpacityForFormat(uint32_t format);
    458 
    459     // drawing
    460     void clearWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip,
    461             float r, float g, float b, float alpha) const;
    462     void drawWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip,
    463             bool useIdentityTransform) const;
    464 
    465     // Temporary - Used only for LEGACY camera mode.
    466     uint32_t getProducerStickyTransform() const;
    467 
    468     // Loads the corresponding system property once per process
    469     static bool latchUnsignaledBuffers();
    470 
    471     // -----------------------------------------------------------------------
    472 
    473     class SyncPoint
    474     {
    475     public:
    476         SyncPoint(uint64_t frameNumber) : mFrameNumber(frameNumber),
    477                 mFrameIsAvailable(false), mTransactionIsApplied(false) {}
    478 
    479         uint64_t getFrameNumber() const {
    480             return mFrameNumber;
    481         }
    482 
    483         bool frameIsAvailable() const {
    484             return mFrameIsAvailable;
    485         }
    486 
    487         void setFrameAvailable() {
    488             mFrameIsAvailable = true;
    489         }
    490 
    491         bool transactionIsApplied() const {
    492             return mTransactionIsApplied;
    493         }
    494 
    495         void setTransactionApplied() {
    496             mTransactionIsApplied = true;
    497         }
    498 
    499     private:
    500         const uint64_t mFrameNumber;
    501         std::atomic<bool> mFrameIsAvailable;
    502         std::atomic<bool> mTransactionIsApplied;
    503     };
    504 
    505     // SyncPoints which will be signaled when the correct frame is at the head
    506     // of the queue and dropped after the frame has been latched. Protected by
    507     // mLocalSyncPointMutex.
    508     Mutex mLocalSyncPointMutex;
    509     std::list<std::shared_ptr<SyncPoint>> mLocalSyncPoints;
    510 
    511     // SyncPoints which will be signaled and then dropped when the transaction
    512     // is applied
    513     std::list<std::shared_ptr<SyncPoint>> mRemoteSyncPoints;
    514 
    515     uint64_t getHeadFrameNumber() const;
    516     bool headFenceHasSignaled() const;
    517 
    518     // Returns false if the relevant frame has already been latched
    519     bool addSyncPoint(const std::shared_ptr<SyncPoint>& point);
    520 
    521     void pushPendingState();
    522     void popPendingState(State* stateToCommit);
    523     bool applyPendingStates(State* stateToCommit);
    524 
    525     // Returns mCurrentScaling mode (originating from the
    526     // Client) or mOverrideScalingMode mode (originating from
    527     // the Surface Controller) if set.
    528     uint32_t getEffectiveScalingMode() const;
    529 public:
    530     void notifyAvailableFrames();
    531 private:
    532 
    533     // -----------------------------------------------------------------------
    534 
    535     // constants
    536     sp<SurfaceFlingerConsumer> mSurfaceFlingerConsumer;
    537     sp<IGraphicBufferProducer> mProducer;
    538     uint32_t mTextureName;      // from GLES
    539     bool mPremultipliedAlpha;
    540     String8 mName;
    541     PixelFormat mFormat;
    542 
    543     // these are protected by an external lock
    544     State mCurrentState;
    545     State mDrawingState;
    546     volatile int32_t mTransactionFlags;
    547 
    548     // Accessed from main thread and binder threads
    549     Mutex mPendingStateMutex;
    550     Vector<State> mPendingStates;
    551 
    552     // thread-safe
    553     volatile int32_t mQueuedFrames;
    554     volatile int32_t mSidebandStreamChanged; // used like an atomic boolean
    555     FrameTracker mFrameTracker;
    556 
    557     // main thread
    558     sp<GraphicBuffer> mActiveBuffer;
    559     sp<NativeHandle> mSidebandStream;
    560     Rect mCurrentCrop;
    561     uint32_t mCurrentTransform;
    562     uint32_t mCurrentScalingMode;
    563     // We encode unset as -1.
    564     int32_t mOverrideScalingMode;
    565     bool mCurrentOpacity;
    566     std::atomic<uint64_t> mCurrentFrameNumber;
    567     bool mRefreshPending;
    568     bool mFrameLatencyNeeded;
    569     // Whether filtering is forced on or not
    570     bool mFiltering;
    571     // Whether filtering is needed b/c of the drawingstate
    572     bool mNeedsFiltering;
    573     // The mesh used to draw the layer in GLES composition mode
    574     mutable Mesh mMesh;
    575     // The texture used to draw the layer in GLES composition mode
    576     mutable Texture mTexture;
    577 
    578 #ifdef USE_HWC2
    579     // HWC items, accessed from the main thread
    580     struct HWCInfo {
    581         HWCInfo()
    582           : layer(),
    583             forceClientComposition(false),
    584             compositionType(HWC2::Composition::Invalid),
    585             clearClientTarget(false) {}
    586 
    587         std::shared_ptr<HWC2::Layer> layer;
    588         bool forceClientComposition;
    589         HWC2::Composition compositionType;
    590         bool clearClientTarget;
    591     };
    592     std::unordered_map<int32_t, HWCInfo> mHwcLayers;
    593 #else
    594     bool mIsGlesComposition;
    595 #endif
    596 
    597     // page-flip thread (currently main thread)
    598     bool mProtectedByApp; // application requires protected path to external sink
    599 
    600     // protected by mLock
    601     mutable Mutex mLock;
    602     // Set to true once we've returned this surface's handle
    603     mutable bool mHasSurface;
    604     const wp<Client> mClientRef;
    605 
    606     // This layer can be a cursor on some displays.
    607     bool mPotentialCursor;
    608 
    609     // Local copy of the queued contents of the incoming BufferQueue
    610     mutable Mutex mQueueItemLock;
    611     Condition mQueueItemCondition;
    612     Vector<BufferItem> mQueueItems;
    613     std::atomic<uint64_t> mLastFrameNumberReceived;
    614     bool mUpdateTexImageFailed; // This is only modified from the main thread
    615 
    616     bool mAutoRefresh;
    617     bool mFreezePositionUpdates;
    618 };
    619 
    620 // ---------------------------------------------------------------------------
    621 
    622 }; // namespace android
    623 
    624 #endif // ANDROID_LAYER_H
    625