diff options
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.h')
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 663 |
1 files changed, 338 insertions, 325 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index b20973b..1f79906 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -20,6 +20,9 @@ #include <stdint.h> #include <sys/types.h> +#include <EGL/egl.h> +#include <GLES/gl.h> + #include <cutils/compiler.h> #include <utils/Atomic.h> @@ -33,66 +36,38 @@ #include <binder/IMemory.h> #include <ui/PixelFormat.h> + #include <gui/IGraphicBufferAlloc.h> #include <gui/ISurfaceComposer.h> #include <gui/ISurfaceComposerClient.h> -#include "Barrier.h" -#include "Layer.h" +#include <hardware/hwcomposer_defs.h> + +#include <private/gui/LayerState.h> +#include "Barrier.h" #include "MessageQueue.h" +#include "DisplayDevice.h" + +#include "DisplayHardware/HWComposer.h" namespace android { // --------------------------------------------------------------------------- class Client; -class DisplayHardware; class DisplayEventConnection; class EventThread; class Layer; +class LayerBase; +class LayerBaseClient; class LayerDim; class LayerScreenshot; -struct surface_flinger_cblk_t; +class SurfaceTextureClient; // --------------------------------------------------------------------------- -class Client : public BnSurfaceComposerClient -{ -public: - Client(const sp<SurfaceFlinger>& flinger); - ~Client(); - - status_t initCheck() const; - - // protected by SurfaceFlinger::mStateLock - size_t attachLayer(const sp<LayerBaseClient>& layer); - void detachLayer(const LayerBaseClient* layer); - sp<LayerBaseClient> getLayerUser(int32_t i) const; - -private: - // ISurfaceComposerClient interface - virtual sp<ISurface> createSurface( - surface_data_t* params, const String8& name, - DisplayID display, uint32_t w, uint32_t h,PixelFormat format, - uint32_t flags); - virtual status_t destroySurface(SurfaceID surfaceId); - virtual status_t onTransact( - uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); - - // constant - sp<SurfaceFlinger> mFlinger; - - // protected by mLock - DefaultKeyedVector< size_t, wp<LayerBaseClient> > mLayers; - size_t mNameGenerator; - - // thread-safe - mutable Mutex mLock; -}; - -class GraphicBufferAlloc : public BnGraphicBufferAlloc -{ +class GraphicBufferAlloc : public BnGraphicBufferAlloc { public: GraphicBufferAlloc(); virtual ~GraphicBufferAlloc(); @@ -102,135 +77,66 @@ public: // --------------------------------------------------------------------------- -class GraphicPlane -{ -public: - static status_t orientationToTransfrom(int orientation, int w, int h, - Transform* tr); - - GraphicPlane(); - ~GraphicPlane(); - - bool initialized() const; - - void setDisplayHardware(DisplayHardware *); - status_t setOrientation(int orientation); - int getOrientation() const { return mOrientation; } - int getWidth() const; - int getHeight() const; - - const DisplayHardware& displayHardware() const; - DisplayHardware& editDisplayHardware(); - const Transform& transform() const; - EGLDisplay getEGLDisplay() const; - -private: - GraphicPlane(const GraphicPlane&); - GraphicPlane operator = (const GraphicPlane&); - - DisplayHardware* mHw; - Transform mGlobalTransform; - Transform mDisplayTransform; - int mOrientation; - float mDisplayWidth; - float mDisplayHeight; - int mWidth; - int mHeight; -}; - -// --------------------------------------------------------------------------- - enum { - eTransactionNeeded = 0x01, - eTraversalNeeded = 0x02 + eTransactionNeeded = 0x01, + eTraversalNeeded = 0x02, + eDisplayTransactionNeeded = 0x04, + eTransactionMask = 0x07 }; -class SurfaceFlinger : - public BinderService<SurfaceFlinger>, - public BnSurfaceComposer, - public IBinder::DeathRecipient, - protected Thread +class SurfaceFlinger : public BinderService<SurfaceFlinger>, + public BnSurfaceComposer, + private IBinder::DeathRecipient, + private Thread, + private HWComposer::EventHandler { public: - static char const* getServiceName() { return "SurfaceFlinger"; } - - SurfaceFlinger(); - virtual ~SurfaceFlinger(); - void init(); + static char const* getServiceName() { + return "SurfaceFlinger"; + } - virtual status_t onTransact( - uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); + SurfaceFlinger(); - virtual status_t dump(int fd, const Vector<String16>& args); - - // ISurfaceComposer interface - virtual sp<ISurfaceComposerClient> createConnection(); - virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc(); - virtual sp<IMemoryHeap> getCblk() const; - virtual void bootFinished(); - virtual void setTransactionState(const Vector<ComposerState>& state, - int orientation, uint32_t flags); - virtual bool authenticateSurfaceTexture(const sp<ISurfaceTexture>& surface) const; - virtual sp<IDisplayEventConnection> createDisplayEventConnection(); - - virtual status_t captureScreen(DisplayID dpy, - sp<IMemoryHeap>* heap, - uint32_t* width, uint32_t* height, - PixelFormat* format, uint32_t reqWidth, uint32_t reqHeight, - uint32_t minLayerZ, uint32_t maxLayerZ); - - virtual status_t turnElectronBeamOff(int32_t mode); - virtual status_t turnElectronBeamOn(int32_t mode); - - - // called when screen needs to turn off - void screenReleased(); - // called when screen is turning back on - void screenAcquired(); - - // called on the main thread in response to screenReleased() - void onScreenReleased(); - // called on the main thread in response to screenAcquired() - void onScreenAcquired(); + enum { + EVENT_VSYNC = HWC_EVENT_VSYNC + }; + // post an asynchronous message to the main thread + status_t postMessageAsync(const sp<MessageBase>& msg, nsecs_t reltime = 0, + uint32_t flags = 0); - status_t renderScreenToTexture(DisplayID dpy, - GLuint* textureName, GLfloat* uOut, GLfloat* vOut); - status_t renderScreenToTextureLocked(DisplayID dpy, - GLuint* textureName, GLfloat* uOut, GLfloat* vOut); + // post a synchronous message to the main thread + status_t postMessageSync(const sp<MessageBase>& msg, nsecs_t reltime = 0, + uint32_t flags = 0); - void onMessageReceived(int32_t what); + // force full composition on all displays + void repaintEverything(); - status_t postMessageAsync(const sp<MessageBase>& msg, - nsecs_t reltime=0, uint32_t flags = 0); + // renders content on given display to a texture. thread-safe version. + status_t renderScreenToTexture(DisplayID dpy, GLuint* textureName, + GLfloat* uOut, GLfloat* vOut); - status_t postMessageSync(const sp<MessageBase>& msg, - nsecs_t reltime=0, uint32_t flags = 0); + // renders content on given display to a texture, w/o acquiring main lock + status_t renderScreenToTextureLocked(DisplayID dpy, GLuint* textureName, + GLfloat* uOut, GLfloat* vOut); - status_t removeLayer(const sp<LayerBase>& layer); - status_t addLayer(const sp<LayerBase>& layer); - status_t invalidateLayerVisibility(const sp<LayerBase>& layer); - void invalidateHwcGeometry(); + // returns the default Display + sp<const DisplayDevice> getDefaultDisplayDevice() const { + return getDisplayDevice(DisplayDevice::DISPLAY_ID_MAIN); + } - sp<Layer> getLayer(const sp<ISurface>& sur) const; + // utility function to delete a texture on the main thread + void deleteTextureAsync(GLuint texture); - GLuint getProtectedTexName() const { return mProtectedTexName; } + // enable/disable h/w composer event + // TODO: this should be made accessible only to EventThread + void eventControl(int event, int enabled); - class MessageDestroyGLTexture : public MessageBase { - GLuint texture; - public: - MessageDestroyGLTexture(GLuint texture) : texture(texture) { } - virtual bool handler() { - glDeleteTextures(1, &texture); - return true; - } - }; - - -private: - // DeathRecipient interface - virtual void binderDied(const wp<IBinder>& who); + // called on the main thread by MessageQueue when an internal message + // is received + // TODO: this should be made accessible only to MessageQueue + void onMessageReceived(int32_t what); private: friend class Client; @@ -239,190 +145,297 @@ private: friend class LayerBaseClient; friend class Layer; - sp<ISurface> createSurface( - ISurfaceComposerClient::surface_data_t* params, - const String8& name, - const sp<Client>& client, - DisplayID display, uint32_t w, uint32_t h, PixelFormat format, - uint32_t flags); - - sp<Layer> createNormalSurface( - const sp<Client>& client, DisplayID display, - uint32_t w, uint32_t h, uint32_t flags, - PixelFormat& format); - - sp<LayerDim> createDimSurface( - const sp<Client>& client, DisplayID display, - uint32_t w, uint32_t h, uint32_t flags); + // We're reference counted, never destroy SurfaceFlinger directly + virtual ~SurfaceFlinger(); - sp<LayerScreenshot> createScreenshotSurface( - const sp<Client>& client, DisplayID display, - uint32_t w, uint32_t h, uint32_t flags); + /* ------------------------------------------------------------------------ + * Internal data structures + */ - status_t removeSurface(const sp<Client>& client, SurfaceID sid); - status_t destroySurface(const wp<LayerBaseClient>& layer); - uint32_t setClientStateLocked(const sp<Client>& client, const layer_state_t& s); - - class LayerVector : public SortedVector< sp<LayerBase> > { + class LayerVector : public SortedVector<sp<LayerBase> > { public: - LayerVector() { } - LayerVector(const LayerVector& rhs) : SortedVector< sp<LayerBase> >(rhs) { } - virtual int do_compare(const void* lhs, const void* rhs) const { - const sp<LayerBase>& l(*reinterpret_cast<const sp<LayerBase>*>(lhs)); - const sp<LayerBase>& r(*reinterpret_cast<const sp<LayerBase>*>(rhs)); - // sort layers by Z order - uint32_t lz = l->currentState().z; - uint32_t rz = r->currentState().z; - // then by sequence, so we get a stable ordering - return (lz != rz) ? (lz - rz) : (l->sequence - r->sequence); - } + LayerVector(); + LayerVector(const LayerVector& rhs); + virtual int do_compare(const void* lhs, const void* rhs) const; + }; + + struct DisplayDeviceState { + DisplayDeviceState(); + DisplayDeviceState(int32_t id); + int32_t id; + sp<ISurfaceTexture> surface; + uint32_t layerStack; + Rect viewport; + Rect frame; + uint8_t orientation; }; struct State { - State() - : orientation(ISurfaceComposer::eOrientationDefault), - orientationFlags(0) { - } - LayerVector layersSortedByZ; - uint8_t orientation; - uint8_t orientationFlags; + LayerVector layersSortedByZ; + DefaultKeyedVector< wp<IBinder>, DisplayDeviceState> displays; }; - virtual bool threadLoop(); - virtual status_t readyToRun(); - virtual void onFirstRef(); + /* ------------------------------------------------------------------------ + * IBinder interface + */ + virtual status_t onTransact(uint32_t code, const Parcel& data, + Parcel* reply, uint32_t flags); + virtual status_t dump(int fd, const Vector<String16>& args); -public: // hack to work around gcc 4.0.3 bug - const GraphicPlane& graphicPlane(int dpy) const; - GraphicPlane& graphicPlane(int dpy); + /* ------------------------------------------------------------------------ + * ISurfaceComposer interface + */ + virtual sp<ISurfaceComposerClient> createConnection(); + virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc(); + virtual sp<IBinder> createDisplay(); + virtual sp<IBinder> getBuiltInDisplay(int32_t id); + virtual void setTransactionState(const Vector<ComposerState>& state, + const Vector<DisplayState>& displays, uint32_t flags); + virtual void bootFinished(); + virtual bool authenticateSurfaceTexture( + const sp<ISurfaceTexture>& surface) const; + virtual sp<IDisplayEventConnection> createDisplayEventConnection(); + virtual status_t captureScreen(DisplayID dpy, sp<IMemoryHeap>* heap, + uint32_t* width, uint32_t* height, PixelFormat* format, + uint32_t reqWidth, uint32_t reqHeight, uint32_t minLayerZ, + uint32_t maxLayerZ); + // called when screen needs to turn off + virtual void blank(); + // called when screen is turning back on + virtual void unblank(); + virtual status_t getDisplayInfo(DisplayID dpy, DisplayInfo* info); + virtual void connectDisplay(const sp<ISurfaceTexture> display); + + /* ------------------------------------------------------------------------ + * DeathRecipient interface + */ + virtual void binderDied(const wp<IBinder>& who); - void signalTransaction(); - void signalLayerUpdate(); - void signalRefresh(); - void repaintEverything(); + /* ------------------------------------------------------------------------ + * Thread interface + */ + virtual bool threadLoop(); + virtual status_t readyToRun(); + virtual void onFirstRef(); + + /* ------------------------------------------------------------------------ + * HWComposer::EventHandler interface + */ + virtual void onVSyncReceived(int dpy, nsecs_t timestamp); + + /* ------------------------------------------------------------------------ + * Message handling + */ + void waitForEvent(); + void signalTransaction(); + void signalLayerUpdate(); + void signalRefresh(); + + // called on the main thread in response to screenReleased() + void onScreenReleased(); + // called on the main thread in response to screenAcquired() + void onScreenAcquired(); + + void handleMessageTransaction(); + void handleMessageInvalidate(); + void handleMessageRefresh(); + + void handleTransaction(uint32_t transactionFlags); + void handleTransactionLocked(uint32_t transactionFlags); + + /* handlePageFilp: this is were we latch a new buffer + * if available and compute the dirty region. + */ + void handlePageFlip(); + + /* ------------------------------------------------------------------------ + * Transactions + */ + uint32_t getTransactionFlags(uint32_t flags); + uint32_t peekTransactionFlags(uint32_t flags); + uint32_t setTransactionFlags(uint32_t flags); + void commitTransaction(); + uint32_t setClientStateLocked(const sp<Client>& client, + const layer_state_t& s); + uint32_t setDisplayStateLocked(const DisplayState& s); + + /* ------------------------------------------------------------------------ + * Layer management + */ + sp<ISurface> createLayer(ISurfaceComposerClient::surface_data_t* params, + const String8& name, const sp<Client>& client, DisplayID display, + uint32_t w, uint32_t h, PixelFormat format, uint32_t flags); + + sp<Layer> createNormalLayer(const sp<Client>& client, DisplayID display, + uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format); + + sp<LayerDim> createDimLayer(const sp<Client>& client, DisplayID display, + uint32_t w, uint32_t h, uint32_t flags); + + sp<LayerScreenshot> createScreenshotLayer(const sp<Client>& client, + DisplayID display, uint32_t w, uint32_t h, uint32_t flags); + + // called in response to the window-manager calling + // ISurfaceComposerClient::destroySurface() + // The specified layer is first placed in a purgatory list + // until all references from the client are released. + status_t onLayerRemoved(const sp<Client>& client, SurfaceID sid); + + // called when all clients have released all their references to + // this layer meaning it is entirely safe to destroy all + // resources associated to this layer. + status_t onLayerDestroyed(const wp<LayerBaseClient>& layer); + + // remove a layer from SurfaceFlinger immediately + status_t removeLayer(const sp<LayerBase>& layer); -private: - void waitForEvent(); - void handleTransaction(uint32_t transactionFlags); - void handleTransactionLocked(uint32_t transactionFlags); - - void computeVisibleRegions( - const LayerVector& currentLayers, - Region& dirtyRegion, - Region& wormholeRegion); - - void handlePageFlip(); - bool lockPageFlip(const LayerVector& currentLayers); - void unlockPageFlip(const LayerVector& currentLayers); - void handleRefresh(); - void handleWorkList(); - void handleRepaint(); - void postFramebuffer(); - void setupHardwareComposer(); - void composeSurfaces(const Region& dirty); - - - void setInvalidateRegion(const Region& reg); - Region getAndClearInvalidateRegion(); - - ssize_t addClientLayer(const sp<Client>& client, - const sp<LayerBaseClient>& lbc); - status_t addLayer_l(const sp<LayerBase>& layer); - status_t removeLayer_l(const sp<LayerBase>& layer); - status_t purgatorizeLayer_l(const sp<LayerBase>& layer); - - uint32_t getTransactionFlags(uint32_t flags); - uint32_t peekTransactionFlags(uint32_t flags); - uint32_t setTransactionFlags(uint32_t flags); - void commitTransaction(); - - - status_t captureScreenImplLocked(DisplayID dpy, - sp<IMemoryHeap>* heap, - uint32_t* width, uint32_t* height, PixelFormat* format, - uint32_t reqWidth, uint32_t reqHeight, - uint32_t minLayerZ, uint32_t maxLayerZ); - - status_t turnElectronBeamOffImplLocked(int32_t mode); - status_t turnElectronBeamOnImplLocked(int32_t mode); - status_t electronBeamOffAnimationImplLocked(); - status_t electronBeamOnAnimationImplLocked(); - - void debugFlashRegions(); - void drawWormhole() const; - - void startBootAnim(); - - void listLayersLocked(const Vector<String16>& args, size_t& index, - String8& result, char* buffer, size_t SIZE) const; - void dumpStatsLocked(const Vector<String16>& args, size_t& index, - String8& result, char* buffer, size_t SIZE) const; - void clearStatsLocked(const Vector<String16>& args, size_t& index, - String8& result, char* buffer, size_t SIZE) const; - void dumpAllLocked(String8& result, char* buffer, size_t SIZE) const; - - mutable MessageQueue mEventQueue; - - // access must be protected by mStateLock - mutable Mutex mStateLock; - State mCurrentState; - volatile int32_t mTransactionFlags; - Condition mTransactionCV; - SortedVector< sp<LayerBase> > mLayerPurgatory; - bool mTransationPending; - Vector< sp<LayerBase> > mLayersPendingRemoval; - - // protected by mStateLock (but we could use another lock) - GraphicPlane mGraphicPlanes[1]; - bool mLayersRemoved; - DefaultKeyedVector< wp<IBinder>, wp<Layer> > mLayerMap; - - // access must be protected by mInvalidateLock - mutable Mutex mInvalidateLock; - Region mInvalidateRegion; - - // constant members (no synchronization needed for access) - sp<IMemoryHeap> mServerHeap; - surface_flinger_cblk_t* mServerCblk; - GLuint mWormholeTexName; - GLuint mProtectedTexName; - nsecs_t mBootTime; - sp<EventThread> mEventThread; - - // Can only accessed from the main thread, these members - // don't need synchronization - State mDrawingState; - Region mDirtyRegion; - Region mDirtyRegionRemovedLayer; - Region mSwapRegion; - Region mWormholeRegion; - bool mVisibleRegionsDirty; - bool mHwWorkListDirty; - int32_t mElectronBeamAnimationMode; - Vector< sp<LayerBase> > mVisibleLayersSortedByZ; - - - // don't use a lock for these, we don't care - int mDebugRegion; - int mDebugDDMS; - int mDebugDisableHWC; - int mDebugDisableTransformHint; - volatile nsecs_t mDebugInSwapBuffers; - nsecs_t mLastSwapBufferTime; - volatile nsecs_t mDebugInTransaction; - nsecs_t mLastTransactionTime; - bool mBootFinished; - - // these are thread safe - mutable Barrier mReadyToRunBarrier; - - - // protected by mDestroyedLayerLock; - mutable Mutex mDestroyedLayerLock; - Vector<LayerBase const *> mDestroyedLayers; - - // only written in the main thread, only read in other threads - volatile int32_t mSecureFrameBuffer; + // add a layer to SurfaceFlinger + ssize_t addClientLayer(const sp<Client>& client, + const sp<LayerBaseClient>& lbc); + + status_t removeLayer_l(const sp<LayerBase>& layer); + status_t purgatorizeLayer_l(const sp<LayerBase>& layer); + + /* ------------------------------------------------------------------------ + * Boot animation, on/off animations and screen capture + */ + + void startBootAnim(); + + status_t captureScreenImplLocked(DisplayID dpy, sp<IMemoryHeap>* heap, + uint32_t* width, uint32_t* height, PixelFormat* format, + uint32_t reqWidth, uint32_t reqHeight, uint32_t minLayerZ, + uint32_t maxLayerZ); + + /* ------------------------------------------------------------------------ + * EGL + */ + static status_t selectConfigForPixelFormat(EGLDisplay dpy, + EGLint const* attrs, PixelFormat format, EGLConfig* outConfig); + static EGLConfig selectEGLConfig(EGLDisplay disp, EGLint visualId); + static EGLContext createGLContext(EGLDisplay disp, EGLConfig config); + void initializeGL(EGLDisplay display, EGLSurface surface); + uint32_t getMaxTextureSize() const; + uint32_t getMaxViewportDims() const; + + /* ------------------------------------------------------------------------ + * Display and layer stack management + */ + sp<const DisplayDevice> getDisplayDevice(DisplayID dpy) const { + return mDisplays.valueFor(dpy); + } + const sp<DisplayDevice>& getDisplayDevice(DisplayID dpy) { + return mDisplays.valueFor(dpy); + } + + // mark a region of a layer stack dirty. this updates the dirty + // region of all screens presenting this layer stack. + void invalidateLayerStack(uint32_t layerStack, const Region& dirty); + + /* ------------------------------------------------------------------------ + * H/W composer + */ + + HWComposer& getHwComposer() const { return *mHwc; } + + /* ------------------------------------------------------------------------ + * Compositing + */ + void invalidateHwcGeometry(); + void computeVisibleRegions(const LayerVector& currentLayers, + uint32_t layerStack, + Region& dirtyRegion, Region& opaqueRegion); + + void preComposition(); + void postComposition(); + void rebuildLayerStacks(); + void setUpHWComposer(); + void doComposition(); + void doDebugFlashRegions(); + void doDisplayComposition(const sp<const DisplayDevice>& hw, + const Region& dirtyRegion); + void doComposeSurfaces(const sp<const DisplayDevice>& hw, + const Region& dirty); + + void postFramebuffer(); + void drawWormhole(const Region& region) const; + GLuint getProtectedTexName() const { + return mProtectedTexName; + } + + /* ------------------------------------------------------------------------ + * Debugging & dumpsys + */ + void listLayersLocked(const Vector<String16>& args, size_t& index, + String8& result, char* buffer, size_t SIZE) const; + void dumpStatsLocked(const Vector<String16>& args, size_t& index, + String8& result, char* buffer, size_t SIZE) const; + void clearStatsLocked(const Vector<String16>& args, size_t& index, + String8& result, char* buffer, size_t SIZE) const; + void dumpAllLocked(String8& result, char* buffer, size_t SIZE) const; + + /* ------------------------------------------------------------------------ + * Attributes + */ + + // access must be protected by mStateLock + mutable Mutex mStateLock; + State mCurrentState; + volatile int32_t mTransactionFlags; + Condition mTransactionCV; + SortedVector<sp<LayerBase> > mLayerPurgatory; + bool mTransationPending; + Vector<sp<LayerBase> > mLayersPendingRemoval; + + // protected by mStateLock (but we could use another lock) + bool mLayersRemoved; + + // access must be protected by mInvalidateLock + volatile int32_t mRepaintEverything; + + // constant members (no synchronization needed for access) + HWComposer* mHwc; + GLuint mProtectedTexName; + nsecs_t mBootTime; + sp<EventThread> mEventThread; + GLint mMaxViewportDims[2]; + GLint mMaxTextureSize; + EGLContext mEGLContext; + EGLConfig mEGLConfig; + EGLDisplay mEGLDisplay; + sp<IBinder> mDefaultDisplays[DisplayDevice::DISPLAY_ID_COUNT]; + + // Can only accessed from the main thread, these members + // don't need synchronization + State mDrawingState; + bool mVisibleRegionsDirty; + bool mHwWorkListDirty; + DefaultKeyedVector<int32_t, sp<DisplayDevice> > mDisplays; + + // don't use a lock for these, we don't care + int mDebugRegion; + int mDebugDDMS; + int mDebugDisableHWC; + int mDebugDisableTransformHint; + volatile nsecs_t mDebugInSwapBuffers; + nsecs_t mLastSwapBufferTime; + volatile nsecs_t mDebugInTransaction; + nsecs_t mLastTransactionTime; + bool mBootFinished; + + // these are thread safe + mutable MessageQueue mEventQueue; + mutable Barrier mReadyToRunBarrier; + + // protected by mDestroyedLayerLock; + mutable Mutex mDestroyedLayerLock; + Vector<LayerBase const *> mDestroyedLayers; + + /* ------------------------------------------------------------------------ + * Feature prototyping + */ + + sp<IBinder> mExtDisplayToken; }; // --------------------------------------------------------------------------- |