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