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> 239cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <utils/Log.h> 24d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian#include <utils/Singleton.h> 25a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/SortedVector.h> 26a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/String8.h> 27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/threads.h> 289cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 29c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IMemory.h> 30a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <binder/IServiceManager.h> 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/DisplayInfo.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian#include <gui/CpuConsumer.h> 35e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/IGraphicBufferProducer.h> 3690ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposer.h> 3790ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposerClient.h> 3890ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/SurfaceComposerClient.h> 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 4041f673c9b3aac0d96e41c928845c39186d565212Mathias Agopian#include <private/gui/ComposerService.h> 4190ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <private/gui/LayerState.h> 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 46b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(ComposerService); 477e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 48b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianComposerService::ComposerService() 49b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian: Singleton<ComposerService>() { 506652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden Mutex::Autolock _l(mLock); 516652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden connectLocked(); 526652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden} 536652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden 546652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFaddenvoid ComposerService::connectLocked() { 55b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian const String16 name("SurfaceFlinger"); 56b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian while (getService(name, &mComposerService) != NO_ERROR) { 57b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian usleep(250000); 587e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian } 596652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden assert(mComposerService != NULL); 606652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden 616652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden // Create the death listener. 626652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden class DeathObserver : public IBinder::DeathRecipient { 636652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ComposerService& mComposerService; 646652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden virtual void binderDied(const wp<IBinder>& who) { 656652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ALOGW("ComposerService remote (surfaceflinger) died [%p]", 666652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden who.unsafe_get()); 676652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mComposerService.composerServiceDied(); 686652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden } 696652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden public: 706652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden DeathObserver(ComposerService& mgr) : mComposerService(mgr) { } 716652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden }; 726652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden 736652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this)); 746652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mComposerService->asBinder()->linkToDeath(mDeathObserver); 756652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden} 766652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden 776652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden/*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() { 786652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ComposerService& instance = ComposerService::getInstance(); 796652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden Mutex::Autolock _l(instance.mLock); 806652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden if (instance.mComposerService == NULL) { 816652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ComposerService::getInstance().connectLocked(); 826652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden assert(instance.mComposerService != NULL); 836652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ALOGD("ComposerService reconnected"); 846652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden } 856652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden return instance.mComposerService; 86b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 877e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 886652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFaddenvoid ComposerService::composerServiceDied() 896652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden{ 906652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden Mutex::Autolock _l(mLock); 916652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mComposerService = NULL; 926652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mDeathObserver = NULL; 93b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 947e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 957e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian// --------------------------------------------------------------------------- 967e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 97698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatic inline 98e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianint compare_type(const ComposerState& lhs, const ComposerState& rhs) { 99698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.client < rhs.client) return -1; 100698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.client > rhs.client) return 1; 101698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.state.surface < rhs.state.surface) return -1; 102698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.state.surface > rhs.state.surface) return 1; 103698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return 0; 104698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 105698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 106e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianstatic inline 107e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianint compare_type(const DisplayState& lhs, const DisplayState& rhs) { 108e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return compare_type(lhs.token, rhs.token); 109e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 110e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1117e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianclass Composer : public Singleton<Composer> 1127e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian{ 113698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian friend class Singleton<Composer>; 1147e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 115698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian mutable Mutex mLock; 116e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian SortedVector<ComposerState> mComposerStates; 117e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian SortedVector<DisplayState > mDisplayStates; 11828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis uint32_t mForceSynchronous; 119f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown uint32_t mTransactionNestCount; 1202d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis bool mAnimation; 1217e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 122b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis Composer() : Singleton<Composer>(), 123f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown mForceSynchronous(0), mTransactionNestCount(0), 1242d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis mAnimation(false) 12528378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis { } 126d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 127f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown void openGlobalTransactionImpl(); 12828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis void closeGlobalTransactionImpl(bool synchronous); 1292d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis void setAnimationTransactionImpl(); 130d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 131698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* getLayerStateLocked( 132ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<SurfaceComposerClient>& client, const sp<IBinder>& id); 133d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 134e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState& getDisplayStateLocked(const sp<IBinder>& token); 135e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 136698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianpublic: 137dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis sp<IBinder> createDisplay(const String8& displayName, bool secure); 1386c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall void destroyDisplay(const sp<IBinder>& display); 1399d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown sp<IBinder> getBuiltInDisplay(int32_t id); 140d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 141ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian status_t setPosition(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 14241b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian float x, float y); 143ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian status_t setSize(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 144698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t w, uint32_t h); 145ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian status_t setLayer(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 146698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian int32_t z); 147ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian status_t setFlags(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 148698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t flags, uint32_t mask); 149698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setTransparentRegionHint( 150ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 151698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion); 152ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian status_t setAlpha(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 153698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float alpha); 154ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian status_t setMatrix(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 155698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdx, float dtdx, float dsdy, float dtdy); 156b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis status_t setOrientation(int orientation); 157ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian status_t setCrop(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 158f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis const Rect& crop); 1598785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian status_t setLayerStack(const sp<SurfaceComposerClient>& client, 160ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, uint32_t layerStack); 161d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 1622adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden void setDisplaySurface(const sp<IBinder>& token, 1632adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden const sp<IGraphicBufferProducer>& bufferProducer); 164e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian void setDisplayLayerStack(const sp<IBinder>& token, uint32_t layerStack); 16500e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian void setDisplayProjection(const sp<IBinder>& token, 16600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian uint32_t orientation, 16700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& layerStackRect, 16800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& displayRect); 169e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1702d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis static void setAnimationTransaction() { 1712d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis Composer::getInstance().setAnimationTransactionImpl(); 1722d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis } 1732d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis 174f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown static void openGlobalTransaction() { 175f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown Composer::getInstance().openGlobalTransactionImpl(); 176f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown } 177f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown 17828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis static void closeGlobalTransaction(bool synchronous) { 17928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis Composer::getInstance().closeGlobalTransactionImpl(synchronous); 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 181d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian}; 182d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 183d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(Composer); 184d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 187dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennissp<IBinder> Composer::createDisplay(const String8& displayName, bool secure) { 188dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis return ComposerService::getComposerService()->createDisplay(displayName, 189dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis secure); 190e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 191e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1926c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hallvoid Composer::destroyDisplay(const sp<IBinder>& display) { 1936c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return ComposerService::getComposerService()->destroyDisplay(display); 1946c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall} 1956c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall 1969d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownsp<IBinder> Composer::getBuiltInDisplay(int32_t id) { 1979d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown return ComposerService::getComposerService()->getBuiltInDisplay(id); 1989d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown} 1999d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown 200f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brownvoid Composer::openGlobalTransactionImpl() { 201f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown { // scope for the lock 202f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown Mutex::Autolock _l(mLock); 203f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown mTransactionNestCount += 1; 204f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown } 205f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown} 206f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown 20728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid Composer::closeGlobalTransactionImpl(bool synchronous) { 208e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 209698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 210698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Vector<ComposerState> transaction; 2118b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<DisplayState> displayTransaction; 21228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis uint32_t flags = 0; 213698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 214698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian { // scope for the lock 215698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 216f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown mForceSynchronous |= synchronous; 217f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown if (!mTransactionNestCount) { 218f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown ALOGW("At least one call to closeGlobalTransaction() was not matched by a prior " 219f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown "call to openGlobalTransaction()."); 220f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown } else if (--mTransactionNestCount) { 221f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown return; 222f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown } 223f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown 224e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian transaction = mComposerStates; 225e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian mComposerStates.clear(); 2268b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian 227e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian displayTransaction = mDisplayStates; 228e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian mDisplayStates.clear(); 22928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 230f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown if (mForceSynchronous) { 23128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis flags |= ISurfaceComposer::eSynchronous; 23228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis } 2332d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis if (mAnimation) { 2342d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis flags |= ISurfaceComposer::eAnimation; 2352d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis } 2362d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis 23728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mForceSynchronous = false; 2382d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis mAnimation = false; 239698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 240698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 2418b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian sm->setTransactionState(transaction, displayTransaction, flags); 242698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 243698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 2442d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennisvoid Composer::setAnimationTransactionImpl() { 2452d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis Mutex::Autolock _l(mLock); 2462d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis mAnimation = true; 2472d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis} 2482d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis 249698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianlayer_state_t* Composer::getLayerStateLocked( 250ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<SurfaceComposerClient>& client, const sp<IBinder>& id) { 251698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 252698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ComposerState s; 253698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s.client = client->mClient; 254698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s.state.surface = id; 255698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 256e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian ssize_t index = mComposerStates.indexOf(s); 257698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (index < 0) { 258698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian // we don't have it, add an initialized layer_state to our list 259e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian index = mComposerStates.add(s); 260698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 261698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 262e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian ComposerState* const out = mComposerStates.editArray(); 263698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return &(out[index].state); 264698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 265698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 266698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setPosition(const sp<SurfaceComposerClient>& client, 267ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, float x, float y) { 268698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 269698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 270698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 271698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 2723165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::ePositionChanged; 273698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->x = x; 274698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->y = y; 275698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 276698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 277698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 278698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setSize(const sp<SurfaceComposerClient>& client, 279ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, uint32_t w, uint32_t h) { 280698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 281698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 282698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 283698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 2843165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eSizeChanged; 285698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->w = w; 286698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->h = h; 28728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 28828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis // Resizing a surface makes the transaction synchronous. 28928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mForceSynchronous = true; 29028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 291698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 292698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 293698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 294698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setLayer(const sp<SurfaceComposerClient>& client, 295ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, int32_t z) { 296698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 297698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 298698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 299698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 3003165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eLayerChanged; 301698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->z = z; 302698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 303698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 304698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 305698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setFlags(const sp<SurfaceComposerClient>& client, 306ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, uint32_t flags, 307698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t mask) { 308698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 309698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 310698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 311698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 3123165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eVisibilityChanged; 313698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->flags &= ~mask; 314698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->flags |= (flags & mask); 315698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->mask |= mask; 316698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 317698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 318698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 319698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setTransparentRegionHint( 320ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 321698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion) { 322698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 323698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 324698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 325698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 3263165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eTransparentRegionChanged; 327698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->transparentRegion = transparentRegion; 328698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 329698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 330698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 331698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setAlpha(const sp<SurfaceComposerClient>& client, 332ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, float alpha) { 333698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 334698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 335698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 336698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 3373165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eAlphaChanged; 338698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->alpha = alpha; 339698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 340698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 341698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 3428785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopianstatus_t Composer::setLayerStack(const sp<SurfaceComposerClient>& client, 343ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, uint32_t layerStack) { 3448785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian Mutex::Autolock _l(mLock); 3458785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 3468785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian if (!s) 3478785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian return BAD_INDEX; 3483165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eLayerStackChanged; 3498785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian s->layerStack = layerStack; 3508785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian return NO_ERROR; 3518785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian} 3528785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian 353698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setMatrix(const sp<SurfaceComposerClient>& client, 354ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, float dsdx, float dtdx, 355698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdy, float dtdy) { 356698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 357698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 358698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 359698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 3603165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eMatrixChanged; 361698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t::matrix22_t matrix; 362698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dsdx = dsdx; 363698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dtdx = dtdx; 364698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dsdy = dsdy; 365698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dtdy = dtdy; 366698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->matrix = matrix; 367698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 370f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatus_t Composer::setCrop(const sp<SurfaceComposerClient>& client, 371ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, const Rect& crop) { 372f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis Mutex::Autolock _l(mLock); 373f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis layer_state_t* s = getLayerStateLocked(client, id); 374f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis if (!s) 375f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return BAD_INDEX; 3763165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eCropChanged; 377f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis s->crop = crop; 378f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return NO_ERROR; 379f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 380f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 381698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// --------------------------------------------------------------------------- 382698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 383e57f292595bec48f65c8088b00ff6beea01217e9Mathias AgopianDisplayState& Composer::getDisplayStateLocked(const sp<IBinder>& token) { 384e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState s; 385e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.token = token; 386e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian ssize_t index = mDisplayStates.indexOf(s); 387e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (index < 0) { 388e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian // we don't have it, add an initialized layer_state to our list 389e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.what = 0; 390e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian index = mDisplayStates.add(s); 391e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 392e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return mDisplayStates.editItemAt(index); 393e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 394e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 395e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid Composer::setDisplaySurface(const sp<IBinder>& token, 3962adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden const sp<IGraphicBufferProducer>& bufferProducer) { 397e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Mutex::Autolock _l(mLock); 398e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState& s(getDisplayStateLocked(token)); 3992adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden s.surface = bufferProducer; 400e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.what |= DisplayState::eSurfaceChanged; 401e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 402e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 403e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid Composer::setDisplayLayerStack(const sp<IBinder>& token, 404e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian uint32_t layerStack) { 405e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Mutex::Autolock _l(mLock); 406e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState& s(getDisplayStateLocked(token)); 407e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.layerStack = layerStack; 408e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.what |= DisplayState::eLayerStackChanged; 409e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 410e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 41100e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid Composer::setDisplayProjection(const sp<IBinder>& token, 41200e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian uint32_t orientation, 41300e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& layerStackRect, 41400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& displayRect) { 415e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Mutex::Autolock _l(mLock); 416e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState& s(getDisplayStateLocked(token)); 417e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.orientation = orientation; 41800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian s.viewport = layerStackRect; 41900e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian s.frame = displayRect; 42000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian s.what |= DisplayState::eDisplayProjectionChanged; 421e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian mForceSynchronous = true; // TODO: do we actually still need this? 422e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 423e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 424e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian// --------------------------------------------------------------------------- 425e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurfaceComposerClient::SurfaceComposerClient() 427698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian : mStatus(NO_INIT), mComposer(Composer::getInstance()) 428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 431698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::onFirstRef() { 432e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 433d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (sm != 0) { 4347e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian sp<ISurfaceComposerClient> conn = sm->createConnection(); 435d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (conn != 0) { 436d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mClient = conn; 437d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mStatus = NO_ERROR; 438d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 442698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias AgopianSurfaceComposerClient::~SurfaceComposerClient() { 443d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian dispose(); 444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 446698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::initCheck() const { 447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 450698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopiansp<IBinder> SurfaceComposerClient::connection() const { 451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (mClient != 0) ? mClient->asBinder() : 0; 452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 454d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianstatus_t SurfaceComposerClient::linkToComposerDeath( 455d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian const sp<IBinder::DeathRecipient>& recipient, 456698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian void* cookie, uint32_t flags) { 457e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 458d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian return sm->asBinder()->linkToDeath(recipient, cookie, flags); 459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 461698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::dispose() { 462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this can be called more than once. 4637e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian sp<ISurfaceComposerClient> client; 464d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Mutex::Autolock _lm(mLock); 465d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (mClient != 0) { 466d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian client = mClient; // hold ref while lock is held 467d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mClient.clear(); 468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 469d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mStatus = NO_INIT; 470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 47201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface( 473285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian const String8& name, 474285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t w, 475285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t h, 476285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian PixelFormat format, 477285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t flags) 478285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian{ 4794d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian sp<SurfaceControl> sur; 480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus == NO_ERROR) { 4814d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian sp<IBinder> handle; 4824d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian sp<IGraphicBufferProducer> gbp; 4834d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian status_t err = mClient->createSurface(name, w, h, format, flags, 4844d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian &handle, &gbp); 4854d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian ALOGE_IF(err, "SurfaceComposerClient::createSurface error %s", strerror(-err)); 4864d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian if (err == NO_ERROR) { 4874d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian sur = new SurfaceControl(this, handle, gbp); 488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 4904d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian return sur; 491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 493dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennissp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName, 494dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool secure) { 495dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis return Composer::getInstance().createDisplay(displayName, secure); 496e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 497e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 4986c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hallvoid SurfaceComposerClient::destroyDisplay(const sp<IBinder>& display) { 4996c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall Composer::getInstance().destroyDisplay(display); 5006c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall} 5016c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall 5029d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownsp<IBinder> SurfaceComposerClient::getBuiltInDisplay(int32_t id) { 5039d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown return Composer::getInstance().getBuiltInDisplay(id); 5049d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown} 5059d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown 506ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::destroySurface(const sp<IBinder>& sid) { 507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus != NO_ERROR) 508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = mClient->destroySurface(sid); 510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return err; 511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 513698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianinline Composer& SurfaceComposerClient::getComposer() { 514698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return mComposer; 515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 517698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 519698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::openGlobalTransaction() { 520f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown Composer::openGlobalTransaction(); 521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 52328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid SurfaceComposerClient::closeGlobalTransaction(bool synchronous) { 52428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis Composer::closeGlobalTransaction(synchronous); 525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5272d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennisvoid SurfaceComposerClient::setAnimationTransaction() { 5282d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis Composer::setAnimationTransaction(); 5292d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis} 5302d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis 531698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 533ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setCrop(const sp<IBinder>& id, const Rect& crop) { 534f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return getComposer().setCrop(this, id, crop); 535f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 536f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 537ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setPosition(const sp<IBinder>& id, float x, float y) { 538698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setPosition(this, id, x, y); 539698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 541ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setSize(const sp<IBinder>& id, uint32_t w, uint32_t h) { 542698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setSize(this, id, w, h); 543698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 545ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setLayer(const sp<IBinder>& id, int32_t z) { 546698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setLayer(this, id, z); 547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 549ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::hide(const sp<IBinder>& id) { 550698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, 5513165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian layer_state_t::eLayerHidden, 5523165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian layer_state_t::eLayerHidden); 553698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 555ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::show(const sp<IBinder>& id) { 556698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, 557698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 0, 5583165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian layer_state_t::eLayerHidden); 559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 561ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setFlags(const sp<IBinder>& id, uint32_t flags, 562698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t mask) { 563698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, flags, mask); 564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 566ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setTransparentRegionHint(const sp<IBinder>& id, 567698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion) { 568698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setTransparentRegionHint(this, id, transparentRegion); 569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 571ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setAlpha(const sp<IBinder>& id, float alpha) { 572698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setAlpha(this, id, alpha); 573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 575ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setLayerStack(const sp<IBinder>& id, uint32_t layerStack) { 5768785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian return getComposer().setLayerStack(this, id, layerStack); 5778785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian} 5788785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian 579ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setMatrix(const sp<IBinder>& id, float dsdx, float dtdx, 580698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdy, float dtdy) { 581698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setMatrix(this, id, dsdx, dtdx, dsdy, dtdy); 582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 584698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 585698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 586e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid SurfaceComposerClient::setDisplaySurface(const sp<IBinder>& token, 5872adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden const sp<IGraphicBufferProducer>& bufferProducer) { 5882adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden Composer::getInstance().setDisplaySurface(token, bufferProducer); 589e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 590e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 591e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid SurfaceComposerClient::setDisplayLayerStack(const sp<IBinder>& token, 592e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian uint32_t layerStack) { 593e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Composer::getInstance().setDisplayLayerStack(token, layerStack); 594e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 595e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 59600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid SurfaceComposerClient::setDisplayProjection(const sp<IBinder>& token, 59700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian uint32_t orientation, 59800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& layerStackRect, 59900e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& displayRect) { 60000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian Composer::getInstance().setDisplayProjection(token, orientation, 60100e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian layerStackRect, displayRect); 602e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 603e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 604e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian// ---------------------------------------------------------------------------- 605e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 606698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::getDisplayInfo( 6079d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown const sp<IBinder>& display, DisplayInfo* info) 608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 6099d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown return ComposerService::getComposerService()->getDisplayInfo(display, info); 610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6122a09bb321930e1f782599ec902bca1db58b9af77Jeff Brownvoid SurfaceComposerClient::blankDisplay(const sp<IBinder>& token) { 6132a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown ComposerService::getComposerService()->blank(token); 6142a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown} 6152a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown 6162a09bb321930e1f782599ec902bca1db58b9af77Jeff Brownvoid SurfaceComposerClient::unblankDisplay(const sp<IBinder>& token) { 6172a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown ComposerService::getComposerService()->unblank(token); 6182a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown} 6192a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown 620698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 621698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 6222a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopianstatus_t ScreenshotClient::capture( 6232a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian const sp<IBinder>& display, 6242a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian const sp<IGraphicBufferProducer>& producer, 6252a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian uint32_t reqWidth, uint32_t reqHeight, 6262a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian uint32_t minLayerZ, uint32_t maxLayerZ) { 6272a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 6282a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian if (s == NULL) return NO_INIT; 6292a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian return s->captureScreen(display, producer, 6303ca76f416bc8665a97636ca8a2d0128b9da9d92cMathias Agopian reqWidth, reqHeight, minLayerZ, maxLayerZ); 6312a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian} 6322a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian 63374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianScreenshotClient::ScreenshotClient() 634abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian : mHaveBuffer(false) { 635abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian memset(&mBuffer, 0, sizeof(mBuffer)); 63674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 63774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 6388000d0694bc34bc17d869da546d8ff8790ae7be4Mathias AgopianScreenshotClient::~ScreenshotClient() { 6398000d0694bc34bc17d869da546d8ff8790ae7be4Mathias Agopian ScreenshotClient::release(); 6408000d0694bc34bc17d869da546d8ff8790ae7be4Mathias Agopian} 6418000d0694bc34bc17d869da546d8ff8790ae7be4Mathias Agopian 642abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopiansp<CpuConsumer> ScreenshotClient::getCpuConsumer() const { 643abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian if (mCpuConsumer == NULL) { 644db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mBufferQueue = new BufferQueue(); 645db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mCpuConsumer = new CpuConsumer(mBufferQueue, 1); 646abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian mCpuConsumer->setName(String8("ScreenshotClient")); 647abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian } 648abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian return mCpuConsumer; 64974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 65074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 6519d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownstatus_t ScreenshotClient::update(const sp<IBinder>& display, 652abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian uint32_t reqWidth, uint32_t reqHeight, 653abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian uint32_t minLayerZ, uint32_t maxLayerZ) { 65474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 65574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian if (s == NULL) return NO_INIT; 656abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian sp<CpuConsumer> cpuConsumer = getCpuConsumer(); 657abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian 658abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian if (mHaveBuffer) { 659abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian mCpuConsumer->unlockBuffer(mBuffer); 660abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian memset(&mBuffer, 0, sizeof(mBuffer)); 661abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian mHaveBuffer = false; 662abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian } 663abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian 664db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian status_t err = s->captureScreen(display, mBufferQueue, 6653ca76f416bc8665a97636ca8a2d0128b9da9d92cMathias Agopian reqWidth, reqHeight, minLayerZ, maxLayerZ); 666abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian 667abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian if (err == NO_ERROR) { 668abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian err = mCpuConsumer->lockNextBuffer(&mBuffer); 669abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian if (err == NO_ERROR) { 670abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian mHaveBuffer = true; 671abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian } 672abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian } 673abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian return err; 674abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian} 675abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian 676abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopianstatus_t ScreenshotClient::update(const sp<IBinder>& display) { 677abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian return ScreenshotClient::update(display, 0, 0, 0, -1UL); 678bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian} 679bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 6809d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownstatus_t ScreenshotClient::update(const sp<IBinder>& display, 681abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian uint32_t reqWidth, uint32_t reqHeight) { 682abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian return ScreenshotClient::update(display, reqWidth, reqHeight, 0, -1UL); 68374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 68474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 68574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid ScreenshotClient::release() { 686abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian if (mHaveBuffer) { 687abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian mCpuConsumer->unlockBuffer(mBuffer); 688abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian memset(&mBuffer, 0, sizeof(mBuffer)); 689abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian mHaveBuffer = false; 690abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian } 691abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian mCpuConsumer.clear(); 69274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 69374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 69474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid const* ScreenshotClient::getPixels() const { 695abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian return mBuffer.data; 69674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 69774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 69874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getWidth() const { 699abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian return mBuffer.width; 70074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 70174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 70274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getHeight() const { 703abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian return mBuffer.height; 70474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 70574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 70674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianPixelFormat ScreenshotClient::getFormat() const { 707abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian return mBuffer.format; 70874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 70974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 71074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getStride() const { 711abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian return mBuffer.stride; 71274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 71374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 71474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopiansize_t ScreenshotClient::getSize() const { 715abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian return mBuffer.stride * mBuffer.height * bytesPerPixel(mBuffer.format); 71674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 71774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 71874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian// ---------------------------------------------------------------------------- 719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 720