SurfaceFlinger.h revision 7d89d06a6fe1bfadfe277f19dbb7e4aa021444e0
13f30b6202dd5ad6ff66959131d216405850ed152Yang Ni/* 23f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * Copyright (C) 2007 The Android Open Source Project 33f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * 43f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * Licensed under the Apache License, Version 2.0 (the "License"); 53f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * you may not use this file except in compliance with the License. 63f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * You may obtain a copy of the License at 73f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * 83f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * http://www.apache.org/licenses/LICENSE-2.0 93f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * 103f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * Unless required by applicable law or agreed to in writing, software 113f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * distributed under the License is distributed on an "AS IS" BASIS, 123f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * See the License for the specific language governing permissions and 143f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * limitations under the License. 153f30b6202dd5ad6ff66959131d216405850ed152Yang Ni */ 163f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 173f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#ifndef ANDROID_SURFACE_FLINGER_H 183f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#define ANDROID_SURFACE_FLINGER_H 193f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 203f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include <stdint.h> 213f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include <sys/types.h> 223f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 233f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include <EGL/egl.h> 243f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 253f30b6202dd5ad6ff66959131d216405850ed152Yang Ni/* 263f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * NOTE: Make sure this file doesn't include anything from <gl/ > or <gl2/ > 273f30b6202dd5ad6ff66959131d216405850ed152Yang Ni */ 283f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 293f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include <cutils/compiler.h> 303f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 313f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include <utils/Atomic.h> 323f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include <utils/Errors.h> 333f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include <utils/KeyedVector.h> 343f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include <utils/RefBase.h> 353f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include <utils/SortedVector.h> 363f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include <utils/threads.h> 373f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 383f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include <binder/IMemory.h> 393f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 403f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include <ui/PixelFormat.h> 413f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include <ui/mat4.h> 423f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 433f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include <gui/ISurfaceComposer.h> 443f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include <gui/ISurfaceComposerClient.h> 453f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 463f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include <hardware/hwcomposer_defs.h> 473f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 483f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include <private/gui/LayerState.h> 493f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 503f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include "Barrier.h" 513f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include "DisplayDevice.h" 523f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include "DispSync.h" 533f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include "FrameTracker.h" 543f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include "MessageQueue.h" 553f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 563f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include "DisplayHardware/HWComposer.h" 573f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include "Effects/Daltonizer.h" 583f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 593f30b6202dd5ad6ff66959131d216405850ed152Yang Ninamespace android { 603f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 613f30b6202dd5ad6ff66959131d216405850ed152Yang Ni// --------------------------------------------------------------------------- 623f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 633f30b6202dd5ad6ff66959131d216405850ed152Yang Niclass Client; 643f30b6202dd5ad6ff66959131d216405850ed152Yang Niclass DisplayEventConnection; 653f30b6202dd5ad6ff66959131d216405850ed152Yang Niclass EventThread; 663f30b6202dd5ad6ff66959131d216405850ed152Yang Niclass IGraphicBufferAlloc; 673f30b6202dd5ad6ff66959131d216405850ed152Yang Niclass Layer; 683f30b6202dd5ad6ff66959131d216405850ed152Yang Niclass LayerDim; 693f30b6202dd5ad6ff66959131d216405850ed152Yang Niclass Surface; 703f30b6202dd5ad6ff66959131d216405850ed152Yang Niclass RenderEngine; 713f30b6202dd5ad6ff66959131d216405850ed152Yang Niclass EventControlThread; 723f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 733f30b6202dd5ad6ff66959131d216405850ed152Yang Ni// --------------------------------------------------------------------------- 743f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 753f30b6202dd5ad6ff66959131d216405850ed152Yang Nienum { 763f30b6202dd5ad6ff66959131d216405850ed152Yang Ni eTransactionNeeded = 0x01, 773f30b6202dd5ad6ff66959131d216405850ed152Yang Ni eTraversalNeeded = 0x02, 783f30b6202dd5ad6ff66959131d216405850ed152Yang Ni eDisplayTransactionNeeded = 0x04, 793f30b6202dd5ad6ff66959131d216405850ed152Yang Ni eTransactionMask = 0x07 803f30b6202dd5ad6ff66959131d216405850ed152Yang Ni}; 813f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 823f30b6202dd5ad6ff66959131d216405850ed152Yang Niclass SurfaceFlinger : public BnSurfaceComposer, 833f30b6202dd5ad6ff66959131d216405850ed152Yang Ni private IBinder::DeathRecipient, 843f30b6202dd5ad6ff66959131d216405850ed152Yang Ni private HWComposer::EventHandler 853f30b6202dd5ad6ff66959131d216405850ed152Yang Ni{ 863f30b6202dd5ad6ff66959131d216405850ed152Yang Nipublic: 873f30b6202dd5ad6ff66959131d216405850ed152Yang Ni static char const* getServiceName() ANDROID_API { 883f30b6202dd5ad6ff66959131d216405850ed152Yang Ni return "SurfaceFlinger"; 893f30b6202dd5ad6ff66959131d216405850ed152Yang Ni } 903f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 913f30b6202dd5ad6ff66959131d216405850ed152Yang Ni SurfaceFlinger() ANDROID_API; 923f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 933f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // must be called before clients can connect 943e5fbb6faf66488ba49c9d2396350ae567dba315Yang Ni void init() ANDROID_API; 953f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 963f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // starts SurfaceFlinger main loop in the current thread 973f30b6202dd5ad6ff66959131d216405850ed152Yang Ni void run() ANDROID_API; 983f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 993f30b6202dd5ad6ff66959131d216405850ed152Yang Ni enum { 1003f30b6202dd5ad6ff66959131d216405850ed152Yang Ni EVENT_VSYNC = HWC_EVENT_VSYNC 1013f30b6202dd5ad6ff66959131d216405850ed152Yang Ni }; 1023f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 1033f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // post an asynchronous message to the main thread 1043f30b6202dd5ad6ff66959131d216405850ed152Yang Ni status_t postMessageAsync(const sp<MessageBase>& msg, nsecs_t reltime = 0, uint32_t flags = 0); 1053f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 1063f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // post a synchronous message to the main thread 1073f30b6202dd5ad6ff66959131d216405850ed152Yang Ni status_t postMessageSync(const sp<MessageBase>& msg, nsecs_t reltime = 0, uint32_t flags = 0); 1083f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 1093f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // force full composition on all displays 1103f30b6202dd5ad6ff66959131d216405850ed152Yang Ni void repaintEverything(); 1113f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 1123f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // returns the default Display 1133f30b6202dd5ad6ff66959131d216405850ed152Yang Ni sp<const DisplayDevice> getDefaultDisplayDevice() const { 1143e5fbb6faf66488ba49c9d2396350ae567dba315Yang Ni return getDisplayDevice(mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY]); 1153f30b6202dd5ad6ff66959131d216405850ed152Yang Ni } 1163f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 1173f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // utility function to delete a texture on the main thread 1183f30b6202dd5ad6ff66959131d216405850ed152Yang Ni void deleteTextureAsync(uint32_t texture); 1193f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 1203f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // enable/disable h/w composer event 1213f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // TODO: this should be made accessible only to EventThread 1223f30b6202dd5ad6ff66959131d216405850ed152Yang Ni void eventControl(int disp, int event, int enabled); 1233f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 1243f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // called on the main thread by MessageQueue when an internal message 1253f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // is received 1263f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // TODO: this should be made accessible only to MessageQueue 1273f30b6202dd5ad6ff66959131d216405850ed152Yang Ni void onMessageReceived(int32_t what); 1283f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 1293f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // for debugging only 1303f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // TODO: this should be made accessible only to HWComposer 1313f30b6202dd5ad6ff66959131d216405850ed152Yang Ni const Vector< sp<Layer> >& getLayerSortedByZForHwcDisplay(int id); 1323f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 1333f30b6202dd5ad6ff66959131d216405850ed152Yang Ni RenderEngine& getRenderEngine() const { 1343f30b6202dd5ad6ff66959131d216405850ed152Yang Ni return *mRenderEngine; 1353f30b6202dd5ad6ff66959131d216405850ed152Yang Ni } 1363e5fbb6faf66488ba49c9d2396350ae567dba315Yang Ni 1373f30b6202dd5ad6ff66959131d216405850ed152Yang Niprivate: 1383f30b6202dd5ad6ff66959131d216405850ed152Yang Ni friend class Client; 1393f30b6202dd5ad6ff66959131d216405850ed152Yang Ni friend class DisplayEventConnection; 1403f30b6202dd5ad6ff66959131d216405850ed152Yang Ni friend class Layer; 1413f30b6202dd5ad6ff66959131d216405850ed152Yang Ni friend class MonitoredProducer; 1423f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 1433f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // This value is specified in number of frames. Log frame stats at most 1443f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // every half hour. 1453f30b6202dd5ad6ff66959131d216405850ed152Yang Ni enum { LOG_FRAME_STATS_PERIOD = 30*60*60 }; 1463f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 1473f30b6202dd5ad6ff66959131d216405850ed152Yang Ni static const size_t MAX_LAYERS = 4096; 1483f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 1493f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // We're reference counted, never destroy SurfaceFlinger directly 1503f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual ~SurfaceFlinger(); 1513e5fbb6faf66488ba49c9d2396350ae567dba315Yang Ni 1523f30b6202dd5ad6ff66959131d216405850ed152Yang Ni /* ------------------------------------------------------------------------ 1533f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * Internal data structures 1543f30b6202dd5ad6ff66959131d216405850ed152Yang Ni */ 1553f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 1563f30b6202dd5ad6ff66959131d216405850ed152Yang Ni class LayerVector : public SortedVector< sp<Layer> > { 1573f30b6202dd5ad6ff66959131d216405850ed152Yang Ni public: 1583f30b6202dd5ad6ff66959131d216405850ed152Yang Ni LayerVector(); 1593f30b6202dd5ad6ff66959131d216405850ed152Yang Ni LayerVector(const LayerVector& rhs); 1603f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual int do_compare(const void* lhs, const void* rhs) const; 1613f30b6202dd5ad6ff66959131d216405850ed152Yang Ni }; 1623f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 1633f30b6202dd5ad6ff66959131d216405850ed152Yang Ni struct DisplayDeviceState { 1643f30b6202dd5ad6ff66959131d216405850ed152Yang Ni DisplayDeviceState(); 1653f30b6202dd5ad6ff66959131d216405850ed152Yang Ni DisplayDeviceState(DisplayDevice::DisplayType type); 1663f30b6202dd5ad6ff66959131d216405850ed152Yang Ni bool isValid() const { return type >= 0; } 1673f30b6202dd5ad6ff66959131d216405850ed152Yang Ni bool isMainDisplay() const { return type == DisplayDevice::DISPLAY_PRIMARY; } 1683f30b6202dd5ad6ff66959131d216405850ed152Yang Ni bool isVirtualDisplay() const { return type >= DisplayDevice::DISPLAY_VIRTUAL; } 1693f30b6202dd5ad6ff66959131d216405850ed152Yang Ni DisplayDevice::DisplayType type; 1703f30b6202dd5ad6ff66959131d216405850ed152Yang Ni sp<IGraphicBufferProducer> surface; 1713f30b6202dd5ad6ff66959131d216405850ed152Yang Ni uint32_t layerStack; 1723f30b6202dd5ad6ff66959131d216405850ed152Yang Ni Rect viewport; 1733e5fbb6faf66488ba49c9d2396350ae567dba315Yang Ni Rect frame; 1743f30b6202dd5ad6ff66959131d216405850ed152Yang Ni uint8_t orientation; 1753f30b6202dd5ad6ff66959131d216405850ed152Yang Ni uint32_t width, height; 1763f30b6202dd5ad6ff66959131d216405850ed152Yang Ni String8 displayName; 1773f30b6202dd5ad6ff66959131d216405850ed152Yang Ni bool isSecure; 1783f30b6202dd5ad6ff66959131d216405850ed152Yang Ni }; 1793f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 1803f30b6202dd5ad6ff66959131d216405850ed152Yang Ni struct State { 1813f30b6202dd5ad6ff66959131d216405850ed152Yang Ni LayerVector layersSortedByZ; 1823f30b6202dd5ad6ff66959131d216405850ed152Yang Ni DefaultKeyedVector< wp<IBinder>, DisplayDeviceState> displays; 1833f30b6202dd5ad6ff66959131d216405850ed152Yang Ni }; 1843f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 1853f30b6202dd5ad6ff66959131d216405850ed152Yang Ni /* ------------------------------------------------------------------------ 1863f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * IBinder interface 1873f30b6202dd5ad6ff66959131d216405850ed152Yang Ni */ 1883f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual status_t onTransact(uint32_t code, const Parcel& data, 1893f30b6202dd5ad6ff66959131d216405850ed152Yang Ni Parcel* reply, uint32_t flags); 1903f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual status_t dump(int fd, const Vector<String16>& args); 1913f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 1923f30b6202dd5ad6ff66959131d216405850ed152Yang Ni /* ------------------------------------------------------------------------ 1933f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * ISurfaceComposer interface 1943f30b6202dd5ad6ff66959131d216405850ed152Yang Ni */ 1953f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual sp<ISurfaceComposerClient> createConnection(); 1963f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc(); 1973f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual sp<IBinder> createDisplay(const String8& displayName, bool secure); 1983f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual void destroyDisplay(const sp<IBinder>& display); 1993f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual sp<IBinder> getBuiltInDisplay(int32_t id); 2003e5fbb6faf66488ba49c9d2396350ae567dba315Yang Ni virtual void setTransactionState(const Vector<ComposerState>& state, 2013f30b6202dd5ad6ff66959131d216405850ed152Yang Ni const Vector<DisplayState>& displays, uint32_t flags); 2023f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual void bootFinished(); 2033f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual bool authenticateSurfaceTexture( 2043f30b6202dd5ad6ff66959131d216405850ed152Yang Ni const sp<IGraphicBufferProducer>& bufferProducer) const; 2053f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual sp<IDisplayEventConnection> createDisplayEventConnection(); 2063f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual status_t captureScreen(const sp<IBinder>& display, 2073f30b6202dd5ad6ff66959131d216405850ed152Yang Ni const sp<IGraphicBufferProducer>& producer, 2083f30b6202dd5ad6ff66959131d216405850ed152Yang Ni Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 2093f30b6202dd5ad6ff66959131d216405850ed152Yang Ni uint32_t minLayerZ, uint32_t maxLayerZ, 2103f30b6202dd5ad6ff66959131d216405850ed152Yang Ni bool useIdentityTransform, ISurfaceComposer::Rotation rotation); 2113f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual status_t getDisplayStats(const sp<IBinder>& display, 2123f30b6202dd5ad6ff66959131d216405850ed152Yang Ni DisplayStatInfo* stats); 2133f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual status_t getDisplayConfigs(const sp<IBinder>& display, 2143f30b6202dd5ad6ff66959131d216405850ed152Yang Ni Vector<DisplayInfo>* configs); 2153e5fbb6faf66488ba49c9d2396350ae567dba315Yang Ni virtual int getActiveConfig(const sp<IBinder>& display); 2163f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual void setPowerMode(const sp<IBinder>& display, int mode); 2173f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual status_t setActiveConfig(const sp<IBinder>& display, int id); 2183f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual status_t clearAnimationFrameStats(); 2193f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual status_t getAnimationFrameStats(FrameStats* outStats) const; 2203f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 2213f30b6202dd5ad6ff66959131d216405850ed152Yang Ni /* ------------------------------------------------------------------------ 2223f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * DeathRecipient interface 2233f30b6202dd5ad6ff66959131d216405850ed152Yang Ni */ 2243f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual void binderDied(const wp<IBinder>& who); 2253f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 2263f30b6202dd5ad6ff66959131d216405850ed152Yang Ni /* ------------------------------------------------------------------------ 2273f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * RefBase interface 2283f30b6202dd5ad6ff66959131d216405850ed152Yang Ni */ 2293f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual void onFirstRef(); 2303f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 2313f30b6202dd5ad6ff66959131d216405850ed152Yang Ni /* ------------------------------------------------------------------------ 2323f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * HWComposer::EventHandler interface 2333e5fbb6faf66488ba49c9d2396350ae567dba315Yang Ni */ 2343f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual void onVSyncReceived(int type, nsecs_t timestamp); 2353f30b6202dd5ad6ff66959131d216405850ed152Yang Ni virtual void onHotplugReceived(int disp, bool connected); 2363f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 2373f30b6202dd5ad6ff66959131d216405850ed152Yang Ni /* ------------------------------------------------------------------------ 2383f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * Message handling 2393f30b6202dd5ad6ff66959131d216405850ed152Yang Ni */ 2403f30b6202dd5ad6ff66959131d216405850ed152Yang Ni void waitForEvent(); 2413f30b6202dd5ad6ff66959131d216405850ed152Yang Ni void signalTransaction(); 2423f30b6202dd5ad6ff66959131d216405850ed152Yang Ni void signalLayerUpdate(); 2433f30b6202dd5ad6ff66959131d216405850ed152Yang Ni void signalRefresh(); 2443f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 2453e5fbb6faf66488ba49c9d2396350ae567dba315Yang Ni // called on the main thread in response to initializeDisplays() 2463f30b6202dd5ad6ff66959131d216405850ed152Yang Ni void onInitializeDisplays(); 2473f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // called on the main thread in response to setActiveConfig() 2483f30b6202dd5ad6ff66959131d216405850ed152Yang Ni void setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode); 2493f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // called on the main thread in response to setPowerMode() 2503f30b6202dd5ad6ff66959131d216405850ed152Yang Ni void setPowerModeInternal(const sp<DisplayDevice>& hw, int mode); 2513f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 2523f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // Returns whether the transaction actually modified any state 2533f30b6202dd5ad6ff66959131d216405850ed152Yang Ni bool handleMessageTransaction(); 2543f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 2553f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // Returns whether a new buffer has been latched (see handlePageFlip()) 2563f30b6202dd5ad6ff66959131d216405850ed152Yang Ni bool handleMessageInvalidate(); 2573e5fbb6faf66488ba49c9d2396350ae567dba315Yang Ni 2583f30b6202dd5ad6ff66959131d216405850ed152Yang Ni void handleMessageRefresh(); 2593f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 2603f30b6202dd5ad6ff66959131d216405850ed152Yang Ni void handleTransaction(uint32_t transactionFlags); 2613f30b6202dd5ad6ff66959131d216405850ed152Yang Ni void handleTransactionLocked(uint32_t transactionFlags); 2623f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 2633f30b6202dd5ad6ff66959131d216405850ed152Yang Ni void updateCursorAsync(); 2643f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 2653f30b6202dd5ad6ff66959131d216405850ed152Yang Ni /* handlePageFlip - latch a new buffer if available and compute the dirty 2663f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * region. Returns whether a new buffer has been latched, i.e., whether it 2673f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * is necessary to perform a refresh during this vsync. 2683f30b6202dd5ad6ff66959131d216405850ed152Yang Ni */ 2693e5fbb6faf66488ba49c9d2396350ae567dba315Yang Ni bool handlePageFlip(); 2703f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 2713f30b6202dd5ad6ff66959131d216405850ed152Yang Ni /* ------------------------------------------------------------------------ 2723f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * Transactions 2733f30b6202dd5ad6ff66959131d216405850ed152Yang Ni */ 2743f30b6202dd5ad6ff66959131d216405850ed152Yang Ni uint32_t getTransactionFlags(uint32_t flags); 2753f30b6202dd5ad6ff66959131d216405850ed152Yang Ni uint32_t peekTransactionFlags(uint32_t flags); 2763f30b6202dd5ad6ff66959131d216405850ed152Yang Ni uint32_t setTransactionFlags(uint32_t flags); 2773f30b6202dd5ad6ff66959131d216405850ed152Yang Ni void commitTransaction(); 2783f30b6202dd5ad6ff66959131d216405850ed152Yang Ni uint32_t setClientStateLocked(const sp<Client>& client, const layer_state_t& s); 2793f30b6202dd5ad6ff66959131d216405850ed152Yang Ni uint32_t setDisplayStateLocked(const DisplayState& s); 2803f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 2813f30b6202dd5ad6ff66959131d216405850ed152Yang Ni /* ------------------------------------------------------------------------ 2823f30b6202dd5ad6ff66959131d216405850ed152Yang Ni * Layer management 2833f30b6202dd5ad6ff66959131d216405850ed152Yang Ni */ 2843e5fbb6faf66488ba49c9d2396350ae567dba315Yang Ni status_t createLayer(const String8& name, const sp<Client>& client, 2853f30b6202dd5ad6ff66959131d216405850ed152Yang Ni uint32_t w, uint32_t h, PixelFormat format, uint32_t flags, 2863f30b6202dd5ad6ff66959131d216405850ed152Yang Ni sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp); 2873f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 2883f30b6202dd5ad6ff66959131d216405850ed152Yang Ni status_t createNormalLayer(const sp<Client>& client, const String8& name, 2893f30b6202dd5ad6ff66959131d216405850ed152Yang Ni uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format, 2903f30b6202dd5ad6ff66959131d216405850ed152Yang Ni sp<IBinder>* outHandle, sp<IGraphicBufferProducer>* outGbp, 2913f30b6202dd5ad6ff66959131d216405850ed152Yang Ni sp<Layer>* outLayer); 2923f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 2933f30b6202dd5ad6ff66959131d216405850ed152Yang Ni status_t createDimLayer(const sp<Client>& client, const String8& name, 2943f30b6202dd5ad6ff66959131d216405850ed152Yang Ni uint32_t w, uint32_t h, uint32_t flags, sp<IBinder>* outHandle, 2953f30b6202dd5ad6ff66959131d216405850ed152Yang Ni sp<IGraphicBufferProducer>* outGbp, sp<Layer>* outLayer); 296 297 // called in response to the window-manager calling 298 // ISurfaceComposerClient::destroySurface() 299 status_t onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle); 300 301 // called when all clients have released all their references to 302 // this layer meaning it is entirely safe to destroy all 303 // resources associated to this layer. 304 status_t onLayerDestroyed(const wp<Layer>& layer); 305 306 // remove a layer from SurfaceFlinger immediately 307 status_t removeLayer(const sp<Layer>& layer); 308 309 // add a layer to SurfaceFlinger 310 status_t addClientLayer(const sp<Client>& client, 311 const sp<IBinder>& handle, 312 const sp<IGraphicBufferProducer>& gbc, 313 const sp<Layer>& lbc); 314 315 /* ------------------------------------------------------------------------ 316 * Boot animation, on/off animations and screen capture 317 */ 318 319 void startBootAnim(); 320 321 void renderScreenImplLocked( 322 const sp<const DisplayDevice>& hw, 323 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 324 uint32_t minLayerZ, uint32_t maxLayerZ, 325 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation); 326 327 status_t captureScreenImplLocked( 328 const sp<const DisplayDevice>& hw, 329 const sp<IGraphicBufferProducer>& producer, 330 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 331 uint32_t minLayerZ, uint32_t maxLayerZ, 332 bool useIdentityTransform, Transform::orientation_flags rotation); 333 334 /* ------------------------------------------------------------------------ 335 * EGL 336 */ 337 size_t getMaxTextureSize() const; 338 size_t getMaxViewportDims() const; 339 340 /* ------------------------------------------------------------------------ 341 * Display and layer stack management 342 */ 343 // called when starting, or restarting after system_server death 344 void initializeDisplays(); 345 346 // Create an IBinder for a builtin display and add it to current state 347 void createBuiltinDisplayLocked(DisplayDevice::DisplayType type); 348 349 // NOTE: can only be called from the main thread or with mStateLock held 350 sp<const DisplayDevice> getDisplayDevice(const wp<IBinder>& dpy) const { 351 return mDisplays.valueFor(dpy); 352 } 353 354 // NOTE: can only be called from the main thread or with mStateLock held 355 sp<DisplayDevice> getDisplayDevice(const wp<IBinder>& dpy) { 356 return mDisplays.valueFor(dpy); 357 } 358 359 // mark a region of a layer stack dirty. this updates the dirty 360 // region of all screens presenting this layer stack. 361 void invalidateLayerStack(uint32_t layerStack, const Region& dirty); 362 363 // allocate a h/w composer display id 364 int32_t allocateHwcDisplayId(DisplayDevice::DisplayType type); 365 366 /* ------------------------------------------------------------------------ 367 * H/W composer 368 */ 369 370 HWComposer& getHwComposer() const { return *mHwc; } 371 372 /* ------------------------------------------------------------------------ 373 * Compositing 374 */ 375 void invalidateHwcGeometry(); 376 static void computeVisibleRegions( 377 const LayerVector& currentLayers, uint32_t layerStack, 378 Region& dirtyRegion, Region& opaqueRegion); 379 380 void preComposition(); 381 void postComposition(); 382 void rebuildLayerStacks(); 383 void setUpHWComposer(); 384 void doComposition(); 385 void doDebugFlashRegions(); 386 void doDisplayComposition(const sp<const DisplayDevice>& hw, const Region& dirtyRegion); 387 388 // compose surfaces for display hw. this fails if using GL and the surface 389 // has been destroyed and is no longer valid. 390 bool doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty); 391 392 void postFramebuffer(); 393 void drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const; 394 395 /* ------------------------------------------------------------------------ 396 * Display management 397 */ 398 399 /* ------------------------------------------------------------------------ 400 * VSync 401 */ 402 void enableHardwareVsync(); 403 void disableHardwareVsync(bool makeUnavailable); 404 void resyncToHardwareVsync(bool makeAvailable); 405 406 /* ------------------------------------------------------------------------ 407 * Debugging & dumpsys 408 */ 409 void listLayersLocked(const Vector<String16>& args, size_t& index, String8& result) const; 410 void dumpStatsLocked(const Vector<String16>& args, size_t& index, String8& result) const; 411 void clearStatsLocked(const Vector<String16>& args, size_t& index, String8& result); 412 void dumpAllLocked(const Vector<String16>& args, size_t& index, String8& result) const; 413 bool startDdmConnection(); 414 static void appendSfConfigString(String8& result); 415 void checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr, 416 const sp<const DisplayDevice>& hw, 417 uint32_t minLayerZ, uint32_t maxLayerZ); 418 419 void logFrameStats(); 420 421 void dumpStaticScreenStats(String8& result) const; 422 423 /* ------------------------------------------------------------------------ 424 * Attributes 425 */ 426 427 // access must be protected by mStateLock 428 mutable Mutex mStateLock; 429 State mCurrentState; 430 volatile int32_t mTransactionFlags; 431 Condition mTransactionCV; 432 bool mTransactionPending; 433 bool mAnimTransactionPending; 434 Vector< sp<Layer> > mLayersPendingRemoval; 435 SortedVector< wp<IBinder> > mGraphicBufferProducerList; 436 437 // protected by mStateLock (but we could use another lock) 438 bool mLayersRemoved; 439 440 // access must be protected by mInvalidateLock 441 volatile int32_t mRepaintEverything; 442 443 // constant members (no synchronization needed for access) 444 HWComposer* mHwc; 445 RenderEngine* mRenderEngine; 446 nsecs_t mBootTime; 447 bool mGpuToCpuSupported; 448 sp<EventThread> mEventThread; 449 sp<EventThread> mSFEventThread; 450 sp<EventControlThread> mEventControlThread; 451 EGLContext mEGLContext; 452 EGLDisplay mEGLDisplay; 453 sp<IBinder> mBuiltinDisplays[DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES]; 454 455 // Can only accessed from the main thread, these members 456 // don't need synchronization 457 State mDrawingState; 458 bool mVisibleRegionsDirty; 459 bool mHwWorkListDirty; 460 bool mAnimCompositionPending; 461 462 // this may only be written from the main thread with mStateLock held 463 // it may be read from other threads with mStateLock held 464 DefaultKeyedVector< wp<IBinder>, sp<DisplayDevice> > mDisplays; 465 466 // don't use a lock for these, we don't care 467 int mDebugRegion; 468 int mDebugDDMS; 469 int mDebugDisableHWC; 470 int mDebugDisableTransformHint; 471 volatile nsecs_t mDebugInSwapBuffers; 472 nsecs_t mLastSwapBufferTime; 473 volatile nsecs_t mDebugInTransaction; 474 nsecs_t mLastTransactionTime; 475 bool mBootFinished; 476 bool mForceFullDamage; 477 478 // these are thread safe 479 mutable MessageQueue mEventQueue; 480 FrameTracker mAnimFrameTracker; 481 DispSync mPrimaryDispSync; 482 483 // protected by mDestroyedLayerLock; 484 mutable Mutex mDestroyedLayerLock; 485 Vector<Layer const *> mDestroyedLayers; 486 487 // protected by mHWVsyncLock 488 Mutex mHWVsyncLock; 489 bool mPrimaryHWVsyncEnabled; 490 bool mHWVsyncAvailable; 491 492 /* ------------------------------------------------------------------------ 493 * Feature prototyping 494 */ 495 496 Daltonizer mDaltonizer; 497 bool mDaltonize; 498 499 mat4 mColorMatrix; 500 bool mHasColorMatrix; 501 502 // Static screen stats 503 bool mHasPoweredOff; 504 static const size_t NUM_BUCKETS = 8; // < 1-7, 7+ 505 nsecs_t mFrameBuckets[NUM_BUCKETS]; 506 nsecs_t mTotalTime; 507 nsecs_t mLastSwapTime; 508}; 509 510}; // namespace android 511 512#endif // ANDROID_SURFACE_FLINGER_H 513