/* * 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