SurfaceFlinger.h revision 4da751999358fffa4cefc4c8046dab72045925f6
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef ANDROID_SURFACE_FLINGER_H
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_SURFACE_FLINGER_H
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/SortedVector.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/KeyedVector.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Atomic.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/RefBase.h>
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
307303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian#include <binder/IMemory.h>
31375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian#include <binder/Permission.h>
32a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian#include <binder/BinderService.h>
33375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
359cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/ISurfaceComposer.h>
367e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian#include <surfaceflinger/ISurfaceComposerClient.h>
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Barrier.h"
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h"
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
41f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include "MessageQueue.h"
42f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Client;
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass DisplayHardware;
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass FreezeLock;
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Layer;
51b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopianclass LayerBlur;
52b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopianclass LayerDim;
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass LayerBuffer;
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6096f0819f81293076e652792794a961543e6750d7Mathias Agopianclass Client : public BnSurfaceComposerClient
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
6396f0819f81293076e652792794a961543e6750d7Mathias Agopian        Client(const sp<SurfaceFlinger>& flinger);
6496f0819f81293076e652792794a961543e6750d7Mathias Agopian        ~Client();
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6696f0819f81293076e652792794a961543e6750d7Mathias Agopian    status_t initCheck() const;
6796f0819f81293076e652792794a961543e6750d7Mathias Agopian
6896f0819f81293076e652792794a961543e6750d7Mathias Agopian    // protected by SurfaceFlinger::mStateLock
6996f0819f81293076e652792794a961543e6750d7Mathias Agopian    ssize_t attachLayer(const sp<LayerBaseClient>& layer);
70b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    void detachLayer(const LayerBaseClient* layer);
7196f0819f81293076e652792794a961543e6750d7Mathias Agopian    sp<LayerBaseClient> getLayerUser(int32_t i) const;
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
7496f0819f81293076e652792794a961543e6750d7Mathias Agopian
7596f0819f81293076e652792794a961543e6750d7Mathias Agopian    // ISurfaceComposerClient interface
7696f0819f81293076e652792794a961543e6750d7Mathias Agopian    virtual sp<IMemoryHeap> getControlBlock() const;
77b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual ssize_t getTokenForSurface(const sp<ISurface>& sur) const;
7896f0819f81293076e652792794a961543e6750d7Mathias Agopian    virtual sp<ISurface> createSurface(
7996f0819f81293076e652792794a961543e6750d7Mathias Agopian            surface_data_t* params, int pid, const String8& name,
8096f0819f81293076e652792794a961543e6750d7Mathias Agopian            DisplayID display, uint32_t w, uint32_t h,PixelFormat format,
8196f0819f81293076e652792794a961543e6750d7Mathias Agopian            uint32_t flags);
8296f0819f81293076e652792794a961543e6750d7Mathias Agopian    virtual status_t destroySurface(SurfaceID surfaceId);
8396f0819f81293076e652792794a961543e6750d7Mathias Agopian    virtual status_t setState(int32_t count, const layer_state_t* states);
8496f0819f81293076e652792794a961543e6750d7Mathias Agopian
8596f0819f81293076e652792794a961543e6750d7Mathias Agopian    DefaultKeyedVector< size_t, wp<LayerBaseClient> > mLayers;
86b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<SurfaceFlinger> mFlinger;
87b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    int32_t mNameGenerator;
88b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian};
89b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
90b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopianclass UserClient : public BnSurfaceComposerClient
91b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian{
92b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopianpublic:
93b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // pointer to this client's control block
94b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    SharedClient* ctrlblk;
95b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
96b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopianpublic:
97b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        UserClient(const sp<SurfaceFlinger>& flinger);
98b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        ~UserClient();
99b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
100b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    status_t initCheck() const;
101b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
102b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // protected by SurfaceFlinger::mStateLock
103b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    void detachLayer(const Layer* layer);
104b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
105b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopianprivate:
106b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
107b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // ISurfaceComposerClient interface
108b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual sp<IMemoryHeap> getControlBlock() const;
109b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual ssize_t getTokenForSurface(const sp<ISurface>& sur) const;
110b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual sp<ISurface> createSurface(
111b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian            surface_data_t* params, int pid, const String8& name,
112b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian            DisplayID display, uint32_t w, uint32_t h,PixelFormat format,
113b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian            uint32_t flags);
114b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual status_t destroySurface(SurfaceID surfaceId);
115b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual status_t setState(int32_t count, const layer_state_t* states);
116b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
117b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // atomic-ops
118b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    mutable volatile int32_t mBitmap;
119b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
12096f0819f81293076e652792794a961543e6750d7Mathias Agopian    sp<IMemoryHeap> mCblkHeap;
12196f0819f81293076e652792794a961543e6750d7Mathias Agopian    sp<SurfaceFlinger> mFlinger;
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass GraphicPlane
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static status_t orientationToTransfrom(int orientation, int w, int h,
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Transform* tr);
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                GraphicPlane();
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ~GraphicPlane();
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        bool                    initialized() const;
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        void                    setDisplayHardware(DisplayHardware *);
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        status_t                setOrientation(int orientation);
1390d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian        int                     getOrientation() const { return mOrientation; }
1402b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        int                     getWidth() const;
1412b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        int                     getHeight() const;
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const DisplayHardware&  displayHardware() const;
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const Transform&        transform() const;
145076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLDisplay              getEGLDisplay() const;
146076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                GraphicPlane(const GraphicPlane&);
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GraphicPlane            operator = (const GraphicPlane&);
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        DisplayHardware*        mHw;
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Transform               mGlobalTransform;
1532b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        Transform               mDisplayTransform;
1540d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian        int                     mOrientation;
1552b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        float                   mDisplayWidth;
1562b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        float                   mDisplayHeight;
1572b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        int                     mWidth;
1582b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        int                     mHeight;
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectenum {
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    eTransactionNeeded      = 0x01,
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    eTraversalNeeded        = 0x02
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
168a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopianclass SurfaceFlinger :
169a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian        public BinderService<SurfaceFlinger>,
170a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian        public BnSurfaceComposer,
171a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian        protected Thread
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
174a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian    static char const* getServiceName() { return "SurfaceFlinger"; }
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    SurfaceFlinger();
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual         ~SurfaceFlinger();
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void    init();
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t onTransact(
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t dump(int fd, const Vector<String16>& args);
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // ISurfaceComposer interface
1867e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    virtual sp<ISurfaceComposerClient>  createConnection();
187b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual sp<ISurfaceComposerClient>  createClientConnection();
1887303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian    virtual sp<IMemoryHeap>             getCblk() const;
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void                        bootFinished();
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void                        openGlobalTransaction();
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void                        closeGlobalTransaction();
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t                    freezeDisplay(DisplayID dpy, uint32_t flags);
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t                    unfreezeDisplay(DisplayID dpy, uint32_t flags);
194c08731e756868653d09d3e49b723706df3687070Mathias Agopian    virtual int                         setOrientation(DisplayID dpy, int orientation, uint32_t flags);
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void                        signal() const;
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                        screenReleased(DisplayID dpy);
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                        screenAcquired(DisplayID dpy);
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            overlay_control_device_t* getOverlayEngine() const;
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
202076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    status_t removeLayer(const sp<LayerBase>& layer);
203076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    status_t addLayer(const sp<LayerBase>& layer);
204076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    status_t invalidateLayerVisibility(const sp<LayerBase>& layer);
205b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
206b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Layer> getLayer(const sp<ISurface>& sur) const;
207b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
20996f0819f81293076e652792794a961543e6750d7Mathias Agopian    friend class Client;
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    friend class LayerBase;
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    friend class LayerBuffer;
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    friend class LayerBaseClient;
2131df3bbb8d88a4e725e4a8cdcb293f1e078176f4aMathias Agopian    friend class LayerBaseClient::Surface;
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    friend class Layer;
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    friend class LayerBlur;
216945ebbfd3dc07c7168602a1603eeb76ea7425376Mathias Agopian    friend class LayerDim;
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
21896f0819f81293076e652792794a961543e6750d7Mathias Agopian    sp<ISurface> createSurface(const sp<Client>& client,
21996f0819f81293076e652792794a961543e6750d7Mathias Agopian            int pid, const String8& name,
2207e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian            ISurfaceComposerClient::surface_data_t* params,
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            DisplayID display, uint32_t w, uint32_t h, PixelFormat format,
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            uint32_t flags);
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
224b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Layer> createNormalSurface(
225f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian            const sp<Client>& client, DisplayID display,
22696f0819f81293076e652792794a961543e6750d7Mathias Agopian            uint32_t w, uint32_t h, uint32_t flags,
2271c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian            PixelFormat& format);
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
229b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<LayerBlur> createBlurSurface(
230f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian            const sp<Client>& client, DisplayID display,
23196f0819f81293076e652792794a961543e6750d7Mathias Agopian            uint32_t w, uint32_t h, uint32_t flags);
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
233b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<LayerDim> createDimSurface(
234f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian            const sp<Client>& client, DisplayID display,
23596f0819f81293076e652792794a961543e6750d7Mathias Agopian            uint32_t w, uint32_t h, uint32_t flags);
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
237b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<LayerBuffer> createPushBuffersSurface(
238f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian            const sp<Client>& client, DisplayID display,
23996f0819f81293076e652792794a961543e6750d7Mathias Agopian            uint32_t w, uint32_t h, uint32_t flags);
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
24196f0819f81293076e652792794a961543e6750d7Mathias Agopian    status_t removeSurface(const sp<Client>& client, SurfaceID sid);
2429a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    status_t destroySurface(const sp<LayerBaseClient>& layer);
24396f0819f81293076e652792794a961543e6750d7Mathias Agopian    status_t setClientState(const sp<Client>& client,
24496f0819f81293076e652792794a961543e6750d7Mathias Agopian            int32_t count, const layer_state_t* states);
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    class LayerVector {
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public:
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        inline              LayerVector() { }
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            LayerVector(const LayerVector&);
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        inline size_t       size() const { return layers.size(); }
252076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        inline sp<LayerBase> const* array() const { return layers.array(); }
253076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ssize_t             add(const sp<LayerBase>&, Vector< sp<LayerBase> >::compar_t);
254076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ssize_t             remove(const sp<LayerBase>&);
255076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ssize_t             reorder(const sp<LayerBase>&, Vector< sp<LayerBase> >::compar_t);
256076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ssize_t             indexOf(const sp<LayerBase>& key, size_t guess=0) const;
257076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        inline sp<LayerBase> operator [] (size_t i) const { return layers[i]; }
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    private:
259076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        KeyedVector< sp<LayerBase> , size_t> lookup;
260076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        Vector< sp<LayerBase> >              layers;
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    struct State {
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        State() {
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            orientation = ISurfaceComposer::eOrientationDefault;
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            freezeDisplay = 0;
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        LayerVector     layersSortedByZ;
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint8_t         orientation;
270c08731e756868653d09d3e49b723706df3687070Mathias Agopian        uint8_t         orientationType;
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint8_t         freezeDisplay;
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual bool        threadLoop();
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t    readyToRun();
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void        onFirstRef();
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
278550a11455a5155b078085fd5f464d7f3e5dfb7fcAndy McFaddenpublic:     // hack to work around gcc 4.0.3 bug
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GraphicPlane&     graphicPlane(int dpy) const;
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          GraphicPlane&     graphicPlane(int dpy);
281550a11455a5155b078085fd5f464d7f3e5dfb7fcAndy McFaddenprivate:
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        waitForEvent();
2842944a2b3601ae5847cf54b3130dcf653a7b24b8aAndy McFaddenpublic:     // hack to work around gcc 4.0.3 bug
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        signalEvent();
2862944a2b3601ae5847cf54b3130dcf653a7b24b8aAndy McFaddenprivate:
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        handleConsoleEvents();
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        handleTransaction(uint32_t transactionFlags);
2893d57964a81cd631d80aa9575647e1ce35b5e82d5Mathias Agopian            void        handleTransactionLocked(
2903d57964a81cd631d80aa9575647e1ce35b5e82d5Mathias Agopian                            uint32_t transactionFlags,
2913d57964a81cd631d80aa9575647e1ce35b5e82d5Mathias Agopian                            Vector< sp<LayerBase> >& ditchedLayers);
292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        computeVisibleRegions(
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            LayerVector& currentLayers,
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            Region& dirtyRegion,
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            Region& wormholeRegion);
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        handlePageFlip();
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool        lockPageFlip(const LayerVector& currentLayers);
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        unlockPageFlip(const LayerVector& currentLayers);
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        handleRepaint();
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        postFramebuffer();
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        composeSurfaces(const Region& dirty);
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        unlockClients();
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
30796f0819f81293076e652792794a961543e6750d7Mathias Agopian            ssize_t     addClientLayer(const sp<Client>& client,
30896f0819f81293076e652792794a961543e6750d7Mathias Agopian                    const sp<LayerBaseClient>& lbc);
309076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            status_t    addLayer_l(const sp<LayerBase>& layer);
310076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            status_t    removeLayer_l(const sp<LayerBase>& layer);
3119a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian            status_t    purgatorizeLayer_l(const sp<LayerBase>& layer);
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            uint32_t    getTransactionFlags(uint32_t flags);
314bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian            uint32_t    setTransactionFlags(uint32_t flags);
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        commitTransaction();
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            friend class FreezeLock;
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            sp<FreezeLock> getFreezeLock() const;
3200408772e34931351d062f2088b611325ddaa6cdbMathias Agopian            inline void incFreezeCount() {
3210408772e34931351d062f2088b611325ddaa6cdbMathias Agopian                if (mFreezeCount == 0)
3220408772e34931351d062f2088b611325ddaa6cdbMathias Agopian                    mFreezeDisplayTime = 0;
3230408772e34931351d062f2088b611325ddaa6cdbMathias Agopian                mFreezeCount++;
3240408772e34931351d062f2088b611325ddaa6cdbMathias Agopian            }
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            inline void decFreezeCount() { if (mFreezeCount > 0) mFreezeCount--; }
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            inline bool hasFreezeRequest() const { return mFreezeDisplay; }
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            inline bool isFrozen() const {
3283330b203039dea366d4981db1408a460134b2d2cMathias Agopian                return (mFreezeDisplay || mFreezeCount>0) && mBootFinished;
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        debugFlashRegions();
333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        debugShowFPS() const;
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        drawWormhole() const;
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
336f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian
337f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian    mutable     MessageQueue    mEventQueue;
338bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian
339bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    status_t postMessageAsync(const sp<MessageBase>& msg,
340bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian            nsecs_t reltime=0, uint32_t flags = 0);
341bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian
342bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    status_t postMessageSync(const sp<MessageBase>& msg,
343bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian            nsecs_t reltime=0, uint32_t flags = 0);
344b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // access must be protected by mStateLock
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable     Mutex                   mStateLock;
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                State                   mCurrentState;
348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                State                   mDrawingState;
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile    int32_t                 mTransactionFlags;
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile    int32_t                 mTransactionCount;
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                Condition               mTransactionCV;
352cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian                bool                    mResizeTransationPending;
35396f0819f81293076e652792794a961543e6750d7Mathias Agopian
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // protected by mStateLock (but we could use another lock)
35596f0819f81293076e652792794a961543e6750d7Mathias Agopian                GraphicPlane                mGraphicPlanes[1];
35696f0819f81293076e652792794a961543e6750d7Mathias Agopian                bool                        mLayersRemoved;
357b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian                DefaultKeyedVector< wp<IBinder>, wp<Layer> > mLayerMap;
358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // constant members (no synchronization needed for access)
3607303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian                sp<IMemoryHeap>             mServerHeap;
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                surface_flinger_cblk_t*     mServerCblk;
362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLuint                      mWormholeTexName;
363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                nsecs_t                     mBootTime;
364375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                Permission                  mHardwareTest;
365375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                Permission                  mAccessSurfaceFlinger;
366375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                Permission                  mDump;
367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // Can only accessed from the main thread, these members
369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // don't need synchronization
370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                Region                      mDirtyRegion;
371970112231e887c8a14441ec4fed55342e019fc8cMathias Agopian                Region                      mDirtyRegionRemovedLayer;
372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                Region                      mInvalidRegion;
373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                Region                      mWormholeRegion;
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                bool                        mVisibleRegionsDirty;
375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                bool                        mDeferReleaseConsole;
376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                bool                        mFreezeDisplay;
377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int32_t                     mFreezeCount;
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                nsecs_t                     mFreezeDisplayTime;
3794da751999358fffa4cefc4c8046dab72045925f6Mathias Agopian                Vector< sp<LayerBase> >     mVisibleLayersSortedByZ;
3804da751999358fffa4cefc4c8046dab72045925f6Mathias Agopian
381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // don't use a lock for these, we don't care
383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int                         mDebugRegion;
384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int                         mDebugBackground;
3859795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian                volatile nsecs_t            mDebugInSwapBuffers;
3869795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian                nsecs_t                     mLastSwapBufferTime;
3879795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian                volatile nsecs_t            mDebugInTransaction;
3889795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian                nsecs_t                     mLastTransactionTime;
3893330b203039dea366d4981db1408a460134b2d2cMathias Agopian                bool                        mBootFinished;
390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // these are thread safe
392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable     Barrier                     mReadyToRunBarrier;
393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // atomic variables
395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                enum {
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    eConsoleReleased = 1,
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    eConsoleAcquired = 2
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                };
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   volatile     int32_t                     mConsoleSignals;
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   // only written in the main thread, only read in other threads
402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   volatile     int32_t                     mSecureFrameBuffer;
403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass FreezeLock : public LightRefBase<FreezeLock> {
408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SurfaceFlinger* mFlinger;
409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    FreezeLock(SurfaceFlinger* flinger)
411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        : mFlinger(flinger) {
412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mFlinger->incFreezeCount();
413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ~FreezeLock() {
415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mFlinger->decFreezeCount();
416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_SURFACE_FLINGER_H
423