19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_SURFACE_FLINGER_H 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_SURFACE_FLINGER_H 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/SortedVector.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/KeyedVector.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Atomic.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h> 281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#include <utils/RefBase.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30d763b5d9197e01662cafa376e1227e53e0463a3cMathias Agopian#include <binder/IMemory.h> 31151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian#include <binder/Permission.h> 32151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/PixelFormat.h> 34000479f9e325b4e426a67033abd92d47da412725Mathias Agopian#include <surfaceflinger/ISurfaceComposer.h> 35000479f9e325b4e426a67033abd92d47da412725Mathias Agopian#include <surfaceflinger/ISurfaceFlingerClient.h> 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "Barrier.h" 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "Layer.h" 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "Tokenizer.h" 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 416ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian#include "MessageQueue.h" 426ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct copybit_device_t; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct overlay_device_t; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Client; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BClient; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass DisplayHardware; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass FreezeLock; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Layer; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass LayerBuffer; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef int32_t ClientID; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 646edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopianclass Client : public RefBase 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Client(ClientID cid, const sp<SurfaceFlinger>& flinger); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~Client(); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t generateId(int pid); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void free(int32_t id); 721473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian status_t bindLayer(const sp<LayerBaseClient>& layer, int32_t id); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inline bool isValid(int32_t i) const; 751473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBaseClient> getLayerUser(int32_t i) const; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dump(const char* what); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 78d763b5d9197e01662cafa376e1227e53e0463a3cMathias Agopian const Vector< wp<LayerBaseClient> >& getLayers() const { 79d763b5d9197e01662cafa376e1227e53e0463a3cMathias Agopian return mLayers; 80d763b5d9197e01662cafa376e1227e53e0463a3cMathias Agopian } 81d763b5d9197e01662cafa376e1227e53e0463a3cMathias Agopian 82d763b5d9197e01662cafa376e1227e53e0463a3cMathias Agopian const sp<IMemoryHeap>& getControlBlockMemory() const { 83d763b5d9197e01662cafa376e1227e53e0463a3cMathias Agopian return mCblkHeap; 84d763b5d9197e01662cafa376e1227e53e0463a3cMathias Agopian } 85d763b5d9197e01662cafa376e1227e53e0463a3cMathias Agopian 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pointer to this client's control block 879779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian SharedClient* ctrlblk; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClientID cid; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 92d763b5d9197e01662cafa376e1227e53e0463a3cMathias Agopian int getClientPid() const { return mPid; } 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 941473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian int mPid; 951473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian uint32_t mBitmap; 961473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian SortedVector<uint8_t> mInUse; 971473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian Vector< wp<LayerBaseClient> > mLayers; 98d763b5d9197e01662cafa376e1227e53e0463a3cMathias Agopian sp<IMemoryHeap> mCblkHeap; 991473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<SurfaceFlinger> mFlinger; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass GraphicPlane 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static status_t orientationToTransfrom(int orientation, int w, int h, 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Transform* tr); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicPlane(); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~GraphicPlane(); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool initialized() const; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setDisplayHardware(DisplayHardware *); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t setOrientation(int orientation); 1173552f53c8370ced8680951f4ac811a126da02b0eMathias Agopian int getOrientation() const { return mOrientation; } 11866c77a5b42517b15c933431e12445b856d804ce5Mathias Agopian int getWidth() const; 11966c77a5b42517b15c933431e12445b856d804ce5Mathias Agopian int getHeight() const; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const DisplayHardware& displayHardware() const; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Transform& transform() const; 1231473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian EGLDisplay getEGLDisplay() const; 1241473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicPlane(const GraphicPlane&); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicPlane operator = (const GraphicPlane&); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayHardware* mHw; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Transform mGlobalTransform; 13166c77a5b42517b15c933431e12445b856d804ce5Mathias Agopian Transform mDisplayTransform; 1323552f53c8370ced8680951f4ac811a126da02b0eMathias Agopian int mOrientation; 13366c77a5b42517b15c933431e12445b856d804ce5Mathias Agopian float mDisplayWidth; 13466c77a5b42517b15c933431e12445b856d804ce5Mathias Agopian float mDisplayHeight; 13566c77a5b42517b15c933431e12445b856d804ce5Mathias Agopian int mWidth; 13666c77a5b42517b15c933431e12445b856d804ce5Mathias Agopian int mHeight; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eTransactionNeeded = 0x01, 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eTraversalNeeded = 0x02 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SurfaceFlinger : public BnSurfaceComposer, protected Thread 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void instantiate(); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void shutdown(); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SurfaceFlinger(); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~SurfaceFlinger(); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void init(); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t onTransact( 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t dump(int fd, const Vector<String16>& args); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ISurfaceComposer interface 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<ISurfaceFlingerClient> createConnection(); 163d763b5d9197e01662cafa376e1227e53e0463a3cMathias Agopian virtual sp<IMemoryHeap> getCblk() const; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void bootFinished(); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void openGlobalTransaction(); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void closeGlobalTransaction(); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t freezeDisplay(DisplayID dpy, uint32_t flags); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t unfreezeDisplay(DisplayID dpy, uint32_t flags); 169eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian virtual int setOrientation(DisplayID dpy, int orientation, uint32_t flags); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void signal() const; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void screenReleased(DisplayID dpy); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void screenAcquired(DisplayID dpy); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overlay_control_device_t* getOverlayEngine() const; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1781473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian status_t removeLayer(const sp<LayerBase>& layer); 1791473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian status_t addLayer(const sp<LayerBase>& layer); 1801473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian status_t invalidateLayerVisibility(const sp<LayerBase>& layer); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class BClient; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class LayerBase; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class LayerBuffer; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class LayerBaseClient; 18794aadce3a266fc63c2ae81e67c847a89c4961ef4Mathias Agopian friend class LayerBaseClient::Surface; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class Layer; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class LayerBlur; 1909cc88529e4cbf54df3eed968666472d3fa658d13Mathias Agopian friend class LayerDim; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1925d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian sp<ISurface> createSurface(ClientID client, int pid, const String8& name, 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ISurfaceFlingerClient::surface_data_t* params, 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayID display, uint32_t w, uint32_t h, PixelFormat format, 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1971473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBaseClient> createNormalSurfaceLocked( 1986edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopian const sp<Client>& client, DisplayID display, 19918b6b49ea5235fb6c0802db9a0cc2c6dd20646cbMathias Agopian int32_t id, uint32_t w, uint32_t h, uint32_t flags, 20018b6b49ea5235fb6c0802db9a0cc2c6dd20646cbMathias Agopian PixelFormat& format); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2021473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBaseClient> createBlurSurfaceLocked( 2036edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopian const sp<Client>& client, DisplayID display, 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t id, uint32_t w, uint32_t h, uint32_t flags); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2061473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBaseClient> createDimSurfaceLocked( 2076edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopian const sp<Client>& client, DisplayID display, 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t id, uint32_t w, uint32_t h, uint32_t flags); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2101473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBaseClient> createPushBuffersSurfaceLocked( 2116edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopian const sp<Client>& client, DisplayID display, 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t id, uint32_t w, uint32_t h, uint32_t flags); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2146cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian status_t removeSurface(SurfaceID surface_id); 2156cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian status_t destroySurface(const sp<LayerBaseClient>& layer); 2161473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian status_t setClientState(ClientID cid, int32_t count, const layer_state_t* states); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class LayerVector { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inline LayerVector() { } 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerVector(const LayerVector&); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inline size_t size() const { return layers.size(); } 2241473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian inline sp<LayerBase> const* array() const { return layers.array(); } 2251473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian ssize_t add(const sp<LayerBase>&, Vector< sp<LayerBase> >::compar_t); 2261473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian ssize_t remove(const sp<LayerBase>&); 2271473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian ssize_t reorder(const sp<LayerBase>&, Vector< sp<LayerBase> >::compar_t); 2281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian ssize_t indexOf(const sp<LayerBase>& key, size_t guess=0) const; 2291473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian inline sp<LayerBase> operator [] (size_t i) const { return layers[i]; } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 2311473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian KeyedVector< sp<LayerBase> , size_t> lookup; 2321473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian Vector< sp<LayerBase> > layers; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct State { 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project State() { 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project orientation = ISurfaceComposer::eOrientationDefault; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project freezeDisplay = 0; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerVector layersSortedByZ; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t orientation; 242eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian uint8_t orientationType; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t freezeDisplay; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool threadLoop(); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t readyToRun(); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void onFirstRef(); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25008c19beee4c8a2fce3f9d2baa78c9d436bedf65dAndy McFaddenpublic: // hack to work around gcc 4.0.3 bug 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const GraphicPlane& graphicPlane(int dpy) const; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicPlane& graphicPlane(int dpy); 25308c19beee4c8a2fce3f9d2baa78c9d436bedf65dAndy McFaddenprivate: 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void waitForEvent(); 256fa0a4bde3fa520aa10de88239af04b45a3e28da0Andy McFaddenpublic: // hack to work around gcc 4.0.3 bug 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void signalEvent(); 258fa0a4bde3fa520aa10de88239af04b45a3e28da0Andy McFaddenprivate: 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void signalDelayedEvent(nsecs_t delay); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void handleConsoleEvents(); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void handleTransaction(uint32_t transactionFlags); 2632d5ee25556cb363700dc5127f88ca05fb9493e14Mathias Agopian void handleTransactionLocked( 2642d5ee25556cb363700dc5127f88ca05fb9493e14Mathias Agopian uint32_t transactionFlags, 2652d5ee25556cb363700dc5127f88ca05fb9493e14Mathias Agopian Vector< sp<LayerBase> >& ditchedLayers); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void computeVisibleRegions( 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerVector& currentLayers, 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Region& dirtyRegion, 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Region& wormholeRegion); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void handlePageFlip(); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool lockPageFlip(const LayerVector& currentLayers); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void unlockPageFlip(const LayerVector& currentLayers); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void handleRepaint(); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void postFramebuffer(); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void composeSurfaces(const Region& dirty); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void unlockClients(); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void destroyConnection(ClientID cid); 2821473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBaseClient> getLayerUser_l(SurfaceID index) const; 2831473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian status_t addLayer_l(const sp<LayerBase>& layer); 2841473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian status_t removeLayer_l(const sp<LayerBase>& layer); 2856cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian status_t purgatorizeLayer_l(const sp<LayerBase>& layer); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void free_resources_l(); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t getTransactionFlags(uint32_t flags); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t setTransactionFlags(uint32_t flags, nsecs_t delay = 0); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void commitTransaction(); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class FreezeLock; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<FreezeLock> getFreezeLock() const; 2950e44976aa425b0c2a0dcf6ec8db918e6a6f51b1aMathias Agopian inline void incFreezeCount() { 2960e44976aa425b0c2a0dcf6ec8db918e6a6f51b1aMathias Agopian if (mFreezeCount == 0) 2970e44976aa425b0c2a0dcf6ec8db918e6a6f51b1aMathias Agopian mFreezeDisplayTime = 0; 2980e44976aa425b0c2a0dcf6ec8db918e6a6f51b1aMathias Agopian mFreezeCount++; 2990e44976aa425b0c2a0dcf6ec8db918e6a6f51b1aMathias Agopian } 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inline void decFreezeCount() { if (mFreezeCount > 0) mFreezeCount--; } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inline bool hasFreezeRequest() const { return mFreezeDisplay; } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inline bool isFrozen() const { 3036950e428feaccc8164b989ef64e771a99948797aMathias Agopian return (mFreezeDisplay || mFreezeCount>0) && mBootFinished; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void debugFlashRegions(); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void debugShowFPS() const; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void drawWormhole() const; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3116ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian 3126ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian mutable MessageQueue mEventQueue; 3136ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian 3146ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian 3156ead5d9f140529edfb744584fa5427b84b4dc13aMathias Agopian 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // access must be protected by mStateLock 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable Mutex mStateLock; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project State mCurrentState; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project State mDrawingState; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project volatile int32_t mTransactionFlags; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project volatile int32_t mTransactionCount; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Condition mTransactionCV; 3239779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian bool mResizeTransationPending; 3246cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // protected by mStateLock (but we could use another lock) 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Tokenizer mTokens; 3276edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopian DefaultKeyedVector<ClientID, sp<Client> > mClientsMap; 3281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian DefaultKeyedVector<SurfaceID, sp<LayerBaseClient> > mLayerMap; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicPlane mGraphicPlanes[1]; 3301473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian bool mLayersRemoved; 3316edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopian Vector< sp<Client> > mDisconnectedClients; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // constant members (no synchronization needed for access) 334d763b5d9197e01662cafa376e1227e53e0463a3cMathias Agopian sp<IMemoryHeap> mServerHeap; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project surface_flinger_cblk_t* mServerCblk; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLuint mWormholeTexName; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nsecs_t mBootTime; 338151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian Permission mHardwareTest; 339151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian Permission mAccessSurfaceFlinger; 340151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian Permission mDump; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Can only accessed from the main thread, these members 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // don't need synchronization 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Region mDirtyRegion; 34512cedff50ca229a5d025e1011f1518c32e858138Mathias Agopian Region mDirtyRegionRemovedLayer; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Region mInvalidRegion; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Region mWormholeRegion; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool mVisibleRegionsDirty; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool mDeferReleaseConsole; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool mFreezeDisplay; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t mFreezeCount; 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nsecs_t mFreezeDisplayTime; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // don't use a lock for these, we don't care 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mDebugRegion; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mDebugBackground; 357a8d49178f94e025be8be00460739315b9c273e4cMathias Agopian volatile nsecs_t mDebugInSwapBuffers; 358a8d49178f94e025be8be00460739315b9c273e4cMathias Agopian nsecs_t mLastSwapBufferTime; 359a8d49178f94e025be8be00460739315b9c273e4cMathias Agopian volatile nsecs_t mDebugInTransaction; 360a8d49178f94e025be8be00460739315b9c273e4cMathias Agopian nsecs_t mLastTransactionTime; 3616950e428feaccc8164b989ef64e771a99948797aMathias Agopian bool mBootFinished; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // these are thread safe 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable Barrier mReadyToRunBarrier; 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // atomic variables 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum { 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eConsoleReleased = 1, 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eConsoleAcquired = 2 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project volatile int32_t mConsoleSignals; 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // only written in the main thread, only read in other threads 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project volatile int32_t mSecureFrameBuffer; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass FreezeLock : public LightRefBase<FreezeLock> { 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SurfaceFlinger* mFlinger; 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FreezeLock(SurfaceFlinger* flinger) 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mFlinger(flinger) { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlinger->incFreezeCount(); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~FreezeLock() { 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlinger->decFreezeCount(); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BClient : public BnSurfaceFlingerClient 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BClient(SurfaceFlinger *flinger, ClientID cid, 397d763b5d9197e01662cafa376e1227e53e0463a3cMathias Agopian const sp<IMemoryHeap>& cblk); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~BClient(); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ISurfaceFlingerClient interface 401d763b5d9197e01662cafa376e1227e53e0463a3cMathias Agopian virtual sp<IMemoryHeap> getControlBlock() const; 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<ISurface> createSurface( 4045d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian surface_data_t* params, int pid, const String8& name, 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayID display, uint32_t w, uint32_t h,PixelFormat format, 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t destroySurface(SurfaceID surfaceId); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setState(int32_t count, const layer_state_t* states); 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClientID mId; 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SurfaceFlinger* mFlinger; 414d763b5d9197e01662cafa376e1227e53e0463a3cMathias Agopian sp<IMemoryHeap> mCblk; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_SURFACE_FLINGER_H 421