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); 1691f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright void setDisplaySize(const sp<IBinder>& token, uint32_t width, uint32_t height); 170e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1712d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis static void setAnimationTransaction() { 1722d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis Composer::getInstance().setAnimationTransactionImpl(); 1732d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis } 1742d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis 175f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown static void openGlobalTransaction() { 176f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown Composer::getInstance().openGlobalTransactionImpl(); 177f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown } 178f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown 17928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis static void closeGlobalTransaction(bool synchronous) { 18028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis Composer::getInstance().closeGlobalTransactionImpl(synchronous); 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 182d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian}; 183d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 184d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(Composer); 185d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 188dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennissp<IBinder> Composer::createDisplay(const String8& displayName, bool secure) { 189dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis return ComposerService::getComposerService()->createDisplay(displayName, 190dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis secure); 191e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 192e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1936c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hallvoid Composer::destroyDisplay(const sp<IBinder>& display) { 1946c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return ComposerService::getComposerService()->destroyDisplay(display); 1956c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall} 1966c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall 1979d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownsp<IBinder> Composer::getBuiltInDisplay(int32_t id) { 1989d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown return ComposerService::getComposerService()->getBuiltInDisplay(id); 1999d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown} 2009d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown 201f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brownvoid Composer::openGlobalTransactionImpl() { 202f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown { // scope for the lock 203f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown Mutex::Autolock _l(mLock); 204f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown mTransactionNestCount += 1; 205f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown } 206f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown} 207f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown 20828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid Composer::closeGlobalTransactionImpl(bool synchronous) { 209e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 210698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 211698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Vector<ComposerState> transaction; 2128b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<DisplayState> displayTransaction; 21328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis uint32_t flags = 0; 214698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 215698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian { // scope for the lock 216698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 217f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown mForceSynchronous |= synchronous; 218f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown if (!mTransactionNestCount) { 219f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown ALOGW("At least one call to closeGlobalTransaction() was not matched by a prior " 220f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown "call to openGlobalTransaction()."); 221f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown } else if (--mTransactionNestCount) { 222f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown return; 223f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown } 224f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown 225e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian transaction = mComposerStates; 226e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian mComposerStates.clear(); 2278b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian 228e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian displayTransaction = mDisplayStates; 229e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian mDisplayStates.clear(); 23028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 231f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown if (mForceSynchronous) { 23228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis flags |= ISurfaceComposer::eSynchronous; 23328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis } 2342d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis if (mAnimation) { 2352d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis flags |= ISurfaceComposer::eAnimation; 2362d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis } 2372d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis 23828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mForceSynchronous = false; 2392d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis mAnimation = false; 240698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 241698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 2428b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian sm->setTransactionState(transaction, displayTransaction, flags); 243698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 244698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 2452d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennisvoid Composer::setAnimationTransactionImpl() { 2462d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis Mutex::Autolock _l(mLock); 2472d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis mAnimation = true; 2482d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis} 2492d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis 250698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianlayer_state_t* Composer::getLayerStateLocked( 251ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<SurfaceComposerClient>& client, const sp<IBinder>& id) { 252698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 253698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ComposerState s; 254698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s.client = client->mClient; 255698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s.state.surface = id; 256698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 257e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian ssize_t index = mComposerStates.indexOf(s); 258698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (index < 0) { 259698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian // we don't have it, add an initialized layer_state to our list 260e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian index = mComposerStates.add(s); 261698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 262698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 263e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian ComposerState* const out = mComposerStates.editArray(); 264698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return &(out[index].state); 265698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 266698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 267698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setPosition(const sp<SurfaceComposerClient>& client, 268ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, float x, float y) { 269698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 270698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 271698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 272698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 2733165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::ePositionChanged; 274698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->x = x; 275698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->y = y; 276698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 277698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 278698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 279698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setSize(const sp<SurfaceComposerClient>& client, 280ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, uint32_t w, uint32_t h) { 281698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 282698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 283698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 284698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 2853165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eSizeChanged; 286698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->w = w; 287698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->h = h; 28828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 28928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis // Resizing a surface makes the transaction synchronous. 29028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mForceSynchronous = true; 29128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 292698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 293698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 294698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 295698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setLayer(const sp<SurfaceComposerClient>& client, 296ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, int32_t z) { 297698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 298698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 299698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 300698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 3013165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eLayerChanged; 302698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->z = z; 303698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 304698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 305698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 306698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setFlags(const sp<SurfaceComposerClient>& client, 307ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, uint32_t flags, 308698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t mask) { 309698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 310698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 311698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 312698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 3134125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden if (mask & layer_state_t::eLayerOpaque) { 3144125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden s->what |= layer_state_t::eOpacityChanged; 3154125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden } 3164125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden if (mask & layer_state_t::eLayerHidden) { 3174125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden s->what |= layer_state_t::eVisibilityChanged; 3184125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden } 319698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->flags &= ~mask; 320698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->flags |= (flags & mask); 321698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->mask |= mask; 322698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 323698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 324698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 325698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setTransparentRegionHint( 326ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 327698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion) { 328698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 329698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 330698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 331698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 3323165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eTransparentRegionChanged; 333698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->transparentRegion = transparentRegion; 334698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 335698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 336698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 337698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setAlpha(const sp<SurfaceComposerClient>& client, 338ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, float alpha) { 339698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 340698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 341698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 342698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 3433165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eAlphaChanged; 344698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->alpha = alpha; 345698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 346698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 347698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 3488785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopianstatus_t Composer::setLayerStack(const sp<SurfaceComposerClient>& client, 349ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, uint32_t layerStack) { 3508785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian Mutex::Autolock _l(mLock); 3518785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 3528785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian if (!s) 3538785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian return BAD_INDEX; 3543165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eLayerStackChanged; 3558785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian s->layerStack = layerStack; 3568785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian return NO_ERROR; 3578785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian} 3588785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian 359698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setMatrix(const sp<SurfaceComposerClient>& client, 360ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, float dsdx, float dtdx, 361698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdy, float dtdy) { 362698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 363698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 364698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 365698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 3663165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eMatrixChanged; 367698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t::matrix22_t matrix; 368698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dsdx = dsdx; 369698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dtdx = dtdx; 370698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dsdy = dsdy; 371698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dtdy = dtdy; 372698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->matrix = matrix; 373698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 376f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatus_t Composer::setCrop(const sp<SurfaceComposerClient>& client, 377ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian const sp<IBinder>& id, const Rect& crop) { 378f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis Mutex::Autolock _l(mLock); 379f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis layer_state_t* s = getLayerStateLocked(client, id); 380f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis if (!s) 381f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return BAD_INDEX; 3823165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eCropChanged; 383f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis s->crop = crop; 384f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return NO_ERROR; 385f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 386f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 387698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// --------------------------------------------------------------------------- 388698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 389e57f292595bec48f65c8088b00ff6beea01217e9Mathias AgopianDisplayState& Composer::getDisplayStateLocked(const sp<IBinder>& token) { 390e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState s; 391e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.token = token; 392e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian ssize_t index = mDisplayStates.indexOf(s); 393e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (index < 0) { 394e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian // we don't have it, add an initialized layer_state to our list 395e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.what = 0; 396e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian index = mDisplayStates.add(s); 397e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 398e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return mDisplayStates.editItemAt(index); 399e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 400e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 401e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid Composer::setDisplaySurface(const sp<IBinder>& token, 4022adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden const sp<IGraphicBufferProducer>& bufferProducer) { 403e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Mutex::Autolock _l(mLock); 404e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState& s(getDisplayStateLocked(token)); 4052adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden s.surface = bufferProducer; 406e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.what |= DisplayState::eSurfaceChanged; 407e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 408e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 409e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid Composer::setDisplayLayerStack(const sp<IBinder>& token, 410e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian uint32_t layerStack) { 411e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Mutex::Autolock _l(mLock); 412e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState& s(getDisplayStateLocked(token)); 413e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.layerStack = layerStack; 414e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.what |= DisplayState::eLayerStackChanged; 415e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 416e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 41700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid Composer::setDisplayProjection(const sp<IBinder>& token, 41800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian uint32_t orientation, 41900e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& layerStackRect, 42000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& displayRect) { 421e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Mutex::Autolock _l(mLock); 422e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState& s(getDisplayStateLocked(token)); 423e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.orientation = orientation; 42400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian s.viewport = layerStackRect; 42500e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian s.frame = displayRect; 42600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian s.what |= DisplayState::eDisplayProjectionChanged; 427e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian mForceSynchronous = true; // TODO: do we actually still need this? 428e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 429e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 4301f6078aef71b1d3f080cd565adbec350c71088ddMichael Wrightvoid Composer::setDisplaySize(const sp<IBinder>& token, uint32_t width, uint32_t height) { 4311f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright Mutex::Autolock _l(mLock); 4321f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright DisplayState& s(getDisplayStateLocked(token)); 4331f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright s.width = width; 4341f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright s.height = height; 4351f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright s.what |= DisplayState::eDisplaySizeChanged; 4361f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright} 4371f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright 438e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian// --------------------------------------------------------------------------- 439e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurfaceComposerClient::SurfaceComposerClient() 441698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian : mStatus(NO_INIT), mComposer(Composer::getInstance()) 442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 445698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::onFirstRef() { 446e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 447d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (sm != 0) { 4487e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian sp<ISurfaceComposerClient> conn = sm->createConnection(); 449d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (conn != 0) { 450d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mClient = conn; 451d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mStatus = NO_ERROR; 452d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 456698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias AgopianSurfaceComposerClient::~SurfaceComposerClient() { 457d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian dispose(); 458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 460698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::initCheck() const { 461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 464698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopiansp<IBinder> SurfaceComposerClient::connection() const { 465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (mClient != 0) ? mClient->asBinder() : 0; 466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 468d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianstatus_t SurfaceComposerClient::linkToComposerDeath( 469d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian const sp<IBinder::DeathRecipient>& recipient, 470698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian void* cookie, uint32_t flags) { 471e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 472d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian return sm->asBinder()->linkToDeath(recipient, cookie, flags); 473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 475698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::dispose() { 476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this can be called more than once. 4777e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian sp<ISurfaceComposerClient> client; 478d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Mutex::Autolock _lm(mLock); 479d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (mClient != 0) { 480d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian client = mClient; // hold ref while lock is held 481d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mClient.clear(); 482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 483d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mStatus = NO_INIT; 484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 48601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface( 487285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian const String8& name, 488285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t w, 489285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t h, 490285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian PixelFormat format, 491285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t flags) 492285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian{ 4934d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian sp<SurfaceControl> sur; 494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus == NO_ERROR) { 4954d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian sp<IBinder> handle; 4964d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian sp<IGraphicBufferProducer> gbp; 4974d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian status_t err = mClient->createSurface(name, w, h, format, flags, 4984d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian &handle, &gbp); 4994d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian ALOGE_IF(err, "SurfaceComposerClient::createSurface error %s", strerror(-err)); 5004d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian if (err == NO_ERROR) { 5014d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian sur = new SurfaceControl(this, handle, gbp); 502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 5044d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian return sur; 505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 507dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennissp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName, 508dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool secure) { 509dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis return Composer::getInstance().createDisplay(displayName, secure); 510e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 511e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 5126c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hallvoid SurfaceComposerClient::destroyDisplay(const sp<IBinder>& display) { 5136c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall Composer::getInstance().destroyDisplay(display); 5146c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall} 5156c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall 5169d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownsp<IBinder> SurfaceComposerClient::getBuiltInDisplay(int32_t id) { 5179d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown return Composer::getInstance().getBuiltInDisplay(id); 5189d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown} 5199d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown 520ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::destroySurface(const sp<IBinder>& sid) { 521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus != NO_ERROR) 522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = mClient->destroySurface(sid); 524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return err; 525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 527d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavstatus_t SurfaceComposerClient::clearLayerFrameStats(const sp<IBinder>& token) const { 528d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav if (mStatus != NO_ERROR) { 529d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return mStatus; 530d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 531d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return mClient->clearLayerFrameStats(token); 532d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 533d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 534d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavstatus_t SurfaceComposerClient::getLayerFrameStats(const sp<IBinder>& token, 535d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav FrameStats* outStats) const { 536d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav if (mStatus != NO_ERROR) { 537d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return mStatus; 538d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 539d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return mClient->getLayerFrameStats(token, outStats); 540d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 541d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 542698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianinline Composer& SurfaceComposerClient::getComposer() { 543698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return mComposer; 544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 546698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 548698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::openGlobalTransaction() { 549f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown Composer::openGlobalTransaction(); 550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 55228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid SurfaceComposerClient::closeGlobalTransaction(bool synchronous) { 55328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis Composer::closeGlobalTransaction(synchronous); 554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5562d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennisvoid SurfaceComposerClient::setAnimationTransaction() { 5572d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis Composer::setAnimationTransaction(); 5582d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis} 5592d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis 560698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 562ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setCrop(const sp<IBinder>& id, const Rect& crop) { 563f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return getComposer().setCrop(this, id, crop); 564f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 565f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 566ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setPosition(const sp<IBinder>& id, float x, float y) { 567698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setPosition(this, id, x, y); 568698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 570ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setSize(const sp<IBinder>& id, uint32_t w, uint32_t h) { 571698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setSize(this, id, w, h); 572698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 574ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setLayer(const sp<IBinder>& id, int32_t z) { 575698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setLayer(this, id, z); 576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 578ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::hide(const sp<IBinder>& id) { 579698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, 5803165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian layer_state_t::eLayerHidden, 5813165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian layer_state_t::eLayerHidden); 582698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 584ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::show(const sp<IBinder>& id) { 585698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, 586698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 0, 5873165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian layer_state_t::eLayerHidden); 588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 590ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setFlags(const sp<IBinder>& id, uint32_t flags, 591698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t mask) { 592698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, flags, mask); 593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 595ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setTransparentRegionHint(const sp<IBinder>& id, 596698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion) { 597698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setTransparentRegionHint(this, id, transparentRegion); 598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 600ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setAlpha(const sp<IBinder>& id, float alpha) { 601698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setAlpha(this, id, alpha); 602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 604ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setLayerStack(const sp<IBinder>& id, uint32_t layerStack) { 6058785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian return getComposer().setLayerStack(this, id, layerStack); 6068785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian} 6078785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian 608ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setMatrix(const sp<IBinder>& id, float dsdx, float dtdx, 609698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdy, float dtdy) { 610698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setMatrix(this, id, dsdx, dtdx, dsdy, dtdy); 611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 613698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 614698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 615e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid SurfaceComposerClient::setDisplaySurface(const sp<IBinder>& token, 6162adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden const sp<IGraphicBufferProducer>& bufferProducer) { 6172adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden Composer::getInstance().setDisplaySurface(token, bufferProducer); 618e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 619e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 620e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid SurfaceComposerClient::setDisplayLayerStack(const sp<IBinder>& token, 621e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian uint32_t layerStack) { 622e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Composer::getInstance().setDisplayLayerStack(token, layerStack); 623e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 624e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 62500e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid SurfaceComposerClient::setDisplayProjection(const sp<IBinder>& token, 62600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian uint32_t orientation, 62700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& layerStackRect, 62800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& displayRect) { 62900e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian Composer::getInstance().setDisplayProjection(token, orientation, 63000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian layerStackRect, displayRect); 631e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 632e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 6331f6078aef71b1d3f080cd565adbec350c71088ddMichael Wrightvoid SurfaceComposerClient::setDisplaySize(const sp<IBinder>& token, 6341f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright uint32_t width, uint32_t height) { 6351f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright Composer::getInstance().setDisplaySize(token, width, height); 6361f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright} 6371f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright 638e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian// ---------------------------------------------------------------------------- 639e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 6407f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stozastatus_t SurfaceComposerClient::getDisplayConfigs( 6417f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza const sp<IBinder>& display, Vector<DisplayInfo>* configs) 642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 6437f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return ComposerService::getComposerService()->getDisplayConfigs(display, configs); 6447f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza} 6457f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza 6467f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stozastatus_t SurfaceComposerClient::getDisplayInfo(const sp<IBinder>& display, 6477f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza DisplayInfo* info) { 6487f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Vector<DisplayInfo> configs; 6497f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza status_t result = getDisplayConfigs(display, &configs); 6507f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza if (result != NO_ERROR) { 6517f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return result; 6527f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 6537f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza 6547f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza int activeId = getActiveConfig(display); 6557f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza if (activeId < 0) { 6567f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza ALOGE("No active configuration found"); 6577f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return NAME_NOT_FOUND; 6587f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 6597f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza 6607f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza *info = configs[activeId]; 6617f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return NO_ERROR; 6627f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza} 6637f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza 6647f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stozaint SurfaceComposerClient::getActiveConfig(const sp<IBinder>& display) { 6657f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return ComposerService::getComposerService()->getActiveConfig(display); 6667f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza} 6677f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza 6687f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stozastatus_t SurfaceComposerClient::setActiveConfig(const sp<IBinder>& display, int id) { 6697f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return ComposerService::getComposerService()->setActiveConfig(display, id); 670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6722c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanivoid SurfaceComposerClient::setDisplayPowerMode(const sp<IBinder>& token, 6732c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani int mode) { 6742c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani ComposerService::getComposerService()->setPowerMode(token, mode); 6752a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown} 6762a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown 677d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavstatus_t SurfaceComposerClient::clearAnimationFrameStats() { 678d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return ComposerService::getComposerService()->clearAnimationFrameStats(); 679d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 680d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 681d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavstatus_t SurfaceComposerClient::getAnimationFrameStats(FrameStats* outStats) { 682d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return ComposerService::getComposerService()->getAnimationFrameStats(outStats); 683d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 684d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 685698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 686698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 6872a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopianstatus_t ScreenshotClient::capture( 6882a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian const sp<IBinder>& display, 6892a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian const sp<IGraphicBufferProducer>& producer, 690c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 691c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza uint32_t minLayerZ, uint32_t maxLayerZ, bool useIdentityTransform) { 6922a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 6932a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian if (s == NULL) return NO_INIT; 694c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza return s->captureScreen(display, producer, sourceCrop, 695c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza reqWidth, reqHeight, minLayerZ, maxLayerZ, useIdentityTransform); 6962a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian} 6972a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian 69874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianScreenshotClient::ScreenshotClient() 699abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian : mHaveBuffer(false) { 700abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian memset(&mBuffer, 0, sizeof(mBuffer)); 70174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 70274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 7038000d0694bc34bc17d869da546d8ff8790ae7be4Mathias AgopianScreenshotClient::~ScreenshotClient() { 7048000d0694bc34bc17d869da546d8ff8790ae7be4Mathias Agopian ScreenshotClient::release(); 7058000d0694bc34bc17d869da546d8ff8790ae7be4Mathias Agopian} 7068000d0694bc34bc17d869da546d8ff8790ae7be4Mathias Agopian 707abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopiansp<CpuConsumer> ScreenshotClient::getCpuConsumer() const { 708abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian if (mCpuConsumer == NULL) { 7096d5a7bb970dd5cfd5a51fe2de7f10b9fc75732b2Dan Stoza sp<IGraphicBufferConsumer> consumer; 7106d5a7bb970dd5cfd5a51fe2de7f10b9fc75732b2Dan Stoza BufferQueue::createBufferQueue(&mProducer, &consumer); 7116d5a7bb970dd5cfd5a51fe2de7f10b9fc75732b2Dan Stoza mCpuConsumer = new CpuConsumer(consumer, 1); 712abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian mCpuConsumer->setName(String8("ScreenshotClient")); 713abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian } 714abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian return mCpuConsumer; 71574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 71674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 7179d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownstatus_t ScreenshotClient::update(const sp<IBinder>& display, 718c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 719c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza uint32_t minLayerZ, uint32_t maxLayerZ, 720d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews bool useIdentityTransform, uint32_t rotation) { 72174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 72274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian if (s == NULL) return NO_INIT; 723abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian sp<CpuConsumer> cpuConsumer = getCpuConsumer(); 724abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian 725abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian if (mHaveBuffer) { 726abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian mCpuConsumer->unlockBuffer(mBuffer); 727abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian memset(&mBuffer, 0, sizeof(mBuffer)); 728abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian mHaveBuffer = false; 729abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian } 730abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian 731c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza status_t err = s->captureScreen(display, mProducer, sourceCrop, 732d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews reqWidth, reqHeight, minLayerZ, maxLayerZ, useIdentityTransform, 733d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews static_cast<ISurfaceComposer::Rotation>(rotation)); 734abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian 735abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian if (err == NO_ERROR) { 736abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian err = mCpuConsumer->lockNextBuffer(&mBuffer); 737abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian if (err == NO_ERROR) { 738abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian mHaveBuffer = true; 739abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian } 740abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian } 741abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian return err; 742abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian} 743abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian 744d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrewsstatus_t ScreenshotClient::update(const sp<IBinder>& display, 745d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 746d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews uint32_t minLayerZ, uint32_t maxLayerZ, 747d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews bool useIdentityTransform) { 748d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews 749d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews return ScreenshotClient::update(display, sourceCrop, reqWidth, reqHeight, 750d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews minLayerZ, maxLayerZ, useIdentityTransform, ISurfaceComposer::eRotateNone); 751d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews} 752d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews 753c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stozastatus_t ScreenshotClient::update(const sp<IBinder>& display, Rect sourceCrop, 754c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform) { 755c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza return ScreenshotClient::update(display, sourceCrop, 0, 0, 0, -1UL, 756d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews useIdentityTransform, ISurfaceComposer::eRotateNone); 757bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian} 758bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 759c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stozastatus_t ScreenshotClient::update(const sp<IBinder>& display, Rect sourceCrop, 760c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza uint32_t reqWidth, uint32_t reqHeight, bool useIdentityTransform) { 761c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza return ScreenshotClient::update(display, sourceCrop, reqWidth, reqHeight, 762d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews 0, -1UL, useIdentityTransform, ISurfaceComposer::eRotateNone); 76374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 76474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 76574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid ScreenshotClient::release() { 766abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian if (mHaveBuffer) { 767abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian mCpuConsumer->unlockBuffer(mBuffer); 768abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian memset(&mBuffer, 0, sizeof(mBuffer)); 769abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian mHaveBuffer = false; 770abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian } 771abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian mCpuConsumer.clear(); 77274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 77374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 77474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid const* ScreenshotClient::getPixels() const { 775abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian return mBuffer.data; 77674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 77774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 77874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getWidth() const { 779abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian return mBuffer.width; 78074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 78174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 78274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getHeight() const { 783abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian return mBuffer.height; 78474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 78574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 78674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianPixelFormat ScreenshotClient::getFormat() const { 787abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian return mBuffer.format; 78874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 78974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 79074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getStride() const { 791abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian return mBuffer.stride; 79274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 79374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 79474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopiansize_t ScreenshotClient::getSize() const { 795abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian return mBuffer.stride * mBuffer.height * bytesPerPixel(mBuffer.format); 79674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 79774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 79874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian// ---------------------------------------------------------------------------- 799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 800