SurfaceFlinger.h revision 99ce5cdeb383216dee95af4d90e47406b0948ea1
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 2399ed22412db547c59d3da08114d9d5a586442b30Glenn Kasten#include <cutils/compiler.h> 2499ed22412db547c59d3da08114d9d5a586442b30Glenn Kasten 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Atomic.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h> 2799b49840d309727678b77403d6cc9f920111623fMathias Agopian#include <utils/KeyedVector.h> 28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/RefBase.h> 2999b49840d309727678b77403d6cc9f920111623fMathias Agopian#include <utils/SortedVector.h> 3099b49840d309727678b77403d6cc9f920111623fMathias Agopian#include <utils/threads.h> 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 32a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian#include <binder/BinderService.h> 3399b49840d309727678b77403d6cc9f920111623fMathias Agopian#include <binder/IMemory.h> 34375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h> 3699b49840d309727678b77403d6cc9f920111623fMathias Agopian#include <surfaceflinger/IGraphicBufferAlloc.h> 379cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/ISurfaceComposer.h> 387e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian#include <surfaceflinger/ISurfaceComposerClient.h> 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Barrier.h" 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h" 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include "MessageQueue.h" 44f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Client; 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass DisplayHardware; 51d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopianclass DisplayEventConnection; 52d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopianclass EventThread; 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Layer; 54b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopianclass LayerDim; 55118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopianclass LayerScreenshot; 56a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianstruct surface_flinger_cblk_t; 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 694f113740180b6512b43723c4728f262882dc9b45Mathias Agopian size_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 // ISurfaceComposerClient interface 7596f0819f81293076e652792794a961543e6750d7Mathias Agopian virtual sp<ISurface> createSurface( 760ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian surface_data_t* params, const String8& name, 7796f0819f81293076e652792794a961543e6750d7Mathias Agopian DisplayID display, uint32_t w, uint32_t h,PixelFormat format, 7896f0819f81293076e652792794a961543e6750d7Mathias Agopian uint32_t flags); 7996f0819f81293076e652792794a961543e6750d7Mathias Agopian virtual status_t destroySurface(SurfaceID surfaceId); 80a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian virtual status_t onTransact( 81a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 8296f0819f81293076e652792794a961543e6750d7Mathias Agopian 834f113740180b6512b43723c4728f262882dc9b45Mathias Agopian // constant 84b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian sp<SurfaceFlinger> mFlinger; 854f113740180b6512b43723c4728f262882dc9b45Mathias Agopian 864f113740180b6512b43723c4728f262882dc9b45Mathias Agopian // protected by mLock 874f113740180b6512b43723c4728f262882dc9b45Mathias Agopian DefaultKeyedVector< size_t, wp<LayerBaseClient> > mLayers; 884f113740180b6512b43723c4728f262882dc9b45Mathias Agopian size_t mNameGenerator; 894f113740180b6512b43723c4728f262882dc9b45Mathias Agopian 904f113740180b6512b43723c4728f262882dc9b45Mathias Agopian // thread-safe 914f113740180b6512b43723c4728f262882dc9b45Mathias Agopian mutable Mutex mLock; 92b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}; 93b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian 949a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennisclass GraphicBufferAlloc : public BnGraphicBufferAlloc 959a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis{ 969a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennispublic: 979a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis GraphicBufferAlloc(); 989a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis virtual ~GraphicBufferAlloc(); 999a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis virtual sp<GraphicBuffer> createGraphicBuffer(uint32_t w, uint32_t h, 100d9e8c64c3dce1612eb948a5c16ba4ff62202b423Mathias Agopian PixelFormat format, uint32_t usage, status_t* error); 1019a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis}; 1029a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass GraphicPlane 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static status_t orientationToTransfrom(int orientation, int w, int h, 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Transform* tr); 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GraphicPlane(); 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ~GraphicPlane(); 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool initialized() const; 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void setDisplayHardware(DisplayHardware *); 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t setOrientation(int orientation); 1180d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian int getOrientation() const { return mOrientation; } 1192b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian int getWidth() const; 1202b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian int getHeight() const; 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& displayHardware() const; 12359119e658a12279e8fff508f8773843de2d90917Mathias Agopian DisplayHardware& editDisplayHardware(); 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Transform& transform() const; 125076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLDisplay getEGLDisplay() const; 126076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GraphicPlane(const GraphicPlane&); 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GraphicPlane operator = (const GraphicPlane&); 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayHardware* mHw; 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Transform mGlobalTransform; 1332b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian Transform mDisplayTransform; 1340d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian int mOrientation; 1352b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian float mDisplayWidth; 1362b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian float mDisplayHeight; 1372b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian int mWidth; 1382b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian int mHeight; 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectenum { 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eTransactionNeeded = 0x01, 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eTraversalNeeded = 0x02 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 148a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopianclass SurfaceFlinger : 149a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian public BinderService<SurfaceFlinger>, 150a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian public BnSurfaceComposer, 1511f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian public IBinder::DeathRecipient, 152a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian protected Thread 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 155a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian static char const* getServiceName() { return "SurfaceFlinger"; } 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project SurfaceFlinger(); 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~SurfaceFlinger(); 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void init(); 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual status_t onTransact( 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual status_t dump(int fd, const Vector<String16>& args); 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // ISurfaceComposer interface 1677e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian virtual sp<ISurfaceComposerClient> createConnection(); 1689a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc(); 1697303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian virtual sp<IMemoryHeap> getCblk() const; 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void bootFinished(); 171b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis virtual void setTransactionState(const Vector<ComposerState>& state, 17228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis int orientation, uint32_t flags); 173582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis virtual bool authenticateSurfaceTexture(const sp<ISurfaceTexture>& surface) const; 174d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian virtual sp<IDisplayEventConnection> createDisplayEventConnection(); 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 188118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian status_t renderScreenToTexture(DisplayID dpy, 189118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian GLuint* textureName, GLfloat* uOut, GLfloat* vOut); 1904a9ac37fe26644bb5253d15eec08be2edb896642Mathias Agopian status_t renderScreenToTextureLocked(DisplayID dpy, 1914a9ac37fe26644bb5253d15eec08be2edb896642Mathias Agopian GLuint* textureName, GLfloat* uOut, GLfloat* vOut); 192118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian 19399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian void onMessageReceived(int32_t what); 19499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 195118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian status_t postMessageAsync(const sp<MessageBase>& msg, 196118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian nsecs_t reltime=0, uint32_t flags = 0); 197118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian 198118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian status_t postMessageSync(const sp<MessageBase>& msg, 199118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian nsecs_t reltime=0, uint32_t flags = 0); 200118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian 201076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian status_t removeLayer(const sp<LayerBase>& layer); 202076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian status_t addLayer(const sp<LayerBase>& layer); 203076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian status_t invalidateLayerVisibility(const sp<LayerBase>& layer); 204ad456f9878ff7c176499e7b992f9ff1cb3e9cdeeMathias Agopian void invalidateHwcGeometry(); 205b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian 206b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian sp<Layer> getLayer(const sp<ISurface>& sur) const; 207b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian 2089575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennis GLuint getProtectedTexName() const { return mProtectedTexName; } 2099575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennis 210118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian 211118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian class MessageDestroyGLTexture : public MessageBase { 212118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian GLuint texture; 213118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian public: 214118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian MessageDestroyGLTexture(GLuint texture) : texture(texture) { } 215118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian virtual bool handler() { 216118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian glDeleteTextures(1, &texture); 217118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian return true; 218118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian } 219118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian }; 220118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian 221118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 2231f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian // DeathRecipient interface 2241f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian virtual void binderDied(const wp<IBinder>& who); 2251f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian 2261f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopianprivate: 22796f0819f81293076e652792794a961543e6750d7Mathias Agopian friend class Client; 228d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian friend class DisplayEventConnection; 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project friend class LayerBase; 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project friend class LayerBaseClient; 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project friend class Layer; 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2330ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian sp<ISurface> createSurface( 2347e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian ISurfaceComposerClient::surface_data_t* params, 2350ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian const String8& name, 2360ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian const sp<Client>& client, 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayID display, uint32_t w, uint32_t h, PixelFormat format, 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags); 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 240b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian sp<Layer> createNormalSurface( 241f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian const sp<Client>& client, DisplayID display, 24296f0819f81293076e652792794a961543e6750d7Mathias Agopian uint32_t w, uint32_t h, uint32_t flags, 2431c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian PixelFormat& format); 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 245b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian sp<LayerDim> createDimSurface( 246f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian const sp<Client>& client, DisplayID display, 24796f0819f81293076e652792794a961543e6750d7Mathias Agopian uint32_t w, uint32_t h, uint32_t flags); 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 249118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian sp<LayerScreenshot> createScreenshotSurface( 250118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian const sp<Client>& client, DisplayID display, 251118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian uint32_t w, uint32_t h, uint32_t flags); 252118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian 25396f0819f81293076e652792794a961543e6750d7Mathias Agopian status_t removeSurface(const sp<Client>& client, SurfaceID sid); 254ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian status_t destroySurface(const wp<LayerBaseClient>& layer); 255698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t setClientStateLocked(const sp<Client>& client, const layer_state_t& s); 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 257f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian class LayerVector : public SortedVector< sp<LayerBase> > { 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project public: 259f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian LayerVector() { } 260f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian LayerVector(const LayerVector& rhs) : SortedVector< sp<LayerBase> >(rhs) { } 261f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian virtual int do_compare(const void* lhs, const void* rhs) const { 262f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian const sp<LayerBase>& l(*reinterpret_cast<const sp<LayerBase>*>(lhs)); 263f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian const sp<LayerBase>& r(*reinterpret_cast<const sp<LayerBase>*>(rhs)); 264f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian // sort layers by Z order 265f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian uint32_t lz = l->currentState().z; 266f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian uint32_t rz = r->currentState().z; 267f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian // then by sequence, so we get a stable ordering 268f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian return (lz != rz) ? (lz - rz) : (l->sequence - r->sequence); 269f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian } 270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project struct State { 273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project State() { 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project orientation = ISurfaceComposer::eOrientationDefault; 275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LayerVector layersSortedByZ; 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint8_t orientation; 27821230c6410bdab13cd2bd274da54b1e4061b6035Jeff Brown uint8_t orientationFlags; 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual bool threadLoop(); 282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual status_t readyToRun(); 283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void onFirstRef(); 284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 285550a11455a5155b078085fd5f464d7f3e5dfb7fcAndy McFaddenpublic: // hack to work around gcc 4.0.3 bug 286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GraphicPlane& graphicPlane(int dpy) const; 287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GraphicPlane& graphicPlane(int dpy); 28899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 28999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian void signalTransaction(); 29099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian void signalLayerUpdate(); 29199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian void signalRefresh(); 292e2c2f9213f936f98db604dc9c126ff22f725a824Mathias Agopian void repaintEverything(); 293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2942944a2b3601ae5847cf54b3130dcf653a7b24b8aAndy McFaddenprivate: 295e2c2f9213f936f98db604dc9c126ff22f725a824Mathias Agopian void waitForEvent(); 296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void handleConsoleEvents(); 297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void handleTransaction(uint32_t transactionFlags); 298ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian void handleTransactionLocked(uint32_t transactionFlags); 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void computeVisibleRegions( 3011bbafb96101de04c43adb5e3ca2494070d20a46aMathias Agopian const LayerVector& currentLayers, 302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region& dirtyRegion, 303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region& wormholeRegion); 304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void handlePageFlip(); 306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool lockPageFlip(const LayerVector& currentLayers); 307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void unlockPageFlip(const LayerVector& currentLayers); 30899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian void handleRefresh(); 309a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian void handleWorkList(); 310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void handleRepaint(); 311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void postFramebuffer(); 3129c6e297271ec9af9d974242d89cfa08cb6ceaa0aMathias Agopian void setupHardwareComposer(Region& dirtyInOut); 313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void composeSurfaces(const Region& dirty); 314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3160dfb7b73a468698622d6c0423f0d5471a6f5d375Mathias Agopian void setInvalidateRegion(const Region& reg); 3170dfb7b73a468698622d6c0423f0d5471a6f5d375Mathias Agopian Region getAndClearInvalidateRegion(); 3180dfb7b73a468698622d6c0423f0d5471a6f5d375Mathias Agopian 31996f0819f81293076e652792794a961543e6750d7Mathias Agopian ssize_t addClientLayer(const sp<Client>& client, 32096f0819f81293076e652792794a961543e6750d7Mathias Agopian const sp<LayerBaseClient>& lbc); 321076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian status_t addLayer_l(const sp<LayerBase>& layer); 322076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian status_t removeLayer_l(const sp<LayerBase>& layer); 3239a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian status_t purgatorizeLayer_l(const sp<LayerBase>& layer); 324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t getTransactionFlags(uint32_t flags); 326dea20b1f343012d58ca9eb381684b26a168dc127Mathias Agopian uint32_t peekTransactionFlags(uint32_t flags); 327bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian uint32_t setTransactionFlags(uint32_t flags); 328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void commitTransaction(); 329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 33174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian status_t captureScreenImplLocked(DisplayID dpy, 33274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sp<IMemoryHeap>* heap, 33374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian uint32_t* width, uint32_t* height, PixelFormat* format, 334bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t reqWidth, uint32_t reqHeight, 335bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t minLayerZ, uint32_t maxLayerZ); 33674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 337abd671a08a41519a7ab3d438a500efe0ef0bfc1dMathias Agopian status_t turnElectronBeamOffImplLocked(int32_t mode); 338abd671a08a41519a7ab3d438a500efe0ef0bfc1dMathias Agopian status_t turnElectronBeamOnImplLocked(int32_t mode); 3399daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian status_t electronBeamOffAnimationImplLocked(); 3409daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian status_t electronBeamOnAnimationImplLocked(); 34159119e658a12279e8fff508f8773843de2d90917Mathias Agopian 342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void debugFlashRegions(); 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void drawWormhole() const; 344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34525e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian void listLayersLocked(const Vector<String16>& args, size_t& index, 34625e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian String8& result, char* buffer, size_t SIZE) const; 34782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian void dumpStatsLocked(const Vector<String16>& args, size_t& index, 34882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian String8& result, char* buffer, size_t SIZE) const; 34925e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian void clearStatsLocked(const Vector<String16>& args, size_t& index, 35025e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian String8& result, char* buffer, size_t SIZE) const; 35182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian void dumpAllLocked(String8& result, char* buffer, size_t SIZE) const; 352f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 353f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian mutable MessageQueue mEventQueue; 354bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian 355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // access must be protected by mStateLock 356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mutable Mutex mStateLock; 357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project State mCurrentState; 358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile int32_t mTransactionFlags; 359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Condition mTransactionCV; 36076cd4ddc6ad664257739b3d3713fd9ebdc9a4ad9Mathias Agopian SortedVector< sp<LayerBase> > mLayerPurgatory; 36128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis bool mTransationPending; 3622f4b68d21c1a58cbcb1e6929fb241e425a8f7b5dJesse Hall Vector< sp<LayerBase> > mLayersPendingRemoval; 36396f0819f81293076e652792794a961543e6750d7Mathias Agopian 364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // protected by mStateLock (but we could use another lock) 36596f0819f81293076e652792794a961543e6750d7Mathias Agopian GraphicPlane mGraphicPlanes[1]; 36696f0819f81293076e652792794a961543e6750d7Mathias Agopian bool mLayersRemoved; 367b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian DefaultKeyedVector< wp<IBinder>, wp<Layer> > mLayerMap; 368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3690dfb7b73a468698622d6c0423f0d5471a6f5d375Mathias Agopian // access must be protected by mInvalidateLock 3700dfb7b73a468698622d6c0423f0d5471a6f5d375Mathias Agopian mutable Mutex mInvalidateLock; 3710dfb7b73a468698622d6c0423f0d5471a6f5d375Mathias Agopian Region mInvalidateRegion; 3720dfb7b73a468698622d6c0423f0d5471a6f5d375Mathias Agopian 373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // constant members (no synchronization needed for access) 3747303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian sp<IMemoryHeap> mServerHeap; 375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface_flinger_cblk_t* mServerCblk; 376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLuint mWormholeTexName; 3779575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennis GLuint mProtectedTexName; 378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nsecs_t mBootTime; 379d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian sp<EventThread> mEventThread; 38099b49840d309727678b77403d6cc9f920111623fMathias Agopian 381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Can only accessed from the main thread, these members 382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // don't need synchronization 3831bbafb96101de04c43adb5e3ca2494070d20a46aMathias Agopian State mDrawingState; 384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region mDirtyRegion; 385970112231e887c8a14441ec4fed55342e019fc8cMathias Agopian Region mDirtyRegionRemovedLayer; 3860656a68380d01de4136933901b2c322cf9ab0d7eMathias Agopian Region mSwapRegion; 387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region mWormholeRegion; 388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool mVisibleRegionsDirty; 389a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian bool mHwWorkListDirty; 390abd671a08a41519a7ab3d438a500efe0ef0bfc1dMathias Agopian int32_t mElectronBeamAnimationMode; 3914da751999358fffa4cefc4c8046dab72045925f6Mathias Agopian Vector< sp<LayerBase> > mVisibleLayersSortedByZ; 3924da751999358fffa4cefc4c8046dab72045925f6Mathias Agopian 393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // don't use a lock for these, we don't care 395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int mDebugRegion; 396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int mDebugBackground; 3978afb7e39a83a3e31170612d562eb08508e328388Mathias Agopian int mDebugDDMS; 39873d3ba9e50be1014aa21ec4bbdc874be394accb4Mathias Agopian int mDebugDisableHWC; 399a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian int mDebugDisableTransformHint; 4009795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian volatile nsecs_t mDebugInSwapBuffers; 4019795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian nsecs_t mLastSwapBufferTime; 4029795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian volatile nsecs_t mDebugInTransaction; 4039795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian nsecs_t mLastTransactionTime; 4043330b203039dea366d4981db1408a460134b2d2cMathias Agopian bool mBootFinished; 405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // these are thread safe 407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mutable Barrier mReadyToRunBarrier; 408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 409ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian 410ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian // protected by mDestroyedLayerLock; 411ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian mutable Mutex mDestroyedLayerLock; 412ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian Vector<LayerBase const *> mDestroyedLayers; 413ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian 414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // atomic variables 415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eConsoleReleased = 1, 417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eConsoleAcquired = 2 418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile int32_t mConsoleSignals; 420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // only written in the main thread, only read in other threads 422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile int32_t mSecureFrameBuffer; 423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_SURFACE_FLINGER_H 429