blob: 3286535d0b1a505e35872b35a8f535d5f7292066 [file] [log] [blame]
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001/*
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 <utils/IMemory.h>
24#include <private/ui/LayerState.h>
25#include <GLES/eglnatives.h>
26
27#include "LayerBase.h"
28#include "LayerBitmap.h"
29
30namespace android {
31
32// ---------------------------------------------------------------------------
33
34class MemoryDealer;
35class Region;
The Android Open Source Projectb7986892009-01-09 17:51:23 -080036class OverlayRef;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070037
38class LayerBuffer : public LayerBaseClient
39{
The Android Open Source Projectb7986892009-01-09 17:51:23 -080040 class Source : public LightRefBase<Source> {
41 public:
42 Source(LayerBuffer& layer);
43 virtual ~Source();
44 virtual void onDraw(const Region& clip) const;
45 virtual void onTransaction(uint32_t flags);
46 virtual void onVisibilityResolved(const Transform& planeTransform);
47 virtual void postBuffer(ssize_t offset);
48 virtual void unregisterBuffers();
49 protected:
50 LayerBuffer& mLayer;
51 };
52
53
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070054public:
55 static const uint32_t typeInfo;
56 static const char* const typeID;
57 virtual char const* getTypeID() const { return typeID; }
58 virtual uint32_t getTypeInfo() const { return typeInfo; }
59
60 LayerBuffer(SurfaceFlinger* flinger, DisplayID display,
61 Client* client, int32_t i);
62 virtual ~LayerBuffer();
63
64 virtual bool needsBlending() const;
65
66 virtual sp<LayerBaseClient::Surface> getSurface() const;
67 virtual void onDraw(const Region& clip) const;
The Android Open Source Projectb7986892009-01-09 17:51:23 -080068 virtual uint32_t doTransaction(uint32_t flags);
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070069 virtual void unlockPageFlip(const Transform& planeTransform, Region& outDirtyRegion);
70
71 status_t registerBuffers(int w, int h, int hstride, int vstride,
72 PixelFormat format, const sp<IMemoryHeap>& heap);
73 void postBuffer(ssize_t offset);
74 void unregisterBuffers();
The Android Open Source Projectb7986892009-01-09 17:51:23 -080075 sp<OverlayRef> createOverlay(uint32_t w, uint32_t h, int32_t format);
76
77 sp<Source> getSource() const;
The Android Open Source Project9266c552009-01-15 16:12:10 -080078 sp<Source> clearSource();
The Android Open Source Projectb7986892009-01-09 17:51:23 -080079 void setNeedsBlending(bool blending);
80 const Rect& getTransformedBounds() const {
81 return mTransformedBounds;
82 }
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070083
84private:
The Android Open Source Projectb7986892009-01-09 17:51:23 -080085 struct NativeBuffer {
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070086 copybit_image_t img;
87 copybit_rect_t crop;
88 };
89
The Android Open Source Projectb7986892009-01-09 17:51:23 -080090 class Buffer : public LightRefBase<Buffer> {
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070091 public:
92 Buffer(const sp<IMemoryHeap>& heap, ssize_t offset,
93 int w, int h, int hs, int vs, int f);
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070094 inline status_t getStatus() const {
95 return mHeap!=0 ? NO_ERROR : NO_INIT;
96 }
97 inline const NativeBuffer& getBuffer() const {
98 return mNativeBuffer;
99 }
100 protected:
The Android Open Source Projectb7986892009-01-09 17:51:23 -0800101 friend class LightRefBase<Buffer>;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700102 Buffer& operator = (const Buffer& rhs);
103 Buffer(const Buffer& rhs);
104 ~Buffer();
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700105 private:
106 sp<IMemoryHeap> mHeap;
107 NativeBuffer mNativeBuffer;
108 };
109
The Android Open Source Projectb7986892009-01-09 17:51:23 -0800110 class BufferSource : public Source {
111 public:
112 BufferSource(LayerBuffer& layer,
113 int w, int h, int hstride, int vstride,
114 PixelFormat format, const sp<IMemoryHeap>& heap);
115 virtual ~BufferSource();
116
117 status_t getStatus() const { return mStatus; }
118 sp<Buffer> getBuffer() const;
119 void setBuffer(const sp<Buffer>& buffer);
120
121 virtual void onDraw(const Region& clip) const;
122 virtual void postBuffer(ssize_t offset);
123 virtual void unregisterBuffers();
124 private:
125 mutable Mutex mLock;
126 sp<IMemoryHeap> mHeap;
127 sp<Buffer> mBuffer;
128 status_t mStatus;
129 int mWidth;
130 int mHeight;
131 int mHStride;
132 int mVStride;
133 int mFormat;
134 mutable sp<MemoryDealer> mTemporaryDealer;
135 mutable LayerBitmap mTempBitmap;
136 mutable GLuint mTextureName;
137 };
138
139 class OverlaySource : public Source {
140 public:
141 OverlaySource(LayerBuffer& layer,
142 sp<OverlayRef>* overlayRef,
143 uint32_t w, uint32_t h, int32_t format);
144 virtual ~OverlaySource();
145 virtual void onTransaction(uint32_t flags);
146 virtual void onVisibilityResolved(const Transform& planeTransform);
147 private:
148 void serverDestroy();
The Android Open Source Project9266c552009-01-15 16:12:10 -0800149 void destroyOverlay();
150 class OverlayChannel : public BnOverlay {
The Android Open Source Projectb7986892009-01-09 17:51:23 -0800151 mutable Mutex mLock;
152 sp<OverlaySource> mSource;
153 virtual void destroy() {
154 sp<OverlaySource> source;
155 { // scope for the lock;
156 Mutex::Autolock _l(mLock);
157 source = mSource;
158 mSource.clear();
159 }
160 if (source != 0) {
161 source->serverDestroy();
162 }
163 }
164 public:
The Android Open Source Project9266c552009-01-15 16:12:10 -0800165 OverlayChannel(const sp<OverlaySource>& source)
The Android Open Source Projectb7986892009-01-09 17:51:23 -0800166 : mSource(source) {
167 }
168 };
The Android Open Source Project9266c552009-01-15 16:12:10 -0800169 friend class OverlayChannel;
The Android Open Source Projectb7986892009-01-09 17:51:23 -0800170 bool mVisibilityChanged;
171
172 overlay_t* mOverlay;
173 overlay_handle_t const *mOverlayHandle;
The Android Open Source Project9266c552009-01-15 16:12:10 -0800174 overlay_control_device_t* mOverlayDevice;
The Android Open Source Projectb7986892009-01-09 17:51:23 -0800175 uint32_t mWidth;
176 uint32_t mHeight;
177 int32_t mFormat;
178 int32_t mWidthStride;
179 int32_t mHeightStride;
180 mutable Mutex mLock;
181 };
182
183
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700184 class SurfaceBuffer : public LayerBaseClient::Surface
185 {
186 public:
187 SurfaceBuffer(SurfaceID id, LayerBuffer* owner);
188 virtual ~SurfaceBuffer();
189 virtual status_t registerBuffers(int w, int h, int hstride, int vstride,
190 PixelFormat format, const sp<IMemoryHeap>& heap);
191 virtual void postBuffer(ssize_t offset);
192 virtual void unregisterBuffers();
The Android Open Source Projectb7986892009-01-09 17:51:23 -0800193 virtual sp<OverlayRef> createOverlay(
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800194 uint32_t w, uint32_t h, int32_t format);
195 void disown();
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700196 private:
197 LayerBuffer* getOwner() const {
198 Mutex::Autolock _l(mLock);
199 return mOwner;
200 }
201 mutable Mutex mLock;
202 LayerBuffer* mOwner;
203 };
204
205 friend class SurfaceFlinger;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700206 sp<SurfaceBuffer> getClientSurface() const;
207
208 mutable Mutex mLock;
The Android Open Source Projectb7986892009-01-09 17:51:23 -0800209 sp<Source> mSource;
210
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700211 bool mInvalidate;
212 bool mNeedsBlending;
213 mutable wp<SurfaceBuffer> mClientSurface;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700214};
215
216// ---------------------------------------------------------------------------
217
218}; // namespace android
219
220#endif // ANDROID_LAYER_BUFFER_H