blob: f9bfe6c7c30163012d8df3fc87d0f0527ba61f30 [file] [log] [blame]
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001/*
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_SURFACE_FLINGER_H
18#define ANDROID_SURFACE_FLINGER_H
19
20#include <stdint.h>
21#include <sys/types.h>
22
23#include <utils/SortedVector.h>
24#include <utils/KeyedVector.h>
25#include <utils/threads.h>
26#include <utils/Atomic.h>
27#include <utils/Errors.h>
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -080028#include <utils/RefBase.h>
29
30#include <binder/IMemory.h>
31#include <binder/Permission.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080032
33#include <ui/PixelFormat.h>
34#include <ui/ISurfaceComposer.h>
35#include <ui/ISurfaceFlingerClient.h>
36
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -080037#include <private/ui/SharedBufferStack.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080038#include <private/ui/LayerState.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080039
40#include "Barrier.h"
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080041#include "Layer.h"
42#include "Tokenizer.h"
43
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -080044#include "MessageQueue.h"
45
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080046struct copybit_device_t;
47struct overlay_device_t;
48
49namespace android {
50
51// ---------------------------------------------------------------------------
52
53class Client;
54class BClient;
55class DisplayHardware;
56class FreezeLock;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080057class Layer;
58class LayerBuffer;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080059
60typedef int32_t ClientID;
61
62#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true ))
63#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false ))
64
65// ---------------------------------------------------------------------------
66
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -080067class Client : public RefBase
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080068{
69public:
70 Client(ClientID cid, const sp<SurfaceFlinger>& flinger);
71 ~Client();
72
73 int32_t generateId(int pid);
74 void free(int32_t id);
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -080075 status_t bindLayer(const sp<LayerBaseClient>& layer, int32_t id);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080076
77 inline bool isValid(int32_t i) const;
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -080078 sp<LayerBaseClient> getLayerUser(int32_t i) const;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080079 void dump(const char* what);
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -080080
81 const Vector< wp<LayerBaseClient> >& getLayers() const {
82 return mLayers;
83 }
84
85 const sp<IMemoryHeap>& getControlBlockMemory() const {
86 return mCblkHeap;
87 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080088
89 // pointer to this client's control block
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -080090 SharedClient* ctrlblk;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080091 ClientID cid;
92
93
94private:
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -080095 int getClientPid() const { return mPid; }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080096
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -080097 int mPid;
98 uint32_t mBitmap;
99 SortedVector<uint8_t> mInUse;
100 Vector< wp<LayerBaseClient> > mLayers;
101 sp<IMemoryHeap> mCblkHeap;
102 sp<SurfaceFlinger> mFlinger;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800103};
104
105// ---------------------------------------------------------------------------
106
107class GraphicPlane
108{
109public:
110 static status_t orientationToTransfrom(int orientation, int w, int h,
111 Transform* tr);
112
113 GraphicPlane();
114 ~GraphicPlane();
115
116 bool initialized() const;
117
118 void setDisplayHardware(DisplayHardware *);
119 void setTransform(const Transform& tr);
120 status_t setOrientation(int orientation);
Mathias Agopian262453c2009-03-25 21:42:35 -0700121 int getOrientation() const { return mOrientation; }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800122
123 const DisplayHardware& displayHardware() const;
124 const Transform& transform() const;
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800125 EGLDisplay getEGLDisplay() const;
126
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800127private:
128 GraphicPlane(const GraphicPlane&);
129 GraphicPlane operator = (const GraphicPlane&);
130
131 DisplayHardware* mHw;
132 Transform mTransform;
133 Transform mOrientationTransform;
134 Transform mGlobalTransform;
Mathias Agopian262453c2009-03-25 21:42:35 -0700135 int mOrientation;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800136};
137
138// ---------------------------------------------------------------------------
139
140enum {
141 eTransactionNeeded = 0x01,
142 eTraversalNeeded = 0x02
143};
144
145class SurfaceFlinger : public BnSurfaceComposer, protected Thread
146{
147public:
148 static void instantiate();
149 static void shutdown();
150
151 SurfaceFlinger();
152 virtual ~SurfaceFlinger();
153 void init();
154
155 virtual status_t onTransact(
156 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
157
158 virtual status_t dump(int fd, const Vector<String16>& args);
159
160 // ISurfaceComposer interface
161 virtual sp<ISurfaceFlingerClient> createConnection();
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800162 virtual sp<IMemoryHeap> getCblk() const;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800163 virtual void bootFinished();
164 virtual void openGlobalTransaction();
165 virtual void closeGlobalTransaction();
166 virtual status_t freezeDisplay(DisplayID dpy, uint32_t flags);
167 virtual status_t unfreezeDisplay(DisplayID dpy, uint32_t flags);
Mathias Agopianceff6e12009-03-25 23:18:56 -0700168 virtual int setOrientation(DisplayID dpy, int orientation, uint32_t flags);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800169 virtual void signal() const;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800170
171 void screenReleased(DisplayID dpy);
172 void screenAcquired(DisplayID dpy);
173
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800174 overlay_control_device_t* getOverlayEngine() const;
175
176
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800177 status_t removeLayer(const sp<LayerBase>& layer);
178 status_t addLayer(const sp<LayerBase>& layer);
179 status_t invalidateLayerVisibility(const sp<LayerBase>& layer);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800180
181private:
182 friend class BClient;
183 friend class LayerBase;
184 friend class LayerBuffer;
185 friend class LayerBaseClient;
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800186 friend class LayerBaseClient::Surface;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800187 friend class Layer;
188 friend class LayerBlur;
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800189 friend class LayerDim;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800190
191 sp<ISurface> createSurface(ClientID client, int pid,
192 ISurfaceFlingerClient::surface_data_t* params,
193 DisplayID display, uint32_t w, uint32_t h, PixelFormat format,
194 uint32_t flags);
195
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800196 sp<LayerBaseClient> createNormalSurfaceLocked(
197 const sp<Client>& client, DisplayID display,
198 int32_t id, uint32_t w, uint32_t h, uint32_t flags,
199 PixelFormat& format);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800200
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800201 sp<LayerBaseClient> createBlurSurfaceLocked(
202 const sp<Client>& client, DisplayID display,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800203 int32_t id, uint32_t w, uint32_t h, uint32_t flags);
204
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800205 sp<LayerBaseClient> createDimSurfaceLocked(
206 const sp<Client>& client, DisplayID display,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800207 int32_t id, uint32_t w, uint32_t h, uint32_t flags);
208
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800209 sp<LayerBaseClient> createPushBuffersSurfaceLocked(
210 const sp<Client>& client, DisplayID display,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800211 int32_t id, uint32_t w, uint32_t h, uint32_t flags);
212
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800213 status_t removeSurface(SurfaceID surface_id);
214 status_t destroySurface(const sp<LayerBaseClient>& layer);
215 status_t setClientState(ClientID cid, int32_t count, const layer_state_t* states);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800216
217
218 class LayerVector {
219 public:
220 inline LayerVector() { }
221 LayerVector(const LayerVector&);
222 inline size_t size() const { return layers.size(); }
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800223 inline sp<LayerBase> const* array() const { return layers.array(); }
224 ssize_t add(const sp<LayerBase>&, Vector< sp<LayerBase> >::compar_t);
225 ssize_t remove(const sp<LayerBase>&);
226 ssize_t reorder(const sp<LayerBase>&, Vector< sp<LayerBase> >::compar_t);
227 ssize_t indexOf(const sp<LayerBase>& key, size_t guess=0) const;
228 inline sp<LayerBase> operator [] (size_t i) const { return layers[i]; }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800229 private:
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800230 KeyedVector< sp<LayerBase> , size_t> lookup;
231 Vector< sp<LayerBase> > layers;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800232 };
233
234 struct State {
235 State() {
236 orientation = ISurfaceComposer::eOrientationDefault;
237 freezeDisplay = 0;
238 }
239 LayerVector layersSortedByZ;
240 uint8_t orientation;
Mathias Agopianceff6e12009-03-25 23:18:56 -0700241 uint8_t orientationType;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800242 uint8_t freezeDisplay;
243 };
244
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800245 virtual bool threadLoop();
246 virtual status_t readyToRun();
247 virtual void onFirstRef();
248
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800249public: // hack to work around gcc 4.0.3 bug
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800250 const GraphicPlane& graphicPlane(int dpy) const;
251 GraphicPlane& graphicPlane(int dpy);
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800252private:
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800253
254 void waitForEvent();
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800255public: // hack to work around gcc 4.0.3 bug
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800256 void signalEvent();
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800257private:
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800258 void signalDelayedEvent(nsecs_t delay);
259
260 void handleConsoleEvents();
261 void handleTransaction(uint32_t transactionFlags);
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800262 void handleTransactionLocked(
263 uint32_t transactionFlags,
264 Vector< sp<LayerBase> >& ditchedLayers);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800265
266 void computeVisibleRegions(
267 LayerVector& currentLayers,
268 Region& dirtyRegion,
269 Region& wormholeRegion);
270
271 void handlePageFlip();
272 bool lockPageFlip(const LayerVector& currentLayers);
273 void unlockPageFlip(const LayerVector& currentLayers);
274 void handleRepaint();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800275 void postFramebuffer();
276 void composeSurfaces(const Region& dirty);
277 void unlockClients();
278
279
280 void destroyConnection(ClientID cid);
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800281 sp<LayerBaseClient> getLayerUser_l(SurfaceID index) const;
282 status_t addLayer_l(const sp<LayerBase>& layer);
283 status_t removeLayer_l(const sp<LayerBase>& layer);
284 status_t purgatorizeLayer_l(const sp<LayerBase>& layer);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800285 void free_resources_l();
286
287 uint32_t getTransactionFlags(uint32_t flags);
288 uint32_t setTransactionFlags(uint32_t flags, nsecs_t delay = 0);
289 void commitTransaction();
290
291
292 friend class FreezeLock;
293 sp<FreezeLock> getFreezeLock() const;
294 inline void incFreezeCount() { mFreezeCount++; }
295 inline void decFreezeCount() { if (mFreezeCount > 0) mFreezeCount--; }
296 inline bool hasFreezeRequest() const { return mFreezeDisplay; }
297 inline bool isFrozen() const {
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800298 return (mFreezeDisplay || mFreezeCount>0) && mBootFinished;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800299 }
300
301
302 void debugFlashRegions();
303 void debugShowFPS() const;
304 void drawWormhole() const;
305
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800306
307 mutable MessageQueue mEventQueue;
308
309
310
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800311 // access must be protected by mStateLock
312 mutable Mutex mStateLock;
313 State mCurrentState;
314 State mDrawingState;
315 volatile int32_t mTransactionFlags;
316 volatile int32_t mTransactionCount;
317 Condition mTransactionCV;
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800318 bool mResizeTransationPending;
319
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800320 // protected by mStateLock (but we could use another lock)
321 Tokenizer mTokens;
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800322 DefaultKeyedVector<ClientID, sp<Client> > mClientsMap;
323 DefaultKeyedVector<SurfaceID, sp<LayerBaseClient> > mLayerMap;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800324 GraphicPlane mGraphicPlanes[1];
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800325 bool mLayersRemoved;
326 Vector< sp<Client> > mDisconnectedClients;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800327
328 // constant members (no synchronization needed for access)
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800329 sp<IMemoryHeap> mServerHeap;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800330 surface_flinger_cblk_t* mServerCblk;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800331 GLuint mWormholeTexName;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800332 nsecs_t mBootTime;
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800333 Permission mHardwareTest;
334 Permission mAccessSurfaceFlinger;
335 Permission mDump;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800336
337 // Can only accessed from the main thread, these members
338 // don't need synchronization
339 Region mDirtyRegion;
Jean-Baptiste Queru110b3142009-07-31 17:38:20 -0700340 Region mDirtyRegionRemovedLayer;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800341 Region mInvalidRegion;
342 Region mWormholeRegion;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800343 bool mVisibleRegionsDirty;
344 bool mDeferReleaseConsole;
345 bool mFreezeDisplay;
346 int32_t mFreezeCount;
347 nsecs_t mFreezeDisplayTime;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800348
349 // don't use a lock for these, we don't care
350 int mDebugRegion;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800351 int mDebugBackground;
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800352 volatile nsecs_t mDebugInSwapBuffers;
353 nsecs_t mLastSwapBufferTime;
354 volatile nsecs_t mDebugInTransaction;
355 nsecs_t mLastTransactionTime;
356 bool mBootFinished;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800357
358 // these are thread safe
359 mutable Barrier mReadyToRunBarrier;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800360
361 // atomic variables
362 enum {
363 eConsoleReleased = 1,
364 eConsoleAcquired = 2
365 };
366 volatile int32_t mConsoleSignals;
367
368 // only written in the main thread, only read in other threads
369 volatile int32_t mSecureFrameBuffer;
370};
371
372// ---------------------------------------------------------------------------
373
374class FreezeLock : public LightRefBase<FreezeLock> {
375 SurfaceFlinger* mFlinger;
376public:
377 FreezeLock(SurfaceFlinger* flinger)
378 : mFlinger(flinger) {
379 mFlinger->incFreezeCount();
380 }
381 ~FreezeLock() {
382 mFlinger->decFreezeCount();
383 }
384};
385
386// ---------------------------------------------------------------------------
387
388class BClient : public BnSurfaceFlingerClient
389{
390public:
391 BClient(SurfaceFlinger *flinger, ClientID cid,
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800392 const sp<IMemoryHeap>& cblk);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800393 ~BClient();
394
395 // ISurfaceFlingerClient interface
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800396 virtual sp<IMemoryHeap> getControlBlock() const;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800397
398 virtual sp<ISurface> createSurface(
399 surface_data_t* params, int pid,
400 DisplayID display, uint32_t w, uint32_t h,PixelFormat format,
401 uint32_t flags);
402
403 virtual status_t destroySurface(SurfaceID surfaceId);
404 virtual status_t setState(int32_t count, const layer_state_t* states);
405
406private:
407 ClientID mId;
408 SurfaceFlinger* mFlinger;
Jean-Baptiste Querucc8c35c2009-11-12 18:45:53 -0800409 sp<IMemoryHeap> mCblk;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800410};
411
412// ---------------------------------------------------------------------------
413}; // namespace android
414
415#endif // ANDROID_SURFACE_FLINGER_H