SurfaceFlinger.cpp revision b0d1dd36f104c0b581674adc7f830cbf44b7db06
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 171c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS 181c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 20921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include <sys/types.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <math.h> 2363f165fd6b86d04be94d4023e845e98560504a96Keun young Park#include <dlfcn.h> 24921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 25921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include <EGL/egl.h> 26921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include <GLES/gl.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/log.h> 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/properties.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IPCThreadState.h> 32c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IServiceManager.h> 337303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian#include <binder/MemoryHeapBase.h> 3499b49840d309727678b77403d6cc9f920111623fMathias Agopian#include <binder/PermissionCache.h> 357303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian 36c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian#include <ui/DisplayInfo.h> 37c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian 38921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include <gui/BitTube.h> 391a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <gui/BufferQueue.h> 401a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <gui/IDisplayEventConnection.h> 41921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include <gui/SurfaceTextureClient.h> 42921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 43921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include <ui/GraphicBufferAllocator.h> 44921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include <ui/PixelFormat.h> 45d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/String8.h> 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/String16.h> 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/StopWatch.h> 491c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#include <utils/Trace.h> 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 51921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include <private/android_filesystem_config.h> 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "clz.h" 5490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include "DdmConnection.h" 550f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h" 56db403e8ff0d7727015e1a5009bab20eb7ec205bcMathias Agopian#include "Client.h" 57d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include "EventThread.h" 581f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian#include "GLExtensions.h" 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Layer.h" 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "LayerDim.h" 61118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian#include "LayerScreenshot.h" 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h" 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 64a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian#include "DisplayHardware/FramebufferSurface.h" 65a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian#include "DisplayHardware/HWComposer.h" 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 67a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 68bc2d79ed7ada6243f3690f94ab512c0ddcdbed12Mathias Agopian#define EGL_VERSION_HW_ANDROID 0x3143 69bc2d79ed7ada6243f3690f94ab512c0ddcdbed12Mathias Agopian 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define DISPLAY_COUNT 1 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7599b49840d309727678b77403d6cc9f920111623fMathias Agopianconst String16 sHardwareTest("android.permission.HARDWARE_TEST"); 7699b49840d309727678b77403d6cc9f920111623fMathias Agopianconst String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER"); 7799b49840d309727678b77403d6cc9f920111623fMathias Agopianconst String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER"); 7899b49840d309727678b77403d6cc9f920111623fMathias Agopianconst String16 sDump("android.permission.DUMP"); 7999b49840d309727678b77403d6cc9f920111623fMathias Agopian 8099b49840d309727678b77403d6cc9f920111623fMathias Agopian// --------------------------------------------------------------------------- 8199b49840d309727678b77403d6cc9f920111623fMathias Agopian 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurfaceFlinger::SurfaceFlinger() 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : BnSurfaceComposer(), Thread(false), 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransactionFlags(0), 8528378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mTransationPending(false), 86076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mLayersRemoved(false), 8752bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian mRepaintEverything(0), 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mBootTime(systemTime()), 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mVisibleRegionsDirty(false), 90a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian mHwWorkListDirty(false), 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDebugRegion(0), 928afb7e39a83a3e31170612d562eb08508e328388Mathias Agopian mDebugDDMS(0), 9373d3ba9e50be1014aa21ec4bbdc874be394accb4Mathias Agopian mDebugDisableHWC(0), 94a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian mDebugDisableTransformHint(0), 959795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian mDebugInSwapBuffers(0), 969795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian mLastSwapBufferTime(0), 979795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian mDebugInTransaction(0), 989795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian mLastTransactionTime(0), 995f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian mBootFinished(false) 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 101a19954ab377b46dbcb9cbe8a6ab6d458f2e32bcaSteve Block ALOGI("SurfaceFlinger is starting"); 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // debugging stuff... 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project char value[PROPERTY_VALUE_MAX]; 1058afb7e39a83a3e31170612d562eb08508e328388Mathias Agopian 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project property_get("debug.sf.showupdates", value, "0"); 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDebugRegion = atoi(value); 1088afb7e39a83a3e31170612d562eb08508e328388Mathias Agopian 1098afb7e39a83a3e31170612d562eb08508e328388Mathias Agopian property_get("debug.sf.ddms", value, "0"); 1108afb7e39a83a3e31170612d562eb08508e328388Mathias Agopian mDebugDDMS = atoi(value); 1118afb7e39a83a3e31170612d562eb08508e328388Mathias Agopian if (mDebugDDMS) { 11263f165fd6b86d04be94d4023e845e98560504a96Keun young Park if (!startDdmConnection()) { 11363f165fd6b86d04be94d4023e845e98560504a96Keun young Park // start failed, and DDMS debugging not enabled 11463f165fd6b86d04be94d4023e845e98560504a96Keun young Park mDebugDDMS = 0; 11563f165fd6b86d04be94d4023e845e98560504a96Keun young Park } 1168afb7e39a83a3e31170612d562eb08508e328388Mathias Agopian } 117c1d359d42b753fcc2426d66a0f782f7c300893bcMathias Agopian ALOGI_IF(mDebugRegion, "showupdates enabled"); 118c1d359d42b753fcc2426d66a0f782f7c300893bcMathias Agopian ALOGI_IF(mDebugDDMS, "DDMS debugging enabled"); 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid SurfaceFlinger::onFirstRef() 12299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian{ 12399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mEventQueue.init(this); 12499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 12599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian run("SurfaceFlinger", PRIORITY_URGENT_DISPLAY); 12699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 12799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian // Wait for the main thread to be done with its initialization 12899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mReadyToRunBarrier.wait(); 12999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian} 13099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 13199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurfaceFlinger::~SurfaceFlinger() 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 134a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 135a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); 136a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian eglTerminate(display); 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid SurfaceFlinger::binderDied(const wp<IBinder>& who) 14099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian{ 14199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian // the window manager died on us. prepare its eulogy. 14299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 14313a082e160c2d1d8006b93a555a57035213d568bAndy McFadden // restore initial conditions (default device unblank, etc) 14413a082e160c2d1d8006b93a555a57035213d568bAndy McFadden initializeDisplays(); 14599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 14699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian // restart the boot-animation 147a67e418e1fda219f6cc0a7e420bcf5cc4f9fe710Mathias Agopian startBootAnim(); 14899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian} 14999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 1507e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopiansp<ISurfaceComposerClient> SurfaceFlinger::createConnection() 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 15296f0819f81293076e652792794a961543e6750d7Mathias Agopian sp<ISurfaceComposerClient> bclient; 15396f0819f81293076e652792794a961543e6750d7Mathias Agopian sp<Client> client(new Client(this)); 15496f0819f81293076e652792794a961543e6750d7Mathias Agopian status_t err = client->initCheck(); 15596f0819f81293076e652792794a961543e6750d7Mathias Agopian if (err == NO_ERROR) { 15696f0819f81293076e652792794a961543e6750d7Mathias Agopian bclient = client; 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return bclient; 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 161e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopiansp<IBinder> SurfaceFlinger::createDisplay() 162e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian{ 163e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian class DisplayToken : public BBinder { 164e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<SurfaceFlinger> flinger; 165e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian virtual ~DisplayToken() { 166e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian // no more references, this display must be terminated 167e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Mutex::Autolock _l(flinger->mStateLock); 168e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian flinger->mCurrentState.displays.removeItem(this); 169e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian flinger->setTransactionFlags(eDisplayTransactionNeeded); 170e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 171e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian public: 172e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayToken(const sp<SurfaceFlinger>& flinger) 173e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian : flinger(flinger) { 174e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 175e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian }; 176e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 177e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<BBinder> token = new DisplayToken(this); 178e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 179e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Mutex::Autolock _l(mStateLock); 1803ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL); 181e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian mCurrentState.displays.add(token, info); 182e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 183e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return token; 184e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 185e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 186e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopiansp<IBinder> SurfaceFlinger::getBuiltInDisplay(int32_t id) { 1873ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian if (uint32_t(id) >= DisplayDevice::NUM_DISPLAY_TYPES) { 188e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian ALOGE("getDefaultDisplay: id=%d is not a valid default display id", id); 189e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return NULL; 190e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 191e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return mDefaultDisplays[id]; 192e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 193e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1949a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennissp<IGraphicBufferAlloc> SurfaceFlinger::createGraphicBufferAlloc() 1959a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis{ 1969a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis sp<GraphicBufferAlloc> gba(new GraphicBufferAlloc()); 1979a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis return gba; 1989a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis} 199b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid SurfaceFlinger::bootFinished() 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const nsecs_t now = systemTime(); 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const nsecs_t duration = now - mBootTime; 204a19954ab377b46dbcb9cbe8a6ab6d458f2e32bcaSteve Block ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) ); 2053330b203039dea366d4981db1408a460134b2d2cMathias Agopian mBootFinished = true; 2061f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian 2071f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian // wait patiently for the window manager death 2081f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian const String16 name("window"); 2091f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian sp<IBinder> window(defaultServiceManager()->getService(name)); 2101f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian if (window != 0) { 211921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this)); 2121f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian } 2131f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian 2141f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian // stop boot animation 215a67e418e1fda219f6cc0a7e420bcf5cc4f9fe710Mathias Agopian // formerly we would just kill the process, but we now ask it to exit so it 216a67e418e1fda219f6cc0a7e420bcf5cc4f9fe710Mathias Agopian // can choose where to stop the animation. 217a67e418e1fda219f6cc0a7e420bcf5cc4f9fe710Mathias Agopian property_set("service.bootanim.exit", "1"); 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 220921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopianvoid SurfaceFlinger::deleteTextureAsync(GLuint texture) { 221921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian class MessageDestroyGLTexture : public MessageBase { 222921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian GLuint texture; 223921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian public: 224921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian MessageDestroyGLTexture(GLuint texture) 225921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian : texture(texture) { 226921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian } 227921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian virtual bool handler() { 228921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian glDeleteTextures(1, &texture); 229921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian return true; 230921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian } 231921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian }; 232921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian postMessageAsync(new MessageDestroyGLTexture(texture)); 233921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian} 234921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 235a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianstatus_t SurfaceFlinger::selectConfigForPixelFormat( 236a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLDisplay dpy, 237a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint const* attrs, 238a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian PixelFormat format, 239a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLConfig* outConfig) 240a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian{ 241a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLConfig config = NULL; 242a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint numConfigs = -1, n=0; 243a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian eglGetConfigs(dpy, NULL, 0, &numConfigs); 244a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLConfig* const configs = new EGLConfig[numConfigs]; 245a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian eglChooseConfig(dpy, attrs, configs, numConfigs, &n); 246a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian for (int i=0 ; i<n ; i++) { 247a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint nativeVisualId = 0; 248a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian eglGetConfigAttrib(dpy, configs[i], EGL_NATIVE_VISUAL_ID, &nativeVisualId); 249a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (nativeVisualId>0 && format == nativeVisualId) { 250a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian *outConfig = configs[i]; 251a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian delete [] configs; 252a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return NO_ERROR; 253a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 254a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 255a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian delete [] configs; 256a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return NAME_NOT_FOUND; 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 259a49126087b4494f4ef50873f3a3f6727265f6621Mathias AgopianEGLConfig SurfaceFlinger::selectEGLConfig(EGLDisplay display, EGLint nativeVisualId) { 260a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // select our EGLConfig. It must support EGL_RECORDABLE_ANDROID if 261a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // it is to be used with WIFI displays 262a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLConfig config; 263a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint dummy; 264a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian status_t err; 265a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint attribs[] = { 266a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 267a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGL_RECORDABLE_ANDROID, EGL_TRUE, 268a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGL_NONE 269a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian }; 270a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian err = selectConfigForPixelFormat(display, attribs, nativeVisualId, &config); 271a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (err) { 272a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // maybe we failed because of EGL_RECORDABLE_ANDROID 273a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGW("couldn't find an EGLConfig with EGL_RECORDABLE_ANDROID"); 274a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian attribs[2] = EGL_NONE; 275a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian err = selectConfigForPixelFormat(display, attribs, nativeVisualId, &config); 276a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 277a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGE_IF(err, "couldn't find an EGLConfig matching the screen format"); 278a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (eglGetConfigAttrib(display, config, EGL_CONFIG_CAVEAT, &dummy) == EGL_TRUE) { 279a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGW_IF(dummy == EGL_SLOW_CONFIG, "EGL_SLOW_CONFIG selected!"); 280a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 281a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return config; 282a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 284a49126087b4494f4ef50873f3a3f6727265f6621Mathias AgopianEGLContext SurfaceFlinger::createGLContext(EGLDisplay display, EGLConfig config) { 285a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // Also create our EGLContext 286a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint contextAttributes[] = { 287a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian#ifdef EGL_IMG_context_priority 288a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian#ifdef HAS_CONTEXT_PRIORITY 289a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian#warning "using EGL_IMG_context_priority" 290a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGL_CONTEXT_PRIORITY_LEVEL_IMG, EGL_CONTEXT_PRIORITY_HIGH_IMG, 291a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian#endif 292a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian#endif 293a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGL_NONE, EGL_NONE 294a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian }; 295a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLContext ctxt = eglCreateContext(display, config, NULL, contextAttributes); 296a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGE_IF(ctxt==EGL_NO_CONTEXT, "EGLContext creation failed"); 297a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return ctxt; 298a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 300da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopianvoid SurfaceFlinger::initializeGL(EGLDisplay display, const sp<DisplayDevice>& hw) { 301da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian EGLBoolean result = DisplayDevice::makeCurrent(display, hw, mEGLContext); 302a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian if (!result) { 303a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGE("Couldn't create a working GLES context. check logs. exiting..."); 304a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian exit(0); 305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 307a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian GLExtensions& extensions(GLExtensions::getInstance()); 308a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian extensions.initWithGLStrings( 309a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian glGetString(GL_VENDOR), 310a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian glGetString(GL_RENDERER), 311a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian glGetString(GL_VERSION), 312a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian glGetString(GL_EXTENSIONS), 313a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian eglQueryString(display, EGL_VENDOR), 314a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian eglQueryString(display, EGL_VERSION), 315a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian eglQueryString(display, EGL_EXTENSIONS)); 3168b42e8a5d87dcdc8ea31368ab88de49b72ab5432Andreas Huber 317a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian glGetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize); 318a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian glGetIntegerv(GL_MAX_VIEWPORT_DIMS, mMaxViewportDims); 3197303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian 320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glPixelStorei(GL_UNPACK_ALIGNMENT, 4); 3218b42e8a5d87dcdc8ea31368ab88de49b72ab5432Andreas Huber glPixelStorei(GL_PACK_ALIGNMENT, 4); 322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnableClientState(GL_VERTEX_ARRAY); 323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glShadeModel(GL_FLAT); 324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_DITHER); 325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_CULL_FACE); 326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 327a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian struct pack565 { 328a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian inline uint16_t operator() (int r, int g, int b) const { 329a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return (r<<11)|(g<<5)|b; 330a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 331a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } pack565; 332a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 3339575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennis const uint16_t protTexData[] = { pack565(0x03, 0x03, 0x03) }; 3349575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennis glGenTextures(1, &mProtectedTexName); 3359575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennis glBindTexture(GL_TEXTURE_2D, mProtectedTexName); 3369575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennis glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 3379575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennis glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 3389575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennis glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 3399575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennis glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 3409575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennis glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, 3419575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennis GL_RGB, GL_UNSIGNED_SHORT_5_6_5, protTexData); 342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 343a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // print some debugging info 344a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian EGLint r,g,b,a; 345a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian eglGetConfigAttrib(display, mEGLConfig, EGL_RED_SIZE, &r); 346a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian eglGetConfigAttrib(display, mEGLConfig, EGL_GREEN_SIZE, &g); 347a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian eglGetConfigAttrib(display, mEGLConfig, EGL_BLUE_SIZE, &b); 348a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian eglGetConfigAttrib(display, mEGLConfig, EGL_ALPHA_SIZE, &a); 349a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGI("EGL informations:"); 350a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGI("vendor : %s", extensions.getEglVendor()); 351a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGI("version : %s", extensions.getEglVersion()); 352a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGI("extensions: %s", extensions.getEglExtension()); 353a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGI("Client API: %s", eglQueryString(display, EGL_CLIENT_APIS)?:"Not Supported"); 354a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGI("EGLSurface: %d-%d-%d-%d, config=%p", r, g, b, a, mEGLConfig); 355a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGI("OpenGL ES informations:"); 356a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGI("vendor : %s", extensions.getVendor()); 357a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGI("renderer : %s", extensions.getRenderer()); 358a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGI("version : %s", extensions.getVersion()); 359a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGI("extensions: %s", extensions.getExtension()); 360a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGI("GL_MAX_TEXTURE_SIZE = %d", mMaxTextureSize); 361a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGI("GL_MAX_VIEWPORT_DIMS = %d x %d", mMaxViewportDims[0], mMaxViewportDims[1]); 362a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 363a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 364a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianstatus_t SurfaceFlinger::readyToRun() 365a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian{ 366a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGI( "SurfaceFlinger's main thread ready to run. " 367a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian "Initializing graphics H/W..."); 368a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 369b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden // initialize EGL for the default display 37034a09ba1efd706323a15633da5044b352988eb5fJesse Hall mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); 37134a09ba1efd706323a15633da5044b352988eb5fJesse Hall eglInitialize(mEGLDisplay, NULL, NULL); 372a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 373b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden // Initialize the H/W composer object. There may or may not be an 374b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden // actual hardware composer underneath. 375b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden mHwc = new HWComposer(this, 376b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden *static_cast<HWComposer::EventHandler *>(this)); 377b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden 378a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // Initialize the main display 379a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // create native window to main display 380b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc); 3811a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis if (fbs == NULL) { 382a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian ALOGE("Display subsystem failed to initialize. check logs. exiting..."); 383a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian exit(0); 384a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian } 385a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 386e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<SurfaceTextureClient> stc(new SurfaceTextureClient( 387e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian static_cast<sp<ISurfaceTexture> >(fbs->getBufferQueue()))); 3881a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 389a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // initialize the config and context 390a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian int format; 3911a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis ANativeWindow* const anw = stc.get(); 3921a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis anw->query(anw, NATIVE_WINDOW_FORMAT, &format); 39334a09ba1efd706323a15633da5044b352988eb5fJesse Hall mEGLConfig = selectEGLConfig(mEGLDisplay, format); 39434a09ba1efd706323a15633da5044b352988eb5fJesse Hall mEGLContext = createGLContext(mEGLDisplay, mEGLConfig); 395a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 396a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // initialize our main display hardware 397e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 3983ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian for (size_t i=0 ; i<DisplayDevice::NUM_DISPLAY_TYPES ; i++) { 399e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian mDefaultDisplays[i] = new BBinder(); 4003ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian mCurrentState.displays.add(mDefaultDisplays[i], 4013ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian DisplayDeviceState((DisplayDevice::DisplayType)i)); 402e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 403e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<DisplayDevice> hw = new DisplayDevice(this, 4043ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian DisplayDevice::DISPLAY_PRIMARY, 4053ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian mDefaultDisplays[DisplayDevice::DISPLAY_PRIMARY], 406e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian anw, fbs, mEGLConfig); 4073ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian mDisplays.add(mDefaultDisplays[DisplayDevice::DISPLAY_PRIMARY], hw); 408a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 409a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // initialize OpenGL ES 410da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian initializeGL(mEGLDisplay, hw); 411d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 412028508cad5ef63ef9fbd42c14e76658e4fd9ebf2Mathias Agopian // start the EventThread 413028508cad5ef63ef9fbd42c14e76658e4fd9ebf2Mathias Agopian mEventThread = new EventThread(this); 414028508cad5ef63ef9fbd42c14e76658e4fd9ebf2Mathias Agopian mEventQueue.setEventThread(mEventThread); 415028508cad5ef63ef9fbd42c14e76658e4fd9ebf2Mathias Agopian 41692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian // initialize our drawing state 41792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian mDrawingState = mCurrentState; 4188630320433bd15aca239522e54e711ef6372ab07Mathias Agopian 419a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian // We're now ready to accept clients... 420d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian mReadyToRunBarrier.open(); 421d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 42213a082e160c2d1d8006b93a555a57035213d568bAndy McFadden // set initial conditions (e.g. unblank default device) 42313a082e160c2d1d8006b93a555a57035213d568bAndy McFadden initializeDisplays(); 42413a082e160c2d1d8006b93a555a57035213d568bAndy McFadden 425a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian // start boot animation 426a67e418e1fda219f6cc0a7e420bcf5cc4f9fe710Mathias Agopian startBootAnim(); 4278b42e8a5d87dcdc8ea31368ab88de49b72ab5432Andreas Huber 428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 4313ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopianint32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) { 4323ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian return (uint32_t(type) < DisplayDevice::NUM_DISPLAY_TYPES) ? 4333ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian type : mHwc->allocateDisplayId(); 4343ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian} 4353ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian 436a67e418e1fda219f6cc0a7e420bcf5cc4f9fe710Mathias Agopianvoid SurfaceFlinger::startBootAnim() { 437a67e418e1fda219f6cc0a7e420bcf5cc4f9fe710Mathias Agopian // start boot animation 438a67e418e1fda219f6cc0a7e420bcf5cc4f9fe710Mathias Agopian property_set("service.bootanim.exit", "0"); 439a67e418e1fda219f6cc0a7e420bcf5cc4f9fe710Mathias Agopian property_set("ctl.start", "bootanim"); 440a67e418e1fda219f6cc0a7e420bcf5cc4f9fe710Mathias Agopian} 441a67e418e1fda219f6cc0a7e420bcf5cc4f9fe710Mathias Agopian 442a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianuint32_t SurfaceFlinger::getMaxTextureSize() const { 443a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mMaxTextureSize; 444a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 445a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 446a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianuint32_t SurfaceFlinger::getMaxViewportDims() const { 447a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian return mMaxViewportDims[0] < mMaxViewportDims[1] ? 448a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian mMaxViewportDims[0] : mMaxViewportDims[1]; 449a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian} 450a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian 451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 452d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 453582270d69db94286a248bd829f1ae6f910d45124Jamie Gennisbool SurfaceFlinger::authenticateSurfaceTexture( 454582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis const sp<ISurfaceTexture>& surfaceTexture) const { 455134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis Mutex::Autolock _l(mStateLock); 456582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis sp<IBinder> surfaceTextureBinder(surfaceTexture->asBinder()); 457134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 458134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis // Check the visible layer list for the ISurface 459134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis const LayerVector& currentLayers = mCurrentState.layersSortedByZ; 460134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis size_t count = currentLayers.size(); 461134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis for (size_t i=0 ; i<count ; i++) { 462134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis const sp<LayerBase>& layer(currentLayers[i]); 463134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis sp<LayerBaseClient> lbc(layer->getLayerBaseClient()); 464582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis if (lbc != NULL) { 465582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis wp<IBinder> lbcBinder = lbc->getSurfaceTextureBinder(); 466582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis if (lbcBinder == surfaceTextureBinder) { 467582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis return true; 468582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis } 469134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 470134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 471134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 472134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis // Check the layers in the purgatory. This check is here so that if a 473582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis // SurfaceTexture gets destroyed before all the clients are done using it, 474582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis // the error will not be reported as "surface XYZ is not authenticated", but 475134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis // will instead fail later on when the client tries to use the surface, 476134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis // which should be reported as "surface XYZ returned an -ENODEV". The 477134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis // purgatorized layers are no less authentic than the visible ones, so this 478134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis // should not cause any harm. 479134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis size_t purgatorySize = mLayerPurgatory.size(); 480134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis for (size_t i=0 ; i<purgatorySize ; i++) { 481134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis const sp<LayerBase>& layer(mLayerPurgatory.itemAt(i)); 482134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis sp<LayerBaseClient> lbc(layer->getLayerBaseClient()); 483582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis if (lbc != NULL) { 484582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis wp<IBinder> lbcBinder = lbc->getSurfaceTextureBinder(); 485582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis if (lbcBinder == surfaceTextureBinder) { 486582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis return true; 487582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis } 488134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 489134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 490134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 491134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 492134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis} 493134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 4949d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownstatus_t SurfaceFlinger::getDisplayInfo(const sp<IBinder>& display, DisplayInfo* info) { 4959d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown // TODO: this is mostly here only for compatibility 4969d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown // the display size is needed but the display metrics should come from elsewhere 4979d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown if (display != mDefaultDisplays[ISurfaceComposer::eDisplayIdMain]) { 4989d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown // TODO: additional displays not yet supported 499c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian return BAD_INDEX; 500c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian } 5018b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian 5028b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian const HWComposer& hwc(getHwComposer()); 503b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden float xdpi = hwc.getDpiX(HWC_DISPLAY_PRIMARY); 504b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden float ydpi = hwc.getDpiY(HWC_DISPLAY_PRIMARY); 5058b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian 5068b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian // TODO: Not sure if display density should handled by SF any longer 5078b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian class Density { 5088b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian static int getDensityFromProperty(char const* propName) { 5098b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian char property[PROPERTY_VALUE_MAX]; 5108b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian int density = 0; 5118b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian if (property_get(propName, property, NULL) > 0) { 5128b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian density = atoi(property); 5138b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian } 5148b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian return density; 5158b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian } 5168b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian public: 5178b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian static int getEmuDensity() { 5188b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian return getDensityFromProperty("qemu.sf.lcd_density"); } 5198b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian static int getBuildDensity() { 5208b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian return getDensityFromProperty("ro.sf.lcd_density"); } 5218b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian }; 5228b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian // The density of the device is provided by a build property 5238b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian float density = Density::getBuildDensity() / 160.0f; 5248b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian if (density == 0) { 5258b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian // the build doesn't provide a density -- this is wrong! 5268b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian // use xdpi instead 5278b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian ALOGE("ro.sf.lcd_density must be defined as a build property"); 5288b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian density = xdpi / 160.0f; 5298b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian } 5308b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian if (Density::getEmuDensity()) { 5318b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian // if "qemu.sf.lcd_density" is specified, it overrides everything 5328b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian xdpi = ydpi = density = Density::getEmuDensity(); 5338b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian density /= 160.0f; 5348b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian } 5358b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian 5364297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian sp<const DisplayDevice> hw(getDefaultDisplayDevice()); 5374297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian info->w = hw->getWidth(); 5384297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian info->h = hw->getHeight(); 5398b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian info->xdpi = xdpi; 5408b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian info->ydpi = ydpi; 541b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden info->fps = float(1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY)); 5428b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian info->density = density; 5434297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian info->orientation = hw->getOrientation(); 544888c822c4cb6976aab9256c58bae9e17e3e55c5cMathias Agopian // TODO: this needs to go away (currently needed only by webkit) 5454297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian getPixelFormatInfo(hw->getFormat(), &info->pixelFormatInfo); 546888c822c4cb6976aab9256c58bae9e17e3e55c5cMathias Agopian return NO_ERROR; 547c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian} 548c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian 549d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian// ---------------------------------------------------------------------------- 550d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 551d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopiansp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection() { 5528aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian return mEventThread->createEventConnection(); 553bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian} 554bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian 5559d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownvoid SurfaceFlinger::connectDisplay(const sp<ISurfaceTexture>& surface) { 5563094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian 5575f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian sp<IBinder> token; 5583094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian { // scope for the lock 5593094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian Mutex::Autolock _l(mStateLock); 5605f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian token = mExtDisplayToken; 5613094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian } 5623094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian 5635f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian if (token == 0) { 5645f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian token = createDisplay(); 5653094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian } 5663094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian 5675f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian { // scope for the lock 5685f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian Mutex::Autolock _l(mStateLock); 5695f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian if (surface == 0) { 5705f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian // release our current display. we're guarantee to have 5715f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian // a reference to it (token), while we hold the lock 5725f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian mExtDisplayToken = 0; 5735f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian } else { 5745f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian mExtDisplayToken = token; 5755f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian } 5765f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian 5775f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian DisplayDeviceState& info(mCurrentState.displays.editValueFor(token)); 5785f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian info.surface = surface; 5795f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian setTransactionFlags(eDisplayTransactionNeeded); 5805f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian } 5813094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian} 5823094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian 583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 58499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 58599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid SurfaceFlinger::waitForEvent() { 58699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mEventQueue.waitMessage(); 58799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian} 58899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 58999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid SurfaceFlinger::signalTransaction() { 59099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mEventQueue.invalidate(); 59199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian} 59299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 59399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid SurfaceFlinger::signalLayerUpdate() { 59499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mEventQueue.invalidate(); 59599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian} 59699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 59799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid SurfaceFlinger::signalRefresh() { 59899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mEventQueue.refresh(); 59999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian} 60099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 60199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianstatus_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg, 60299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian nsecs_t reltime, uint32_t flags) { 60399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian return mEventQueue.postMessage(msg, reltime); 60499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian} 60599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 60699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianstatus_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg, 60799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian nsecs_t reltime, uint32_t flags) { 60899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian status_t res = mEventQueue.postMessage(msg, reltime); 60999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian if (res == NO_ERROR) { 61099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian msg->wait(); 61199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian } 61299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian return res; 61399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian} 614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6154fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopianbool SurfaceFlinger::threadLoop() { 616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project waitForEvent(); 61799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian return true; 61899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian} 619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6203ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopianvoid SurfaceFlinger::onVSyncReceived(int type, nsecs_t timestamp) { 6213ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian if (uint32_t(type) < DisplayDevice::NUM_DISPLAY_TYPES) { 6223ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian // we should only receive DisplayDevice::DisplayType from the vsync callback 6233ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian const wp<IBinder>& token(mDefaultDisplays[type]); 6243ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian mEventThread->onVSyncReceived(token, timestamp); 6253ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian } 6268630320433bd15aca239522e54e711ef6372ab07Mathias Agopian} 6278630320433bd15aca239522e54e711ef6372ab07Mathias Agopian 6288630320433bd15aca239522e54e711ef6372ab07Mathias Agopianvoid SurfaceFlinger::eventControl(int event, int enabled) { 6298630320433bd15aca239522e54e711ef6372ab07Mathias Agopian getHwComposer().eventControl(event, enabled); 6308630320433bd15aca239522e54e711ef6372ab07Mathias Agopian} 6318630320433bd15aca239522e54e711ef6372ab07Mathias Agopian 6324fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopianvoid SurfaceFlinger::onMessageReceived(int32_t what) { 6331c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 63499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian switch (what) { 6354fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian case MessageQueue::INVALIDATE: 6364fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian handleMessageTransaction(); 6374fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian handleMessageInvalidate(); 6384fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian signalRefresh(); 6394fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian break; 6404fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian case MessageQueue::REFRESH: 6414fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian handleMessageRefresh(); 6424fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian break; 6434fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian } 6444fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian} 645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6464fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopianvoid SurfaceFlinger::handleMessageTransaction() { 647e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian uint32_t transactionFlags = peekTransactionFlags(eTransactionMask); 6484fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian if (transactionFlags) { 64987baae104a3e4c2059990b01c393476065c558b0Mathias Agopian handleTransaction(transactionFlags); 6504fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian } 6514fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian} 652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6534fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopianvoid SurfaceFlinger::handleMessageInvalidate() { 654cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian ATRACE_CALL(); 65587baae104a3e4c2059990b01c393476065c558b0Mathias Agopian handlePageFlip(); 6564fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian} 6573a3cad30c40c8eb87671262a9fe7f0e214b6a934Mathias Agopian 6584fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopianvoid SurfaceFlinger::handleMessageRefresh() { 659cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian ATRACE_CALL(); 660cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian preComposition(); 661cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian rebuildLayerStacks(); 662cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian setUpHWComposer(); 663cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian doDebugFlashRegions(); 664cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian doComposition(); 665cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian postComposition(); 666cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 667cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 668cd60f99aba9e750700a967db30b74a29145739cfMathias Agopianvoid SurfaceFlinger::doDebugFlashRegions() 669cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian{ 670cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian // is debugging enabled 671cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (CC_LIKELY(!mDebugRegion)) 672cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian return; 673cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 674cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian const bool repaintEverything = mRepaintEverything; 675cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 676cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian const sp<DisplayDevice>& hw(mDisplays[dpy]); 677cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (hw->canDraw()) { 678cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian // transform the dirty region into this screen's coordinate space 679cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian const Region dirtyRegion(hw->getDirtyRegion(repaintEverything)); 680cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (!dirtyRegion.isEmpty()) { 681cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian // redraw the whole screen 682cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian doComposeSurfaces(hw, Region(hw->bounds())); 683cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 684cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian // and draw the dirty region 685cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian glDisable(GL_TEXTURE_EXTERNAL_OES); 686cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian glDisable(GL_TEXTURE_2D); 687cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian glDisable(GL_BLEND); 688cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian glColor4f(1, 0, 1, 1); 689cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian const int32_t height = hw->getHeight(); 690cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian Region::const_iterator it = dirtyRegion.begin(); 691cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian Region::const_iterator const end = dirtyRegion.end(); 692cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian while (it != end) { 693cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian const Rect& r = *it++; 694cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian GLfloat vertices[][2] = { 695cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian { r.left, height - r.top }, 696cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian { r.left, height - r.bottom }, 697cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian { r.right, height - r.bottom }, 698cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian { r.right, height - r.top } 699cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian }; 700cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian glVertexPointer(2, GL_FLOAT, 0, vertices); 701cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 702cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 703cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian hw->compositionComplete(); 704cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian // FIXME 7053ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) { 706cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian eglSwapBuffers(mEGLDisplay, hw->getEGLSurface()); 707cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 708cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 709cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 710cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 711cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 712cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian postFramebuffer(); 713cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 714cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (mDebugRegion > 1) { 715cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian usleep(mDebugRegion * 1000); 716cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 717cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 718cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 719cd60f99aba9e750700a967db30b74a29145739cfMathias Agopianvoid SurfaceFlinger::preComposition() 720cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian{ 721cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian bool needExtraInvalidate = false; 722cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian const LayerVector& currentLayers(mDrawingState.layersSortedByZ); 723cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian const size_t count = currentLayers.size(); 724cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian for (size_t i=0 ; i<count ; i++) { 725cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (currentLayers[i]->onPreComposition()) { 726cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian needExtraInvalidate = true; 727cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 728cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 729cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (needExtraInvalidate) { 730cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian signalLayerUpdate(); 731cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 732cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 733a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 734cd60f99aba9e750700a967db30b74a29145739cfMathias Agopianvoid SurfaceFlinger::postComposition() 735cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian{ 736cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian const LayerVector& currentLayers(mDrawingState.layersSortedByZ); 737cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian const size_t count = currentLayers.size(); 738cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian for (size_t i=0 ; i<count ; i++) { 739cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian currentLayers[i]->onPostComposition(); 740cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 741cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 742cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian 743cd60f99aba9e750700a967db30b74a29145739cfMathias Agopianvoid SurfaceFlinger::rebuildLayerStacks() { 744cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian // rebuild the visible layer list per screen 74552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian if (CC_UNLIKELY(mVisibleRegionsDirty)) { 746cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian ATRACE_CALL(); 74787baae104a3e4c2059990b01c393476065c558b0Mathias Agopian mVisibleRegionsDirty = false; 74887baae104a3e4c2059990b01c393476065c558b0Mathias Agopian invalidateHwcGeometry(); 74987baae104a3e4c2059990b01c393476065c558b0Mathias Agopian const LayerVector& currentLayers(mDrawingState.layersSortedByZ); 75092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 7514297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian const sp<DisplayDevice>& hw(mDisplays[dpy]); 7527e7ed7f77a3963a3542bde529d2797a239e2798bMathias Agopian const Transform& tr(hw->getTransform()); 7537e7ed7f77a3963a3542bde529d2797a239e2798bMathias Agopian const Rect bounds(hw->getBounds()); 7547e7ed7f77a3963a3542bde529d2797a239e2798bMathias Agopian 75587baae104a3e4c2059990b01c393476065c558b0Mathias Agopian Region opaqueRegion; 75687baae104a3e4c2059990b01c393476065c558b0Mathias Agopian Region dirtyRegion; 75787baae104a3e4c2059990b01c393476065c558b0Mathias Agopian computeVisibleRegions(currentLayers, 7584297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian hw->getLayerStack(), dirtyRegion, opaqueRegion); 75987baae104a3e4c2059990b01c393476065c558b0Mathias Agopian 76087baae104a3e4c2059990b01c393476065c558b0Mathias Agopian Vector< sp<LayerBase> > layersSortedByZ; 76187baae104a3e4c2059990b01c393476065c558b0Mathias Agopian const size_t count = currentLayers.size(); 76287baae104a3e4c2059990b01c393476065c558b0Mathias Agopian for (size_t i=0 ; i<count ; i++) { 7637e7ed7f77a3963a3542bde529d2797a239e2798bMathias Agopian const sp<LayerBase>& layer(currentLayers[i]); 7647e7ed7f77a3963a3542bde529d2797a239e2798bMathias Agopian const Layer::State& s(layer->drawingState()); 7654297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian if (s.layerStack == hw->getLayerStack()) { 7667e7ed7f77a3963a3542bde529d2797a239e2798bMathias Agopian Region visibleRegion(tr.transform(layer->visibleRegion)); 7677e7ed7f77a3963a3542bde529d2797a239e2798bMathias Agopian visibleRegion.andSelf(bounds); 7687e7ed7f77a3963a3542bde529d2797a239e2798bMathias Agopian if (!visibleRegion.isEmpty()) { 7697e7ed7f77a3963a3542bde529d2797a239e2798bMathias Agopian layersSortedByZ.add(layer); 77087baae104a3e4c2059990b01c393476065c558b0Mathias Agopian } 77187baae104a3e4c2059990b01c393476065c558b0Mathias Agopian } 7723b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 7734297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian hw->setVisibleLayersSortedByZ(layersSortedByZ); 7747e7ed7f77a3963a3542bde529d2797a239e2798bMathias Agopian hw->undefinedRegion.set(bounds); 7757e7ed7f77a3963a3542bde529d2797a239e2798bMathias Agopian hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion)); 7767e7ed7f77a3963a3542bde529d2797a239e2798bMathias Agopian hw->dirtyRegion.orSelf(dirtyRegion); 7773b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 7783b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 779cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 7803b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 781cd60f99aba9e750700a967db30b74a29145739cfMathias Agopianvoid SurfaceFlinger::setUpHWComposer() { 78252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian HWComposer& hwc(getHwComposer()); 78352bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian if (hwc.initCheck() == NO_ERROR) { 78452bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian // build the h/w work list 78552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian const bool workListsDirty = mHwWorkListDirty; 78652bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian mHwWorkListDirty = false; 78792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 7884297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian sp<const DisplayDevice> hw(mDisplays[dpy]); 789e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian const int32_t id = hw->getHwcDisplayId(); 790e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian if (id >= 0) { 791e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian const Vector< sp<LayerBase> >& currentLayers( 792cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian hw->getVisibleLayersSortedByZ()); 793e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian const size_t count = currentLayers.size(); 794e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian if (hwc.createWorkList(id, count) >= 0) { 795e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian HWComposer::LayerListIterator cur = hwc.begin(id); 796e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian const HWComposer::LayerListIterator end = hwc.end(id); 797e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) { 798e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian const sp<LayerBase>& layer(currentLayers[i]); 799e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian 800e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian if (CC_UNLIKELY(workListsDirty)) { 801e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian layer->setGeometry(hw, *cur); 802e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian if (mDebugDisableHWC || mDebugRegion) { 803e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian cur->setSkip(true); 804e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian } 8051e26087493ac0e7d7dc6dea8ad85cfef08b3271fMathias Agopian } 80652bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 807e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian /* 808e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian * update the per-frame h/w composer data for each layer 809e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian * and build the transparent region of the FB 810e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian */ 811e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian layer->setPerFrameData(hw, *cur); 812e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian } 8131e26087493ac0e7d7dc6dea8ad85cfef08b3271fMathias Agopian } 81452bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 81587baae104a3e4c2059990b01c393476065c558b0Mathias Agopian } 81652bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian status_t err = hwc.prepare(); 81752bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err)); 81852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 819cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian} 82052bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 821cd60f99aba9e750700a967db30b74a29145739cfMathias Agopianvoid SurfaceFlinger::doComposition() { 822cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian ATRACE_CALL(); 82352bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian const bool repaintEverything = android_atomic_and(0, &mRepaintEverything); 82492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 8254297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian const sp<DisplayDevice>& hw(mDisplays[dpy]); 826cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (hw->canDraw()) { 827cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian // transform the dirty region into this screen's coordinate space 828cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian const Region dirtyRegion(hw->getDirtyRegion(repaintEverything)); 829cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (!dirtyRegion.isEmpty()) { 83052bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian // repaint the framebuffer (if needed) 831cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian doDisplayComposition(hw, dirtyRegion); 83252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 833cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian hw->dirtyRegion.clear(); 834cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian hw->flip(hw->swapRegion); 835cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian hw->swapRegion.clear(); 83687baae104a3e4c2059990b01c393476065c558b0Mathias Agopian } 83752bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian // inform the h/w that we're done compositing 8384297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian hw->compositionComplete(); 8394fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian } 84052bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian postFramebuffer(); 841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid SurfaceFlinger::postFramebuffer() 844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 845841cde55549cea7a344a1705b18d57a0c6c8ec45Mathias Agopian ATRACE_CALL(); 846b048cef231075a5e41d224b73fe11fec62f335b1Mathias Agopian 847a44b04163957d6086362f6f365443c4c93379031Mathias Agopian const nsecs_t now = systemTime(); 848a44b04163957d6086362f6f365443c4c93379031Mathias Agopian mDebugInSwapBuffers = now; 849c5c5a14c06de249d8e0445fd24699e1d9aa04549Jesse Hall 85052bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian HWComposer& hwc(getHwComposer()); 851ef19414bd8b77a26f5751f3845be79025a8263feJesse Hall if (hwc.initCheck() == NO_ERROR) { 8525f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian // FIXME: EGL spec says: 8535f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian // "surface must be bound to the calling thread's current context, 8545f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian // for the current rendering API." 855da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian DisplayDevice::makeCurrent(mEGLDisplay, getDefaultDisplayDevice(), mEGLContext); 856e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian hwc.commit(); 85752bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 85852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian 85992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 8604297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian sp<const DisplayDevice> hw(mDisplays[dpy]); 8614297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian const Vector< sp<LayerBase> >& currentLayers(hw->getVisibleLayersSortedByZ()); 86252bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian const size_t count = currentLayers.size(); 863e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian int32_t id = hw->getHwcDisplayId(); 864e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian if (id >=0 && hwc.initCheck() == NO_ERROR) { 8651e26087493ac0e7d7dc6dea8ad85cfef08b3271fMathias Agopian HWComposer::LayerListIterator cur = hwc.begin(id); 8661e26087493ac0e7d7dc6dea8ad85cfef08b3271fMathias Agopian const HWComposer::LayerListIterator end = hwc.end(id); 86752bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian for (size_t i = 0; cur != end && i < count; ++i, ++cur) { 868d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian currentLayers[i]->onLayerDisplayed(hw, &*cur); 86952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 870cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } else { 87152bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian for (size_t i = 0; i < count; i++) { 872d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian currentLayers[i]->onLayerDisplayed(hw, NULL); 87352bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian } 874ef19414bd8b77a26f5751f3845be79025a8263feJesse Hall } 875e8696a40e09b24b634214684d18526187b316a2fJamie Gennis } 876e8696a40e09b24b634214684d18526187b316a2fJamie Gennis 877a44b04163957d6086362f6f365443c4c93379031Mathias Agopian mLastSwapBufferTime = systemTime() - now; 878a44b04163957d6086362f6f365443c4c93379031Mathias Agopian mDebugInSwapBuffers = 0; 879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 88187baae104a3e4c2059990b01c393476065c558b0Mathias Agopianvoid SurfaceFlinger::handleTransaction(uint32_t transactionFlags) 882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 883841cde55549cea7a344a1705b18d57a0c6c8ec45Mathias Agopian ATRACE_CALL(); 884841cde55549cea7a344a1705b18d57a0c6c8ec45Mathias Agopian 885ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian Mutex::Autolock _l(mStateLock); 886ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian const nsecs_t now = systemTime(); 887ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian mDebugInTransaction = now; 888ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian 889ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian // Here we're guaranteed that some transaction flags are set 890ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian // so we can call handleTransactionLocked() unconditionally. 891ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian // We call getTransactionFlags(), which will also clear the flags, 892ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian // with mStateLock held to guarantee that mCurrentState won't change 893ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian // until the transaction is committed. 894ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian 895e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian transactionFlags = getTransactionFlags(eTransactionMask); 89687baae104a3e4c2059990b01c393476065c558b0Mathias Agopian handleTransactionLocked(transactionFlags); 897ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian 898ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian mLastTransactionTime = systemTime() - now; 899ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian mDebugInTransaction = 0; 900ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian invalidateHwcGeometry(); 901ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian // here the transaction has been committed 9023d57964a81cd631d80aa9575647e1ce35b5e82d5Mathias Agopian} 903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 90487baae104a3e4c2059990b01c393476065c558b0Mathias Agopianvoid SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) 9053d57964a81cd631d80aa9575647e1ce35b5e82d5Mathias Agopian{ 9063d57964a81cd631d80aa9575647e1ce35b5e82d5Mathias Agopian const LayerVector& currentLayers(mCurrentState.layersSortedByZ); 907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const size_t count = currentLayers.size(); 908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Traversal of the children 911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * (perform the transaction for each of them if needed) 912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9143559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian if (transactionFlags & eTraversalNeeded) { 915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (size_t i=0 ; i<count ; i++) { 916076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const sp<LayerBase>& layer = currentLayers[i]; 917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded); 918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!trFlags) continue; 919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t flags = layer->doTransaction(0); 921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (flags & Layer::eVisibleRegion) 922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mVisibleRegionsDirty = true; 923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 9273559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian * Perform display own transactions if needed 928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 930e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (transactionFlags & eDisplayTransactionNeeded) { 93192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian // here we take advantage of Vector's copy-on-write semantics to 93292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian // improve performance by skipping the transaction entirely when 93392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian // know that the lists are identical 934e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays); 935e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays); 93692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian if (!curr.isIdenticalTo(draw)) { 937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mVisibleRegionsDirty = true; 93892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian const size_t cc = curr.size(); 93993997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian size_t dc = draw.size(); 94092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian 94192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian // find the displays that were removed 94292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian // (ie: in drawing state but not in current state) 94392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian // also handle displays that changed 94492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian // (ie: displays that are in both lists) 94592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian for (size_t i=0 ; i<dc ; i++) { 946e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian const ssize_t j = curr.indexOfKey(draw.keyAt(i)); 947e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (j < 0) { 94892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian // in drawing state but not in current state 9493ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian if (!draw[i].isMainDisplay()) { 9503ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian mDisplays.removeItem(draw.keyAt(i)); 95192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian } else { 95292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian ALOGW("trying to remove the main display"); 95392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian } 95492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian } else { 95592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian // this display is in both lists. see if something changed. 956e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian const DisplayDeviceState& state(curr[j]); 9573ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian const wp<IBinder>& display(curr.keyAt(j)); 958111b2d89221722d38f5b5b3ba65904ec22421839Mathias Agopian if (state.surface->asBinder() != draw[i].surface->asBinder()) { 959e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian // changing the surface is like destroying and 96093997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian // recreating the DisplayDevice, so we just remove it 96193997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian // from the drawing state, so that it get re-added 96293997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian // below. 96393997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian mDisplays.removeItem(display); 96493997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian mDrawingState.displays.removeItemsAt(i); 96593997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian dc--; i--; 96693997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian // at this point we must loop to the next item 96793997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian continue; 96892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian } 96993997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian 97093997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian const sp<DisplayDevice>& disp(getDisplayDevice(display)); 97193997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian if (disp != NULL) { 97293997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian if (state.layerStack != draw[i].layerStack) { 97393997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian disp->setLayerStack(state.layerStack); 97493997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian } 97500e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian if ((state.orientation != draw[i].orientation) 97600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian || (state.viewport != draw[i].viewport) 97700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian || (state.frame != draw[i].frame)) 97800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian { 97900e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian disp->setProjection(state.orientation, 9804fb3999cea652617be5125f8a42c257467bf3c77Jeff Brown state.viewport, state.frame); 98193997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian } 98292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian } 98392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian } 98492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian } 98592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian 98692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian // find displays that were added 98792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian // (ie: in current state but not in drawing state) 98892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian for (size_t i=0 ; i<cc ; i++) { 989e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (draw.indexOfKey(curr.keyAt(i)) < 0) { 990e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian const DisplayDeviceState& state(curr[i]); 99193997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian if (state.surface != NULL) { 99293997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian sp<SurfaceTextureClient> stc( 99393997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian new SurfaceTextureClient(state.surface)); 99493997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian const wp<IBinder>& display(curr.keyAt(i)); 99593997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian sp<DisplayDevice> disp = new DisplayDevice(this, 99693997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian state.type, display, stc, 0, mEGLConfig); 99793997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian disp->setLayerStack(state.layerStack); 99800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian disp->setProjection(state.orientation, 9994fb3999cea652617be5125f8a42c257467bf3c77Jeff Brown state.viewport, state.frame); 100093997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian mDisplays.add(display, disp); 100193997a8a75942b4d06cf50925de5bede489cc134Mathias Agopian } 100292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian } 100392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian } 1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 10053559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian } 1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10073559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian /* 10083559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian * Perform our own transaction if needed 10093559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian */ 1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1011cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian const LayerVector& previousLayers(mDrawingState.layersSortedByZ); 1012cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian if (currentLayers.size() > previousLayers.size()) { 10133559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian // layers have been added 10143559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian mVisibleRegionsDirty = true; 10153559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian } 10163559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian 10173559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian // some layers might have been removed, so 10183559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian // we need to update the regions they're exposing. 10193559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian if (mLayersRemoved) { 10203559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian mLayersRemoved = false; 10213559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian mVisibleRegionsDirty = true; 10223559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian const size_t count = previousLayers.size(); 10233559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian for (size_t i=0 ; i<count ; i++) { 10243559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian const sp<LayerBase>& layer(previousLayers[i]); 10253559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian if (currentLayers.indexOf(layer) < 0) { 10263559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian // this layer is not visible anymore 10273559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian // TODO: we could traverse the tree from front to back and 10283559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian // compute the actual visible region 10293559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian // TODO: we could cache the transformed region 10301501d54d63c55dc4e8f4c6eeaeac35aca6660ffcMathias Agopian const Layer::State& s(layer->drawingState()); 10311501d54d63c55dc4e8f4c6eeaeac35aca6660ffcMathias Agopian Region visibleReg = s.transform.transform( 10321501d54d63c55dc4e8f4c6eeaeac35aca6660ffcMathias Agopian Region(Rect(s.active.w, s.active.h))); 10331501d54d63c55dc4e8f4c6eeaeac35aca6660ffcMathias Agopian invalidateLayerStack(s.layerStack, visibleReg); 10340aa758d64ac530833ce9a311b164c9175a7a054cMathias Agopian } 1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project commitTransaction(); 10394fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian} 10404fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian 10414fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopianvoid SurfaceFlinger::commitTransaction() 10424fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian{ 10434fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian if (!mLayersPendingRemoval.isEmpty()) { 10444fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian // Notify removed layers now that they can't be drawn from 10454fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian for (size_t i = 0; i < mLayersPendingRemoval.size(); i++) { 10464fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian mLayersPendingRemoval[i]->onRemoved(); 10474fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian } 10484fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian mLayersPendingRemoval.clear(); 10494fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian } 10504fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian 10514fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian mDrawingState = mCurrentState; 10524fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian mTransationPending = false; 10534fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian mTransactionCV.broadcast(); 1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid SurfaceFlinger::computeVisibleRegions( 105787baae104a3e4c2059990b01c393476065c558b0Mathias Agopian const LayerVector& currentLayers, uint32_t layerStack, 105887baae104a3e4c2059990b01c393476065c558b0Mathias Agopian Region& outDirtyRegion, Region& outOpaqueRegion) 1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1060841cde55549cea7a344a1705b18d57a0c6c8ec45Mathias Agopian ATRACE_CALL(); 1061841cde55549cea7a344a1705b18d57a0c6c8ec45Mathias Agopian 1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region aboveOpaqueLayers; 1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region aboveCoveredLayers; 1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region dirty; 1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 106687baae104a3e4c2059990b01c393476065c558b0Mathias Agopian outDirtyRegion.clear(); 1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t i = currentLayers.size(); 1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (i--) { 1070076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const sp<LayerBase>& layer = currentLayers[i]; 1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // start with the whole surface at its current location 1073970112231e887c8a14441ec4fed55342e019fc8cMathias Agopian const Layer::State& s(layer->drawingState()); 1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 107587baae104a3e4c2059990b01c393476065c558b0Mathias Agopian // only consider the layers on the given later stack 107687baae104a3e4c2059990b01c393476065c558b0Mathias Agopian if (s.layerStack != layerStack) 107787baae104a3e4c2059990b01c393476065c558b0Mathias Agopian continue; 107887baae104a3e4c2059990b01c393476065c558b0Mathias Agopian 1079ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian /* 1080ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * opaqueRegion: area of a surface that is fully opaque. 1081ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian */ 1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region opaqueRegion; 1083ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian 1084ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian /* 1085ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * visibleRegion: area of a surface that is visible on screen 1086ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * and not fully transparent. This is essentially the layer's 1087ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * footprint minus the opaque regions above it. 1088ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * Areas covered by a translucent surface are considered visible. 1089ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian */ 1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region visibleRegion; 1091ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian 1092ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian /* 1093ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * coveredRegion: area of a surface that is covered by all 1094ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * visible regions above it (which includes the translucent areas). 1095ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian */ 1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region coveredRegion; 1097ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian 1098ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian 1099ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian // handle hidden surfaces by setting the visible region to empty 11003165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian if (CC_LIKELY(!(s.flags & layer_state_t::eLayerHidden) && s.alpha)) { 1101a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian const bool translucent = !layer->isOpaque(); 11024fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian Rect bounds(layer->computeBounds()); 1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project visibleRegion.set(bounds); 1104ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian if (!visibleRegion.isEmpty()) { 1105ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian // Remove the transparent area from the visible region 1106ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian if (translucent) { 11074fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian Region transparentRegionScreen; 11084fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian const Transform tr(s.transform); 11094fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian if (tr.transformed()) { 11104fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian if (tr.preserveRects()) { 11114fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian // transform the transparent region 11124fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian transparentRegionScreen = tr.transform(s.transparentRegion); 11134fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian } else { 11144fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian // transformation too complex, can't do the 11154fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian // transparent region optimization. 11164fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian transparentRegionScreen.clear(); 11174fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian } 11184fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian } else { 11194fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian transparentRegionScreen = s.transparentRegion; 11204fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian } 11214fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian visibleRegion.subtractSelf(transparentRegionScreen); 1122ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian } 1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1124ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian // compute the opaque region 11254fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian const int32_t layerOrientation = s.transform.getOrientation(); 1126ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian if (s.alpha==255 && !translucent && 1127ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian ((layerOrientation & Transform::ROT_INVALID) == false)) { 1128ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian // the opaque region is the layer's footprint 1129ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian opaqueRegion = visibleRegion; 1130ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian } 1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1134ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian // Clip the covered region to the visible region 1135ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian coveredRegion = aboveCoveredLayers.intersect(visibleRegion); 1136ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian 1137ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian // Update aboveCoveredLayers for next (lower) layer 1138ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian aboveCoveredLayers.orSelf(visibleRegion); 1139ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian 1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // subtract the opaque region covered by the layers above us 1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project visibleRegion.subtractSelf(aboveOpaqueLayers); 1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // compute this layer's dirty region 1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (layer->contentDirty) { 1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // we need to invalidate the whole region 1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project dirty = visibleRegion; 1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // as well, as the old visible region 11484fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian dirty.orSelf(layer->visibleRegion); 1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project layer->contentDirty = false; 1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1151a8d44f75e1934072713371a2dcd143c63ffcbe0eMathias Agopian /* compute the exposed region: 1152ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * the exposed region consists of two components: 1153ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * 1) what's VISIBLE now and was COVERED before 1154ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * 2) what's EXPOSED now less what was EXPOSED before 1155ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * 1156ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * note that (1) is conservative, we start with the whole 1157ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * visible region but only keep what used to be covered by 1158ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * something -- which mean it may have been exposed. 1159ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * 1160ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * (2) handles areas that were not covered by anything but got 1161ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * exposed because of a resize. 1162a8d44f75e1934072713371a2dcd143c63ffcbe0eMathias Agopian */ 1163ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian const Region newExposed = visibleRegion - coveredRegion; 11644fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian const Region oldVisibleRegion = layer->visibleRegion; 11654fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian const Region oldCoveredRegion = layer->coveredRegion; 1166ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian const Region oldExposed = oldVisibleRegion - oldCoveredRegion; 1167ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed); 1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project dirty.subtractSelf(aboveOpaqueLayers); 1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // accumulate to the screen dirty region 117287baae104a3e4c2059990b01c393476065c558b0Mathias Agopian outDirtyRegion.orSelf(dirty); 1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1174ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian // Update aboveOpaqueLayers for next (lower) layer 1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project aboveOpaqueLayers.orSelf(opaqueRegion); 11768b42e8a5d87dcdc8ea31368ab88de49b72ab5432Andreas Huber 1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Store the visible region is screen space 1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project layer->setVisibleRegion(visibleRegion); 1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project layer->setCoveredRegion(coveredRegion); 1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 118287baae104a3e4c2059990b01c393476065c558b0Mathias Agopian outOpaqueRegion = aboveOpaqueLayers; 1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 118587baae104a3e4c2059990b01c393476065c558b0Mathias Agopianvoid SurfaceFlinger::invalidateLayerStack(uint32_t layerStack, 118687baae104a3e4c2059990b01c393476065c558b0Mathias Agopian const Region& dirty) { 118792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 11884297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian const sp<DisplayDevice>& hw(mDisplays[dpy]); 11894297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian if (hw->getLayerStack() == layerStack) { 11904297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian hw->dirtyRegion.orSelf(dirty); 119192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian } 119292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian } 119387baae104a3e4c2059990b01c393476065c558b0Mathias Agopian} 119487baae104a3e4c2059990b01c393476065c558b0Mathias Agopian 119587baae104a3e4c2059990b01c393476065c558b0Mathias Agopianvoid SurfaceFlinger::handlePageFlip() 1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 11974fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian Region dirtyRegion; 119899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 11994fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian bool visibleRegions = false; 1200cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian const LayerVector& currentLayers(mDrawingState.layersSortedByZ); 12014fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian const size_t count = currentLayers.size(); 12024fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian for (size_t i=0 ; i<count ; i++) { 1203cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian const sp<LayerBase>& layer(currentLayers[i]); 120487baae104a3e4c2059990b01c393476065c558b0Mathias Agopian const Region dirty(layer->latchBuffer(visibleRegions)); 12051501d54d63c55dc4e8f4c6eeaeac35aca6660ffcMathias Agopian const Layer::State& s(layer->drawingState()); 120687baae104a3e4c2059990b01c393476065c558b0Mathias Agopian invalidateLayerStack(s.layerStack, dirty); 12074fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian } 12084da751999358fffa4cefc4c8046dab72045925f6Mathias Agopian 12093b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian mVisibleRegionsDirty |= visibleRegions; 1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1212ad456f9878ff7c176499e7b992f9ff1cb3e9cdeeMathias Agopianvoid SurfaceFlinger::invalidateHwcGeometry() 1213ad456f9878ff7c176499e7b992f9ff1cb3e9cdeeMathias Agopian{ 1214ad456f9878ff7c176499e7b992f9ff1cb3e9cdeeMathias Agopian mHwWorkListDirty = true; 1215ad456f9878ff7c176499e7b992f9ff1cb3e9cdeeMathias Agopian} 1216ad456f9878ff7c176499e7b992f9ff1cb3e9cdeeMathias Agopian 121799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 1218cd60f99aba9e750700a967db30b74a29145739cfMathias Agopianvoid SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw, 121987baae104a3e4c2059990b01c393476065c558b0Mathias Agopian const Region& inDirtyRegion) 1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 122187baae104a3e4c2059990b01c393476065c558b0Mathias Agopian Region dirtyRegion(inDirtyRegion); 122287baae104a3e4c2059990b01c393476065c558b0Mathias Agopian 1223b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian // compute the invalid region 12244297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian hw->swapRegion.orSelf(dirtyRegion); 1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12264297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian uint32_t flags = hw->getFlags(); 12270f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian if (flags & DisplayDevice::SWAP_RECTANGLE) { 122829d06ac9a45e564b4f935b91067fc92c2d4c193dMathias Agopian // we can redraw only what's dirty, but since SWAP_RECTANGLE only 122929d06ac9a45e564b4f935b91067fc92c2d4c193dMathias Agopian // takes a rectangle, we must make sure to update that whole 123029d06ac9a45e564b4f935b91067fc92c2d4c193dMathias Agopian // rectangle in that case 12314297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian dirtyRegion.set(hw->swapRegion.bounds()); 1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 12330f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian if (flags & DisplayDevice::PARTIAL_UPDATES) { 123429d06ac9a45e564b4f935b91067fc92c2d4c193dMathias Agopian // We need to redraw the rectangle that will be updated 1235df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // (pushed to the framebuffer). 123695a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian // This is needed because PARTIAL_UPDATES only takes one 12370f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian // rectangle instead of a region (see DisplayDevice::flip()) 12384297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian dirtyRegion.set(hw->swapRegion.bounds()); 1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 124029d06ac9a45e564b4f935b91067fc92c2d4c193dMathias Agopian // we need to redraw everything (the whole screen) 12414297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian dirtyRegion.set(hw->bounds()); 12424297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian hw->swapRegion = dirtyRegion; 1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1246cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian doComposeSurfaces(hw, dirtyRegion); 1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1248cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian // FIXME: we need to call eglSwapBuffers() on displays that have 1249cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian // GL composition and only on those. 1250cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian // however, currently hwc.commit() already does that for the main 12519ca48916bc9408d0f3f8ac95469ced0a6a342acaJesse Hall // display (if there is a hwc) and never for the other ones 12529ca48916bc9408d0f3f8ac95469ced0a6a342acaJesse Hall if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL || 12539ca48916bc9408d0f3f8ac95469ced0a6a342acaJesse Hall getHwComposer().initCheck() != NO_ERROR) { 1254cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian // FIXME: EGL spec says: 1255cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian // "surface must be bound to the calling thread's current context, 1256cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian // for the current rendering API." 1257cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian eglSwapBuffers(mEGLDisplay, hw->getEGLSurface()); 1258d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian } 1259d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 12609c6e297271ec9af9d974242d89cfa08cb6ceaa0aMathias Agopian // update the swap region and clear the dirty region 12614297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian hw->swapRegion.orSelf(dirtyRegion); 1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1264cd60f99aba9e750700a967db30b74a29145739cfMathias Agopianvoid SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty) 1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 126685d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian const int32_t id = hw->getHwcDisplayId(); 12678630320433bd15aca239522e54e711ef6372ab07Mathias Agopian HWComposer& hwc(getHwComposer()); 12681e26087493ac0e7d7dc6dea8ad85cfef08b3271fMathias Agopian HWComposer::LayerListIterator cur = hwc.begin(id); 12691e26087493ac0e7d7dc6dea8ad85cfef08b3271fMathias Agopian const HWComposer::LayerListIterator end = hwc.end(id); 1270a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 127185d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian const bool hasGlesComposition = hwc.hasGlesComposition(id) || (cur==end); 127285d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian if (hasGlesComposition) { 1273da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian DisplayDevice::makeCurrent(mEGLDisplay, hw, mEGLContext); 1274a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 127552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian // set the frame buffer 127652bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian glMatrixMode(GL_MODELVIEW); 127752bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian glLoadIdentity(); 1278a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 1279a2f4e56fec0fb36c4a370eb23d6e9dc57f250b59Mathias Agopian // Never touch the framebuffer if we don't have any framebuffer layers 128085d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian const bool hasHwcComposition = hwc.hasHwcComposition(id); 1281e60b0687c8d49871d0c8786cabe6851f7a7783b5Mathias Agopian if (hasHwcComposition) { 1282b9494d5c9d44e4a59b6d510fea1665de434f3c6bMathias Agopian // when using overlays, we assume a fully transparent framebuffer 1283b9494d5c9d44e4a59b6d510fea1665de434f3c6bMathias Agopian // NOTE: we could reduce how much we need to clear, for instance 1284b9494d5c9d44e4a59b6d510fea1665de434f3c6bMathias Agopian // remove where there are opaque FB layers. however, on some 1285b9494d5c9d44e4a59b6d510fea1665de434f3c6bMathias Agopian // GPUs doing a "clean slate" glClear might be more efficient. 1286b9494d5c9d44e4a59b6d510fea1665de434f3c6bMathias Agopian // We'll revisit later if needed. 1287b9494d5c9d44e4a59b6d510fea1665de434f3c6bMathias Agopian glClearColor(0, 0, 0, 0); 1288b9494d5c9d44e4a59b6d510fea1665de434f3c6bMathias Agopian glClear(GL_COLOR_BUFFER_BIT); 1289b9494d5c9d44e4a59b6d510fea1665de434f3c6bMathias Agopian } else { 12904297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian const Region region(hw->undefinedRegion.intersect(dirty)); 1291b9494d5c9d44e4a59b6d510fea1665de434f3c6bMathias Agopian // screen is already cleared here 129287baae104a3e4c2059990b01c393476065c558b0Mathias Agopian if (!region.isEmpty()) { 1293b9494d5c9d44e4a59b6d510fea1665de434f3c6bMathias Agopian // can happen with SurfaceView 129455801e41e6d7306d75d8134dd69d7d8cbbfbc63cMathias Agopian drawWormhole(hw, region); 1295b9494d5c9d44e4a59b6d510fea1665de434f3c6bMathias Agopian } 1296a2f4e56fec0fb36c4a370eb23d6e9dc57f250b59Mathias Agopian } 129785d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian } 12984b2ba53423ac2dc795a5a0bf72f6d787d9dc8950Mathias Agopian 129985d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian /* 130085d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian * and then, render the layers targeted at the framebuffer 130185d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian */ 13024b2ba53423ac2dc795a5a0bf72f6d787d9dc8950Mathias Agopian 130385d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian const Vector< sp<LayerBase> >& layers(hw->getVisibleLayersSortedByZ()); 130485d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian const size_t count = layers.size(); 130585d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian const Transform& tr = hw->getTransform(); 130685d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian if (cur != end) { 130785d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian // we're using h/w composer 130885d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) { 1309a2f4e56fec0fb36c4a370eb23d6e9dc57f250b59Mathias Agopian const sp<LayerBase>& layer(layers[i]); 13104fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian const Region clip(dirty.intersect(tr.transform(layer->visibleRegion))); 131185d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian if (!clip.isEmpty()) { 131285d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian switch (cur->getCompositionType()) { 131385d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian case HWC_OVERLAY: { 131485d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian if ((cur->getHints() & HWC_HINT_CLEAR_FB) 131585d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian && i 131685d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian && layer->isOpaque() 131785d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian && hasGlesComposition) { 1318cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian // never clear the very first layer since we're 1319cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian // guaranteed the FB is already cleared 1320cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian layer->clearWithOpenGL(hw, clip); 1321cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 132285d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian break; 132385d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian } 132485d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian case HWC_FRAMEBUFFER: { 1325cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian layer->draw(hw, clip); 132685d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian break; 1327a2f4e56fec0fb36c4a370eb23d6e9dc57f250b59Mathias Agopian } 1328cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian } 1329a6b32db164e7834e211261046f3229bf50bc0098Jesse Hall } 133085d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian layer->setAcquireFence(hw, *cur); 133185d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian } 133285d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian } else { 133385d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian // we're not using h/w composer 133485d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian for (size_t i=0 ; i<count ; ++i) { 133585d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian const sp<LayerBase>& layer(layers[i]); 133685d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian const Region clip(dirty.intersect( 133785d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian tr.transform(layer->visibleRegion))); 133885d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian if (!clip.isEmpty()) { 133985d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian layer->draw(hw, clip); 134085d751cba5d4386c739dbf9dd8f7bbf8c493ade9Mathias Agopian } 13414b2ba53423ac2dc795a5a0bf72f6d787d9dc8950Mathias Agopian } 13424b2ba53423ac2dc795a5a0bf72f6d787d9dc8950Mathias Agopian } 1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 134555801e41e6d7306d75d8134dd69d7d8cbbfbc63cMathias Agopianvoid SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, 134655801e41e6d7306d75d8134dd69d7d8cbbfbc63cMathias Agopian const Region& region) const 1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1348f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian glDisable(GL_TEXTURE_EXTERNAL_OES); 1349b9494d5c9d44e4a59b6d510fea1665de434f3c6bMathias Agopian glDisable(GL_TEXTURE_2D); 1350f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian glDisable(GL_BLEND); 1351b9494d5c9d44e4a59b6d510fea1665de434f3c6bMathias Agopian glColor4f(0,0,0,0); 1352f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian 135355801e41e6d7306d75d8134dd69d7d8cbbfbc63cMathias Agopian const int32_t height = hw->getHeight(); 1354f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian Region::const_iterator it = region.begin(); 1355f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian Region::const_iterator const end = region.end(); 1356f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian while (it != end) { 1357f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian const Rect& r = *it++; 135855801e41e6d7306d75d8134dd69d7d8cbbfbc63cMathias Agopian GLfloat vertices[][2] = { 135955801e41e6d7306d75d8134dd69d7d8cbbfbc63cMathias Agopian { r.left, height - r.top }, 136055801e41e6d7306d75d8134dd69d7d8cbbfbc63cMathias Agopian { r.left, height - r.bottom }, 136155801e41e6d7306d75d8134dd69d7d8cbbfbc63cMathias Agopian { r.right, height - r.bottom }, 136255801e41e6d7306d75d8134dd69d7d8cbbfbc63cMathias Agopian { r.right, height - r.top } 136355801e41e6d7306d75d8134dd69d7d8cbbfbc63cMathias Agopian }; 136455801e41e6d7306d75d8134dd69d7d8cbbfbc63cMathias Agopian glVertexPointer(2, GL_FLOAT, 0, vertices); 1365f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 1366f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian } 1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 136996f0819f81293076e652792794a961543e6750d7Mathias Agopianssize_t SurfaceFlinger::addClientLayer(const sp<Client>& client, 137096f0819f81293076e652792794a961543e6750d7Mathias Agopian const sp<LayerBaseClient>& lbc) 13711b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 137296f0819f81293076e652792794a961543e6750d7Mathias Agopian // attach this layer to the client 13734f113740180b6512b43723c4728f262882dc9b45Mathias Agopian size_t name = client->attachLayer(lbc); 13744f113740180b6512b43723c4728f262882dc9b45Mathias Agopian 137596f0819f81293076e652792794a961543e6750d7Mathias Agopian // add this layer to the current state list 1376921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian Mutex::Autolock _l(mStateLock); 1377921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian mCurrentState.layersSortedByZ.add(lbc); 137896f0819f81293076e652792794a961543e6750d7Mathias Agopian 13794f113740180b6512b43723c4728f262882dc9b45Mathias Agopian return ssize_t(name); 138096f0819f81293076e652792794a961543e6750d7Mathias Agopian} 138196f0819f81293076e652792794a961543e6750d7Mathias Agopian 138296f0819f81293076e652792794a961543e6750d7Mathias Agopianstatus_t SurfaceFlinger::removeLayer(const sp<LayerBase>& layer) 138396f0819f81293076e652792794a961543e6750d7Mathias Agopian{ 138496f0819f81293076e652792794a961543e6750d7Mathias Agopian Mutex::Autolock _l(mStateLock); 138596f0819f81293076e652792794a961543e6750d7Mathias Agopian status_t err = purgatorizeLayer_l(layer); 138696f0819f81293076e652792794a961543e6750d7Mathias Agopian if (err == NO_ERROR) 13873559b07a885bcdff51a6dffb8e3a5ac5adf3a220Mathias Agopian setTransactionFlags(eTransactionNeeded); 138896f0819f81293076e652792794a961543e6750d7Mathias Agopian return err; 1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1391076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatus_t SurfaceFlinger::removeLayer_l(const sp<LayerBase>& layerBase) 1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ssize_t index = mCurrentState.layersSortedByZ.remove(layerBase); 1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index >= 0) { 1395076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mLayersRemoved = true; 1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 13983d57964a81cd631d80aa9575647e1ce35b5e82d5Mathias Agopian return status_t(index); 1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 14019a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopianstatus_t SurfaceFlinger::purgatorizeLayer_l(const sp<LayerBase>& layerBase) 14029a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{ 140376cd4ddc6ad664257739b3d3713fd9ebdc9a4ad9Mathias Agopian // First add the layer to the purgatory list, which makes sure it won't 140476cd4ddc6ad664257739b3d3713fd9ebdc9a4ad9Mathias Agopian // go away, then remove it from the main list (through a transaction). 14059a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian ssize_t err = removeLayer_l(layerBase); 140676cd4ddc6ad664257739b3d3713fd9ebdc9a4ad9Mathias Agopian if (err >= 0) { 140776cd4ddc6ad664257739b3d3713fd9ebdc9a4ad9Mathias Agopian mLayerPurgatory.add(layerBase); 140876cd4ddc6ad664257739b3d3713fd9ebdc9a4ad9Mathias Agopian } 14098c0a3d75c8823e179d19c6303f64e669975a4d85Mathias Agopian 14102f4b68d21c1a58cbcb1e6929fb241e425a8f7b5dJesse Hall mLayersPendingRemoval.push(layerBase); 14110b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian 14123d57964a81cd631d80aa9575647e1ce35b5e82d5Mathias Agopian // it's possible that we don't find a layer, because it might 14133d57964a81cd631d80aa9575647e1ce35b5e82d5Mathias Agopian // have been destroyed already -- this is not technically an error 141496f0819f81293076e652792794a961543e6750d7Mathias Agopian // from the user because there is a race between Client::destroySurface(), 141596f0819f81293076e652792794a961543e6750d7Mathias Agopian // ~Client() and ~ISurface(). 14169a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian return (err == NAME_NOT_FOUND) ? status_t(NO_ERROR) : err; 14179a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian} 14189a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian 1419dea20b1f343012d58ca9eb381684b26a168dc127Mathias Agopianuint32_t SurfaceFlinger::peekTransactionFlags(uint32_t flags) 1420dea20b1f343012d58ca9eb381684b26a168dc127Mathias Agopian{ 1421dea20b1f343012d58ca9eb381684b26a168dc127Mathias Agopian return android_atomic_release_load(&mTransactionFlags); 1422dea20b1f343012d58ca9eb381684b26a168dc127Mathias Agopian} 1423dea20b1f343012d58ca9eb381684b26a168dc127Mathias Agopian 1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) 1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return android_atomic_and(~flags, &mTransactionFlags) & flags; 1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1429bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopianuint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) 1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t old = android_atomic_or(flags, &mTransactionFlags); 1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((old & flags)==0) { // wake the server up 143399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian signalTransaction(); 1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return old; 1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 14388b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopianvoid SurfaceFlinger::setTransactionState( 14398b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian const Vector<ComposerState>& state, 14408b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian const Vector<DisplayState>& displays, 14418b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian uint32_t flags) 14428b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian{ 1443698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mStateLock); 144428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis uint32_t transactionFlags = 0; 1445e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1446e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian size_t count = displays.size(); 1447e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian for (size_t i=0 ; i<count ; i++) { 1448e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian const DisplayState& s(displays[i]); 1449e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian transactionFlags |= setDisplayStateLocked(s); 1450b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis } 1451b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis 1452e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian count = state.size(); 1453698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian for (size_t i=0 ; i<count ; i++) { 1454698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const ComposerState& s(state[i]); 1455698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian sp<Client> client( static_cast<Client *>(s.client.get()) ); 145628378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis transactionFlags |= setClientStateLocked(client, s.state); 1457698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 1458386aa98c4ffb9b805303e683f0a7b925b44d04dbMathias Agopian 145928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis if (transactionFlags) { 1460386aa98c4ffb9b805303e683f0a7b925b44d04dbMathias Agopian // this triggers the transaction 146128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis setTransactionFlags(transactionFlags); 1462698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 1463386aa98c4ffb9b805303e683f0a7b925b44d04dbMathias Agopian // if this is a synchronous transaction, wait for it to take effect 1464386aa98c4ffb9b805303e683f0a7b925b44d04dbMathias Agopian // before returning. 1465386aa98c4ffb9b805303e683f0a7b925b44d04dbMathias Agopian if (flags & eSynchronous) { 1466386aa98c4ffb9b805303e683f0a7b925b44d04dbMathias Agopian mTransationPending = true; 1467386aa98c4ffb9b805303e683f0a7b925b44d04dbMathias Agopian } 1468386aa98c4ffb9b805303e683f0a7b925b44d04dbMathias Agopian while (mTransationPending) { 1469386aa98c4ffb9b805303e683f0a7b925b44d04dbMathias Agopian status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5)); 1470386aa98c4ffb9b805303e683f0a7b925b44d04dbMathias Agopian if (CC_UNLIKELY(err != NO_ERROR)) { 1471386aa98c4ffb9b805303e683f0a7b925b44d04dbMathias Agopian // just in case something goes wrong in SF, return to the 1472386aa98c4ffb9b805303e683f0a7b925b44d04dbMathias Agopian // called after a few seconds. 147332397c1cd3327905173b36baa6fd1c579bc328ffSteve Block ALOGW_IF(err == TIMED_OUT, "closeGlobalTransaction timed out!"); 1474386aa98c4ffb9b805303e683f0a7b925b44d04dbMathias Agopian mTransationPending = false; 1475386aa98c4ffb9b805303e683f0a7b925b44d04dbMathias Agopian break; 1476386aa98c4ffb9b805303e683f0a7b925b44d04dbMathias Agopian } 1477cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian } 1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1481e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianuint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s) 1482e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian{ 1483e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian uint32_t flags = 0; 1484e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayDeviceState& disp(mCurrentState.displays.editValueFor(s.token)); 14853ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian if (disp.isValid()) { 1486e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian const uint32_t what = s.what; 1487e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (what & DisplayState::eSurfaceChanged) { 1488e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (disp.surface->asBinder() != s.surface->asBinder()) { 1489e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian disp.surface = s.surface; 1490e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian flags |= eDisplayTransactionNeeded; 1491e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1492e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1493e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (what & DisplayState::eLayerStackChanged) { 1494e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (disp.layerStack != s.layerStack) { 1495e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian disp.layerStack = s.layerStack; 1496e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian flags |= eDisplayTransactionNeeded; 1497e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1498e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 149900e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian if (what & DisplayState::eDisplayProjectionChanged) { 1500e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (disp.orientation != s.orientation) { 1501e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian disp.orientation = s.orientation; 1502e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian flags |= eDisplayTransactionNeeded; 1503e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1504e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (disp.frame != s.frame) { 1505e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian disp.frame = s.frame; 1506e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian flags |= eDisplayTransactionNeeded; 1507e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1508e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (disp.viewport != s.viewport) { 1509e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian disp.viewport = s.viewport; 1510e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian flags |= eDisplayTransactionNeeded; 1511e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1512e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1513e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1514e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return flags; 1515e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 1516e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1517e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianuint32_t SurfaceFlinger::setClientStateLocked( 1518e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian const sp<Client>& client, 1519e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian const layer_state_t& s) 1520e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian{ 1521e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian uint32_t flags = 0; 1522e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<LayerBaseClient> layer(client->getLayerUser(s.surface)); 1523e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (layer != 0) { 1524e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian const uint32_t what = s.what; 1525e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (what & layer_state_t::ePositionChanged) { 1526e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (layer->setPosition(s.x, s.y)) 1527e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian flags |= eTraversalNeeded; 1528e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1529e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (what & layer_state_t::eLayerChanged) { 1530e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian // NOTE: index needs to be calculated before we update the state 1531e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer); 1532e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (layer->setLayer(s.z)) { 1533e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian mCurrentState.layersSortedByZ.removeAt(idx); 1534e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian mCurrentState.layersSortedByZ.add(layer); 1535e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian // we need traversal (state changed) 1536e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian // AND transaction (list changed) 1537e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian flags |= eTransactionNeeded|eTraversalNeeded; 1538e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1539e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1540e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (what & layer_state_t::eSizeChanged) { 1541e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (layer->setSize(s.w, s.h)) { 1542e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian flags |= eTraversalNeeded; 1543e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1544e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1545e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (what & layer_state_t::eAlphaChanged) { 1546e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f))) 1547e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian flags |= eTraversalNeeded; 1548e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1549e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (what & layer_state_t::eMatrixChanged) { 1550e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (layer->setMatrix(s.matrix)) 1551e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian flags |= eTraversalNeeded; 1552e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1553e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (what & layer_state_t::eTransparentRegionChanged) { 1554e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (layer->setTransparentRegionHint(s.transparentRegion)) 1555e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian flags |= eTraversalNeeded; 1556e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1557e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (what & layer_state_t::eVisibilityChanged) { 1558e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (layer->setFlags(s.flags, s.mask)) 1559e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian flags |= eTraversalNeeded; 1560e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1561e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (what & layer_state_t::eCropChanged) { 1562e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (layer->setCrop(s.crop)) 1563e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian flags |= eTraversalNeeded; 1564e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1565e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (what & layer_state_t::eLayerStackChanged) { 1566e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian // NOTE: index needs to be calculated before we update the state 1567e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer); 1568e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (layer->setLayerStack(s.layerStack)) { 1569e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian mCurrentState.layersSortedByZ.removeAt(idx); 1570e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian mCurrentState.layersSortedByZ.add(layer); 1571e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian // we need traversal (state changed) 1572e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian // AND transaction (list changed) 1573e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian flags |= eTransactionNeeded|eTraversalNeeded; 1574e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1575e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1576e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 1577e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return flags; 1578e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 1579e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1580921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopiansp<ISurface> SurfaceFlinger::createLayer( 15810ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian ISurfaceComposerClient::surface_data_t* params, 15820ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian const String8& name, 15830ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian const sp<Client>& client, 15843ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian uint32_t w, uint32_t h, PixelFormat format, 1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags) 1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1587076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian sp<LayerBaseClient> layer; 1588a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian sp<ISurface> surfaceHandle; 15896e2d6483fe14362187c78c91dc03024fbb31d431Mathias Agopian 15906e2d6483fe14362187c78c91dc03024fbb31d431Mathias Agopian if (int32_t(w|h) < 0) { 1591921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)", 15926e2d6483fe14362187c78c91dc03024fbb31d431Mathias Agopian int(w), int(h)); 15936e2d6483fe14362187c78c91dc03024fbb31d431Mathias Agopian return surfaceHandle; 15946e2d6483fe14362187c78c91dc03024fbb31d431Mathias Agopian } 15958b42e8a5d87dcdc8ea31368ab88de49b72ab5432Andreas Huber 1596921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian //ALOGD("createLayer for (%d x %d), name=%s", w, h, name.string()); 15973165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian switch (flags & ISurfaceComposerClient::eFXSurfaceMask) { 15983165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case ISurfaceComposerClient::eFXSurfaceNormal: 15993ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian layer = createNormalLayer(client, w, h, flags, format); 1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 16013165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case ISurfaceComposerClient::eFXSurfaceBlur: 16023165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case ISurfaceComposerClient::eFXSurfaceDim: 16033ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian layer = createDimLayer(client, w, h, flags); 1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 16053165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian case ISurfaceComposerClient::eFXSurfaceScreenshot: 16063ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian layer = createScreenshotLayer(client, w, h, flags); 1607118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian break; 1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1610076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (layer != 0) { 161196f0819f81293076e652792794a961543e6750d7Mathias Agopian layer->initStates(w, h, flags); 1612285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian layer->setName(name); 161396f0819f81293076e652792794a961543e6750d7Mathias Agopian ssize_t token = addClientLayer(client, layer); 1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surfaceHandle = layer->getSurface(); 16158b42e8a5d87dcdc8ea31368ab88de49b72ab5432Andreas Huber if (surfaceHandle != 0) { 161696f0819f81293076e652792794a961543e6750d7Mathias Agopian params->token = token; 1617a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian params->identity = layer->getIdentity(); 16181c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian } 161996f0819f81293076e652792794a961543e6750d7Mathias Agopian setTransactionFlags(eTransactionNeeded); 1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surfaceHandle; 1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1625921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopiansp<Layer> SurfaceFlinger::createNormalLayer( 16263ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian const sp<Client>& client, 162796f0819f81293076e652792794a961543e6750d7Mathias Agopian uint32_t w, uint32_t h, uint32_t flags, 16281c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian PixelFormat& format) 1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // initialize the surfaces 163192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian switch (format) { 1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case PIXEL_FORMAT_TRANSPARENT: 1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case PIXEL_FORMAT_TRANSLUCENT: 1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project format = PIXEL_FORMAT_RGBA_8888; 1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case PIXEL_FORMAT_OPAQUE: 1637a8f3e4e53cad835d0d57b85a6ce1b7416e95ba73Mathias Agopian#ifdef NO_RGBX_8888 1638a8f3e4e53cad835d0d57b85a6ce1b7416e95ba73Mathias Agopian format = PIXEL_FORMAT_RGB_565; 1639a8f3e4e53cad835d0d57b85a6ce1b7416e95ba73Mathias Agopian#else 16408f10540cd59e980dcdb5a8f4f2dbec0d94177f5fMathias Agopian format = PIXEL_FORMAT_RGBX_8888; 1641a8f3e4e53cad835d0d57b85a6ce1b7416e95ba73Mathias Agopian#endif 1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1645a8f3e4e53cad835d0d57b85a6ce1b7416e95ba73Mathias Agopian#ifdef NO_RGBX_8888 1646a8f3e4e53cad835d0d57b85a6ce1b7416e95ba73Mathias Agopian if (format == PIXEL_FORMAT_RGBX_8888) 1647a8f3e4e53cad835d0d57b85a6ce1b7416e95ba73Mathias Agopian format = PIXEL_FORMAT_RGBA_8888; 1648a8f3e4e53cad835d0d57b85a6ce1b7416e95ba73Mathias Agopian#endif 1649a8f3e4e53cad835d0d57b85a6ce1b7416e95ba73Mathias Agopian 16503ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian sp<Layer> layer = new Layer(this, client); 1651f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian status_t err = layer->setBuffers(w, h, format, flags); 165299ed22412db547c59d3da08114d9d5a586442b30Glenn Kasten if (CC_LIKELY(err != NO_ERROR)) { 1653921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian ALOGE("createNormalLayer() failed (%s)", strerror(-err)); 1654076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian layer.clear(); 1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return layer; 1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1659921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopiansp<LayerDim> SurfaceFlinger::createDimLayer( 16603ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian const sp<Client>& client, 166196f0819f81293076e652792794a961543e6750d7Mathias Agopian uint32_t w, uint32_t h, uint32_t flags) 1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 16633ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian sp<LayerDim> layer = new LayerDim(this, client); 1664118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian return layer; 1665118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian} 1666118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian 1667921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopiansp<LayerScreenshot> SurfaceFlinger::createScreenshotLayer( 16683ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian const sp<Client>& client, 1669118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian uint32_t w, uint32_t h, uint32_t flags) 1670118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian{ 16713ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian sp<LayerScreenshot> layer = new LayerScreenshot(this, client); 1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return layer; 1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1675921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopianstatus_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, SurfaceID sid) 16769a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{ 16779a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian /* 16789a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian * called by the window manager, when a surface should be marked for 16799a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian * destruction. 16808b42e8a5d87dcdc8ea31368ab88de49b72ab5432Andreas Huber * 16810aa758d64ac530833ce9a311b164c9175a7a054cMathias Agopian * The surface is removed from the current and drawing lists, but placed 16820aa758d64ac530833ce9a311b164c9175a7a054cMathias Agopian * in the purgatory queue, so it's not destroyed right-away (we need 16830aa758d64ac530833ce9a311b164c9175a7a054cMathias Agopian * to wait for all client's references to go away first). 16849a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian */ 16859a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian 168648d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian status_t err = NAME_NOT_FOUND; 16870aa758d64ac530833ce9a311b164c9175a7a054cMathias Agopian Mutex::Autolock _l(mStateLock); 168896f0819f81293076e652792794a961543e6750d7Mathias Agopian sp<LayerBaseClient> layer = client->getLayerUser(sid); 1689b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam 169048d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian if (layer != 0) { 169148d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian err = purgatorizeLayer_l(layer); 169248d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian if (err == NO_ERROR) { 169313233e067b8f71adc3a0ade5f442265e1f27084bMathias Agopian setTransactionFlags(eTransactionNeeded); 169448d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian } 16959a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian } 16969a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian return err; 16979a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian} 16989a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian 1699921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopianstatus_t SurfaceFlinger::onLayerDestroyed(const wp<LayerBaseClient>& layer) 1700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1701759fdb2ef735422d6b8c65e168fa9d1c24562a86Mathias Agopian // called by ~ISurface() when all references are gone 1702ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian status_t err = NO_ERROR; 1703ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian sp<LayerBaseClient> l(layer.promote()); 1704ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian if (l != NULL) { 1705ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian Mutex::Autolock _l(mStateLock); 1706ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian err = removeLayer_l(l); 1707ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian if (err == NAME_NOT_FOUND) { 1708ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian // The surface wasn't in the current list, which means it was 1709ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian // removed already, which means it is in the purgatory, 1710ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian // and need to be removed from there. 1711ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian ssize_t idx = mLayerPurgatory.remove(l); 1712e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE_IF(idx < 0, 1713ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian "layer=%p is not in the purgatory list", l.get()); 1714f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian } 1715e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE_IF(err<0 && err != NAME_NOT_FOUND, 1716ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian "error removing layer=%p (%s)", l.get(), strerror(-err)); 1717ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian } 1718ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian return err; 1719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1721b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian// --------------------------------------------------------------------------- 1722b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian 172313a082e160c2d1d8006b93a555a57035213d568bAndy McFaddenvoid SurfaceFlinger::onInitializeDisplays() { 172413a082e160c2d1d8006b93a555a57035213d568bAndy McFadden // reset screen orientation 172513a082e160c2d1d8006b93a555a57035213d568bAndy McFadden Vector<ComposerState> state; 172613a082e160c2d1d8006b93a555a57035213d568bAndy McFadden Vector<DisplayState> displays; 172713a082e160c2d1d8006b93a555a57035213d568bAndy McFadden DisplayState d; 172800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian d.what = DisplayState::eDisplayProjectionChanged; 17293ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian d.token = mDefaultDisplays[DisplayDevice::DISPLAY_PRIMARY]; 173013a082e160c2d1d8006b93a555a57035213d568bAndy McFadden d.orientation = DisplayState::eOrientationDefault; 17314c05dd175ee3bd5119eecf368742b6510a8cfa6cJeff Brown d.frame.makeInvalid(); 17324c05dd175ee3bd5119eecf368742b6510a8cfa6cJeff Brown d.viewport.makeInvalid(); 173313a082e160c2d1d8006b93a555a57035213d568bAndy McFadden displays.add(d); 173413a082e160c2d1d8006b93a555a57035213d568bAndy McFadden setTransactionState(state, displays, 0); 173513a082e160c2d1d8006b93a555a57035213d568bAndy McFadden 173613a082e160c2d1d8006b93a555a57035213d568bAndy McFadden // XXX: this should init default device to "unblank" and all other devices to "blank" 173713a082e160c2d1d8006b93a555a57035213d568bAndy McFadden onScreenAcquired(); 173813a082e160c2d1d8006b93a555a57035213d568bAndy McFadden} 173913a082e160c2d1d8006b93a555a57035213d568bAndy McFadden 174013a082e160c2d1d8006b93a555a57035213d568bAndy McFaddenvoid SurfaceFlinger::initializeDisplays() { 174113a082e160c2d1d8006b93a555a57035213d568bAndy McFadden class MessageScreenInitialized : public MessageBase { 174213a082e160c2d1d8006b93a555a57035213d568bAndy McFadden SurfaceFlinger* flinger; 174313a082e160c2d1d8006b93a555a57035213d568bAndy McFadden public: 174413a082e160c2d1d8006b93a555a57035213d568bAndy McFadden MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { } 174513a082e160c2d1d8006b93a555a57035213d568bAndy McFadden virtual bool handler() { 174613a082e160c2d1d8006b93a555a57035213d568bAndy McFadden flinger->onInitializeDisplays(); 174713a082e160c2d1d8006b93a555a57035213d568bAndy McFadden return true; 174813a082e160c2d1d8006b93a555a57035213d568bAndy McFadden } 174913a082e160c2d1d8006b93a555a57035213d568bAndy McFadden }; 175013a082e160c2d1d8006b93a555a57035213d568bAndy McFadden sp<MessageBase> msg = new MessageScreenInitialized(this); 175113a082e160c2d1d8006b93a555a57035213d568bAndy McFadden postMessageAsync(msg); // we may be called from main thread, use async message 175213a082e160c2d1d8006b93a555a57035213d568bAndy McFadden} 175313a082e160c2d1d8006b93a555a57035213d568bAndy McFadden 175413a082e160c2d1d8006b93a555a57035213d568bAndy McFadden 1755b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopianvoid SurfaceFlinger::onScreenAcquired() { 17568e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross ALOGD("Screen about to return, flinger = %p", this); 17574297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian sp<const DisplayDevice> hw(getDefaultDisplayDevice()); // XXX: this should be per DisplayDevice 17588630320433bd15aca239522e54e711ef6372ab07Mathias Agopian getHwComposer().acquire(); 17594297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian hw->acquireScreen(); 176022ffb117b0c2a906bd04aef9738a52223cdd1dceMathias Agopian mEventThread->onScreenAcquired(); 176120128300e0cb7f459a60cfbcddb48190ce6545edMathias Agopian mVisibleRegionsDirty = true; 176220128300e0cb7f459a60cfbcddb48190ce6545edMathias Agopian repaintEverything(); 1763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1765b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopianvoid SurfaceFlinger::onScreenReleased() { 17668e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross ALOGD("About to give-up screen, flinger = %p", this); 17674297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian sp<const DisplayDevice> hw(getDefaultDisplayDevice()); // XXX: this should be per DisplayDevice 17684297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian if (hw->isScreenAcquired()) { 176922ffb117b0c2a906bd04aef9738a52223cdd1dceMathias Agopian mEventThread->onScreenReleased(); 17704297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian hw->releaseScreen(); 17718630320433bd15aca239522e54e711ef6372ab07Mathias Agopian getHwComposer().release(); 1772b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian // from this point on, SF will stop drawing 1773b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian } 1774b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian} 1775b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian 17768e533069e5721e55cb9768e140e16546c3a4a8b6Colin Crossvoid SurfaceFlinger::unblank() { 1777b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian class MessageScreenAcquired : public MessageBase { 1778b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian SurfaceFlinger* flinger; 1779b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian public: 1780b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian MessageScreenAcquired(SurfaceFlinger* flinger) : flinger(flinger) { } 1781b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian virtual bool handler() { 1782b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian flinger->onScreenAcquired(); 1783b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian return true; 1784b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian } 1785b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian }; 1786b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian sp<MessageBase> msg = new MessageScreenAcquired(this); 1787b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian postMessageSync(msg); 1788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17908e533069e5721e55cb9768e140e16546c3a4a8b6Colin Crossvoid SurfaceFlinger::blank() { 1791b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian class MessageScreenReleased : public MessageBase { 1792b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian SurfaceFlinger* flinger; 1793b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian public: 1794b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian MessageScreenReleased(SurfaceFlinger* flinger) : flinger(flinger) { } 1795b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian virtual bool handler() { 1796b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian flinger->onScreenReleased(); 1797b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian return true; 1798b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian } 1799b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian }; 1800b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian sp<MessageBase> msg = new MessageScreenReleased(this); 1801b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian postMessageSync(msg); 1802b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian} 1803b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian 1804b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian// --------------------------------------------------------------------------- 1805b60314a12f3336b27d73920805ab07cbc498d857Mathias Agopian 1806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceFlinger::dump(int fd, const Vector<String16>& args) 1807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 18081d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling const size_t SIZE = 4096; 1809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project char buffer[SIZE]; 1810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String8 result; 181199b49840d309727678b77403d6cc9f920111623fMathias Agopian 181299b49840d309727678b77403d6cc9f920111623fMathias Agopian if (!PermissionCache::checkCallingPermission(sDump)) { 1813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project snprintf(buffer, SIZE, "Permission Denial: " 1814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "can't dump SurfaceFlinger from pid=%d, uid=%d\n", 1815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IPCThreadState::self()->getCallingPid(), 1816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IPCThreadState::self()->getCallingUid()); 1817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project result.append(buffer); 1818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 18199795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian // Try to get the main lock, but don't insist if we can't 18209795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian // (this would indicate SF is stuck, but we want to be able to 18219795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian // print something in dumpsys). 18229795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian int retry = 3; 18239795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian while (mStateLock.tryLock()<0 && --retry>=0) { 18249795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian usleep(1000000); 18259795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian } 18269795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian const bool locked(retry >= 0); 18279795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian if (!locked) { 18288b42e8a5d87dcdc8ea31368ab88de49b72ab5432Andreas Huber snprintf(buffer, SIZE, 18299795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian "SurfaceFlinger appears to be unresponsive, " 18309795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian "dumping anyways (no locks held)\n"); 18319795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian result.append(buffer); 18329795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian } 18339795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian 183482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian bool dumpAll = true; 183582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian size_t index = 0; 183625e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian size_t numArgs = args.size(); 183725e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian if (numArgs) { 183825e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian if ((index < numArgs) && 183925e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian (args[index] == String16("--list"))) { 184025e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian index++; 184125e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian listLayersLocked(args, index, result, buffer, SIZE); 184235aadd6be249da4bd4851692e6aff757c91b32a7Mathias Agopian dumpAll = false; 184325e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian } 184425e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian 184525e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian if ((index < numArgs) && 184625e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian (args[index] == String16("--latency"))) { 184782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian index++; 184882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian dumpStatsLocked(args, index, result, buffer, SIZE); 184935aadd6be249da4bd4851692e6aff757c91b32a7Mathias Agopian dumpAll = false; 185082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian } 185125e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian 185225e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian if ((index < numArgs) && 185325e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian (args[index] == String16("--latency-clear"))) { 185425e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian index++; 185525e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian clearStatsLocked(args, index, result, buffer, SIZE); 185635aadd6be249da4bd4851692e6aff757c91b32a7Mathias Agopian dumpAll = false; 185725e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian } 1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 18591b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 186082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian if (dumpAll) { 186182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian dumpAllLocked(result, buffer, SIZE); 186282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian } 186348b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 186482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian if (locked) { 186582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian mStateLock.unlock(); 186648b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian } 186782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian } 186882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian write(fd, result.string(), result.size()); 186982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian return NO_ERROR; 187082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 187148b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 187225e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid SurfaceFlinger::listLayersLocked(const Vector<String16>& args, size_t& index, 187325e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian String8& result, char* buffer, size_t SIZE) const 187425e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian{ 187525e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian const LayerVector& currentLayers = mCurrentState.layersSortedByZ; 187625e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian const size_t count = currentLayers.size(); 187725e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian for (size_t i=0 ; i<count ; i++) { 187825e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian const sp<LayerBase>& layer(currentLayers[i]); 187925e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian snprintf(buffer, SIZE, "%s\n", layer->getName().string()); 188025e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian result.append(buffer); 188125e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian } 188225e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian} 188325e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian 188482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopianvoid SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index, 188582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian String8& result, char* buffer, size_t SIZE) const 188682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian{ 188782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian String8 name; 188882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian if (index < args.size()) { 188982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian name = String8(args[index]); 189082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian index++; 189182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian } 189248b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 189382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian const LayerVector& currentLayers = mCurrentState.layersSortedByZ; 189482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian const size_t count = currentLayers.size(); 189582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian for (size_t i=0 ; i<count ; i++) { 189682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian const sp<LayerBase>& layer(currentLayers[i]); 189782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian if (name.isEmpty()) { 189882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian snprintf(buffer, SIZE, "%s\n", layer->getName().string()); 189982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian result.append(buffer); 190082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian } 190182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian if (name.isEmpty() || (name == layer->getName())) { 190282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian layer->dumpStats(result, buffer, SIZE); 190382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian } 190482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian } 190582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 1906ad70186f80355e55ddad2a66b5fd174a1c019c2dMathias Agopian 190725e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index, 190825e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian String8& result, char* buffer, size_t SIZE) const 190925e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian{ 191025e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian String8 name; 191125e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian if (index < args.size()) { 191225e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian name = String8(args[index]); 191325e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian index++; 191425e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian } 191525e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian 191625e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian const LayerVector& currentLayers = mCurrentState.layersSortedByZ; 191725e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian const size_t count = currentLayers.size(); 191825e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian for (size_t i=0 ; i<count ; i++) { 191925e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian const sp<LayerBase>& layer(currentLayers[i]); 192025e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian if (name.isEmpty() || (name == layer->getName())) { 192125e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian layer->clearStats(); 192225e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian } 192325e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian } 192425e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian} 192525e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian 192682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopianvoid SurfaceFlinger::dumpAllLocked( 192782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian String8& result, char* buffer, size_t SIZE) const 192882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian{ 192982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian // figure out if we're stuck somewhere 193082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian const nsecs_t now = systemTime(); 193182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian const nsecs_t inSwapBuffers(mDebugInSwapBuffers); 193282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian const nsecs_t inTransaction(mDebugInTransaction); 193382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0; 193482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0; 1935bc2d79ed7ada6243f3690f94ab512c0ddcdbed12Mathias Agopian 193682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian /* 193782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian * Dump the visible layer list 193882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian */ 193982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian const LayerVector& currentLayers = mCurrentState.layersSortedByZ; 194082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian const size_t count = currentLayers.size(); 194182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian snprintf(buffer, SIZE, "Visible layers (count = %d)\n", count); 194282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian result.append(buffer); 194382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian for (size_t i=0 ; i<count ; i++) { 194482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian const sp<LayerBase>& layer(currentLayers[i]); 194582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian layer->dump(result, buffer, SIZE); 194682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian } 1947bc2d79ed7ada6243f3690f94ab512c0ddcdbed12Mathias Agopian 194882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian /* 194982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian * Dump the layers in the purgatory 195082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian */ 1951ad70186f80355e55ddad2a66b5fd174a1c019c2dMathias Agopian 195282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian const size_t purgatorySize = mLayerPurgatory.size(); 195382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian snprintf(buffer, SIZE, "Purgatory state (%d entries)\n", purgatorySize); 195482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian result.append(buffer); 195582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian for (size_t i=0 ; i<purgatorySize ; i++) { 195682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian const sp<LayerBase>& layer(mLayerPurgatory.itemAt(i)); 195782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian layer->shortDump(result, buffer, SIZE); 195882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian } 19591b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 196082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian /* 19615f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian * Dump Display state 19625f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian */ 19635f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian 19645f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 19655f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian const sp<const DisplayDevice>& hw(mDisplays[dpy]); 19665f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian snprintf(buffer, SIZE, 19675f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian "+ DisplayDevice[%u]\n" 19684fb3999cea652617be5125f8a42c257467bf3c77Jeff Brown " type=%x, layerStack=%u, (%4dx%4d), orient=%2d (type=%08x), " 1969da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian "flips=%u, secure=%d, numLayers=%u, v:[%d,%d,%d,%d], f:[%d,%d,%d,%d]\n", 19705f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian dpy, 19713ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian hw->getDisplayType(), hw->getLayerStack(), 19725f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian hw->getWidth(), hw->getHeight(), 19735f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian hw->getOrientation(), hw->getTransform().getType(), 19745f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian hw->getPageFlipCount(), 19755f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian hw->getSecureLayerVisible(), 1976da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian hw->getVisibleLayersSortedByZ().size(), 1977da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian hw->getViewport().left, hw->getViewport().top, hw->getViewport().right, hw->getViewport().bottom, 1978da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian hw->getFrame().left, hw->getFrame().top, hw->getFrame().right, hw->getFrame().bottom); 1979da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian 19805f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian result.append(buffer); 19815f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian } 19825f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian 19835f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian /* 198482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian * Dump SurfaceFlinger global state 198582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian */ 19861b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 198782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian snprintf(buffer, SIZE, "SurfaceFlinger global state:\n"); 198882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian result.append(buffer); 19891b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 1990888c822c4cb6976aab9256c58bae9e17e3e55c5cMathias Agopian HWComposer& hwc(getHwComposer()); 19914297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian sp<const DisplayDevice> hw(getDefaultDisplayDevice()); 199282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian const GLExtensions& extensions(GLExtensions::getInstance()); 199382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian snprintf(buffer, SIZE, "GLES: %s, %s, %s\n", 199482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian extensions.getVendor(), 199582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian extensions.getRenderer(), 199682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian extensions.getVersion()); 199782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian result.append(buffer); 1998d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 199982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian snprintf(buffer, SIZE, "EGL : %s\n", 2000d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian eglQueryString(mEGLDisplay, EGL_VERSION_HW_ANDROID)); 200182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian result.append(buffer); 200273d3ba9e50be1014aa21ec4bbdc874be394accb4Mathias Agopian 200382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian snprintf(buffer, SIZE, "EXTS: %s\n", extensions.getExtension()); 200482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian result.append(buffer); 20059795c42e557cfa37b9fd353ef7a2a7977a77f504Mathias Agopian 20064297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian hw->undefinedRegion.dump(result, "undefinedRegion"); 200782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian snprintf(buffer, SIZE, 200882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian " orientation=%d, canDraw=%d\n", 20094297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian hw->getOrientation(), hw->canDraw()); 201082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian result.append(buffer); 201182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian snprintf(buffer, SIZE, 201282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian " last eglSwapBuffers() time: %f us\n" 201382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian " last transaction time : %f us\n" 2014c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian " transaction-flags : %08x\n" 201582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian " refresh-rate : %f fps\n" 201682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian " x-dpi : %f\n" 20178b736f138cfd9b239a2c7073347a13c489534ae1Mathias Agopian " y-dpi : %f\n", 201882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian mLastSwapBufferTime/1000.0, 201982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian mLastTransactionTime/1000.0, 2020c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian mTransactionFlags, 2021b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY), 2022b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden hwc.getDpiX(HWC_DISPLAY_PRIMARY), 2023b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden hwc.getDpiY(HWC_DISPLAY_PRIMARY)); 202482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian result.append(buffer); 202582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 202682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian snprintf(buffer, SIZE, " eglSwapBuffers time: %f us\n", 202782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian inSwapBuffersDuration/1000.0); 202882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian result.append(buffer); 202982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 203082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian snprintf(buffer, SIZE, " transaction time: %f us\n", 203182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian inTransactionDuration/1000.0); 203282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian result.append(buffer); 203382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 203482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian /* 203582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian * VSYNC state 203682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian */ 203782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian mEventThread->dump(result, buffer, SIZE); 203882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 203982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian /* 204082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian * Dump HWComposer state 204182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian */ 204282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian snprintf(buffer, SIZE, "h/w composer state:\n"); 204382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian result.append(buffer); 204482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian snprintf(buffer, SIZE, " h/w composer %s and %s\n", 204582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian hwc.initCheck()==NO_ERROR ? "present" : "not present", 204682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian (mDebugDisableHWC || mDebugRegion) ? "disabled" : "enabled"); 204782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian result.append(buffer); 20484297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian hwc.dump(result, buffer, SIZE, hw->getVisibleLayersSortedByZ()); 204982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 205082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian /* 205182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian * Dump gralloc state 205282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian */ 205382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get()); 205482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian alloc.dump(result); 20554297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian hw->dump(result); 2056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 205863f165fd6b86d04be94d4023e845e98560504a96Keun young Parkbool SurfaceFlinger::startDdmConnection() 205963f165fd6b86d04be94d4023e845e98560504a96Keun young Park{ 206063f165fd6b86d04be94d4023e845e98560504a96Keun young Park void* libddmconnection_dso = 206163f165fd6b86d04be94d4023e845e98560504a96Keun young Park dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW); 206263f165fd6b86d04be94d4023e845e98560504a96Keun young Park if (!libddmconnection_dso) { 206363f165fd6b86d04be94d4023e845e98560504a96Keun young Park return false; 206463f165fd6b86d04be94d4023e845e98560504a96Keun young Park } 206563f165fd6b86d04be94d4023e845e98560504a96Keun young Park void (*DdmConnection_start)(const char* name); 206663f165fd6b86d04be94d4023e845e98560504a96Keun young Park DdmConnection_start = 206763f165fd6b86d04be94d4023e845e98560504a96Keun young Park (typeof DdmConnection_start)dlsym(libddmconnection_dso, "DdmConnection_start"); 206863f165fd6b86d04be94d4023e845e98560504a96Keun young Park if (!DdmConnection_start) { 206963f165fd6b86d04be94d4023e845e98560504a96Keun young Park dlclose(libddmconnection_dso); 207063f165fd6b86d04be94d4023e845e98560504a96Keun young Park return false; 207163f165fd6b86d04be94d4023e845e98560504a96Keun young Park } 207263f165fd6b86d04be94d4023e845e98560504a96Keun young Park (*DdmConnection_start)(getServiceName()); 207363f165fd6b86d04be94d4023e845e98560504a96Keun young Park return true; 207463f165fd6b86d04be94d4023e845e98560504a96Keun young Park} 207563f165fd6b86d04be94d4023e845e98560504a96Keun young Park 2076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceFlinger::onTransact( 2077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 2078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (code) { 2080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case CREATE_CONNECTION: 2081698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian case SET_TRANSACTION_STATE: 2082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case BOOT_FINISHED: 20838e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross case BLANK: 20848e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross case UNBLANK: 2085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 2086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // codes that require permission check 2087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IPCThreadState* ipc = IPCThreadState::self(); 2088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int pid = ipc->getCallingPid(); 2089a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian const int uid = ipc->getCallingUid(); 209099b49840d309727678b77403d6cc9f920111623fMathias Agopian if ((uid != AID_GRAPHICS) && 209199b49840d309727678b77403d6cc9f920111623fMathias Agopian !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) { 2092e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("Permission Denial: " 2093375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid); 2094375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian return PERMISSION_DENIED; 2095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 20961b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian break; 20971b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian } 20981b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian case CAPTURE_SCREEN: 20991b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian { 21001b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian // codes that require permission check 21011b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian IPCThreadState* ipc = IPCThreadState::self(); 21021b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian const int pid = ipc->getCallingPid(); 21031b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian const int uid = ipc->getCallingUid(); 210499b49840d309727678b77403d6cc9f920111623fMathias Agopian if ((uid != AID_GRAPHICS) && 210599b49840d309727678b77403d6cc9f920111623fMathias Agopian !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) { 2106e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("Permission Denial: " 21071b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian "can't read framebuffer pid=%d, uid=%d", pid, uid); 21081b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian return PERMISSION_DENIED; 21091b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian } 21101b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian break; 2111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 21131b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian 2114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags); 2115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) { 2116b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 211799ed22412db547c59d3da08114d9d5a586442b30Glenn Kasten if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) { 2118375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian IPCThreadState* ipc = IPCThreadState::self(); 2119375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian const int pid = ipc->getCallingPid(); 2120375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian const int uid = ipc->getCallingUid(); 2121e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("Permission Denial: " 2122375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid); 2123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return PERMISSION_DENIED; 2124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int n; 2126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (code) { 212701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE 212835b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE 2129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 2130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1002: // SHOW_UPDATES 2131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project n = data.readInt32(); 2132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDebugRegion = n ? n : (mDebugRegion ? 0 : 1); 213353331da007b56e0cb4201728de99c8c29bcfaa9aMathias Agopian invalidateHwcGeometry(); 213453331da007b56e0cb4201728de99c8c29bcfaa9aMathias Agopian repaintEverything(); 2135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 2136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1004:{ // repaint everything 213753331da007b56e0cb4201728de99c8c29bcfaa9aMathias Agopian repaintEverything(); 2138cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian return NO_ERROR; 2139cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian } 2140cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian case 1005:{ // force transaction 2141e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian setTransactionFlags( 2142e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian eTransactionNeeded| 2143e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian eDisplayTransactionNeeded| 2144e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian eTraversalNeeded); 2145cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian return NO_ERROR; 2146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 21474d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian case 1006:{ // send empty update 21484d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian signalRefresh(); 21494d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian return NO_ERROR; 21504d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian } 215153331da007b56e0cb4201728de99c8c29bcfaa9aMathias Agopian case 1008: // toggle use of hw composer 215253331da007b56e0cb4201728de99c8c29bcfaa9aMathias Agopian n = data.readInt32(); 215353331da007b56e0cb4201728de99c8c29bcfaa9aMathias Agopian mDebugDisableHWC = n ? 1 : 0; 215453331da007b56e0cb4201728de99c8c29bcfaa9aMathias Agopian invalidateHwcGeometry(); 215553331da007b56e0cb4201728de99c8c29bcfaa9aMathias Agopian repaintEverything(); 215653331da007b56e0cb4201728de99c8c29bcfaa9aMathias Agopian return NO_ERROR; 2157a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian case 1009: // toggle use of transform hint 2158a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian n = data.readInt32(); 2159a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian mDebugDisableTransformHint = n ? 1 : 0; 2160a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian invalidateHwcGeometry(); 2161a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian repaintEverything(); 2162a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian return NO_ERROR; 2163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1010: // interrogate. 216401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian reply->writeInt32(0); 2165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeInt32(0); 2166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeInt32(mDebugRegion); 2167b9494d5c9d44e4a59b6d510fea1665de434f3c6bMathias Agopian reply->writeInt32(0); 216812839bee29bdcc65731b4d42029cc59e2320c5c4Dianne Hackborn reply->writeInt32(mDebugDisableHWC); 2169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 2170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1013: { 2171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Mutex::Autolock _l(mStateLock); 21724297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian sp<const DisplayDevice> hw(getDefaultDisplayDevice()); 21734297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian reply->writeInt32(hw->getPageFlipCount()); 2174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 2176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return err; 2179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 218153331da007b56e0cb4201728de99c8c29bcfaa9aMathias Agopianvoid SurfaceFlinger::repaintEverything() { 218287baae104a3e4c2059990b01c393476065c558b0Mathias Agopian android_atomic_or(1, &mRepaintEverything); 218399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian signalTransaction(); 218453331da007b56e0cb4201728de99c8c29bcfaa9aMathias Agopian} 218553331da007b56e0cb4201728de99c8c29bcfaa9aMathias Agopian 218659119e658a12279e8fff508f8773843de2d90917Mathias Agopian// --------------------------------------------------------------------------- 218759119e658a12279e8fff508f8773843de2d90917Mathias Agopian 21883ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopianstatus_t SurfaceFlinger::renderScreenToTexture(uint32_t layerStack, 2189118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian GLuint* textureName, GLfloat* uOut, GLfloat* vOut) 2190118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian{ 2191118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian Mutex::Autolock _l(mStateLock); 21923ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian return renderScreenToTextureLocked(layerStack, textureName, uOut, vOut); 2193118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian} 2194118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian 21953ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopianstatus_t SurfaceFlinger::renderScreenToTextureLocked(uint32_t layerStack, 21969daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian GLuint* textureName, GLfloat* uOut, GLfloat* vOut) 219759119e658a12279e8fff508f8773843de2d90917Mathias Agopian{ 219822ffb117b0c2a906bd04aef9738a52223cdd1dceMathias Agopian ATRACE_CALL(); 219922ffb117b0c2a906bd04aef9738a52223cdd1dceMathias Agopian 220059119e658a12279e8fff508f8773843de2d90917Mathias Agopian if (!GLExtensions::getInstance().haveFramebufferObject()) 220159119e658a12279e8fff508f8773843de2d90917Mathias Agopian return INVALID_OPERATION; 220259119e658a12279e8fff508f8773843de2d90917Mathias Agopian 220359119e658a12279e8fff508f8773843de2d90917Mathias Agopian // get screen geometry 22043ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian // FIXME: figure out what it means to have a screenshot texture w/ multi-display 22053ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian sp<const DisplayDevice> hw(getDefaultDisplayDevice()); 22064297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian const uint32_t hw_w = hw->getWidth(); 22074297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian const uint32_t hw_h = hw->getHeight(); 220859119e658a12279e8fff508f8773843de2d90917Mathias Agopian GLfloat u = 1; 220959119e658a12279e8fff508f8773843de2d90917Mathias Agopian GLfloat v = 1; 221059119e658a12279e8fff508f8773843de2d90917Mathias Agopian 221159119e658a12279e8fff508f8773843de2d90917Mathias Agopian // make sure to clear all GL error flags 221259119e658a12279e8fff508f8773843de2d90917Mathias Agopian while ( glGetError() != GL_NO_ERROR ) ; 221359119e658a12279e8fff508f8773843de2d90917Mathias Agopian 221459119e658a12279e8fff508f8773843de2d90917Mathias Agopian // create a FBO 221559119e658a12279e8fff508f8773843de2d90917Mathias Agopian GLuint name, tname; 221659119e658a12279e8fff508f8773843de2d90917Mathias Agopian glGenTextures(1, &tname); 221759119e658a12279e8fff508f8773843de2d90917Mathias Agopian glBindTexture(GL_TEXTURE_2D, tname); 2218a2f4e56fec0fb36c4a370eb23d6e9dc57f250b59Mathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 2219a2f4e56fec0fb36c4a370eb23d6e9dc57f250b59Mathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 22209daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 22219daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian hw_w, hw_h, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 222259119e658a12279e8fff508f8773843de2d90917Mathias Agopian if (glGetError() != GL_NO_ERROR) { 2223015fb3fb41ffe04475ab2b604cc30cc1c031815aMathias Agopian while ( glGetError() != GL_NO_ERROR ) ; 222459119e658a12279e8fff508f8773843de2d90917Mathias Agopian GLint tw = (2 << (31 - clz(hw_w))); 222559119e658a12279e8fff508f8773843de2d90917Mathias Agopian GLint th = (2 << (31 - clz(hw_h))); 22269daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 22279daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian tw, th, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 222859119e658a12279e8fff508f8773843de2d90917Mathias Agopian u = GLfloat(hw_w) / tw; 222959119e658a12279e8fff508f8773843de2d90917Mathias Agopian v = GLfloat(hw_h) / th; 223059119e658a12279e8fff508f8773843de2d90917Mathias Agopian } 223159119e658a12279e8fff508f8773843de2d90917Mathias Agopian glGenFramebuffersOES(1, &name); 223259119e658a12279e8fff508f8773843de2d90917Mathias Agopian glBindFramebufferOES(GL_FRAMEBUFFER_OES, name); 22339daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, 22349daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, tname, 0); 223559119e658a12279e8fff508f8773843de2d90917Mathias Agopian 22369daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian // redraw the screen entirely... 2237c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian glDisable(GL_TEXTURE_EXTERNAL_OES); 2238c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian glDisable(GL_TEXTURE_2D); 22399daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian glClearColor(0,0,0,1); 22409daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian glClear(GL_COLOR_BUFFER_BIT); 2241a9040d0eefa34a78ca68b6e7901e1703e74aeb7cMathias Agopian glMatrixMode(GL_MODELVIEW); 2242a9040d0eefa34a78ca68b6e7901e1703e74aeb7cMathias Agopian glLoadIdentity(); 22434297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian const Vector< sp<LayerBase> >& layers(hw->getVisibleLayersSortedByZ()); 22449daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian const size_t count = layers.size(); 22459daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian for (size_t i=0 ; i<count ; ++i) { 22469daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian const sp<LayerBase>& layer(layers[i]); 2247fcb239d3dac8bc80f28177f1951611c1d43286ffMathias Agopian layer->draw(hw); 22489daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian } 224959119e658a12279e8fff508f8773843de2d90917Mathias Agopian 22504297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian hw->compositionComplete(); 2251118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian 22529daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian // back to main framebuffer 22539daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0); 22549daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian glDeleteFramebuffersOES(1, &name); 225559119e658a12279e8fff508f8773843de2d90917Mathias Agopian 22569daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian *textureName = tname; 22579daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian *uOut = u; 22589daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian *vOut = v; 22599daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian return NO_ERROR; 22609daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian} 226159119e658a12279e8fff508f8773843de2d90917Mathias Agopian 22629daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian// --------------------------------------------------------------------------- 22639daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian 22649d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownstatus_t SurfaceFlinger::captureScreenImplLocked(const sp<IBinder>& display, 226574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sp<IMemoryHeap>* heap, 226674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian uint32_t* w, uint32_t* h, PixelFormat* f, 2267bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t sw, uint32_t sh, 2268bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t minLayerZ, uint32_t maxLayerZ) 226974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian{ 2270fddc28d87136b55f0d9613e5f8ecd64a6aca018dMathias Agopian ATRACE_CALL(); 2271fddc28d87136b55f0d9613e5f8ecd64a6aca018dMathias Agopian 227274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian status_t result = PERMISSION_DENIED; 227374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 22743b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian if (!GLExtensions::getInstance().haveFramebufferObject()) { 227574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return INVALID_OPERATION; 22763b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 227774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 227874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian // get screen geometry 22793ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian sp<const DisplayDevice> hw(getDisplayDevice(display)); 22804297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian const uint32_t hw_w = hw->getWidth(); 22814297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian const uint32_t hw_h = hw->getHeight(); 228274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 22833b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian // if we have secure windows on this display, never allow the screen capture 22844297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian if (hw->getSecureLayerVisible()) { 2285ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian ALOGW("FB is protected: PERMISSION_DENIED"); 22863b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian return PERMISSION_DENIED; 22873b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 22883b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian 22893b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian if ((sw > hw_w) || (sh > hw_h)) { 2290ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian ALOGE("size mismatch (%d, %d) > (%d, %d)", sw, sh, hw_w, hw_h); 229174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return BAD_VALUE; 22923b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian } 229374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 229474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sw = (!sw) ? hw_w : sw; 229574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sh = (!sh) ? hw_h : sh; 229674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian const size_t size = sw * sh * 4; 2297fcb239d3dac8bc80f28177f1951611c1d43286ffMathias Agopian const bool filtering = sw != hw_w || sh != hw_h; 229874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 2299ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian// ALOGD("screenshot: sw=%d, sh=%d, minZ=%d, maxZ=%d", 2300ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian// sw, sh, minLayerZ, maxLayerZ); 2301c1d1b0d9b74d8f55346d0b84f369e48ecf2e0d33Mathias Agopian 230274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian // make sure to clear all GL error flags 230374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian while ( glGetError() != GL_NO_ERROR ) ; 230474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 230574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian // create a FBO 230674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian GLuint name, tname; 230774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glGenRenderbuffersOES(1, &tname); 230874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glBindRenderbufferOES(GL_RENDERBUFFER_OES, tname); 230974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGBA8_OES, sw, sh); 2310fddc28d87136b55f0d9613e5f8ecd64a6aca018dMathias Agopian 231174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glGenFramebuffersOES(1, &name); 231274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glBindFramebufferOES(GL_FRAMEBUFFER_OES, name); 231374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, 231474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, tname); 231574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 231674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES); 2317c1d1b0d9b74d8f55346d0b84f369e48ecf2e0d33Mathias Agopian 231874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian if (status == GL_FRAMEBUFFER_COMPLETE_OES) { 231974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 232074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian // invert everything, b/c glReadPixel() below will invert the FB 232174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glViewport(0, 0, sw, sh); 232274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glMatrixMode(GL_PROJECTION); 232374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glPushMatrix(); 232474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glLoadIdentity(); 2325ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian glOrthof(0, hw_w, hw_h, 0, 0, 1); 232674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glMatrixMode(GL_MODELVIEW); 232774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 232874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian // redraw the screen entirely... 232974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glClearColor(0,0,0,1); 233074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glClear(GL_COLOR_BUFFER_BIT); 2331f653b897a449e10d6cbfb6e0812f7b0bb02d6482Mathias Agopian 23323ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian const Vector< sp<LayerBase> >& layers(hw->getVisibleLayersSortedByZ()); 23339575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennis const size_t count = layers.size(); 233474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian for (size_t i=0 ; i<count ; ++i) { 233574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian const sp<LayerBase>& layer(layers[i]); 23363ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian const uint32_t z = layer->drawingState().z; 23373ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian if (z >= minLayerZ && z <= maxLayerZ) { 23383ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian if (filtering) layer->setFiltering(true); 23393ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian layer->draw(hw); 23403ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian if (filtering) layer->setFiltering(false); 2341bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian } 234274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian } 234374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 234474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian // check for errors and return screen capture 234574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian if (glGetError() != GL_NO_ERROR) { 234674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian // error while rendering 234774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian result = INVALID_OPERATION; 234874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian } else { 234974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian // allocate shared memory large enough to hold the 235074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian // screen capture 235174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sp<MemoryHeapBase> base( 235274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian new MemoryHeapBase(size, 0, "screen-capture") ); 235374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian void* const ptr = base->getBase(); 235474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian if (ptr) { 235574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian // capture the screen with glReadPixels() 2356fddc28d87136b55f0d9613e5f8ecd64a6aca018dMathias Agopian ScopedTrace _t(ATRACE_TAG, "glReadPixels"); 235774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glReadPixels(0, 0, sw, sh, GL_RGBA, GL_UNSIGNED_BYTE, ptr); 235874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian if (glGetError() == GL_NO_ERROR) { 235974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian *heap = base; 236074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian *w = sw; 236174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian *h = sh; 236274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian *f = PIXEL_FORMAT_RGBA_8888; 236374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian result = NO_ERROR; 236474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian } 236574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian } else { 236674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian result = NO_MEMORY; 236774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian } 236874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian } 236974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glViewport(0, 0, hw_w, hw_h); 237074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glMatrixMode(GL_PROJECTION); 237174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glPopMatrix(); 237274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glMatrixMode(GL_MODELVIEW); 237374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian } else { 237474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian result = BAD_VALUE; 237574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian } 237674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 237774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian // release FBO resources 237874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0); 237974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glDeleteRenderbuffersOES(1, &tname); 238074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian glDeleteFramebuffersOES(1, &name); 2381e6f0984361f634ff36bc0ad1c2d45f4554619ac8Mathias Agopian 23824297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian hw->compositionComplete(); 2383e6f0984361f634ff36bc0ad1c2d45f4554619ac8Mathias Agopian 2384ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian// ALOGD("screenshot: result = %s", result<0 ? strerror(result) : "OK"); 2385c1d1b0d9b74d8f55346d0b84f369e48ecf2e0d33Mathias Agopian 238674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return result; 238774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 238874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 238974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 23909d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownstatus_t SurfaceFlinger::captureScreen(const sp<IBinder>& display, 23911b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian sp<IMemoryHeap>* heap, 239274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian uint32_t* width, uint32_t* height, PixelFormat* format, 2393bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t sw, uint32_t sh, 2394bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t minLayerZ, uint32_t maxLayerZ) 23951b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian{ 23969d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown if (CC_UNLIKELY(display == 0)) 23971b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian return BAD_VALUE; 23981b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian 23991b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian if (!GLExtensions::getInstance().haveFramebufferObject()) 24001b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian return INVALID_OPERATION; 24011b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian 24021b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian class MessageCaptureScreen : public MessageBase { 24031b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian SurfaceFlinger* flinger; 24049d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown sp<IBinder> display; 24051b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian sp<IMemoryHeap>* heap; 24061b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian uint32_t* w; 24071b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian uint32_t* h; 24081b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian PixelFormat* f; 240974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian uint32_t sw; 241074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian uint32_t sh; 2411bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t minLayerZ; 2412bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t maxLayerZ; 24131b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian status_t result; 24141b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian public: 24159d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown MessageCaptureScreen(SurfaceFlinger* flinger, const sp<IBinder>& display, 241674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sp<IMemoryHeap>* heap, uint32_t* w, uint32_t* h, PixelFormat* f, 2417bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t sw, uint32_t sh, 2418bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t minLayerZ, uint32_t maxLayerZ) 24199d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown : flinger(flinger), display(display), 2420bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian heap(heap), w(w), h(h), f(f), sw(sw), sh(sh), 2421bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian minLayerZ(minLayerZ), maxLayerZ(maxLayerZ), 2422bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian result(PERMISSION_DENIED) 24231b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian { 24241b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian } 24251b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian status_t getResult() const { 24261b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian return result; 24271b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian } 24281b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian virtual bool handler() { 24291b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian Mutex::Autolock _l(flinger->mStateLock); 24309d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown result = flinger->captureScreenImplLocked(display, 2431bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian heap, w, h, f, sw, sh, minLayerZ, maxLayerZ); 24321b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian return true; 24331b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian } 24341b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian }; 24351b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian 24361b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian sp<MessageBase> msg = new MessageCaptureScreen(this, 24379d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown display, heap, width, height, format, sw, sh, minLayerZ, maxLayerZ); 24381b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian status_t res = postMessageSync(msg); 24391b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian if (res == NO_ERROR) { 24401b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian res = static_cast<MessageCaptureScreen*>( msg.get() )->getResult(); 24411b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian } 24421b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian return res; 24431b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian} 24441b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian 24451b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian// --------------------------------------------------------------------------- 24461b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian 2447921e6ac4b7610a178285898d191eb0e3afe906c0Mathias AgopianSurfaceFlinger::LayerVector::LayerVector() { 2448921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian} 2449921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 2450921e6ac4b7610a178285898d191eb0e3afe906c0Mathias AgopianSurfaceFlinger::LayerVector::LayerVector(const LayerVector& rhs) 2451921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian : SortedVector<sp<LayerBase> >(rhs) { 2452921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian} 2453921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 2454921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopianint SurfaceFlinger::LayerVector::do_compare(const void* lhs, 2455921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian const void* rhs) const 2456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2457be246f86bd6378a5110e81e9d9068ab03c3b077eMathias Agopian // sort layers per layer-stack, then by z-order and finally by sequence 2458921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian const sp<LayerBase>& l(*reinterpret_cast<const sp<LayerBase>*>(lhs)); 2459921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian const sp<LayerBase>& r(*reinterpret_cast<const sp<LayerBase>*>(rhs)); 2460be246f86bd6378a5110e81e9d9068ab03c3b077eMathias Agopian 2461be246f86bd6378a5110e81e9d9068ab03c3b077eMathias Agopian uint32_t ls = l->currentState().layerStack; 2462be246f86bd6378a5110e81e9d9068ab03c3b077eMathias Agopian uint32_t rs = r->currentState().layerStack; 2463be246f86bd6378a5110e81e9d9068ab03c3b077eMathias Agopian if (ls != rs) 2464be246f86bd6378a5110e81e9d9068ab03c3b077eMathias Agopian return ls - rs; 2465be246f86bd6378a5110e81e9d9068ab03c3b077eMathias Agopian 2466921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian uint32_t lz = l->currentState().z; 2467921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian uint32_t rz = r->currentState().z; 2468be246f86bd6378a5110e81e9d9068ab03c3b077eMathias Agopian if (lz != rz) 2469be246f86bd6378a5110e81e9d9068ab03c3b077eMathias Agopian return lz - rz; 2470be246f86bd6378a5110e81e9d9068ab03c3b077eMathias Agopian 2471be246f86bd6378a5110e81e9d9068ab03c3b077eMathias Agopian return l->sequence - r->sequence; 2472921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian} 2473921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 2474921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian// --------------------------------------------------------------------------- 2475921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 24763ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias AgopianSurfaceFlinger::DisplayDeviceState::DisplayDeviceState() 24773ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian : type(DisplayDevice::DISPLAY_ID_INVALID) { 2478e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 2479e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 24803ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias AgopianSurfaceFlinger::DisplayDeviceState::DisplayDeviceState(DisplayDevice::DisplayType type) 24813ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian : type(type), layerStack(0), orientation(0) { 2482da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian viewport.makeInvalid(); 2483da8d0a5c0cf9d41915d3b106cad4aaec3e767c11Mathias Agopian frame.makeInvalid(); 2484b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 24857303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian 2486b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian// --------------------------------------------------------------------------- 248796f0819f81293076e652792794a961543e6750d7Mathias Agopian 24889a78c90cd46b2a3bd637b056873149d3b94384b4Jamie GennisGraphicBufferAlloc::GraphicBufferAlloc() {} 24899a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 24909a78c90cd46b2a3bd637b056873149d3b94384b4Jamie GennisGraphicBufferAlloc::~GraphicBufferAlloc() {} 24919a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 24929a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennissp<GraphicBuffer> GraphicBufferAlloc::createGraphicBuffer(uint32_t w, uint32_t h, 2493d9e8c64c3dce1612eb948a5c16ba4ff62202b423Mathias Agopian PixelFormat format, uint32_t usage, status_t* error) { 24949a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis sp<GraphicBuffer> graphicBuffer(new GraphicBuffer(w, h, format, usage)); 24959a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis status_t err = graphicBuffer->initCheck(); 2496d9e8c64c3dce1612eb948a5c16ba4ff62202b423Mathias Agopian *error = err; 2497a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian if (err != 0 || graphicBuffer->handle == 0) { 2498d9e8c64c3dce1612eb948a5c16ba4ff62202b423Mathias Agopian if (err == NO_MEMORY) { 2499d9e8c64c3dce1612eb948a5c16ba4ff62202b423Mathias Agopian GraphicBuffer::dumpAllocationsToSystemLog(); 2500d9e8c64c3dce1612eb948a5c16ba4ff62202b423Mathias Agopian } 2501e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("GraphicBufferAlloc::createGraphicBuffer(w=%d, h=%d) " 2502a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian "failed (%s), handle=%p", 2503a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian w, h, strerror(-err), graphicBuffer->handle); 25049a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis return 0; 25059a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis } 25069a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis return graphicBuffer; 25079a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis} 25089a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 25099a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis// --------------------------------------------------------------------------- 25109a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 2511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 2512