123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476 |
- /*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #ifndef ANDROID_LAYER_H
- #define ANDROID_LAYER_H
- #include <stdint.h>
- #include <sys/types.h>
- #include <EGL/egl.h>
- #include <EGL/eglext.h>
- #include <utils/RefBase.h>
- #include <utils/String8.h>
- #include <utils/Timers.h>
- #include <ui/FrameStats.h>
- #include <ui/GraphicBuffer.h>
- #include <ui/PixelFormat.h>
- #include <ui/Region.h>
- #include <gui/ISurfaceComposerClient.h>
- #include <private/gui/LayerState.h>
- #include "FrameTracker.h"
- #include "Client.h"
- #include "MonitoredProducer.h"
- #include "SurfaceFlinger.h"
- #include "SurfaceFlingerConsumer.h"
- #include "Transform.h"
- #include "DisplayHardware/HWComposer.h"
- #include "DisplayHardware/FloatRect.h"
- #include "RenderEngine/Mesh.h"
- #include "RenderEngine/Texture.h"
- namespace android {
- // ---------------------------------------------------------------------------
- class Client;
- class Colorizer;
- class DisplayDevice;
- class GraphicBuffer;
- class SurfaceFlinger;
- class LayerBlur;
- // ---------------------------------------------------------------------------
- /*
- * A new BufferQueue and a new SurfaceFlingerConsumer are created when the
- * Layer is first referenced.
- *
- * This also implements onFrameAvailable(), which notifies SurfaceFlinger
- * that new data has arrived.
- */
- class Layer : public SurfaceFlingerConsumer::ContentsChangedListener {
- static int32_t sSequence;
- friend class LayerBlur;
- public:
- #ifdef QTI_BSP
- friend class ExLayer;
- #endif
- mutable bool contentDirty;
- // regions below are in window-manager space
- Region visibleRegion;
- Region coveredRegion;
- Region visibleNonTransparentRegion;
- Region surfaceDamageRegion;
- // Layer serial number. This gives layers an explicit ordering, so we
- // have a stable sort order when their layer stack and Z-order are
- // the same.
- int32_t sequence;
- enum { // flags for doTransaction()
- eDontUpdateGeometryState = 0x00000001,
- eVisibleRegion = 0x00000002,
- };
- struct Geometry {
- float x;
- float y;
- uint32_t w;
- uint32_t h;
- bool isPositionPending;
- Rect crop;
- inline bool operator ==(const Geometry& rhs) const {
- return (w == rhs.w && h == rhs.h && crop == rhs.crop && x == rhs.x && y == rhs.y
- && isPositionPending == rhs.isPositionPending);
- }
- inline bool operator !=(const Geometry& rhs) const {
- return !operator ==(rhs);
- }
- };
- struct State {
- Geometry active;
- Geometry requested;
- uint32_t z;
- uint32_t layerStack;
- uint8_t blur;
- uint8_t alpha;
- uint8_t flags;
- uint8_t reserved[2];
- int32_t sequence; // changes when visible regions can change
- Transform transform;
- // the transparentRegion hint is a bit special, it's latched only
- // when we receive a buffer -- this is because it's "content"
- // dependent.
- Region activeTransparentRegion;
- Region requestedTransparentRegion;
- };
- // -----------------------------------------------------------------------
- Layer(SurfaceFlinger* flinger, const sp<Client>& client,
- const String8& name, uint32_t w, uint32_t h, uint32_t flags);
- virtual ~Layer();
- // the this layer's size and format
- status_t setBuffers(uint32_t w, uint32_t h, PixelFormat format, uint32_t flags);
- // modify current state
- bool setPosition(float x, float y);
- bool setLayer(uint32_t z);
- bool setBlur(uint8_t blur);
- virtual bool setBlurMaskLayer(sp<Layer>& /*maskLayer*/) { return false; }
- virtual bool setBlurMaskSampling(int32_t /*sampling*/) { return false; }
- virtual bool setBlurMaskAlphaThreshold(float /*alpha*/) { return false; }
- bool setSize(uint32_t w, uint32_t h);
- bool setAlpha(uint8_t alpha);
- bool setMatrix(const layer_state_t::matrix22_t& matrix);
- bool setTransparentRegionHint(const Region& transparent);
- bool setFlags(uint8_t flags, uint8_t mask);
- bool setCrop(const Rect& crop);
- bool setLayerStack(uint32_t layerStack);
- // If we have received a new buffer this frame, we will pass its surface
- // damage down to hardware composer. Otherwise, we must send a region with
- // one empty rect.
- void useSurfaceDamage();
- void useEmptyDamage();
- uint32_t getTransactionFlags(uint32_t flags);
- uint32_t setTransactionFlags(uint32_t flags);
- #ifdef QTI_BSP
- virtual void computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh,
- bool useIdentityTransform) const;
- #else
- void computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh,
- bool useIdentityTransform) const;
- #endif
- Rect computeBounds(const Region& activeTransparentRegion) const;
- Rect computeBounds() const;
- sp<IBinder> getHandle();
- sp<IGraphicBufferProducer> getProducer() const;
- const String8& getName() const;
- // -----------------------------------------------------------------------
- // Virtuals
- virtual const char* getTypeId() const { return "Layer"; }
- /*
- * isOpaque - true if this surface is opaque
- *
- * This takes into account the buffer format (i.e. whether or not the
- * pixel format includes an alpha channel) and the "opaque" flag set
- * on the layer. It does not examine the current plane alpha value.
- */
- virtual bool isOpaque(const Layer::State& s) const;
- /*
- * isSecure - true if this surface is secure, that is if it prevents
- * screenshots or VNC servers.
- */
- virtual bool isSecure() const;
- /*
- * isProtected - true if the layer may contain protected content in the
- * GRALLOC_USAGE_PROTECTED sense.
- */
- virtual bool isProtected() const;
- /*
- * isVisible - true if this layer is visible, false otherwise
- */
- virtual bool isVisible() const;
- /*
- * isFixedSize - true if content has a fixed size
- */
- virtual bool isFixedSize() const;
- /*
- * isBlurLayer - true if this is a LayerBlur instance
- */
- virtual bool isBlurLayer() const { return false; }
- protected:
- /*
- * onDraw - draws the surface.
- */
- virtual void onDraw(const sp<const DisplayDevice>& hw, const Region& clip,
- bool useIdentityTransform);
- public:
- // -----------------------------------------------------------------------
- void setGeometry(const sp<const DisplayDevice>& hw,
- HWComposer::HWCLayerInterface& layer);
- virtual void setPerFrameData(const sp<const DisplayDevice>& hw,
- HWComposer::HWCLayerInterface& layer);
- void setAcquireFence(const sp<const DisplayDevice>& hw,
- HWComposer::HWCLayerInterface& layer);
- Rect getPosition(const sp<const DisplayDevice>& hw);
- /*
- * called after page-flip
- */
- void onLayerDisplayed(const sp<const DisplayDevice>& hw,
- HWComposer::HWCLayerInterface* layer);
- bool shouldPresentNow(const DispSync& dispSync) const;
- /*
- * called before composition.
- * returns true if the layer has pending updates.
- */
- bool onPreComposition();
- /*
- * called after composition.
- */
- void onPostComposition();
- /*
- * draw - performs some global clipping optimizations
- * and calls onDraw().
- */
- void draw(const sp<const DisplayDevice>& hw, const Region& clip);
- void draw(const sp<const DisplayDevice>& hw, bool useIdentityTransform);
- void draw(const sp<const DisplayDevice>& hw);
- /*
- * doTransaction - process the transaction. This is a good place to figure
- * out which attributes of the surface have changed.
- */
- uint32_t doTransaction(uint32_t transactionFlags);
- /*
- * setVisibleRegion - called to set the new visible region. This gives
- * a chance to update the new visible region or record the fact it changed.
- */
- void setVisibleRegion(const Region& visibleRegion);
- /*
- * setCoveredRegion - called when the covered region changes. The covered
- * region corresponds to any area of the surface that is covered
- * (transparently or not) by another surface.
- */
- void setCoveredRegion(const Region& coveredRegion);
- /*
- * setVisibleNonTransparentRegion - called when the visible and
- * non-transparent region changes.
- */
- void setVisibleNonTransparentRegion(const Region&
- visibleNonTransparentRegion);
- /*
- * latchBuffer - called each time the screen is redrawn and returns whether
- * the visible regions need to be recomputed (this is a fairly heavy
- * operation, so this should be set only if needed). Typically this is used
- * to figure out if the content or size of a surface has changed.
- */
- Region latchBuffer(bool& recomputeVisibleRegions);
- bool isPotentialCursor() const { return mPotentialCursor;}
- /*
- * called with the state lock when the surface is removed from the
- * current list
- */
- void onRemoved();
- // Updates the transform hint in our SurfaceFlingerConsumer to match
- // the current orientation of the display device.
- void updateTransformHint(const sp<const DisplayDevice>& hw) ;
- /* ------------------------------------------------------------------------
- * Extensions
- */
- virtual bool isExtOnly() const { return false; }
- virtual bool isIntOnly() const { return false; }
- virtual bool isSecureDisplay() const { return false; }
- virtual bool isYuvLayer() const { return false; }
- virtual void setPosition(const sp<const DisplayDevice>& /*hw*/,
- HWComposer::HWCLayerInterface& /*layer*/,
- const State& /*state*/) { }
- virtual void setAcquiredFenceIfBlit(int& /*fenceFd */,
- HWComposer::HWCLayerInterface& /*layer */) { }
- virtual bool canAllowGPUForProtected() const { return false; }
- /*
- * returns the rectangle that crops the content of the layer and scales it
- * to the layer's size.
- */
- Rect getContentCrop() const;
- /*
- * Returns if a frame is queued.
- */
- bool hasQueuedFrame() const { return mQueuedFrames > 0 || mSidebandStreamChanged; }
- // -----------------------------------------------------------------------
- void clearWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip) const;
- void setFiltering(bool filtering);
- bool getFiltering() const;
- // only for debugging
- inline const sp<GraphicBuffer>& getActiveBuffer() const { return mActiveBuffer; }
- inline const State& getDrawingState() const { return mDrawingState; }
- inline const State& getCurrentState() const { return mCurrentState; }
- inline State& getCurrentState() { return mCurrentState; }
- /* always call base class first */
- void dump(String8& result, Colorizer& colorizer) const;
- void dumpFrameStats(String8& result) const;
- void clearFrameStats();
- void logFrameStats();
- void getFrameStats(FrameStats* outStats) const;
- protected:
- // constant
- sp<SurfaceFlinger> mFlinger;
- virtual void onFirstRef();
- /*
- * Trivial class, used to ensure that mFlinger->onLayerDestroyed(mLayer)
- * is called.
- */
- class LayerCleaner {
- sp<SurfaceFlinger> mFlinger;
- wp<Layer> mLayer;
- protected:
- ~LayerCleaner();
- public:
- LayerCleaner(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer);
- };
- Rect reduce(const Rect& win, const Region& exclude) const;
- private:
- // Interface implementation for SurfaceFlingerConsumer::ContentsChangedListener
- virtual void onFrameAvailable(const BufferItem& item) override;
- virtual void onFrameReplaced(const BufferItem& item) override;
- virtual void onSidebandStreamChanged() override;
- void commitTransaction();
- // needsLinearFiltering - true if this surface's state requires filtering
- bool needsFiltering(const sp<const DisplayDevice>& hw) const;
- uint32_t getEffectiveUsage(uint32_t usage) const;
- FloatRect computeCrop(const sp<const DisplayDevice>& hw) const;
- bool isCropped() const;
- static bool getOpacityForFormat(uint32_t format);
- // drawing
- void clearWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip,
- float r, float g, float b, float alpha) const;
- #ifdef QTI_BSP
- virtual void drawWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip,
- bool useIdentityTransform) const;
- #else
- void drawWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip,
- bool useIdentityTransform) const;
- #endif
- // Temporary - Used only for LEGACY camera mode.
- uint32_t getProducerStickyTransform() const;
- // -----------------------------------------------------------------------
- // constants
- sp<SurfaceFlingerConsumer> mSurfaceFlingerConsumer;
- sp<IGraphicBufferProducer> mProducer;
- uint32_t mTextureName; // from GLES
- bool mPremultipliedAlpha;
- String8 mName;
- PixelFormat mFormat;
- // these are protected by an external lock
- State mCurrentState;
- State mDrawingState;
- volatile int32_t mTransactionFlags;
- // thread-safe
- volatile int32_t mQueuedFrames;
- volatile int32_t mSidebandStreamChanged; // used like an atomic boolean
- FrameTracker mFrameTracker;
- // main thread
- sp<GraphicBuffer> mActiveBuffer;
- sp<NativeHandle> mSidebandStream;
- Rect mCurrentCrop;
- uint32_t mCurrentTransform;
- uint32_t mCurrentScalingMode;
- bool mCurrentOpacity;
- bool mRefreshPending;
- bool mFrameLatencyNeeded;
- // Whether filtering is forced on or not
- bool mFiltering;
- // Whether filtering is needed b/c of the drawingstate
- bool mNeedsFiltering;
- // The mesh used to draw the layer in GLES composition mode
- mutable Mesh mMesh;
- // The texture used to draw the layer in GLES composition mode
- mutable Texture mTexture;
- // page-flip thread (currently main thread)
- bool mProtectedByApp; // application requires protected path to external sink
- // protected by mLock
- mutable Mutex mLock;
- // Set to true once we've returned this surface's handle
- mutable bool mHasSurface;
- const wp<Client> mClientRef;
- // This layer can be a cursor on some displays.
- bool mPotentialCursor;
- // Local copy of the queued contents of the incoming BufferQueue
- mutable Mutex mQueueItemLock;
- Condition mQueueItemCondition;
- Vector<BufferItem> mQueueItems;
- uint64_t mLastFrameNumberReceived;
- bool mUpdateTexImageFailed; // This is only modified from the main thread
- uint32_t mTransformHint;
- };
- // ---------------------------------------------------------------------------
- }; // namespace android
- #endif // ANDROID_LAYER_H
|