SurfaceFlinger.h revision 1f339ff3875afad128a8e16ee6395c5fad295826
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/Atomic.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
2599b49840d309727678b77403d6cc9f920111623fMathias Agopian#include <utils/KeyedVector.h>
26076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/RefBase.h>
2799b49840d309727678b77403d6cc9f920111623fMathias Agopian#include <utils/SortedVector.h>
2899b49840d309727678b77403d6cc9f920111623fMathias Agopian#include <utils/threads.h>
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
30a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian#include <binder/BinderService.h>
3199b49840d309727678b77403d6cc9f920111623fMathias Agopian#include <binder/IMemory.h>
32375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
3499b49840d309727678b77403d6cc9f920111623fMathias Agopian#include <surfaceflinger/IGraphicBufferAlloc.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 LayerDim;
52a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianstruct surface_flinger_cblk_t;
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
5996f0819f81293076e652792794a961543e6750d7Mathias Agopianclass Client : public BnSurfaceComposerClient
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
6296f0819f81293076e652792794a961543e6750d7Mathias Agopian        Client(const sp<SurfaceFlinger>& flinger);
6396f0819f81293076e652792794a961543e6750d7Mathias Agopian        ~Client();
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6596f0819f81293076e652792794a961543e6750d7Mathias Agopian    status_t initCheck() const;
6696f0819f81293076e652792794a961543e6750d7Mathias Agopian
6796f0819f81293076e652792794a961543e6750d7Mathias Agopian    // protected by SurfaceFlinger::mStateLock
684f113740180b6512b43723c4728f262882dc9b45Mathias Agopian    size_t attachLayer(const sp<LayerBaseClient>& layer);
69b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    void detachLayer(const LayerBaseClient* layer);
7096f0819f81293076e652792794a961543e6750d7Mathias Agopian    sp<LayerBaseClient> getLayerUser(int32_t i) const;
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
7396f0819f81293076e652792794a961543e6750d7Mathias Agopian    // ISurfaceComposerClient interface
7496f0819f81293076e652792794a961543e6750d7Mathias Agopian    virtual sp<ISurface> createSurface(
750ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian            surface_data_t* params, const String8& name,
7696f0819f81293076e652792794a961543e6750d7Mathias Agopian            DisplayID display, uint32_t w, uint32_t h,PixelFormat format,
7796f0819f81293076e652792794a961543e6750d7Mathias Agopian            uint32_t flags);
7896f0819f81293076e652792794a961543e6750d7Mathias Agopian    virtual status_t destroySurface(SurfaceID surfaceId);
79a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    virtual status_t onTransact(
80a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
8196f0819f81293076e652792794a961543e6750d7Mathias Agopian
824f113740180b6512b43723c4728f262882dc9b45Mathias Agopian    // constant
83b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<SurfaceFlinger> mFlinger;
844f113740180b6512b43723c4728f262882dc9b45Mathias Agopian
854f113740180b6512b43723c4728f262882dc9b45Mathias Agopian    // protected by mLock
864f113740180b6512b43723c4728f262882dc9b45Mathias Agopian    DefaultKeyedVector< size_t, wp<LayerBaseClient> > mLayers;
874f113740180b6512b43723c4728f262882dc9b45Mathias Agopian    size_t mNameGenerator;
884f113740180b6512b43723c4728f262882dc9b45Mathias Agopian
894f113740180b6512b43723c4728f262882dc9b45Mathias Agopian    // thread-safe
904f113740180b6512b43723c4728f262882dc9b45Mathias Agopian    mutable Mutex mLock;
91b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian};
92b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
939a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennisclass GraphicBufferAlloc : public BnGraphicBufferAlloc
949a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis{
959a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennispublic:
969a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    GraphicBufferAlloc();
979a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    virtual ~GraphicBufferAlloc();
989a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    virtual sp<GraphicBuffer> createGraphicBuffer(uint32_t w, uint32_t h,
999a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        PixelFormat format, uint32_t usage);
1009a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis};
1019a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass GraphicPlane
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static status_t orientationToTransfrom(int orientation, int w, int h,
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Transform* tr);
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                GraphicPlane();
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ~GraphicPlane();
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        bool                    initialized() const;
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        void                    setDisplayHardware(DisplayHardware *);
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        status_t                setOrientation(int orientation);
1170d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian        int                     getOrientation() const { return mOrientation; }
1182b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        int                     getWidth() const;
1192b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        int                     getHeight() const;
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const DisplayHardware&  displayHardware() const;
12259119e658a12279e8fff508f8773843de2d90917Mathias Agopian        DisplayHardware&        editDisplayHardware();
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const Transform&        transform() const;
124076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLDisplay              getEGLDisplay() const;
125076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                GraphicPlane(const GraphicPlane&);
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GraphicPlane            operator = (const GraphicPlane&);
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        DisplayHardware*        mHw;
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Transform               mGlobalTransform;
1322b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        Transform               mDisplayTransform;
1330d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian        int                     mOrientation;
1342b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        float                   mDisplayWidth;
1352b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        float                   mDisplayHeight;
1362b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        int                     mWidth;
1372b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        int                     mHeight;
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectenum {
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    eTransactionNeeded      = 0x01,
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    eTraversalNeeded        = 0x02
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
147a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopianclass SurfaceFlinger :
148a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian        public BinderService<SurfaceFlinger>,
149a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian        public BnSurfaceComposer,
1501f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian        public IBinder::DeathRecipient,
151a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian        protected Thread
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
154a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian    static char const* getServiceName() { return "SurfaceFlinger"; }
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    SurfaceFlinger();
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual         ~SurfaceFlinger();
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void    init();
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t onTransact(
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t dump(int fd, const Vector<String16>& args);
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // ISurfaceComposer interface
1667e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    virtual sp<ISurfaceComposerClient>  createConnection();
1679a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    virtual sp<IGraphicBufferAlloc>     createGraphicBufferAlloc();
1687303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian    virtual sp<IMemoryHeap>             getCblk() const;
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void                        bootFinished();
170698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    virtual void                        setTransactionState(const Vector<ComposerState>& state);
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t                    freezeDisplay(DisplayID dpy, uint32_t flags);
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t                    unfreezeDisplay(DisplayID dpy, uint32_t flags);
173c08731e756868653d09d3e49b723706df3687070Mathias Agopian    virtual int                         setOrientation(DisplayID dpy, int orientation, uint32_t flags);
174134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    virtual bool                        authenticateSurface(const sp<ISurface>& surface) const;
175bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian
176bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    virtual status_t captureScreen(DisplayID dpy,
177bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            sp<IMemoryHeap>* heap,
178bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            uint32_t* width, uint32_t* height,
179bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            PixelFormat* format, uint32_t reqWidth, uint32_t reqHeight,
180bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            uint32_t minLayerZ, uint32_t maxLayerZ);
181bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian
18259119e658a12279e8fff508f8773843de2d90917Mathias Agopian    virtual status_t                    turnElectronBeamOff(int32_t mode);
1839daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian    virtual status_t                    turnElectronBeamOn(int32_t mode);
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                        screenReleased(DisplayID dpy);
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                        screenAcquired(DisplayID dpy);
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
188076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    status_t removeLayer(const sp<LayerBase>& layer);
189076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    status_t addLayer(const sp<LayerBase>& layer);
190076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    status_t invalidateLayerVisibility(const sp<LayerBase>& layer);
191ad456f9878ff7c176499e7b992f9ff1cb3e9cdeeMathias Agopian    void invalidateHwcGeometry();
192ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian    void destroyLayer(LayerBase const* layer);
193b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
194b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Layer> getLayer(const sp<ISurface>& sur) const;
195b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
1971f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian    // DeathRecipient interface
1981f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian    virtual void binderDied(const wp<IBinder>& who);
1991f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian
2001f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopianprivate:
20196f0819f81293076e652792794a961543e6750d7Mathias Agopian    friend class Client;
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    friend class LayerBase;
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    friend class LayerBaseClient;
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    friend class Layer;
205945ebbfd3dc07c7168602a1603eeb76ea7425376Mathias Agopian    friend class LayerDim;
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2070ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian    sp<ISurface> createSurface(
2087e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian            ISurfaceComposerClient::surface_data_t* params,
2090ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian            const String8& name,
2100ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian            const sp<Client>& client,
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            DisplayID display, uint32_t w, uint32_t h, PixelFormat format,
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            uint32_t flags);
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
214b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Layer> createNormalSurface(
215f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian            const sp<Client>& client, DisplayID display,
21696f0819f81293076e652792794a961543e6750d7Mathias Agopian            uint32_t w, uint32_t h, uint32_t flags,
2171c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian            PixelFormat& format);
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
219b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<LayerDim> createDimSurface(
220f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian            const sp<Client>& client, DisplayID display,
22196f0819f81293076e652792794a961543e6750d7Mathias Agopian            uint32_t w, uint32_t h, uint32_t flags);
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
22396f0819f81293076e652792794a961543e6750d7Mathias Agopian    status_t removeSurface(const sp<Client>& client, SurfaceID sid);
224ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian    status_t destroySurface(const wp<LayerBaseClient>& layer);
225698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    uint32_t setClientStateLocked(const sp<Client>& client, const layer_state_t& s);
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
227f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian    class LayerVector : public SortedVector< sp<LayerBase> > {
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public:
229f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian        LayerVector() { }
230f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian        LayerVector(const LayerVector& rhs) : SortedVector< sp<LayerBase> >(rhs) { }
231f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian        virtual int do_compare(const void* lhs, const void* rhs) const {
232f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian            const sp<LayerBase>& l(*reinterpret_cast<const sp<LayerBase>*>(lhs));
233f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian            const sp<LayerBase>& r(*reinterpret_cast<const sp<LayerBase>*>(rhs));
234f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian            // sort layers by Z order
235f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian            uint32_t lz = l->currentState().z;
236f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian            uint32_t rz = r->currentState().z;
237f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian            // then by sequence, so we get a stable ordering
238f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian            return (lz != rz) ? (lz - rz) : (l->sequence - r->sequence);
239f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian        }
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    struct State {
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        State() {
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            orientation = ISurfaceComposer::eOrientationDefault;
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            freezeDisplay = 0;
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        LayerVector     layersSortedByZ;
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint8_t         orientation;
249c08731e756868653d09d3e49b723706df3687070Mathias Agopian        uint8_t         orientationType;
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint8_t         freezeDisplay;
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual bool        threadLoop();
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t    readyToRun();
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void        onFirstRef();
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
257550a11455a5155b078085fd5f464d7f3e5dfb7fcAndy McFaddenpublic:     // hack to work around gcc 4.0.3 bug
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GraphicPlane&     graphicPlane(int dpy) const;
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          GraphicPlane&     graphicPlane(int dpy);
260550a11455a5155b078085fd5f464d7f3e5dfb7fcAndy McFaddenprivate:
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        waitForEvent();
2632944a2b3601ae5847cf54b3130dcf653a7b24b8aAndy McFaddenpublic:     // hack to work around gcc 4.0.3 bug
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        signalEvent();
2652944a2b3601ae5847cf54b3130dcf653a7b24b8aAndy McFaddenprivate:
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        handleConsoleEvents();
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        handleTransaction(uint32_t transactionFlags);
268ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian            void        handleTransactionLocked(uint32_t transactionFlags);
269ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian            void        handleDestroyLayers();
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        computeVisibleRegions(
2721bbafb96101de04c43adb5e3ca2494070d20a46aMathias Agopian                            const LayerVector& currentLayers,
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            Region& dirtyRegion,
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            Region& wormholeRegion);
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        handlePageFlip();
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool        lockPageFlip(const LayerVector& currentLayers);
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        unlockPageFlip(const LayerVector& currentLayers);
279a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian            void        handleWorkList();
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        handleRepaint();
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        postFramebuffer();
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        composeSurfaces(const Region& dirty);
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
28596f0819f81293076e652792794a961543e6750d7Mathias Agopian            ssize_t     addClientLayer(const sp<Client>& client,
28696f0819f81293076e652792794a961543e6750d7Mathias Agopian                    const sp<LayerBaseClient>& lbc);
287076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            status_t    addLayer_l(const sp<LayerBase>& layer);
288076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            status_t    removeLayer_l(const sp<LayerBase>& layer);
2899a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian            status_t    purgatorizeLayer_l(const sp<LayerBase>& layer);
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            uint32_t    getTransactionFlags(uint32_t flags);
292dea20b1f343012d58ca9eb381684b26a168dc127Mathias Agopian            uint32_t    peekTransactionFlags(uint32_t flags);
293bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian            uint32_t    setTransactionFlags(uint32_t flags);
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        commitTransaction();
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian            status_t captureScreenImplLocked(DisplayID dpy,
29874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian                    sp<IMemoryHeap>* heap,
29974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian                    uint32_t* width, uint32_t* height, PixelFormat* format,
300bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian                    uint32_t reqWidth, uint32_t reqHeight,
301bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian                    uint32_t minLayerZ, uint32_t maxLayerZ);
30274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
303abd671a08a41519a7ab3d438a500efe0ef0bfc1dMathias Agopian            status_t turnElectronBeamOffImplLocked(int32_t mode);
304abd671a08a41519a7ab3d438a500efe0ef0bfc1dMathias Agopian            status_t turnElectronBeamOnImplLocked(int32_t mode);
3059daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian            status_t electronBeamOffAnimationImplLocked();
3069daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian            status_t electronBeamOnAnimationImplLocked();
3079daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian            status_t renderScreenToTextureLocked(DisplayID dpy,
3089daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian                    GLuint* textureName, GLfloat* uOut, GLfloat* vOut);
30959119e658a12279e8fff508f8773843de2d90917Mathias Agopian
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            friend class FreezeLock;
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            sp<FreezeLock> getFreezeLock() const;
3120408772e34931351d062f2088b611325ddaa6cdbMathias Agopian            inline void incFreezeCount() {
3130408772e34931351d062f2088b611325ddaa6cdbMathias Agopian                if (mFreezeCount == 0)
3140408772e34931351d062f2088b611325ddaa6cdbMathias Agopian                    mFreezeDisplayTime = 0;
3150408772e34931351d062f2088b611325ddaa6cdbMathias Agopian                mFreezeCount++;
3160408772e34931351d062f2088b611325ddaa6cdbMathias Agopian            }
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            inline void decFreezeCount() { if (mFreezeCount > 0) mFreezeCount--; }
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            inline bool hasFreezeRequest() const { return mFreezeDisplay; }
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            inline bool isFrozen() const {
3203330b203039dea366d4981db1408a460134b2d2cMathias Agopian                return (mFreezeDisplay || mFreezeCount>0) && mBootFinished;
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        debugFlashRegions();
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        debugShowFPS() const;
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        drawWormhole() const;
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
328f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian
329f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian    mutable     MessageQueue    mEventQueue;
330bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian
331bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    status_t postMessageAsync(const sp<MessageBase>& msg,
332bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian            nsecs_t reltime=0, uint32_t flags = 0);
333bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian
334bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    status_t postMessageSync(const sp<MessageBase>& msg,
335bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian            nsecs_t reltime=0, uint32_t flags = 0);
336b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // access must be protected by mStateLock
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable     Mutex                   mStateLock;
339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                State                   mCurrentState;
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile    int32_t                 mTransactionFlags;
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                Condition               mTransactionCV;
34276cd4ddc6ad664257739b3d3713fd9ebdc9a4ad9Mathias Agopian                SortedVector< sp<LayerBase> > mLayerPurgatory;
343cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian                bool                    mResizeTransationPending;
34496f0819f81293076e652792794a961543e6750d7Mathias Agopian
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // protected by mStateLock (but we could use another lock)
34696f0819f81293076e652792794a961543e6750d7Mathias Agopian                GraphicPlane                mGraphicPlanes[1];
34796f0819f81293076e652792794a961543e6750d7Mathias Agopian                bool                        mLayersRemoved;
348b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian                DefaultKeyedVector< wp<IBinder>, wp<Layer> > mLayerMap;
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // constant members (no synchronization needed for access)
3517303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian                sp<IMemoryHeap>             mServerHeap;
352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                surface_flinger_cblk_t*     mServerCblk;
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLuint                      mWormholeTexName;
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                nsecs_t                     mBootTime;
35599b49840d309727678b77403d6cc9f920111623fMathias Agopian
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // Can only accessed from the main thread, these members
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // don't need synchronization
3581bbafb96101de04c43adb5e3ca2494070d20a46aMathias Agopian                State                       mDrawingState;
359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                Region                      mDirtyRegion;
360970112231e887c8a14441ec4fed55342e019fc8cMathias Agopian                Region                      mDirtyRegionRemovedLayer;
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                Region                      mInvalidRegion;
362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                Region                      mWormholeRegion;
363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                bool                        mVisibleRegionsDirty;
364a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian                bool                        mHwWorkListDirty;
365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                bool                        mDeferReleaseConsole;
366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                bool                        mFreezeDisplay;
367abd671a08a41519a7ab3d438a500efe0ef0bfc1dMathias Agopian                int32_t                     mElectronBeamAnimationMode;
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int32_t                     mFreezeCount;
369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                nsecs_t                     mFreezeDisplayTime;
3704da751999358fffa4cefc4c8046dab72045925f6Mathias Agopian                Vector< sp<LayerBase> >     mVisibleLayersSortedByZ;
3714da751999358fffa4cefc4c8046dab72045925f6Mathias Agopian
372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // don't use a lock for these, we don't care
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int                         mDebugRegion;
375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int                         mDebugBackground;
37673d3ba9e50be1014aa21ec4bbdc874be394accb4Mathias Agopian                int                         mDebugDisableHWC;
3779795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian                volatile nsecs_t            mDebugInSwapBuffers;
3789795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian                nsecs_t                     mLastSwapBufferTime;
3799795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian                volatile nsecs_t            mDebugInTransaction;
3809795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian                nsecs_t                     mLastTransactionTime;
3813330b203039dea366d4981db1408a460134b2d2cMathias Agopian                bool                        mBootFinished;
382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // these are thread safe
384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable     Barrier                     mReadyToRunBarrier;
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
386ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian
387ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian                // protected by mDestroyedLayerLock;
388ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian    mutable     Mutex                       mDestroyedLayerLock;
389ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian                Vector<LayerBase const *>   mDestroyedLayers;
390ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian
391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // atomic variables
392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                enum {
393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    eConsoleReleased = 1,
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    eConsoleAcquired = 2
395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                };
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   volatile     int32_t                     mConsoleSignals;
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   // only written in the main thread, only read in other threads
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   volatile     int32_t                     mSecureFrameBuffer;
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass FreezeLock : public LightRefBase<FreezeLock> {
405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SurfaceFlinger* mFlinger;
406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    FreezeLock(SurfaceFlinger* flinger)
408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        : mFlinger(flinger) {
409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mFlinger->incFreezeCount();
410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ~FreezeLock() {
412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mFlinger->decFreezeCount();
413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_SURFACE_FLINGER_H
420