SurfaceComposerClient.cpp revision ac9fa427d4a86745e60a5f7fd8e3ea340c4db907
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 3490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurface.h> 3590ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposer.h> 3690ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposerClient.h> 3790ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/SurfaceComposerClient.h> 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3941f673c9b3aac0d96e41c928845c39186d565212Mathias Agopian#include <private/gui/ComposerService.h> 4090ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <private/gui/LayerState.h> 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>() { 496652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden Mutex::Autolock _l(mLock); 506652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden connectLocked(); 516652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden} 526652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden 536652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFaddenvoid ComposerService::connectLocked() { 54b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian const String16 name("SurfaceFlinger"); 55b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian while (getService(name, &mComposerService) != NO_ERROR) { 56b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian usleep(250000); 577e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian } 586652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden assert(mComposerService != NULL); 596652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden 606652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden // Create the death listener. 616652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden class DeathObserver : public IBinder::DeathRecipient { 626652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ComposerService& mComposerService; 636652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden virtual void binderDied(const wp<IBinder>& who) { 646652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ALOGW("ComposerService remote (surfaceflinger) died [%p]", 656652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden who.unsafe_get()); 666652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mComposerService.composerServiceDied(); 676652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden } 686652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden public: 696652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden DeathObserver(ComposerService& mgr) : mComposerService(mgr) { } 706652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden }; 716652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden 726652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this)); 736652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mComposerService->asBinder()->linkToDeath(mDeathObserver); 746652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden} 756652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden 766652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden/*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() { 776652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ComposerService& instance = ComposerService::getInstance(); 786652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden Mutex::Autolock _l(instance.mLock); 796652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden if (instance.mComposerService == NULL) { 806652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ComposerService::getInstance().connectLocked(); 816652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden assert(instance.mComposerService != NULL); 826652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ALOGD("ComposerService reconnected"); 836652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden } 846652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden return instance.mComposerService; 85b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 867e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 876652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFaddenvoid ComposerService::composerServiceDied() 886652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden{ 896652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden Mutex::Autolock _l(mLock); 906652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mComposerService = NULL; 916652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mDeathObserver = NULL; 92b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 937e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 947e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian// --------------------------------------------------------------------------- 957e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 96698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatic inline 97e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianint compare_type(const ComposerState& lhs, const ComposerState& rhs) { 98698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.client < rhs.client) return -1; 99698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.client > rhs.client) return 1; 100698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.state.surface < rhs.state.surface) return -1; 101698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.state.surface > rhs.state.surface) return 1; 102698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return 0; 103698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 104698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 105e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianstatic inline 106e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianint compare_type(const DisplayState& lhs, const DisplayState& rhs) { 107e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return compare_type(lhs.token, rhs.token); 108e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 109e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1107e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianclass Composer : public Singleton<Composer> 1117e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian{ 112698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian friend class Singleton<Composer>; 1137e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 114698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian mutable Mutex mLock; 115e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian SortedVector<ComposerState> mComposerStates; 116e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian SortedVector<DisplayState > mDisplayStates; 11728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis uint32_t mForceSynchronous; 118f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown uint32_t mTransactionNestCount; 1192d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis bool mAnimation; 1207e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 121b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis Composer() : Singleton<Composer>(), 122f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown mForceSynchronous(0), mTransactionNestCount(0), 1232d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis mAnimation(false) 12428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis { } 125d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 126f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown void openGlobalTransactionImpl(); 12728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis void closeGlobalTransactionImpl(bool synchronous); 1282d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis void setAnimationTransactionImpl(); 129d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 130698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* getLayerStateLocked( 131ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<SurfaceComposerClient>& client, const sp<IBinder>& id); 132d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 133e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState& getDisplayStateLocked(const sp<IBinder>& token); 134e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 135698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianpublic: 136dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis sp<IBinder> createDisplay(const String8& displayName, bool secure); 1379d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown sp<IBinder> getBuiltInDisplay(int32_t id); 138d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 139ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian status_t setPosition(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 14041b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian float x, float y); 141ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian status_t setSize(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 142698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t w, uint32_t h); 143ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian status_t setLayer(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 144698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian int32_t z); 145ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian status_t setFlags(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 146698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t flags, uint32_t mask); 147698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setTransparentRegionHint( 148ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 149698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion); 150ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian status_t setAlpha(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 151698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float alpha); 152ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian status_t setMatrix(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 153698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdx, float dtdx, float dsdy, float dtdy); 154b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis status_t setOrientation(int orientation); 155ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian status_t setCrop(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 156f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis const Rect& crop); 1578785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian status_t setLayerStack(const sp<SurfaceComposerClient>& client, 158ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, uint32_t layerStack); 159d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 1602adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden void setDisplaySurface(const sp<IBinder>& token, 1612adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden const sp<IGraphicBufferProducer>& bufferProducer); 162e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian void setDisplayLayerStack(const sp<IBinder>& token, uint32_t layerStack); 16300e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian void setDisplayProjection(const sp<IBinder>& token, 16400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian uint32_t orientation, 16500e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& layerStackRect, 16600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& displayRect); 167e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1682d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis static void setAnimationTransaction() { 1692d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis Composer::getInstance().setAnimationTransactionImpl(); 1702d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis } 1712d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis 172f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown static void openGlobalTransaction() { 173f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown Composer::getInstance().openGlobalTransactionImpl(); 174f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown } 175f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown 17628378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis static void closeGlobalTransaction(bool synchronous) { 17728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis Composer::getInstance().closeGlobalTransactionImpl(synchronous); 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 179d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian}; 180d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 181d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(Composer); 182d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 185dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennissp<IBinder> Composer::createDisplay(const String8& displayName, bool secure) { 186dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis return ComposerService::getComposerService()->createDisplay(displayName, 187dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis secure); 188e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 189e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1909d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownsp<IBinder> Composer::getBuiltInDisplay(int32_t id) { 1919d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown return ComposerService::getComposerService()->getBuiltInDisplay(id); 1929d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown} 1939d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown 194f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brownvoid Composer::openGlobalTransactionImpl() { 195f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown { // scope for the lock 196f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown Mutex::Autolock _l(mLock); 197f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown mTransactionNestCount += 1; 198f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown } 199f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown} 200f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown 20128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid Composer::closeGlobalTransactionImpl(bool synchronous) { 202e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 203698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 204698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Vector<ComposerState> transaction; 2058b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<DisplayState> displayTransaction; 20628378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis uint32_t flags = 0; 207698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 208698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian { // scope for the lock 209698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 210f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown mForceSynchronous |= synchronous; 211f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown if (!mTransactionNestCount) { 212f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown ALOGW("At least one call to closeGlobalTransaction() was not matched by a prior " 213f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown "call to openGlobalTransaction()."); 214f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown } else if (--mTransactionNestCount) { 215f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown return; 216f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown } 217f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown 218e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian transaction = mComposerStates; 219e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian mComposerStates.clear(); 2208b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian 221e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian displayTransaction = mDisplayStates; 222e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian mDisplayStates.clear(); 22328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 224f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown if (mForceSynchronous) { 22528378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis flags |= ISurfaceComposer::eSynchronous; 22628378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis } 2272d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis if (mAnimation) { 2282d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis flags |= ISurfaceComposer::eAnimation; 2292d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis } 2302d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis 23128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mForceSynchronous = false; 2322d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis mAnimation = false; 233698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 234698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 2358b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian sm->setTransactionState(transaction, displayTransaction, flags); 236698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 237698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 2382d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennisvoid Composer::setAnimationTransactionImpl() { 2392d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis Mutex::Autolock _l(mLock); 2402d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis mAnimation = true; 2412d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis} 2422d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis 243698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianlayer_state_t* Composer::getLayerStateLocked( 244ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<SurfaceComposerClient>& client, const sp<IBinder>& id) { 245698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 246698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ComposerState s; 247698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s.client = client->mClient; 248698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s.state.surface = id; 249698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 250e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian ssize_t index = mComposerStates.indexOf(s); 251698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (index < 0) { 252698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian // we don't have it, add an initialized layer_state to our list 253e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian index = mComposerStates.add(s); 254698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 255698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 256e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian ComposerState* const out = mComposerStates.editArray(); 257698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return &(out[index].state); 258698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 259698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 260698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setPosition(const sp<SurfaceComposerClient>& client, 261ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, float x, float y) { 262698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 263698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 264698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 265698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 2663165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::ePositionChanged; 267698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->x = x; 268698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->y = y; 269698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 270698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 271698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 272698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setSize(const sp<SurfaceComposerClient>& client, 273ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, uint32_t w, uint32_t h) { 274698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 275698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 276698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 277698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 2783165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eSizeChanged; 279698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->w = w; 280698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->h = h; 28128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 28228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis // Resizing a surface makes the transaction synchronous. 28328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mForceSynchronous = true; 28428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 285698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 286698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 287698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 288698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setLayer(const sp<SurfaceComposerClient>& client, 289ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, int32_t z) { 290698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 291698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 292698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 293698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 2943165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eLayerChanged; 295698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->z = z; 296698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 297698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 298698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 299698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setFlags(const sp<SurfaceComposerClient>& client, 300ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, uint32_t flags, 301698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t mask) { 302698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 303698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 304698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 305698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 3063165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eVisibilityChanged; 307698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->flags &= ~mask; 308698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->flags |= (flags & mask); 309698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->mask |= mask; 310698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 311698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 312698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 313698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setTransparentRegionHint( 314ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 315698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion) { 316698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 317698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 318698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 319698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 3203165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eTransparentRegionChanged; 321698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->transparentRegion = transparentRegion; 322698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 323698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 324698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 325698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setAlpha(const sp<SurfaceComposerClient>& client, 326ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, float alpha) { 327698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 328698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 329698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 330698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 3313165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eAlphaChanged; 332698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->alpha = alpha; 333698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 334698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 335698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 3368785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopianstatus_t Composer::setLayerStack(const sp<SurfaceComposerClient>& client, 337ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, uint32_t layerStack) { 3388785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian Mutex::Autolock _l(mLock); 3398785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 3408785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian if (!s) 3418785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian return BAD_INDEX; 3423165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eLayerStackChanged; 3438785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian s->layerStack = layerStack; 3448785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian return NO_ERROR; 3458785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian} 3468785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian 347698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setMatrix(const sp<SurfaceComposerClient>& client, 348ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, float dsdx, float dtdx, 349698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdy, float dtdy) { 350698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 351698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 352698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 353698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 3543165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eMatrixChanged; 355698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t::matrix22_t matrix; 356698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dsdx = dsdx; 357698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dtdx = dtdx; 358698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dsdy = dsdy; 359698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dtdy = dtdy; 360698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->matrix = matrix; 361698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 364f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatus_t Composer::setCrop(const sp<SurfaceComposerClient>& client, 365ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, const Rect& crop) { 366f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis Mutex::Autolock _l(mLock); 367f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis layer_state_t* s = getLayerStateLocked(client, id); 368f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis if (!s) 369f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return BAD_INDEX; 3703165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eCropChanged; 371f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis s->crop = crop; 372f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return NO_ERROR; 373f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 374f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 375698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// --------------------------------------------------------------------------- 376698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 377e57f292595bec48f65c8088b00ff6beea01217e9Mathias AgopianDisplayState& Composer::getDisplayStateLocked(const sp<IBinder>& token) { 378e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState s; 379e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.token = token; 380e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian ssize_t index = mDisplayStates.indexOf(s); 381e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (index < 0) { 382e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian // we don't have it, add an initialized layer_state to our list 383e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.what = 0; 384e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian index = mDisplayStates.add(s); 385e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 386e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return mDisplayStates.editItemAt(index); 387e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 388e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 389e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid Composer::setDisplaySurface(const sp<IBinder>& token, 3902adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden const sp<IGraphicBufferProducer>& bufferProducer) { 391e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Mutex::Autolock _l(mLock); 392e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState& s(getDisplayStateLocked(token)); 3932adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden s.surface = bufferProducer; 394e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.what |= DisplayState::eSurfaceChanged; 395e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 396e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 397e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid Composer::setDisplayLayerStack(const sp<IBinder>& token, 398e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian uint32_t layerStack) { 399e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Mutex::Autolock _l(mLock); 400e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState& s(getDisplayStateLocked(token)); 401e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.layerStack = layerStack; 402e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.what |= DisplayState::eLayerStackChanged; 403e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 404e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 40500e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid Composer::setDisplayProjection(const sp<IBinder>& token, 40600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian uint32_t orientation, 40700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& layerStackRect, 40800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& displayRect) { 409e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Mutex::Autolock _l(mLock); 410e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState& s(getDisplayStateLocked(token)); 411e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.orientation = orientation; 41200e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian s.viewport = layerStackRect; 41300e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian s.frame = displayRect; 41400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian s.what |= DisplayState::eDisplayProjectionChanged; 415e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian mForceSynchronous = true; // TODO: do we actually still need this? 416e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 417e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 418e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian// --------------------------------------------------------------------------- 419e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurfaceComposerClient::SurfaceComposerClient() 421698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian : mStatus(NO_INIT), mComposer(Composer::getInstance()) 422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 425698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::onFirstRef() { 426e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 427d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (sm != 0) { 4287e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian sp<ISurfaceComposerClient> conn = sm->createConnection(); 429d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (conn != 0) { 430d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mClient = conn; 431d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mStatus = NO_ERROR; 432d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 436698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias AgopianSurfaceComposerClient::~SurfaceComposerClient() { 437d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian dispose(); 438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 440698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::initCheck() const { 441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 444698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopiansp<IBinder> SurfaceComposerClient::connection() const { 445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (mClient != 0) ? mClient->asBinder() : 0; 446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 448d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianstatus_t SurfaceComposerClient::linkToComposerDeath( 449d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian const sp<IBinder::DeathRecipient>& recipient, 450698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian void* cookie, uint32_t flags) { 451e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 452d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian return sm->asBinder()->linkToDeath(recipient, cookie, flags); 453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 455698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::dispose() { 456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this can be called more than once. 4577e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian sp<ISurfaceComposerClient> client; 458d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Mutex::Autolock _lm(mLock); 459d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (mClient != 0) { 460d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian client = mClient; // hold ref while lock is held 461d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mClient.clear(); 462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 463d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mStatus = NO_INIT; 464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 46601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface( 467285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian const String8& name, 468285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t w, 469285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t h, 470285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian PixelFormat format, 471285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t flags) 472285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian{ 47301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian sp<SurfaceControl> result; 474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus == NO_ERROR) { 475ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian sp<ISurface> surface = mClient->createSurface(name, w, h, format, flags); 476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface != 0) { 477ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian result = new SurfaceControl(this, surface); 478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return result; 481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 483dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennissp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName, 484dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool secure) { 485dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis return Composer::getInstance().createDisplay(displayName, secure); 486e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 487e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 4889d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownsp<IBinder> SurfaceComposerClient::getBuiltInDisplay(int32_t id) { 4899d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown return Composer::getInstance().getBuiltInDisplay(id); 4909d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown} 4919d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown 492ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::destroySurface(const sp<IBinder>& sid) { 493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus != NO_ERROR) 494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = mClient->destroySurface(sid); 496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return err; 497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 499698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianinline Composer& SurfaceComposerClient::getComposer() { 500698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return mComposer; 501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 503698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 505698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::openGlobalTransaction() { 506f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown Composer::openGlobalTransaction(); 507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 50928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid SurfaceComposerClient::closeGlobalTransaction(bool synchronous) { 51028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis Composer::closeGlobalTransaction(synchronous); 511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5132d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennisvoid SurfaceComposerClient::setAnimationTransaction() { 5142d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis Composer::setAnimationTransaction(); 5152d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis} 5162d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis 517698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 519ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setCrop(const sp<IBinder>& id, const Rect& crop) { 520f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return getComposer().setCrop(this, id, crop); 521f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 522f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 523ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setPosition(const sp<IBinder>& id, float x, float y) { 524698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setPosition(this, id, x, y); 525698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 527ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setSize(const sp<IBinder>& id, uint32_t w, uint32_t h) { 528698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setSize(this, id, w, h); 529698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 531ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setLayer(const sp<IBinder>& id, int32_t z) { 532698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setLayer(this, id, z); 533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 535ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::hide(const sp<IBinder>& id) { 536698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, 5373165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian layer_state_t::eLayerHidden, 5383165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian layer_state_t::eLayerHidden); 539698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 541ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::show(const sp<IBinder>& id) { 542698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, 543698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 0, 5443165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian layer_state_t::eLayerHidden); 545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 547ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setFlags(const sp<IBinder>& id, uint32_t flags, 548698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t mask) { 549698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, flags, mask); 550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 552ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setTransparentRegionHint(const sp<IBinder>& id, 553698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion) { 554698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setTransparentRegionHint(this, id, transparentRegion); 555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 557ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setAlpha(const sp<IBinder>& id, float alpha) { 558698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setAlpha(this, id, alpha); 559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 561ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setLayerStack(const sp<IBinder>& id, uint32_t layerStack) { 5628785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian return getComposer().setLayerStack(this, id, layerStack); 5638785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian} 5648785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian 565ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setMatrix(const sp<IBinder>& id, float dsdx, float dtdx, 566698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdy, float dtdy) { 567698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setMatrix(this, id, dsdx, dtdx, dsdy, dtdy); 568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 570698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 571698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 572e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid SurfaceComposerClient::setDisplaySurface(const sp<IBinder>& token, 5732adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden const sp<IGraphicBufferProducer>& bufferProducer) { 5742adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden Composer::getInstance().setDisplaySurface(token, bufferProducer); 575e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 576e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 577e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid SurfaceComposerClient::setDisplayLayerStack(const sp<IBinder>& token, 578e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian uint32_t layerStack) { 579e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Composer::getInstance().setDisplayLayerStack(token, layerStack); 580e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 581e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 58200e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid SurfaceComposerClient::setDisplayProjection(const sp<IBinder>& token, 58300e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian uint32_t orientation, 58400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& layerStackRect, 58500e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& displayRect) { 58600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian Composer::getInstance().setDisplayProjection(token, orientation, 58700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian layerStackRect, displayRect); 588e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 589e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 590e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian// ---------------------------------------------------------------------------- 591e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 592698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::getDisplayInfo( 5939d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown const sp<IBinder>& display, DisplayInfo* info) 594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 5959d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown return ComposerService::getComposerService()->getDisplayInfo(display, info); 596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5982a09bb321930e1f782599ec902bca1db58b9af77Jeff Brownvoid SurfaceComposerClient::blankDisplay(const sp<IBinder>& token) { 5992a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown ComposerService::getComposerService()->blank(token); 6002a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown} 6012a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown 6022a09bb321930e1f782599ec902bca1db58b9af77Jeff Brownvoid SurfaceComposerClient::unblankDisplay(const sp<IBinder>& token) { 6032a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown ComposerService::getComposerService()->unblank(token); 6042a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown} 6052a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown 606698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 607698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 60874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianScreenshotClient::ScreenshotClient() 60974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian : mWidth(0), mHeight(0), mFormat(PIXEL_FORMAT_NONE) { 61074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 61174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 6129d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownstatus_t ScreenshotClient::update(const sp<IBinder>& display) { 61374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 61474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian if (s == NULL) return NO_INIT; 61574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian mHeap = 0; 6169d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown return s->captureScreen(display, &mHeap, 617bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian &mWidth, &mHeight, &mFormat, 0, 0, 618bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 0, -1UL); 61974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 62074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 6219d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownstatus_t ScreenshotClient::update(const sp<IBinder>& display, 6229d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown uint32_t reqWidth, uint32_t reqHeight) { 62374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 62474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian if (s == NULL) return NO_INIT; 62574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian mHeap = 0; 6269d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown return s->captureScreen(display, &mHeap, 627bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian &mWidth, &mHeight, &mFormat, reqWidth, reqHeight, 628bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 0, -1UL); 629bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian} 630bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 6319d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownstatus_t ScreenshotClient::update(const sp<IBinder>& display, 6329d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown uint32_t reqWidth, uint32_t reqHeight, 633bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t minLayerZ, uint32_t maxLayerZ) { 634bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 635bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian if (s == NULL) return NO_INIT; 636bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian mHeap = 0; 6379d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown return s->captureScreen(display, &mHeap, 638bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian &mWidth, &mHeight, &mFormat, reqWidth, reqHeight, 639bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian minLayerZ, maxLayerZ); 64074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 64174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 64274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid ScreenshotClient::release() { 64374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian mHeap = 0; 64474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 64574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 64674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid const* ScreenshotClient::getPixels() const { 64774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mHeap->getBase(); 64874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 64974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 65074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getWidth() const { 65174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mWidth; 65274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 65374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 65474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getHeight() const { 65574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mHeight; 65674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 65774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 65874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianPixelFormat ScreenshotClient::getFormat() const { 65974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mFormat; 66074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 66174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 66274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getStride() const { 66374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mWidth; 66474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 66574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 66674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopiansize_t ScreenshotClient::getSize() const { 66774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mHeap->getSize(); 66874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 66974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 67074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian// ---------------------------------------------------------------------------- 671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 672