1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_LAYER_BUFFER_H 18 #define ANDROID_LAYER_BUFFER_H 19 20 #include <stdint.h> 21 #include <sys/types.h> 22 23 #include "LayerBase.h" 24 25 struct copybit_device_t; 26 27 namespace android { 28 29 // --------------------------------------------------------------------------- 30 31 class Buffer; 32 class Region; 33 class OverlayRef; 34 35 // --------------------------------------------------------------------------- 36 37 class LayerBuffer : public LayerBaseClient 38 { 39 class Source : public LightRefBase<Source> { 40 public: 41 Source(LayerBuffer& layer); 42 virtual ~Source(); 43 virtual void onDraw(const Region& clip) const; 44 virtual void onTransaction(uint32_t flags); 45 virtual void onVisibilityResolved(const Transform& planeTransform); 46 virtual void postBuffer(ssize_t offset); 47 virtual void unregisterBuffers(); 48 virtual bool transformed() const; destroy()49 virtual void destroy() { } 50 protected: 51 LayerBuffer& mLayer; 52 }; 53 54 public: 55 static const uint32_t typeInfo; 56 static const char* const typeID; getTypeID()57 virtual char const* getTypeID() const { return typeID; } getTypeInfo()58 virtual uint32_t getTypeInfo() const { return typeInfo; } 59 60 LayerBuffer(SurfaceFlinger* flinger, DisplayID display, 61 const sp<Client>& client, int32_t i); 62 virtual ~LayerBuffer(); 63 64 virtual void onFirstRef(); 65 virtual bool needsBlending() const; 66 67 virtual sp<LayerBaseClient::Surface> createSurface() const; 68 virtual status_t ditch(); 69 virtual void onDraw(const Region& clip) const; 70 virtual uint32_t doTransaction(uint32_t flags); 71 virtual void unlockPageFlip(const Transform& planeTransform, Region& outDirtyRegion); 72 virtual bool transformed() const; 73 74 status_t registerBuffers(const ISurface::BufferHeap& buffers); 75 void postBuffer(ssize_t offset); 76 void unregisterBuffers(); 77 sp<OverlayRef> createOverlay(uint32_t w, uint32_t h, int32_t format); 78 79 sp<Source> getSource() const; 80 sp<Source> clearSource(); 81 void setNeedsBlending(bool blending); getTransformedBounds()82 Rect getTransformedBounds() const { 83 return mTransformedBounds; 84 } 85 86 void serverDestroy(); 87 88 private: 89 struct NativeBuffer { 90 copybit_image_t img; 91 copybit_rect_t crop; 92 }; 93 94 static gralloc_module_t const* sGrallocModule; getGrallocModule()95 static gralloc_module_t const* getGrallocModule() { 96 return sGrallocModule; 97 } 98 99 class Buffer : public LightRefBase<Buffer> { 100 public: 101 Buffer(const ISurface::BufferHeap& buffers, ssize_t offset); getStatus()102 inline status_t getStatus() const { 103 return mBufferHeap.heap!=0 ? NO_ERROR : NO_INIT; 104 } getBuffer()105 inline const NativeBuffer& getBuffer() const { 106 return mNativeBuffer; 107 } 108 protected: 109 friend class LightRefBase<Buffer>; 110 Buffer& operator = (const Buffer& rhs); 111 Buffer(const Buffer& rhs); 112 ~Buffer(); 113 private: 114 ISurface::BufferHeap mBufferHeap; 115 NativeBuffer mNativeBuffer; 116 }; 117 118 class BufferSource : public Source { 119 public: 120 BufferSource(LayerBuffer& layer, const ISurface::BufferHeap& buffers); 121 virtual ~BufferSource(); 122 getStatus()123 status_t getStatus() const { return mStatus; } 124 sp<Buffer> getBuffer() const; 125 void setBuffer(const sp<Buffer>& buffer); 126 127 virtual void onDraw(const Region& clip) const; 128 virtual void postBuffer(ssize_t offset); 129 virtual void unregisterBuffers(); 130 virtual bool transformed() const; destroy()131 virtual void destroy() { } 132 private: 133 mutable Mutex mBufferSourceLock; 134 sp<Buffer> mBuffer; 135 status_t mStatus; 136 ISurface::BufferHeap mBufferHeap; 137 size_t mBufferSize; 138 mutable LayerBase::Texture mTexture; 139 NativeBuffer mTempBuffer; 140 mutable sp<GraphicBuffer> mTempGraphicBuffer; 141 }; 142 143 class OverlaySource : public Source { 144 public: 145 OverlaySource(LayerBuffer& layer, 146 sp<OverlayRef>* overlayRef, 147 uint32_t w, uint32_t h, int32_t format); 148 virtual ~OverlaySource(); 149 virtual void onDraw(const Region& clip) const; 150 virtual void onTransaction(uint32_t flags); 151 virtual void onVisibilityResolved(const Transform& planeTransform); 152 virtual void destroy(); 153 private: 154 155 class OverlayChannel : public BnOverlay { 156 wp<LayerBuffer> mLayer; destroy()157 virtual void destroy() { 158 sp<LayerBuffer> layer(mLayer.promote()); 159 if (layer != 0) { 160 layer->serverDestroy(); 161 } 162 } 163 public: OverlayChannel(const sp<LayerBuffer> & layer)164 OverlayChannel(const sp<LayerBuffer>& layer) 165 : mLayer(layer) { 166 } 167 }; 168 169 friend class OverlayChannel; 170 bool mVisibilityChanged; 171 172 overlay_t* mOverlay; 173 overlay_handle_t mOverlayHandle; 174 overlay_control_device_t* mOverlayDevice; 175 uint32_t mWidth; 176 uint32_t mHeight; 177 int32_t mFormat; 178 int32_t mWidthStride; 179 int32_t mHeightStride; 180 mutable Mutex mOverlaySourceLock; 181 bool mInitialized; 182 }; 183 184 185 class SurfaceLayerBuffer : public LayerBaseClient::Surface 186 { 187 public: 188 SurfaceLayerBuffer(const sp<SurfaceFlinger>& flinger, 189 SurfaceID id, const sp<LayerBuffer>& owner); 190 virtual ~SurfaceLayerBuffer(); 191 192 virtual status_t registerBuffers(const ISurface::BufferHeap& buffers); 193 virtual void postBuffer(ssize_t offset); 194 virtual void unregisterBuffers(); 195 196 virtual sp<OverlayRef> createOverlay( 197 uint32_t w, uint32_t h, int32_t format); 198 private: getOwner()199 sp<LayerBuffer> getOwner() const { 200 return static_cast<LayerBuffer*>(Surface::getOwner().get()); 201 } 202 }; 203 204 mutable Mutex mLock; 205 sp<Source> mSource; 206 sp<Surface> mSurface; 207 bool mInvalidate; 208 bool mNeedsBlending; 209 copybit_device_t* mBlitEngine; 210 }; 211 212 // --------------------------------------------------------------------------- 213 214 }; // namespace android 215 216 #endif // ANDROID_LAYER_BUFFER_H 217