SurfaceFlinger.h revision 81bac09fa6b01dd1495644d9c825c3666762fced
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_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>
28#include <utils/RefBase.h>
29
30#include <binder/IMemory.h>
31#include <binder/Permission.h>
32
33#include <ui/PixelFormat.h>
34#include <surfaceflinger/ISurfaceComposer.h>
35#include <surfaceflinger/ISurfaceComposerClient.h>
36
37#include "Barrier.h"
38#include "Layer.h"
39
40#include "MessageQueue.h"
41
42struct copybit_device_t;
43struct overlay_device_t;
44
45namespace android {
46
47// ---------------------------------------------------------------------------
48
49class Client;
50class DisplayHardware;
51class FreezeLock;
52class Layer;
53class LayerBlur;
54class LayerDim;
55class LayerBuffer;
56
57#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
58#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
59
60// ---------------------------------------------------------------------------
61
62class Client : public BnSurfaceComposerClient
63{
64public:
65        Client(const sp<SurfaceFlinger>& flinger);
66        ~Client();
67
68    status_t initCheck() const;
69
70    // protected by SurfaceFlinger::mStateLock
71    ssize_t attachLayer(const sp<LayerBaseClient>& layer);
72    void detachLayer(const LayerBaseClient* layer);
73    sp<LayerBaseClient> getLayerUser(int32_t i) const;
74
75private:
76
77    // ISurfaceComposerClient interface
78    virtual sp<IMemoryHeap> getControlBlock() const;
79    virtual ssize_t getTokenForSurface(const sp<ISurface>& sur) const;
80    virtual sp<ISurface> createSurface(
81            surface_data_t* params, int pid, const String8& name,
82            DisplayID display, uint32_t w, uint32_t h,PixelFormat format,
83            uint32_t flags);
84    virtual status_t destroySurface(SurfaceID surfaceId);
85    virtual status_t setState(int32_t count, const layer_state_t* states);
86
87    DefaultKeyedVector< size_t, wp<LayerBaseClient> > mLayers;
88    sp<SurfaceFlinger> mFlinger;
89    int32_t mNameGenerator;
90};
91
92class UserClient : public BnSurfaceComposerClient
93{
94public:
95    // pointer to this client's control block
96    SharedClient* ctrlblk;
97
98public:
99        UserClient(const sp<SurfaceFlinger>& flinger);
100        ~UserClient();
101
102    status_t initCheck() const;
103
104    // protected by SurfaceFlinger::mStateLock
105    void detachLayer(const Layer* layer);
106
107private:
108
109    // ISurfaceComposerClient interface
110    virtual sp<IMemoryHeap> getControlBlock() const;
111    virtual ssize_t getTokenForSurface(const sp<ISurface>& sur) const;
112    virtual sp<ISurface> createSurface(
113            surface_data_t* params, int pid, const String8& name,
114            DisplayID display, uint32_t w, uint32_t h,PixelFormat format,
115            uint32_t flags);
116    virtual status_t destroySurface(SurfaceID surfaceId);
117    virtual status_t setState(int32_t count, const layer_state_t* states);
118
119    // atomic-ops
120    mutable volatile int32_t mBitmap;
121
122    sp<IMemoryHeap> mCblkHeap;
123    sp<SurfaceFlinger> mFlinger;
124};
125
126// ---------------------------------------------------------------------------
127
128class GraphicPlane
129{
130public:
131    static status_t orientationToTransfrom(int orientation, int w, int h,
132            Transform* tr);
133
134                                GraphicPlane();
135                                ~GraphicPlane();
136
137        bool                    initialized() const;
138
139        void                    setDisplayHardware(DisplayHardware *);
140        status_t                setOrientation(int orientation);
141        int                     getOrientation() const { return mOrientation; }
142        int                     getWidth() const;
143        int                     getHeight() const;
144
145        const DisplayHardware&  displayHardware() const;
146        const Transform&        transform() const;
147        EGLDisplay              getEGLDisplay() const;
148
149private:
150                                GraphicPlane(const GraphicPlane&);
151        GraphicPlane            operator = (const GraphicPlane&);
152
153        DisplayHardware*        mHw;
154        Transform               mGlobalTransform;
155        Transform               mDisplayTransform;
156        int                     mOrientation;
157        float                   mDisplayWidth;
158        float                   mDisplayHeight;
159        int                     mWidth;
160        int                     mHeight;
161};
162
163// ---------------------------------------------------------------------------
164
165enum {
166    eTransactionNeeded      = 0x01,
167    eTraversalNeeded        = 0x02
168};
169
170class SurfaceFlinger : public BnSurfaceComposer, protected Thread
171{
172public:
173    static void instantiate();
174    static void shutdown();
175
176                    SurfaceFlinger();
177    virtual         ~SurfaceFlinger();
178            void    init();
179
180    virtual status_t onTransact(
181        uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
182
183    virtual status_t dump(int fd, const Vector<String16>& args);
184
185    // ISurfaceComposer interface
186    virtual sp<ISurfaceComposerClient>  createConnection();
187    virtual sp<ISurfaceComposerClient>  createClientConnection();
188    virtual sp<IMemoryHeap>             getCblk() const;
189    virtual void                        bootFinished();
190    virtual void                        openGlobalTransaction();
191    virtual void                        closeGlobalTransaction();
192    virtual status_t                    freezeDisplay(DisplayID dpy, uint32_t flags);
193    virtual status_t                    unfreezeDisplay(DisplayID dpy, uint32_t flags);
194    virtual int                         setOrientation(DisplayID dpy, int orientation, uint32_t flags);
195    virtual void                        signal() const;
196
197            void                        screenReleased(DisplayID dpy);
198            void                        screenAcquired(DisplayID dpy);
199
200            overlay_control_device_t* getOverlayEngine() const;
201
202    status_t removeLayer(const sp<LayerBase>& layer);
203    status_t addLayer(const sp<LayerBase>& layer);
204    status_t invalidateLayerVisibility(const sp<LayerBase>& layer);
205
206    sp<Layer> getLayer(const sp<ISurface>& sur) const;
207
208private:
209    friend class Client;
210    friend class LayerBase;
211    friend class LayerBuffer;
212    friend class LayerBaseClient;
213    friend class LayerBaseClient::Surface;
214    friend class Layer;
215    friend class LayerBlur;
216    friend class LayerDim;
217
218    sp<ISurface> createSurface(const sp<Client>& client,
219            int pid, const String8& name,
220            ISurfaceComposerClient::surface_data_t* params,
221            DisplayID display, uint32_t w, uint32_t h, PixelFormat format,
222            uint32_t flags);
223
224    sp<Layer> createNormalSurface(
225            const sp<Client>& client, DisplayID display,
226            uint32_t w, uint32_t h, uint32_t flags,
227            PixelFormat& format);
228
229    sp<LayerBlur> createBlurSurface(
230            const sp<Client>& client, DisplayID display,
231            uint32_t w, uint32_t h, uint32_t flags);
232
233    sp<LayerDim> createDimSurface(
234            const sp<Client>& client, DisplayID display,
235            uint32_t w, uint32_t h, uint32_t flags);
236
237    sp<LayerBuffer> createPushBuffersSurface(
238            const sp<Client>& client, DisplayID display,
239            uint32_t w, uint32_t h, uint32_t flags);
240
241    status_t removeSurface(const sp<Client>& client, SurfaceID sid);
242    status_t destroySurface(const sp<LayerBaseClient>& layer);
243    status_t setClientState(const sp<Client>& client,
244            int32_t count, const layer_state_t* states);
245
246
247    class LayerVector {
248    public:
249        inline              LayerVector() { }
250                            LayerVector(const LayerVector&);
251        inline size_t       size() const { return layers.size(); }
252        inline sp<LayerBase> const* array() const { return layers.array(); }
253        ssize_t             add(const sp<LayerBase>&, Vector< sp<LayerBase> >::compar_t);
254        ssize_t             remove(const sp<LayerBase>&);
255        ssize_t             reorder(const sp<LayerBase>&, Vector< sp<LayerBase> >::compar_t);
256        ssize_t             indexOf(const sp<LayerBase>& key, size_t guess=0) const;
257        inline sp<LayerBase> operator [] (size_t i) const { return layers[i]; }
258    private:
259        KeyedVector< sp<LayerBase> , size_t> lookup;
260        Vector< sp<LayerBase> >              layers;
261    };
262
263    struct State {
264        State() {
265            orientation = ISurfaceComposer::eOrientationDefault;
266            freezeDisplay = 0;
267        }
268        LayerVector     layersSortedByZ;
269        uint8_t         orientation;
270        uint8_t         orientationType;
271        uint8_t         freezeDisplay;
272    };
273
274    virtual bool        threadLoop();
275    virtual status_t    readyToRun();
276    virtual void        onFirstRef();
277
278public:     // hack to work around gcc 4.0.3 bug
279    const GraphicPlane&     graphicPlane(int dpy) const;
280          GraphicPlane&     graphicPlane(int dpy);
281private:
282
283            void        waitForEvent();
284public:     // hack to work around gcc 4.0.3 bug
285            void        signalEvent();
286private:
287            void        handleConsoleEvents();
288            void        handleTransaction(uint32_t transactionFlags);
289            void        handleTransactionLocked(
290                            uint32_t transactionFlags,
291                            Vector< sp<LayerBase> >& ditchedLayers);
292
293            void        computeVisibleRegions(
294                            LayerVector& currentLayers,
295                            Region& dirtyRegion,
296                            Region& wormholeRegion);
297
298            void        handlePageFlip();
299            bool        lockPageFlip(const LayerVector& currentLayers);
300            void        unlockPageFlip(const LayerVector& currentLayers);
301            void        handleRepaint();
302            void        postFramebuffer();
303            void        composeSurfaces(const Region& dirty);
304            void        unlockClients();
305
306
307            ssize_t     addClientLayer(const sp<Client>& client,
308                    const sp<LayerBaseClient>& lbc);
309            status_t    addLayer_l(const sp<LayerBase>& layer);
310            status_t    removeLayer_l(const sp<LayerBase>& layer);
311            status_t    purgatorizeLayer_l(const sp<LayerBase>& layer);
312
313            uint32_t    getTransactionFlags(uint32_t flags);
314            uint32_t    setTransactionFlags(uint32_t flags);
315            void        commitTransaction();
316
317
318            friend class FreezeLock;
319            sp<FreezeLock> getFreezeLock() const;
320            inline void incFreezeCount() {
321                if (mFreezeCount == 0)
322                    mFreezeDisplayTime = 0;
323                mFreezeCount++;
324            }
325            inline void decFreezeCount() { if (mFreezeCount > 0) mFreezeCount--; }
326            inline bool hasFreezeRequest() const { return mFreezeDisplay; }
327            inline bool isFrozen() const {
328                return (mFreezeDisplay || mFreezeCount>0) && mBootFinished;
329            }
330
331
332            void        debugFlashRegions();
333            void        debugShowFPS() const;
334            void        drawWormhole() const;
335
336
337    mutable     MessageQueue    mEventQueue;
338
339    status_t postMessageAsync(const sp<MessageBase>& msg,
340            nsecs_t reltime=0, uint32_t flags = 0);
341
342    status_t postMessageSync(const sp<MessageBase>& msg,
343            nsecs_t reltime=0, uint32_t flags = 0);
344
345                // access must be protected by mStateLock
346    mutable     Mutex                   mStateLock;
347                State                   mCurrentState;
348                State                   mDrawingState;
349    volatile    int32_t                 mTransactionFlags;
350    volatile    int32_t                 mTransactionCount;
351                Condition               mTransactionCV;
352                bool                    mResizeTransationPending;
353
354                // protected by mStateLock (but we could use another lock)
355                GraphicPlane                mGraphicPlanes[1];
356                bool                        mLayersRemoved;
357                DefaultKeyedVector< wp<IBinder>, wp<Layer> > mLayerMap;
358
359                // constant members (no synchronization needed for access)
360                sp<IMemoryHeap>             mServerHeap;
361                surface_flinger_cblk_t*     mServerCblk;
362                GLuint                      mWormholeTexName;
363                nsecs_t                     mBootTime;
364                Permission                  mHardwareTest;
365                Permission                  mAccessSurfaceFlinger;
366                Permission                  mDump;
367
368                // Can only accessed from the main thread, these members
369                // don't need synchronization
370                Region                      mDirtyRegion;
371                Region                      mDirtyRegionRemovedLayer;
372                Region                      mInvalidRegion;
373                Region                      mWormholeRegion;
374                bool                        mVisibleRegionsDirty;
375                bool                        mDeferReleaseConsole;
376                bool                        mFreezeDisplay;
377                int32_t                     mFreezeCount;
378                nsecs_t                     mFreezeDisplayTime;
379
380                // don't use a lock for these, we don't care
381                int                         mDebugRegion;
382                int                         mDebugBackground;
383                volatile nsecs_t            mDebugInSwapBuffers;
384                nsecs_t                     mLastSwapBufferTime;
385                volatile nsecs_t            mDebugInTransaction;
386                nsecs_t                     mLastTransactionTime;
387                bool                        mBootFinished;
388
389                // these are thread safe
390    mutable     Barrier                     mReadyToRunBarrier;
391
392                // atomic variables
393                enum {
394                    eConsoleReleased = 1,
395                    eConsoleAcquired = 2
396                };
397   volatile     int32_t                     mConsoleSignals;
398
399   // only written in the main thread, only read in other threads
400   volatile     int32_t                     mSecureFrameBuffer;
401};
402
403// ---------------------------------------------------------------------------
404
405class FreezeLock : public LightRefBase<FreezeLock> {
406    SurfaceFlinger* mFlinger;
407public:
408    FreezeLock(SurfaceFlinger* flinger)
409        : mFlinger(flinger) {
410        mFlinger->incFreezeCount();
411    }
412    ~FreezeLock() {
413        mFlinger->decFreezeCount();
414    }
415};
416
417// ---------------------------------------------------------------------------
418}; // namespace android
419
420#endif // ANDROID_SURFACE_FLINGER_H
421