• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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