diff options
author | Andy McFadden <fadden@android.com> | 2013-01-08 16:06:15 -0800 |
---|---|---|
committer | Andy McFadden <fadden@android.com> | 2013-01-11 10:16:10 -0800 |
commit | 882e3a39ed770b335a203e233b57127fde1c839e (patch) | |
tree | ff8230d5c7681c5bf378cbd9eee086b7dfce28a7 /services | |
parent | 5001001d1164389a96a46121c29e63db20f11281 (diff) | |
download | frameworks_native-882e3a39ed770b335a203e233b57127fde1c839e.zip frameworks_native-882e3a39ed770b335a203e233b57127fde1c839e.tar.gz frameworks_native-882e3a39ed770b335a203e233b57127fde1c839e.tar.bz2 |
Add some comments.
Also, minor tweak to SurfaceTextureLayer.
Change-Id: If616d5ee4e8226dd0e16c5dbb0e0f80db553110e
Diffstat (limited to 'services')
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 16 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.h | 13 | ||||
-rw-r--r-- | services/surfaceflinger/LayerBase.h | 42 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 7 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceTextureLayer.cpp | 1 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceTextureLayer.h | 5 |
6 files changed, 75 insertions, 9 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 8c2dade..f94a9ba 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -125,6 +125,22 @@ void Layer::setName(const String8& name) { sp<ISurface> Layer::createSurface() { + /* + * This class provides an implementation of BnSurface (the "native" or + * "remote" side of the Binder IPC interface ISurface), and mixes in + * LayerCleaner to ensure that mFlinger->onLayerDestroyed() is called for + * this layer when the BSurface is destroyed. + * + * The idea is to provide a handle to the Layer through ISurface that + * is cleaned up automatically when the last reference to the ISurface + * goes away. (The references will be held on the "proxy" side, while + * the Layer exists on the "native" side.) + * + * The Layer has a reference to an instance of SurfaceFlinger's variant + * of GLConsumer, which holds a reference to the BufferQueue. The + * getSurfaceTexture() call returns a Binder interface reference for + * the producer interface of the buffer queue associated with the Layer. + */ class BSurface : public BnSurface, public LayerCleaner { wp<const Layer> mOwner; virtual sp<IGraphicBufferProducer> getSurfaceTexture() const { diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 2d4afc4..ef829ed 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -47,11 +47,19 @@ class GLExtensions; // --------------------------------------------------------------------------- +/* + * The Layer class is essentially a LayerBase combined with a BufferQueue. + * 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 LayerBaseClient, public SurfaceFlingerConsumer::FrameAvailableListener { public: - Layer(SurfaceFlinger* flinger, const sp<Client>& client); + Layer(SurfaceFlinger* flinger, const sp<Client>& client); virtual ~Layer(); virtual const char* getTypeId() const { return "Layer"; } @@ -102,8 +110,9 @@ protected: virtual void clearStats(); private: - friend class SurfaceTextureLayer; + // Creates an instance of ISurface for this Layer. virtual sp<ISurface> createSurface(); + uint32_t getEffectiveUsage(uint32_t usage) const; bool isCropped() const; Rect computeBufferCrop() const; diff --git a/services/surfaceflinger/LayerBase.h b/services/surfaceflinger/LayerBase.h index 7a9471e..47473e7 100644 --- a/services/surfaceflinger/LayerBase.h +++ b/services/surfaceflinger/LayerBase.h @@ -49,6 +49,18 @@ class SurfaceFlinger; // --------------------------------------------------------------------------- +/* + * Layers are rectangular graphic entities, internal to SurfaceFlinger. + * They have properties including width, height, Z-depth, and 2D + * transformations (chiefly translation and 90-degree rotations). + * + * Layers are organized into "layer stacks". Each layer is a member of + * exactly one layer stack, identified by an integer in Layer::State. A + * given layer stack may appear on more than one display. + * + * Notable subclasses (below LayerBaseClient) include Layer, LayerDim, and + * LayerScreenshot. + */ class LayerBase : virtual public RefBase { static int32_t sSequence; @@ -308,16 +320,27 @@ private: // --------------------------------------------------------------------------- +/* + * This adds some additional fields and methods to support some Binder IPC + * interactions. In particular, the LayerBaseClient's lifetime can be + * managed by references to an ISurface object in another process. + */ class LayerBaseClient : public LayerBase { public: - LayerBaseClient(SurfaceFlinger* flinger, const sp<Client>& client); + LayerBaseClient(SurfaceFlinger* flinger, const sp<Client>& client); + + virtual ~LayerBaseClient(); - virtual ~LayerBaseClient(); + // Creates an ISurface associated with this object. This may only be + // called once (see also getSurfaceBinder()). + sp<ISurface> getSurface(); - sp<ISurface> getSurface(); - wp<IBinder> getSurfaceBinder() const; - virtual wp<IBinder> getSurfaceTextureBinder() const; + // Returns the Binder object for the ISurface associated with + // this object. + wp<IBinder> getSurfaceBinder() const; + + virtual wp<IBinder> getSurfaceTextureBinder() const; virtual sp<LayerBaseClient> getLayerBaseClient() const { return const_cast<LayerBaseClient*>(this); } @@ -330,6 +353,10 @@ protected: virtual void dump(String8& result, char* scratch, size_t size) const; virtual void shortDump(String8& result, char* scratch, size_t size) const; + /* + * Trivial class, used to ensure that mFlinger->onLayerDestroyed(mLayer) + * is called. + */ class LayerCleaner { sp<SurfaceFlinger> mFlinger; wp<LayerBaseClient> mLayer; @@ -344,8 +371,13 @@ private: virtual sp<ISurface> createSurface(); mutable Mutex mLock; + + // Set to true if an ISurface has been associated with this object. mutable bool mHasSurface; + + // The ISurface's Binder object, set by getSurface(). wp<IBinder> mClientSurfaceBinder; + const wp<Client> mClientRef; // only read const uint32_t mIdentity; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index f0e5719..46476f9 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -575,13 +575,18 @@ bool SurfaceFlinger::authenticateSurfaceTexture( Mutex::Autolock _l(mStateLock); sp<IBinder> surfaceTextureBinder(bufferProducer->asBinder()); - // Check the visible layer list for the ISurface + // We want to determine whether the IGraphicBufferProducer was created by + // SurfaceFlinger. Check to see if we can find it in the layer list. const LayerVector& currentLayers = mCurrentState.layersSortedByZ; size_t count = currentLayers.size(); for (size_t i=0 ; i<count ; i++) { const sp<LayerBase>& layer(currentLayers[i]); sp<LayerBaseClient> lbc(layer->getLayerBaseClient()); if (lbc != NULL) { + // If this is an instance of Layer (as opposed to, say, LayerDim), + // we will get the consumer interface of SurfaceFlingerConsumer's + // BufferQueue. If it's the same Binder object as the graphic + // buffer producer interface, return success. wp<IBinder> lbcBinder = lbc->getSurfaceTextureBinder(); if (lbcBinder == surfaceTextureBinder) { return true; diff --git a/services/surfaceflinger/SurfaceTextureLayer.cpp b/services/surfaceflinger/SurfaceTextureLayer.cpp index 0b638b4..395c8c8 100644 --- a/services/surfaceflinger/SurfaceTextureLayer.cpp +++ b/services/surfaceflinger/SurfaceTextureLayer.cpp @@ -20,7 +20,6 @@ #include <utils/Errors.h> -#include "Layer.h" #include "SurfaceTextureLayer.h" namespace android { diff --git a/services/surfaceflinger/SurfaceTextureLayer.h b/services/surfaceflinger/SurfaceTextureLayer.h index 8baa8d2..a75ccf4 100644 --- a/services/surfaceflinger/SurfaceTextureLayer.h +++ b/services/surfaceflinger/SurfaceTextureLayer.h @@ -29,12 +29,17 @@ namespace android { class Layer; +/* + * This is a thin wrapper around BufferQueue, used by the Layer class. + */ class SurfaceTextureLayer : public BufferQueue { public: SurfaceTextureLayer(); ~SurfaceTextureLayer(); + // After calling the superclass connect(), set or clear synchronous + // mode appropriately for the specified API. virtual status_t connect(int api, QueueBufferOutput* output); }; |