SurfaceComposerClient.cpp revision 0ef4e15a6c12778daf464a4953d7e15e651f49ac
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "SurfaceComposerClient" 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h> 24d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian#include <utils/SortedVector.h> 259cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <utils/Log.h> 26d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian#include <utils/Singleton.h> 279cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 28c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IServiceManager.h> 29c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IMemory.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/DisplayInfo.h> 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 339cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/ISurfaceComposer.h> 347e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian#include <surfaceflinger/ISurfaceComposerClient.h> 359cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/ISurface.h> 369cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/SurfaceComposerClient.h> 379cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 389cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <private/surfaceflinger/LayerState.h> 399cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <private/surfaceflinger/SharedBufferStack.h> 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 45b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(ComposerService); 467e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 47b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianComposerService::ComposerService() 48b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian: Singleton<ComposerService>() { 49b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian const String16 name("SurfaceFlinger"); 50b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian while (getService(name, &mComposerService) != NO_ERROR) { 51b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian usleep(250000); 527e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian } 53b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian mServerCblkMemory = mComposerService->getCblk(); 54b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian mServerCblk = static_cast<surface_flinger_cblk_t volatile *>( 55b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian mServerCblkMemory->getBase()); 56b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 577e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 58b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopiansp<ISurfaceComposer> ComposerService::getComposerService() { 59b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian return ComposerService::getInstance().mComposerService; 60b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 617e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 62b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopiansurface_flinger_cblk_t const volatile * ComposerService::getControlBlock() { 63b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian return ComposerService::getInstance().mServerCblk; 64b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 657e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 667e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianstatic inline sp<ISurfaceComposer> getComposerService() { 677e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian return ComposerService::getComposerService(); 687e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian} 697e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 707e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianstatic inline surface_flinger_cblk_t const volatile * get_cblk() { 717e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian return ComposerService::getControlBlock(); 727e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian} 737e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 747e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian// --------------------------------------------------------------------------- 757e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 767e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianclass Composer : public Singleton<Composer> 777e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian{ 787e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian Mutex mLock; 797e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian SortedVector< wp<SurfaceComposerClient> > mActiveConnections; 807e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian SortedVector<sp<SurfaceComposerClient> > mOpenTransactions; 817e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 827e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian Composer() : Singleton<Composer>() { 837e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian } 847e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 85d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian void addClientImpl(const sp<SurfaceComposerClient>& client) { 86d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Mutex::Autolock _l(mLock); 87d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mActiveConnections.add(client); 88d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 89d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 90d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian void removeClientImpl(const sp<SurfaceComposerClient>& client) { 91d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Mutex::Autolock _l(mLock); 92d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mActiveConnections.remove(client); 93d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 94d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 95d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian void openGlobalTransactionImpl() 96d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian { 97d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Mutex::Autolock _l(mLock); 98d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (mOpenTransactions.size()) { 99d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian LOGE("openGlobalTransaction() called more than once. skipping."); 100d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian return; 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 102d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian const size_t N = mActiveConnections.size(); 103d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian for (size_t i=0; i<N; i++) { 104d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian sp<SurfaceComposerClient> client(mActiveConnections[i].promote()); 105d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (client != 0 && mOpenTransactions.indexOf(client) < 0) { 106d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (client->openTransaction() == NO_ERROR) { 107d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mOpenTransactions.add(client); 108d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } else { 109d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian LOGE("openTransaction on client %p failed", client.get()); 110d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian // let it go, it'll fail later when the user 111d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian // tries to do something with the transaction 112d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 113d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 114d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 115d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 116d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 117d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian void closeGlobalTransactionImpl() 118d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian { 119d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mLock.lock(); 120d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian SortedVector< sp<SurfaceComposerClient> > clients(mOpenTransactions); 121d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mOpenTransactions.clear(); 122d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mLock.unlock(); 123d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 1247e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian sp<ISurfaceComposer> sm(getComposerService()); 125d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian sm->openGlobalTransaction(); 126d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian const size_t N = clients.size(); 127d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian for (size_t i=0; i<N; i++) { 128d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian clients[i]->closeTransaction(); 129d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 130d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian sm->closeGlobalTransaction(); 131d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 132d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 133d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian friend class Singleton<Composer>; 134d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 135d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianpublic: 136d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian static void addClient(const sp<SurfaceComposerClient>& client) { 137d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Composer::getInstance().addClientImpl(client); 138d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 139d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian static void removeClient(const sp<SurfaceComposerClient>& client) { 140d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Composer::getInstance().removeClientImpl(client); 141d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 142d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian static void openGlobalTransaction() { 143d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Composer::getInstance().openGlobalTransactionImpl(); 144d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 145d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian static void closeGlobalTransaction() { 146d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Composer::getInstance().closeGlobalTransactionImpl(); 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 148d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian}; 149d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 150d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(Composer); 151d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline int compare_type( const layer_state_t& lhs, 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const layer_state_t& rhs) { 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (lhs.surface < rhs.surface) return -1; 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (lhs.surface > rhs.surface) return 1; 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurfaceComposerClient::SurfaceComposerClient() 162d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian : mTransactionOpen(0), mPrebuiltLayerState(0), mStatus(NO_INIT) 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 166d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianvoid SurfaceComposerClient::onFirstRef() 167dd3423c6247965bf67ea30c75e484a6f5d72b1a2Mathias Agopian{ 168dd3423c6247965bf67ea30c75e484a6f5d72b1a2Mathias Agopian sp<ISurfaceComposer> sm(getComposerService()); 169d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (sm != 0) { 1707e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian sp<ISurfaceComposerClient> conn = sm->createConnection(); 171d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (conn != 0) { 172d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mClient = conn; 173d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Composer::addClient(this); 174d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mPrebuiltLayerState = new layer_state_t; 175d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mStatus = NO_ERROR; 176d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 180d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias AgopianSurfaceComposerClient::~SurfaceComposerClient() 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 182d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian delete mPrebuiltLayerState; 183d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian dispose(); 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceComposerClient::initCheck() const 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectsp<IBinder> SurfaceComposerClient::connection() const 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (mClient != 0) ? mClient->asBinder() : 0; 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 196d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianstatus_t SurfaceComposerClient::linkToComposerDeath( 197d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian const sp<IBinder::DeathRecipient>& recipient, 198d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian void* cookie, uint32_t flags) 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 200d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian sp<ISurfaceComposer> sm(getComposerService()); 201d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian return sm->asBinder()->linkToDeath(recipient, cookie, flags); 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid SurfaceComposerClient::dispose() 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this can be called more than once. 2077e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian sp<ISurfaceComposerClient> client; 208d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Mutex::Autolock _lm(mLock); 209d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (mClient != 0) { 210d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Composer::removeClient(this); 211d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian client = mClient; // hold ref while lock is held 212d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mClient.clear(); 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 214d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mStatus = NO_INIT; 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceComposerClient::getDisplayInfo( 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayID dpy, DisplayInfo* info) 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 220bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian if (uint32_t(dpy)>=SharedBufferStack::NUM_DISPLAY_MAX) 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return BAD_VALUE; 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile surface_flinger_cblk_t const * cblk = get_cblk(); 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile display_cblk_t const * dcblk = cblk->displays + dpy; 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->w = dcblk->w; 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->h = dcblk->h; 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->orientation = dcblk->orientation; 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->xdpi = dcblk->xdpi; 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->ydpi = dcblk->ydpi; 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->fps = dcblk->fps; 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->density = dcblk->density; 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getPixelFormatInfo(dcblk->format, &(info->pixelFormatInfo)); 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t SurfaceComposerClient::getDisplayWidth(DisplayID dpy) 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 238bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian if (uint32_t(dpy)>=SharedBufferStack::NUM_DISPLAY_MAX) 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return BAD_VALUE; 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile surface_flinger_cblk_t const * cblk = get_cblk(); 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile display_cblk_t const * dcblk = cblk->displays + dpy; 242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return dcblk->w; 243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t SurfaceComposerClient::getDisplayHeight(DisplayID dpy) 246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 247bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian if (uint32_t(dpy)>=SharedBufferStack::NUM_DISPLAY_MAX) 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return BAD_VALUE; 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile surface_flinger_cblk_t const * cblk = get_cblk(); 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile display_cblk_t const * dcblk = cblk->displays + dpy; 251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return dcblk->h; 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t SurfaceComposerClient::getDisplayOrientation(DisplayID dpy) 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 256bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian if (uint32_t(dpy)>=SharedBufferStack::NUM_DISPLAY_MAX) 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return BAD_VALUE; 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile surface_flinger_cblk_t const * cblk = get_cblk(); 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile display_cblk_t const * dcblk = cblk->displays + dpy; 260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return dcblk->orientation; 261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t SurfaceComposerClient::getNumberOfDisplays() 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile surface_flinger_cblk_t const * cblk = get_cblk(); 266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t connected = cblk->connected; 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int n = 0; 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (connected) { 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (connected&1) n++; 270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project connected >>= 1; 271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return n; 273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface( 276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayID display, 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t w, 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t h, 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PixelFormat format, 280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags) 281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 282285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian String8 name; 283285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian const size_t SIZE = 128; 284285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian char buffer[SIZE]; 285285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian snprintf(buffer, SIZE, "<pid_%d>", getpid()); 286285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian name.append(buffer); 287285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian 2880ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian return SurfaceComposerClient::createSurface(name, display, 289285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian w, h, format, flags); 290285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian} 291285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian 292285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface( 293285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian const String8& name, 294285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian DisplayID display, 295285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t w, 296285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t h, 297285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian PixelFormat format, 298285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t flags) 299285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian{ 30001b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian sp<SurfaceControl> result; 301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus == NO_ERROR) { 3027e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian ISurfaceComposerClient::surface_data_t data; 3030ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian sp<ISurface> surface = mClient->createSurface(&data, name, 304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project display, w, h, format, flags); 305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface != 0) { 30653503a97a9afa9e876b1e95ca7e3b46c76aa4f15Mathias Agopian result = new SurfaceControl(this, surface, data, w, h, format, flags); 307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return result; 310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceComposerClient::destroySurface(SurfaceID sid) 313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus != NO_ERROR) 315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it's okay to destroy a surface while a transaction is open, 318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // (transactions really are a client-side concept) 319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // however, this indicates probably a misuse of the API or a bug 320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // in the client code. 321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGW_IF(mTransactionOpen, 322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "Destroying surface while a transaction is open. " 323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "Client %p: destroying surface %d, mTransactionOpen=%d", 324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project this, sid, mTransactionOpen); 325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = mClient->destroySurface(sid); 327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return err; 328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid SurfaceComposerClient::openGlobalTransaction() 331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 332d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Composer::openGlobalTransaction(); 333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid SurfaceComposerClient::closeGlobalTransaction() 336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 337d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Composer::closeGlobalTransaction(); 338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceComposerClient::freezeDisplay(DisplayID dpy, uint32_t flags) 341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 342dd3423c6247965bf67ea30c75e484a6f5d72b1a2Mathias Agopian sp<ISurfaceComposer> sm(getComposerService()); 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return sm->freezeDisplay(dpy, flags); 344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceComposerClient::unfreezeDisplay(DisplayID dpy, uint32_t flags) 347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 348dd3423c6247965bf67ea30c75e484a6f5d72b1a2Mathias Agopian sp<ISurfaceComposer> sm(getComposerService()); 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return sm->unfreezeDisplay(dpy, flags); 350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 352c08731e756868653d09d3e49b723706df3687070Mathias Agopianint SurfaceComposerClient::setOrientation(DisplayID dpy, 353c08731e756868653d09d3e49b723706df3687070Mathias Agopian int orientation, uint32_t flags) 354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 355dd3423c6247965bf67ea30c75e484a6f5d72b1a2Mathias Agopian sp<ISurfaceComposer> sm(getComposerService()); 356c08731e756868653d09d3e49b723706df3687070Mathias Agopian return sm->setOrientation(dpy, orientation, flags); 357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceComposerClient::openTransaction() 360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus != NO_ERROR) 362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Mutex::Autolock _l(mLock); 364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransactionOpen++; 365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceComposerClient::closeTransaction() 369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus != NO_ERROR) 371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Mutex::Autolock _l(mLock); 374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mTransactionOpen <= 0) { 375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGE( "closeTransaction (client %p, mTransactionOpen=%d) " 376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "called more times than openTransaction()", 377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project this, mTransactionOpen); 378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return INVALID_OPERATION; 379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mTransactionOpen >= 2) { 382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransactionOpen--; 383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransactionOpen = 0; 387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const ssize_t count = mStates.size(); 388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (count) { 389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mClient->setState(count, mStates.array()); 390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mStates.clear(); 391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 395631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianlayer_state_t* SurfaceComposerClient::get_state_l(SurfaceID index) 396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // API usage error, do nothing. 398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mTransactionOpen<=0) { 399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGE("Not in transaction (client=%p, SurfaceID=%d, mTransactionOpen=%d", 400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project this, int(index), mTransactionOpen); 401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // use mPrebuiltLayerState just to find out if we already have it 405d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian layer_state_t& dummy(*mPrebuiltLayerState); 406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project dummy.surface = index; 407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ssize_t i = mStates.indexOf(dummy); 408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (i < 0) { 409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // we don't have it, add an initialized layer_state to our list 410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project i = mStates.add(dummy); 411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStates.editArray() + i; 413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 415631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianlayer_state_t* SurfaceComposerClient::lockLayerState(SurfaceID id) 416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project layer_state_t* s; 418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mLock.lock(); 419631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian s = get_state_l(id); 420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!s) mLock.unlock(); 421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return s; 422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 424631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianvoid SurfaceComposerClient::unlockLayerState() 425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mLock.unlock(); 427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 42962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::setPosition(SurfaceID id, int32_t x, int32_t y) 430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 431631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian layer_state_t* s = lockLayerState(id); 432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!s) return BAD_INDEX; 433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->what |= ISurfaceComposer::ePositionChanged; 434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->x = x; 435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->y = y; 436631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian unlockLayerState(); 437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 44062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::setSize(SurfaceID id, uint32_t w, uint32_t h) 441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 442631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian layer_state_t* s = lockLayerState(id); 443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!s) return BAD_INDEX; 444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->what |= ISurfaceComposer::eSizeChanged; 445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->w = w; 446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->h = h; 447631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian unlockLayerState(); 448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 45162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::setLayer(SurfaceID id, int32_t z) 452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 453631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian layer_state_t* s = lockLayerState(id); 454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!s) return BAD_INDEX; 455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->what |= ISurfaceComposer::eLayerChanged; 456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->z = z; 457631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian unlockLayerState(); 458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 46162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::hide(SurfaceID id) 462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 46362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian return setFlags(id, ISurfaceComposer::eLayerHidden, 464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ISurfaceComposer::eLayerHidden); 465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 46762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::show(SurfaceID id, int32_t) 468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 46962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian return setFlags(id, 0, ISurfaceComposer::eLayerHidden); 470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 47262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::freeze(SurfaceID id) 473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 47462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian return setFlags(id, ISurfaceComposer::eLayerFrozen, 475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ISurfaceComposer::eLayerFrozen); 476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 47862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::unfreeze(SurfaceID id) 479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 48062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian return setFlags(id, 0, ISurfaceComposer::eLayerFrozen); 481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 48362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::setFlags(SurfaceID id, 484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags, uint32_t mask) 485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 486631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian layer_state_t* s = lockLayerState(id); 487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!s) return BAD_INDEX; 488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->what |= ISurfaceComposer::eVisibilityChanged; 489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->flags &= ~mask; 490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->flags |= (flags & mask); 491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->mask |= mask; 492631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian unlockLayerState(); 493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceComposerClient::setTransparentRegionHint( 49762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian SurfaceID id, const Region& transparentRegion) 498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 499631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian layer_state_t* s = lockLayerState(id); 500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!s) return BAD_INDEX; 501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->what |= ISurfaceComposer::eTransparentRegionChanged; 502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->transparentRegion = transparentRegion; 503631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian unlockLayerState(); 504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 50762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::setAlpha(SurfaceID id, float alpha) 508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 509631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian layer_state_t* s = lockLayerState(id); 510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!s) return BAD_INDEX; 511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->what |= ISurfaceComposer::eAlphaChanged; 512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->alpha = alpha; 513631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian unlockLayerState(); 514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceComposerClient::setMatrix( 51862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian SurfaceID id, 519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float dsdx, float dtdx, 520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float dsdy, float dtdy ) 521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 522631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian layer_state_t* s = lockLayerState(id); 523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!s) return BAD_INDEX; 524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->what |= ISurfaceComposer::eMatrixChanged; 525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project layer_state_t::matrix22_t matrix; 526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrix.dsdx = dsdx; 527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrix.dtdx = dtdx; 528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrix.dsdy = dsdy; 529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrix.dtdy = dtdy; 530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->matrix = matrix; 531631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian unlockLayerState(); 532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 53562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::setFreezeTint(SurfaceID id, uint32_t tint) 536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 537631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian layer_state_t* s = lockLayerState(id); 538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!s) return BAD_INDEX; 539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->what |= ISurfaceComposer::eFreezeTintChanged; 540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->tint = tint; 541631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian unlockLayerState(); 542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 545d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian// ---------------------------------------------------------------------------- 54674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 54774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianScreenshotClient::ScreenshotClient() 54874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian : mWidth(0), mHeight(0), mFormat(PIXEL_FORMAT_NONE) { 54974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 55074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 55174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianstatus_t ScreenshotClient::update() { 55274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 55374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian if (s == NULL) return NO_INIT; 55474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian mHeap = 0; 55574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return s->captureScreen(0, &mHeap, 556bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian &mWidth, &mHeight, &mFormat, 0, 0, 557bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 0, -1UL); 55874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 55974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 56074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianstatus_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight) { 56174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 56274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian if (s == NULL) return NO_INIT; 56374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian mHeap = 0; 56474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return s->captureScreen(0, &mHeap, 565bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian &mWidth, &mHeight, &mFormat, reqWidth, reqHeight, 566bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 0, -1UL); 567bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian} 568bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 569bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopianstatus_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight, 570bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t minLayerZ, uint32_t maxLayerZ) { 571bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 572bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian if (s == NULL) return NO_INIT; 573bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian mHeap = 0; 574bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian return s->captureScreen(0, &mHeap, 575bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian &mWidth, &mHeight, &mFormat, reqWidth, reqHeight, 576bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian minLayerZ, maxLayerZ); 57774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 57874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 57974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid ScreenshotClient::release() { 58074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian mHeap = 0; 58174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 58274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 58374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid const* ScreenshotClient::getPixels() const { 58474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mHeap->getBase(); 58574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 58674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 58774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getWidth() const { 58874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mWidth; 58974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 59074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 59174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getHeight() const { 59274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mHeight; 59374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 59474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 59574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianPixelFormat ScreenshotClient::getFormat() const { 59674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mFormat; 59774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 59874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 59974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getStride() const { 60074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mWidth; 60174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 60274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 60374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopiansize_t ScreenshotClient::getSize() const { 60474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mHeap->getSize(); 60574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 60674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 60774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian// ---------------------------------------------------------------------------- 608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 610