|  | /* | 
|  | * 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_BUFFER_H | 
|  | #define ANDROID_LAYER_BUFFER_H | 
|  |  | 
|  | #include <stdint.h> | 
|  | #include <sys/types.h> | 
|  |  | 
|  | #include <utils/IMemory.h> | 
|  | #include <private/ui/LayerState.h> | 
|  | #include <EGL/eglnatives.h> | 
|  |  | 
|  | #include "LayerBase.h" | 
|  | #include "LayerBitmap.h" | 
|  |  | 
|  | namespace android { | 
|  |  | 
|  | // --------------------------------------------------------------------------- | 
|  |  | 
|  | class MemoryDealer; | 
|  | class Region; | 
|  | class OverlayRef; | 
|  |  | 
|  | class LayerBuffer : public LayerBaseClient | 
|  | { | 
|  | class Source : public LightRefBase<Source> { | 
|  | public: | 
|  | Source(LayerBuffer& layer); | 
|  | virtual ~Source(); | 
|  | virtual void onDraw(const Region& clip) const; | 
|  | virtual void onTransaction(uint32_t flags); | 
|  | virtual void onVisibilityResolved(const Transform& planeTransform); | 
|  | virtual void postBuffer(ssize_t offset); | 
|  | virtual void unregisterBuffers(); | 
|  | virtual bool transformed() const; | 
|  | protected: | 
|  | LayerBuffer& mLayer; | 
|  | }; | 
|  |  | 
|  |  | 
|  | public: | 
|  | static const uint32_t typeInfo; | 
|  | static const char* const typeID; | 
|  | virtual char const* getTypeID() const { return typeID; } | 
|  | virtual uint32_t getTypeInfo() const { return typeInfo; } | 
|  |  | 
|  | LayerBuffer(SurfaceFlinger* flinger, DisplayID display, | 
|  | Client* client, int32_t i); | 
|  | virtual ~LayerBuffer(); | 
|  |  | 
|  | virtual bool needsBlending() const; | 
|  |  | 
|  | virtual sp<LayerBaseClient::Surface> getSurface() const; | 
|  | virtual void onDraw(const Region& clip) const; | 
|  | virtual uint32_t doTransaction(uint32_t flags); | 
|  | virtual void unlockPageFlip(const Transform& planeTransform, Region& outDirtyRegion); | 
|  | virtual bool transformed() const; | 
|  |  | 
|  | status_t registerBuffers(const ISurface::BufferHeap& buffers); | 
|  | void postBuffer(ssize_t offset); | 
|  | void unregisterBuffers(); | 
|  | sp<OverlayRef> createOverlay(uint32_t w, uint32_t h, int32_t format); | 
|  |  | 
|  | sp<Source> getSource() const; | 
|  | sp<Source> clearSource(); | 
|  | void setNeedsBlending(bool blending); | 
|  | const Rect& getTransformedBounds() const { | 
|  | return mTransformedBounds; | 
|  | } | 
|  |  | 
|  | private: | 
|  | struct NativeBuffer { | 
|  | copybit_image_t   img; | 
|  | copybit_rect_t    crop; | 
|  | }; | 
|  |  | 
|  | class Buffer : public LightRefBase<Buffer> { | 
|  | public: | 
|  | Buffer(const ISurface::BufferHeap& buffers, ssize_t offset); | 
|  | inline status_t getStatus() const { | 
|  | return mBufferHeap.heap!=0 ? NO_ERROR : NO_INIT; | 
|  | } | 
|  | inline const NativeBuffer& getBuffer() const { | 
|  | return mNativeBuffer; | 
|  | } | 
|  | protected: | 
|  | friend class LightRefBase<Buffer>; | 
|  | Buffer& operator = (const Buffer& rhs); | 
|  | Buffer(const Buffer& rhs); | 
|  | ~Buffer(); | 
|  | private: | 
|  | ISurface::BufferHeap    mBufferHeap; | 
|  | NativeBuffer            mNativeBuffer; | 
|  | }; | 
|  |  | 
|  | class BufferSource : public Source { | 
|  | public: | 
|  | BufferSource(LayerBuffer& layer, const ISurface::BufferHeap& buffers); | 
|  | virtual ~BufferSource(); | 
|  |  | 
|  | status_t getStatus() const { return mStatus; } | 
|  | sp<Buffer> getBuffer() const; | 
|  | void setBuffer(const sp<Buffer>& buffer); | 
|  |  | 
|  | virtual void onDraw(const Region& clip) const; | 
|  | virtual void postBuffer(ssize_t offset); | 
|  | virtual void unregisterBuffers(); | 
|  | virtual bool transformed() const; | 
|  | private: | 
|  | mutable Mutex   mLock; | 
|  | sp<Buffer>      mBuffer; | 
|  | status_t        mStatus; | 
|  | ISurface::BufferHeap mBufferHeap; | 
|  | size_t          mBufferSize; | 
|  | mutable sp<MemoryDealer> mTemporaryDealer; | 
|  | mutable LayerBitmap mTempBitmap; | 
|  | mutable GLuint  mTextureName; | 
|  | }; | 
|  |  | 
|  | class OverlaySource : public Source { | 
|  | public: | 
|  | OverlaySource(LayerBuffer& layer, | 
|  | sp<OverlayRef>* overlayRef, | 
|  | uint32_t w, uint32_t h, int32_t format); | 
|  | virtual ~OverlaySource(); | 
|  | virtual void onTransaction(uint32_t flags); | 
|  | virtual void onVisibilityResolved(const Transform& planeTransform); | 
|  | private: | 
|  | void serverDestroy(); | 
|  | void destroyOverlay(); | 
|  | class OverlayChannel : public BnOverlay { | 
|  | mutable Mutex mLock; | 
|  | sp<OverlaySource> mSource; | 
|  | virtual void destroy() { | 
|  | sp<OverlaySource> source; | 
|  | { // scope for the lock; | 
|  | Mutex::Autolock _l(mLock); | 
|  | source = mSource; | 
|  | mSource.clear(); | 
|  | } | 
|  | if (source != 0) { | 
|  | source->serverDestroy(); | 
|  | } | 
|  | } | 
|  | public: | 
|  | OverlayChannel(const sp<OverlaySource>& source) | 
|  | : mSource(source) { | 
|  | } | 
|  | }; | 
|  | friend class OverlayChannel; | 
|  | bool mVisibilityChanged; | 
|  |  | 
|  | overlay_t* mOverlay; | 
|  | overlay_handle_t mOverlayHandle; | 
|  | overlay_control_device_t* mOverlayDevice; | 
|  | uint32_t mWidth; | 
|  | uint32_t mHeight; | 
|  | int32_t mFormat; | 
|  | int32_t mWidthStride; | 
|  | int32_t mHeightStride; | 
|  | mutable Mutex mLock; | 
|  | }; | 
|  |  | 
|  |  | 
|  | class SurfaceBuffer : 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); | 
|  | virtual status_t registerBuffers(const ISurface::BufferHeap& buffers); | 
|  | virtual void postBuffer(ssize_t offset); | 
|  | virtual void unregisterBuffers(); | 
|  | virtual sp<OverlayRef> createOverlay( | 
|  | uint32_t w, uint32_t h, int32_t format); | 
|  | void disown(); | 
|  | private: | 
|  | LayerBuffer* getOwner() const { | 
|  | Mutex::Autolock _l(mLock); | 
|  | return mOwner; | 
|  | } | 
|  | mutable Mutex   mLock; | 
|  | LayerBuffer*    mOwner; | 
|  | }; | 
|  |  | 
|  | friend class SurfaceFlinger; | 
|  | sp<SurfaceBuffer>   getClientSurface() const; | 
|  |  | 
|  | mutable Mutex   mLock; | 
|  | sp<Source>      mSource; | 
|  |  | 
|  | bool            mInvalidate; | 
|  | bool            mNeedsBlending; | 
|  | mutable wp<SurfaceBuffer> mClientSurface; | 
|  | }; | 
|  |  | 
|  | // --------------------------------------------------------------------------- | 
|  |  | 
|  | }; // namespace android | 
|  |  | 
|  | #endif // ANDROID_LAYER_BUFFER_H |