summaryrefslogtreecommitdiffstats
path: root/services/surfaceflinger/SurfaceFlinger.h
diff options
context:
space:
mode:
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.h')
-rw-r--r--services/surfaceflinger/SurfaceFlinger.h663
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;
};
// ---------------------------------------------------------------------------