SurfaceFlinger.h revision 4f113740180b6512b43723c4728f262882dc9b45
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>
379a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis#include <surfaceflinger/IGraphicBufferAlloc.h>
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Barrier.h"
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h"
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
42f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include "MessageQueue.h"
43f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Client;
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass DisplayHardware;
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass FreezeLock;
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Layer;
52b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopianclass LayerDim;
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
7496f0819f81293076e652792794a961543e6750d7Mathias Agopian    // ISurfaceComposerClient interface
7596f0819f81293076e652792794a961543e6750d7Mathias Agopian    virtual sp<IMemoryHeap> getControlBlock() const;
76b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual ssize_t getTokenForSurface(const sp<ISurface>& sur) const;
7796f0819f81293076e652792794a961543e6750d7Mathias Agopian    virtual sp<ISurface> createSurface(
780ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian            surface_data_t* params, const String8& name,
7996f0819f81293076e652792794a961543e6750d7Mathias Agopian            DisplayID display, uint32_t w, uint32_t h,PixelFormat format,
8096f0819f81293076e652792794a961543e6750d7Mathias Agopian            uint32_t flags);
8196f0819f81293076e652792794a961543e6750d7Mathias Agopian    virtual status_t destroySurface(SurfaceID surfaceId);
8296f0819f81293076e652792794a961543e6750d7Mathias Agopian    virtual status_t setState(int32_t count, const layer_state_t* states);
8396f0819f81293076e652792794a961543e6750d7Mathias Agopian
844f113740180b6512b43723c4728f262882dc9b45Mathias Agopian    // constant
85b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<SurfaceFlinger> mFlinger;
864f113740180b6512b43723c4728f262882dc9b45Mathias Agopian
874f113740180b6512b43723c4728f262882dc9b45Mathias Agopian    // protected by mLock
884f113740180b6512b43723c4728f262882dc9b45Mathias Agopian    DefaultKeyedVector< size_t, wp<LayerBaseClient> > mLayers;
894f113740180b6512b43723c4728f262882dc9b45Mathias Agopian    size_t mNameGenerator;
904f113740180b6512b43723c4728f262882dc9b45Mathias Agopian
914f113740180b6512b43723c4728f262882dc9b45Mathias Agopian    // thread-safe
924f113740180b6512b43723c4728f262882dc9b45Mathias Agopian    mutable Mutex mLock;
93b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian};
94b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
95b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopianclass UserClient : public BnSurfaceComposerClient
96b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian{
97b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopianpublic:
98b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // pointer to this client's control block
99b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    SharedClient* ctrlblk;
100b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
101b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopianpublic:
102b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        UserClient(const sp<SurfaceFlinger>& flinger);
103b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        ~UserClient();
104b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
105b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    status_t initCheck() const;
106b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
107b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // protected by SurfaceFlinger::mStateLock
108b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    void detachLayer(const Layer* layer);
109b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
110b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopianprivate:
111b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
112b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // ISurfaceComposerClient interface
113b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual sp<IMemoryHeap> getControlBlock() const;
114b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual ssize_t getTokenForSurface(const sp<ISurface>& sur) const;
115b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual sp<ISurface> createSurface(
1160ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian            surface_data_t* params, const String8& name,
117b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian            DisplayID display, uint32_t w, uint32_t h,PixelFormat format,
118b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian            uint32_t flags);
119b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual status_t destroySurface(SurfaceID surfaceId);
120b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual status_t setState(int32_t count, const layer_state_t* states);
121b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
122b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // atomic-ops
123b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    mutable volatile int32_t mBitmap;
124b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
12596f0819f81293076e652792794a961543e6750d7Mathias Agopian    sp<IMemoryHeap> mCblkHeap;
12696f0819f81293076e652792794a961543e6750d7Mathias Agopian    sp<SurfaceFlinger> mFlinger;
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1299a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennisclass GraphicBufferAlloc : public BnGraphicBufferAlloc
1309a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis{
1319a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennispublic:
1329a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    GraphicBufferAlloc();
1339a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    virtual ~GraphicBufferAlloc();
1349a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    virtual sp<GraphicBuffer> createGraphicBuffer(uint32_t w, uint32_t h,
1359a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        PixelFormat format, uint32_t usage);
1369a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis};
1379a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass GraphicPlane
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static status_t orientationToTransfrom(int orientation, int w, int h,
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Transform* tr);
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                GraphicPlane();
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ~GraphicPlane();
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        bool                    initialized() const;
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        void                    setDisplayHardware(DisplayHardware *);
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        status_t                setOrientation(int orientation);
1530d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian        int                     getOrientation() const { return mOrientation; }
1542b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        int                     getWidth() const;
1552b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        int                     getHeight() const;
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const DisplayHardware&  displayHardware() const;
15859119e658a12279e8fff508f8773843de2d90917Mathias Agopian        DisplayHardware&        editDisplayHardware();
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const Transform&        transform() const;
160076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLDisplay              getEGLDisplay() const;
161076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                GraphicPlane(const GraphicPlane&);
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GraphicPlane            operator = (const GraphicPlane&);
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        DisplayHardware*        mHw;
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Transform               mGlobalTransform;
1682b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        Transform               mDisplayTransform;
1690d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian        int                     mOrientation;
1702b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        float                   mDisplayWidth;
1712b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        float                   mDisplayHeight;
1722b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        int                     mWidth;
1732b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian        int                     mHeight;
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectenum {
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    eTransactionNeeded      = 0x01,
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    eTraversalNeeded        = 0x02
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
183a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopianclass SurfaceFlinger :
184a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian        public BinderService<SurfaceFlinger>,
185a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian        public BnSurfaceComposer,
186a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian        protected Thread
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
189a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian    static char const* getServiceName() { return "SurfaceFlinger"; }
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    SurfaceFlinger();
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual         ~SurfaceFlinger();
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void    init();
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t onTransact(
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t dump(int fd, const Vector<String16>& args);
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // ISurfaceComposer interface
2017e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    virtual sp<ISurfaceComposerClient>  createConnection();
202b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual sp<ISurfaceComposerClient>  createClientConnection();
2039a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    virtual sp<IGraphicBufferAlloc>     createGraphicBufferAlloc();
2047303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian    virtual sp<IMemoryHeap>             getCblk() const;
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void                        bootFinished();
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void                        openGlobalTransaction();
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void                        closeGlobalTransaction();
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t                    freezeDisplay(DisplayID dpy, uint32_t flags);
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t                    unfreezeDisplay(DisplayID dpy, uint32_t flags);
210c08731e756868653d09d3e49b723706df3687070Mathias Agopian    virtual int                         setOrientation(DisplayID dpy, int orientation, uint32_t flags);
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void                        signal() const;
212134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    virtual bool                        authenticateSurface(const sp<ISurface>& surface) const;
213bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian
214bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    virtual status_t captureScreen(DisplayID dpy,
215bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            sp<IMemoryHeap>* heap,
216bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            uint32_t* width, uint32_t* height,
217bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            PixelFormat* format, uint32_t reqWidth, uint32_t reqHeight,
218bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            uint32_t minLayerZ, uint32_t maxLayerZ);
219bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian
22059119e658a12279e8fff508f8773843de2d90917Mathias Agopian    virtual status_t                    turnElectronBeamOff(int32_t mode);
2219daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian    virtual status_t                    turnElectronBeamOn(int32_t mode);
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                        screenReleased(DisplayID dpy);
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                        screenAcquired(DisplayID dpy);
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
226076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    status_t removeLayer(const sp<LayerBase>& layer);
227076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    status_t addLayer(const sp<LayerBase>& layer);
228076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    status_t invalidateLayerVisibility(const sp<LayerBase>& layer);
229ad456f9878ff7c176499e7b992f9ff1cb3e9cdeeMathias Agopian    void invalidateHwcGeometry();
230b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
231b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Layer> getLayer(const sp<ISurface>& sur) const;
232b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
23496f0819f81293076e652792794a961543e6750d7Mathias Agopian    friend class Client;
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    friend class LayerBase;
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    friend class LayerBaseClient;
2371df3bbb8d88a4e725e4a8cdcb293f1e078176f4aMathias Agopian    friend class LayerBaseClient::Surface;
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    friend class Layer;
239945ebbfd3dc07c7168602a1603eeb76ea7425376Mathias Agopian    friend class LayerDim;
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2410ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian    sp<ISurface> createSurface(
2427e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian            ISurfaceComposerClient::surface_data_t* params,
2430ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian            const String8& name,
2440ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian            const sp<Client>& client,
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            DisplayID display, uint32_t w, uint32_t h, PixelFormat format,
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            uint32_t flags);
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
248b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Layer> createNormalSurface(
249f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian            const sp<Client>& client, DisplayID display,
25096f0819f81293076e652792794a961543e6750d7Mathias Agopian            uint32_t w, uint32_t h, uint32_t flags,
2511c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian            PixelFormat& format);
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
253b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<LayerDim> createDimSurface(
254f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian            const sp<Client>& client, DisplayID display,
25596f0819f81293076e652792794a961543e6750d7Mathias Agopian            uint32_t w, uint32_t h, uint32_t flags);
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25796f0819f81293076e652792794a961543e6750d7Mathias Agopian    status_t removeSurface(const sp<Client>& client, SurfaceID sid);
2589a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    status_t destroySurface(const sp<LayerBaseClient>& layer);
25996f0819f81293076e652792794a961543e6750d7Mathias Agopian    status_t setClientState(const sp<Client>& client,
26096f0819f81293076e652792794a961543e6750d7Mathias Agopian            int32_t count, const layer_state_t* states);
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
262f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian    class LayerVector : public SortedVector< sp<LayerBase> > {
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public:
264f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian        LayerVector() { }
265f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian        LayerVector(const LayerVector& rhs) : SortedVector< sp<LayerBase> >(rhs) { }
266f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian        virtual int do_compare(const void* lhs, const void* rhs) const {
267f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian            const sp<LayerBase>& l(*reinterpret_cast<const sp<LayerBase>*>(lhs));
268f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian            const sp<LayerBase>& r(*reinterpret_cast<const sp<LayerBase>*>(rhs));
269f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian            // sort layers by Z order
270f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian            uint32_t lz = l->currentState().z;
271f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian            uint32_t rz = r->currentState().z;
272f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian            // then by sequence, so we get a stable ordering
273f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian            return (lz != rz) ? (lz - rz) : (l->sequence - r->sequence);
274f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian        }
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    struct State {
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        State() {
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            orientation = ISurfaceComposer::eOrientationDefault;
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            freezeDisplay = 0;
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        LayerVector     layersSortedByZ;
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint8_t         orientation;
284c08731e756868653d09d3e49b723706df3687070Mathias Agopian        uint8_t         orientationType;
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint8_t         freezeDisplay;
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual bool        threadLoop();
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t    readyToRun();
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void        onFirstRef();
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
292550a11455a5155b078085fd5f464d7f3e5dfb7fcAndy McFaddenpublic:     // hack to work around gcc 4.0.3 bug
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GraphicPlane&     graphicPlane(int dpy) const;
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          GraphicPlane&     graphicPlane(int dpy);
295550a11455a5155b078085fd5f464d7f3e5dfb7fcAndy McFaddenprivate:
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        waitForEvent();
2982944a2b3601ae5847cf54b3130dcf653a7b24b8aAndy McFaddenpublic:     // hack to work around gcc 4.0.3 bug
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        signalEvent();
3002944a2b3601ae5847cf54b3130dcf653a7b24b8aAndy McFaddenprivate:
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        handleConsoleEvents();
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        handleTransaction(uint32_t transactionFlags);
3033d57964a81cd631d80aa9575647e1ce35b5e82d5Mathias Agopian            void        handleTransactionLocked(
3043d57964a81cd631d80aa9575647e1ce35b5e82d5Mathias Agopian                            uint32_t transactionFlags,
3053d57964a81cd631d80aa9575647e1ce35b5e82d5Mathias Agopian                            Vector< sp<LayerBase> >& ditchedLayers);
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        computeVisibleRegions(
3081bbafb96101de04c43adb5e3ca2494070d20a46aMathias Agopian                            const LayerVector& currentLayers,
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            Region& dirtyRegion,
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            Region& wormholeRegion);
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        handlePageFlip();
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool        lockPageFlip(const LayerVector& currentLayers);
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        unlockPageFlip(const LayerVector& currentLayers);
315a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian            void        handleWorkList();
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        handleRepaint();
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        postFramebuffer();
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        composeSurfaces(const Region& dirty);
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32196f0819f81293076e652792794a961543e6750d7Mathias Agopian            ssize_t     addClientLayer(const sp<Client>& client,
32296f0819f81293076e652792794a961543e6750d7Mathias Agopian                    const sp<LayerBaseClient>& lbc);
323076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            status_t    addLayer_l(const sp<LayerBase>& layer);
324076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            status_t    removeLayer_l(const sp<LayerBase>& layer);
3259a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian            status_t    purgatorizeLayer_l(const sp<LayerBase>& layer);
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            uint32_t    getTransactionFlags(uint32_t flags);
328bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian            uint32_t    setTransactionFlags(uint32_t flags);
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        commitTransaction();
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
33274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian            status_t captureScreenImplLocked(DisplayID dpy,
33374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian                    sp<IMemoryHeap>* heap,
33474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian                    uint32_t* width, uint32_t* height, PixelFormat* format,
335bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian                    uint32_t reqWidth, uint32_t reqHeight,
336bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian                    uint32_t minLayerZ, uint32_t maxLayerZ);
33774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
338abd671a08a41519a7ab3d438a500efe0ef0bfc1dMathias Agopian            status_t turnElectronBeamOffImplLocked(int32_t mode);
339abd671a08a41519a7ab3d438a500efe0ef0bfc1dMathias Agopian            status_t turnElectronBeamOnImplLocked(int32_t mode);
3409daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian            status_t electronBeamOffAnimationImplLocked();
3419daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian            status_t electronBeamOnAnimationImplLocked();
3429daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian            status_t renderScreenToTextureLocked(DisplayID dpy,
3439daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian                    GLuint* textureName, GLfloat* uOut, GLfloat* vOut);
34459119e658a12279e8fff508f8773843de2d90917Mathias Agopian
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            friend class FreezeLock;
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            sp<FreezeLock> getFreezeLock() const;
3470408772e34931351d062f2088b611325ddaa6cdbMathias Agopian            inline void incFreezeCount() {
3480408772e34931351d062f2088b611325ddaa6cdbMathias Agopian                if (mFreezeCount == 0)
3490408772e34931351d062f2088b611325ddaa6cdbMathias Agopian                    mFreezeDisplayTime = 0;
3500408772e34931351d062f2088b611325ddaa6cdbMathias Agopian                mFreezeCount++;
3510408772e34931351d062f2088b611325ddaa6cdbMathias Agopian            }
352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            inline void decFreezeCount() { if (mFreezeCount > 0) mFreezeCount--; }
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            inline bool hasFreezeRequest() const { return mFreezeDisplay; }
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            inline bool isFrozen() const {
3553330b203039dea366d4981db1408a460134b2d2cMathias Agopian                return (mFreezeDisplay || mFreezeCount>0) && mBootFinished;
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        debugFlashRegions();
360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        debugShowFPS() const;
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        drawWormhole() const;
362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
363f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian
364f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian    mutable     MessageQueue    mEventQueue;
365bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian
366bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    status_t postMessageAsync(const sp<MessageBase>& msg,
367bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian            nsecs_t reltime=0, uint32_t flags = 0);
368bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian
369bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    status_t postMessageSync(const sp<MessageBase>& msg,
370bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian            nsecs_t reltime=0, uint32_t flags = 0);
371b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // access must be protected by mStateLock
373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable     Mutex                   mStateLock;
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                State                   mCurrentState;
375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile    int32_t                 mTransactionFlags;
376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile    int32_t                 mTransactionCount;
377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                Condition               mTransactionCV;
37876cd4ddc6ad664257739b3d3713fd9ebdc9a4ad9Mathias Agopian                SortedVector< sp<LayerBase> > mLayerPurgatory;
379cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian                bool                    mResizeTransationPending;
38096f0819f81293076e652792794a961543e6750d7Mathias Agopian
381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // protected by mStateLock (but we could use another lock)
38296f0819f81293076e652792794a961543e6750d7Mathias Agopian                GraphicPlane                mGraphicPlanes[1];
38396f0819f81293076e652792794a961543e6750d7Mathias Agopian                bool                        mLayersRemoved;
384b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian                DefaultKeyedVector< wp<IBinder>, wp<Layer> > mLayerMap;
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // constant members (no synchronization needed for access)
3877303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian                sp<IMemoryHeap>             mServerHeap;
388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                surface_flinger_cblk_t*     mServerCblk;
389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLuint                      mWormholeTexName;
390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                nsecs_t                     mBootTime;
391375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                Permission                  mHardwareTest;
392375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                Permission                  mAccessSurfaceFlinger;
3931b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian                Permission                  mReadFramebuffer;
394375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                Permission                  mDump;
395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // Can only accessed from the main thread, these members
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // don't need synchronization
3981bbafb96101de04c43adb5e3ca2494070d20a46aMathias Agopian                State                       mDrawingState;
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                Region                      mDirtyRegion;
400970112231e887c8a14441ec4fed55342e019fc8cMathias Agopian                Region                      mDirtyRegionRemovedLayer;
401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                Region                      mInvalidRegion;
402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                Region                      mWormholeRegion;
403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                bool                        mVisibleRegionsDirty;
404a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian                bool                        mHwWorkListDirty;
405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                bool                        mDeferReleaseConsole;
406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                bool                        mFreezeDisplay;
407abd671a08a41519a7ab3d438a500efe0ef0bfc1dMathias Agopian                int32_t                     mElectronBeamAnimationMode;
408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int32_t                     mFreezeCount;
409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                nsecs_t                     mFreezeDisplayTime;
4104da751999358fffa4cefc4c8046dab72045925f6Mathias Agopian                Vector< sp<LayerBase> >     mVisibleLayersSortedByZ;
4114da751999358fffa4cefc4c8046dab72045925f6Mathias Agopian
412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // don't use a lock for these, we don't care
414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int                         mDebugRegion;
415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int                         mDebugBackground;
41673d3ba9e50be1014aa21ec4bbdc874be394accb4Mathias Agopian                int                         mDebugDisableHWC;
4179795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian                volatile nsecs_t            mDebugInSwapBuffers;
4189795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian                nsecs_t                     mLastSwapBufferTime;
4199795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian                volatile nsecs_t            mDebugInTransaction;
4209795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian                nsecs_t                     mLastTransactionTime;
4213330b203039dea366d4981db1408a460134b2d2cMathias Agopian                bool                        mBootFinished;
422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // these are thread safe
424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable     Barrier                     mReadyToRunBarrier;
425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // atomic variables
427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                enum {
428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    eConsoleReleased = 1,
429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    eConsoleAcquired = 2
430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                };
431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   volatile     int32_t                     mConsoleSignals;
432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   // only written in the main thread, only read in other threads
434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   volatile     int32_t                     mSecureFrameBuffer;
435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass FreezeLock : public LightRefBase<FreezeLock> {
440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SurfaceFlinger* mFlinger;
441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    FreezeLock(SurfaceFlinger* flinger)
443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        : mFlinger(flinger) {
444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mFlinger->incFreezeCount();
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ~FreezeLock() {
447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mFlinger->decFreezeCount();
448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_SURFACE_FLINGER_H
455