From 9db3d07b9620b4269ab33f78604a36327e536ce1 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Queru Date: Thu, 12 Nov 2009 18:45:53 -0800 Subject: eclair snapshot --- libs/surfaceflinger/LayerBuffer.h | 96 +++++++++++++++++++-------------------- 1 file changed, 47 insertions(+), 49 deletions(-) (limited to 'libs/surfaceflinger/LayerBuffer.h') diff --git a/libs/surfaceflinger/LayerBuffer.h b/libs/surfaceflinger/LayerBuffer.h index 2dc77f1501e9..47482f49e476 100644 --- a/libs/surfaceflinger/LayerBuffer.h +++ b/libs/surfaceflinger/LayerBuffer.h @@ -20,21 +20,20 @@ #include #include -#include -#include -#include - #include "LayerBase.h" -#include "LayerBitmap.h" + +struct copybit_device_t; namespace android { // --------------------------------------------------------------------------- -class MemoryDealer; +class Buffer; class Region; class OverlayRef; +// --------------------------------------------------------------------------- + class LayerBuffer : public LayerBaseClient { class Source : public LightRefBase { @@ -47,11 +46,11 @@ class LayerBuffer : public LayerBaseClient virtual void postBuffer(ssize_t offset); virtual void unregisterBuffers(); virtual bool transformed() const; + virtual void destroy() { } protected: LayerBuffer& mLayer; }; - public: static const uint32_t typeInfo; static const char* const typeID; @@ -59,12 +58,14 @@ public: virtual uint32_t getTypeInfo() const { return typeInfo; } LayerBuffer(SurfaceFlinger* flinger, DisplayID display, - Client* client, int32_t i); + const sp& client, int32_t i); virtual ~LayerBuffer(); + virtual void onFirstRef(); virtual bool needsBlending() const; - virtual sp getSurface() const; + virtual sp createSurface() const; + virtual status_t ditch(); virtual void onDraw(const Region& clip) const; virtual uint32_t doTransaction(uint32_t flags); virtual void unlockPageFlip(const Transform& planeTransform, Region& outDirtyRegion); @@ -78,16 +79,23 @@ public: sp getSource() const; sp clearSource(); void setNeedsBlending(bool blending); - const Rect& getTransformedBounds() const { + Rect getTransformedBounds() const { return mTransformedBounds; } + void serverDestroy(); + private: struct NativeBuffer { copybit_image_t img; copybit_rect_t crop; }; + static gralloc_module_t const* sGrallocModule; + static gralloc_module_t const* getGrallocModule() { + return sGrallocModule; + } + class Buffer : public LightRefBase { public: Buffer(const ISurface::BufferHeap& buffers, ssize_t offset); @@ -120,15 +128,15 @@ private: virtual void postBuffer(ssize_t offset); virtual void unregisterBuffers(); virtual bool transformed() const; + virtual void destroy() { } private: - mutable Mutex mLock; - sp mBuffer; - status_t mStatus; - ISurface::BufferHeap mBufferHeap; - size_t mBufferSize; - mutable sp mTemporaryDealer; - mutable LayerBitmap mTempBitmap; - mutable GLuint mTextureName; + mutable Mutex mBufferSourceLock; + sp mBuffer; + status_t mStatus; + ISurface::BufferHeap mBufferHeap; + size_t mBufferSize; + mutable sp mTempBitmap; + mutable LayerBase::Texture mTexture; }; class OverlaySource : public Source { @@ -137,30 +145,26 @@ private: sp* overlayRef, uint32_t w, uint32_t h, int32_t format); virtual ~OverlaySource(); + virtual void onDraw(const Region& clip) const; virtual void onTransaction(uint32_t flags); virtual void onVisibilityResolved(const Transform& planeTransform); + virtual void destroy(); private: - void serverDestroy(); - void destroyOverlay(); + class OverlayChannel : public BnOverlay { - mutable Mutex mLock; - sp mSource; + wp mLayer; virtual void destroy() { - sp source; - { // scope for the lock; - Mutex::Autolock _l(mLock); - source = mSource; - mSource.clear(); - } - if (source != 0) { - source->serverDestroy(); + sp layer(mLayer.promote()); + if (layer != 0) { + layer->serverDestroy(); } } public: - OverlayChannel(const sp& source) - : mSource(source) { + OverlayChannel(const sp& layer) + : mLayer(layer) { } }; + friend class OverlayChannel; bool mVisibilityChanged; @@ -172,41 +176,35 @@ private: int32_t mFormat; int32_t mWidthStride; int32_t mHeightStride; - mutable Mutex mLock; + mutable Mutex mOverlaySourceLock; + bool mInitialized; }; - class SurfaceBuffer : public LayerBaseClient::Surface + class SurfaceLayerBuffer : public LayerBaseClient::Surface { public: - SurfaceBuffer(SurfaceID id, LayerBuffer* owner); - virtual ~SurfaceBuffer(); - virtual status_t onTransact( - uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); + SurfaceLayerBuffer(const sp& flinger, + SurfaceID id, const sp& owner); + virtual ~SurfaceLayerBuffer(); + virtual status_t registerBuffers(const ISurface::BufferHeap& buffers); virtual void postBuffer(ssize_t offset); virtual void unregisterBuffers(); + virtual sp createOverlay( uint32_t w, uint32_t h, int32_t format); - void disown(); private: - LayerBuffer* getOwner() const { - Mutex::Autolock _l(mLock); - return mOwner; + sp getOwner() const { + return static_cast(Surface::getOwner().get()); } - mutable Mutex mLock; - LayerBuffer* mOwner; }; - friend class SurfaceFlinger; - sp getClientSurface() const; - mutable Mutex mLock; sp mSource; - + sp mSurface; bool mInvalidate; bool mNeedsBlending; - mutable wp mClientSurface; }; // --------------------------------------------------------------------------- -- cgit v1.2.3-59-g8ed1b