SurfaceComposerClient.cpp revision 41f673c9b3aac0d96e41c928845c39186d565212
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 34a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <surfaceflinger/ISurface.h> 359cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/ISurfaceComposer.h> 367e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian#include <surfaceflinger/ISurfaceComposerClient.h> 379cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/SurfaceComposerClient.h> 389cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 399cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <private/surfaceflinger/LayerState.h> 409cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <private/surfaceflinger/SharedBufferStack.h> 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 4241f673c9b3aac0d96e41c928845c39186d565212Mathias Agopian#include <private/gui/ComposerService.h> 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 47b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(ComposerService); 487e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 49b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianComposerService::ComposerService() 50b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian: Singleton<ComposerService>() { 51b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian const String16 name("SurfaceFlinger"); 52b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian while (getService(name, &mComposerService) != NO_ERROR) { 53b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian usleep(250000); 547e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian } 55b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian mServerCblkMemory = mComposerService->getCblk(); 56b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian mServerCblk = static_cast<surface_flinger_cblk_t volatile *>( 57b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian mServerCblkMemory->getBase()); 58b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 597e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 60b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopiansp<ISurfaceComposer> ComposerService::getComposerService() { 61b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian return ComposerService::getInstance().mComposerService; 62b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 637e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 64b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopiansurface_flinger_cblk_t const volatile * ComposerService::getControlBlock() { 65b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian return ComposerService::getInstance().mServerCblk; 66b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 677e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 687e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianstatic inline sp<ISurfaceComposer> getComposerService() { 697e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian return ComposerService::getComposerService(); 707e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian} 717e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 727e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianstatic inline surface_flinger_cblk_t const volatile * get_cblk() { 737e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian return ComposerService::getControlBlock(); 747e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian} 757e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 767e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian// --------------------------------------------------------------------------- 777e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 78698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// NOTE: this is NOT a member function (it's a friend defined with its 79698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// declaration). 80698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatic inline 81698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianint compare_type( const ComposerState& lhs, const ComposerState& rhs) { 82698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.client < rhs.client) return -1; 83698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.client > rhs.client) return 1; 84698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.state.surface < rhs.state.surface) return -1; 85698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.state.surface > rhs.state.surface) return 1; 86698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return 0; 87698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 88698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 897e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianclass Composer : public Singleton<Composer> 907e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian{ 91698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian friend class Singleton<Composer>; 927e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 93698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian mutable Mutex mLock; 94698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SortedVector<ComposerState> mStates; 95b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis int mOrientation; 9628378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis uint32_t mForceSynchronous; 977e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 98b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis Composer() : Singleton<Composer>(), 9928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mOrientation(ISurfaceComposer::eOrientationUnchanged), 10028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mForceSynchronous(0) 10128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis { } 102d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 10328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis void closeGlobalTransactionImpl(bool synchronous); 104d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 105698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* getLayerStateLocked( 106698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const sp<SurfaceComposerClient>& client, SurfaceID id); 107d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 108698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianpublic: 109d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 110698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setPosition(const sp<SurfaceComposerClient>& client, SurfaceID id, 11141b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian float x, float y); 112698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setSize(const sp<SurfaceComposerClient>& client, SurfaceID id, 113698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t w, uint32_t h); 114698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setLayer(const sp<SurfaceComposerClient>& client, SurfaceID id, 115698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian int32_t z); 116698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setFlags(const sp<SurfaceComposerClient>& client, SurfaceID id, 117698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t flags, uint32_t mask); 118698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setTransparentRegionHint( 119698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const sp<SurfaceComposerClient>& client, SurfaceID id, 120698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion); 121698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setAlpha(const sp<SurfaceComposerClient>& client, SurfaceID id, 122698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float alpha); 123698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setMatrix(const sp<SurfaceComposerClient>& client, SurfaceID id, 124698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdx, float dtdx, float dsdy, float dtdy); 125698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setFreezeTint( 126698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const sp<SurfaceComposerClient>& client, SurfaceID id, 127698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t tint); 128b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis status_t setOrientation(int orientation); 129d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 13028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis static void closeGlobalTransaction(bool synchronous) { 13128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis Composer::getInstance().closeGlobalTransactionImpl(synchronous); 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 133d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian}; 134d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 135d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(Composer); 136d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid Composer::closeGlobalTransactionImpl(bool synchronous) { 140698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian sp<ISurfaceComposer> sm(getComposerService()); 141698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 142698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Vector<ComposerState> transaction; 143b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis int orientation; 14428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis uint32_t flags = 0; 145698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 146698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian { // scope for the lock 147698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 148698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian transaction = mStates; 149698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian mStates.clear(); 150b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis 151b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis orientation = mOrientation; 152b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis mOrientation = ISurfaceComposer::eOrientationUnchanged; 15328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 15428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis if (synchronous || mForceSynchronous) { 15528378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis flags |= ISurfaceComposer::eSynchronous; 15628378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis } 15728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mForceSynchronous = false; 158698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 159698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 16028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis sm->setTransactionState(transaction, orientation, flags); 161698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 162698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 163698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianlayer_state_t* Composer::getLayerStateLocked( 164698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const sp<SurfaceComposerClient>& client, SurfaceID id) { 165698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 166698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ComposerState s; 167698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s.client = client->mClient; 168698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s.state.surface = id; 169698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 170698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ssize_t index = mStates.indexOf(s); 171698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (index < 0) { 172698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian // we don't have it, add an initialized layer_state to our list 173698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian index = mStates.add(s); 174698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 175698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 176698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ComposerState* const out = mStates.editArray(); 177698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return &(out[index].state); 178698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 179698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 180698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setPosition(const sp<SurfaceComposerClient>& client, 18141b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian SurfaceID id, float x, float y) { 182698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 183698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 184698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 185698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 186698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::ePositionChanged; 187698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->x = x; 188698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->y = y; 189698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 190698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 191698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 192698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setSize(const sp<SurfaceComposerClient>& client, 193698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, uint32_t w, uint32_t h) { 194698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 195698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 196698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 197698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 198698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eSizeChanged; 199698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->w = w; 200698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->h = h; 20128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 20228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis // Resizing a surface makes the transaction synchronous. 20328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mForceSynchronous = true; 20428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 205698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 206698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 207698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 208698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setLayer(const sp<SurfaceComposerClient>& client, 209698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, int32_t z) { 210698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 211698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 212698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 213698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 214698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eLayerChanged; 215698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->z = z; 216698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 217698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 218698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 219698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setFlags(const sp<SurfaceComposerClient>& client, 220698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, uint32_t flags, 221698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t mask) { 222698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 223698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 224698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 225698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 226698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eVisibilityChanged; 227698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->flags &= ~mask; 228698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->flags |= (flags & mask); 229698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->mask |= mask; 230698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 231698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 232698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 233698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setTransparentRegionHint( 234698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const sp<SurfaceComposerClient>& client, SurfaceID id, 235698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion) { 236698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 237698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 238698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 239698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 240698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eTransparentRegionChanged; 241698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->transparentRegion = transparentRegion; 242698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 243698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 244698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 245698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setAlpha(const sp<SurfaceComposerClient>& client, 246698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, float alpha) { 247698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 248698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 249698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 250698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 251698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eAlphaChanged; 252698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->alpha = alpha; 253698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 254698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 255698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 256698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setMatrix(const sp<SurfaceComposerClient>& client, 257698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, float dsdx, float dtdx, 258698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdy, float dtdy) { 259698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 260698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 261698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 262698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 263698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eMatrixChanged; 264698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t::matrix22_t matrix; 265698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dsdx = dsdx; 266698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dtdx = dtdx; 267698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dsdy = dsdy; 268698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dtdy = dtdy; 269698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->matrix = matrix; 270698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 273698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setFreezeTint(const sp<SurfaceComposerClient>& client, 274698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, uint32_t tint) { 275698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 276698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 277698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 278698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 279698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eFreezeTintChanged; 280698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->tint = tint; 281698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 282698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 283698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 284b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennisstatus_t Composer::setOrientation(int orientation) { 285b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis Mutex::Autolock _l(mLock); 286b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis mOrientation = orientation; 28728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 28828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis // Changing the orientation makes the transaction synchronous. 28928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mForceSynchronous = true; 29028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 291b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis return NO_ERROR; 292b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis} 293b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis 294698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// --------------------------------------------------------------------------- 295698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurfaceComposerClient::SurfaceComposerClient() 297698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian : mStatus(NO_INIT), mComposer(Composer::getInstance()) 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 301698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::onFirstRef() { 302dd3423c6247965bf67ea30c75e484a6f5d72b1a2Mathias Agopian sp<ISurfaceComposer> sm(getComposerService()); 303d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (sm != 0) { 3047e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian sp<ISurfaceComposerClient> conn = sm->createConnection(); 305d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (conn != 0) { 306d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mClient = conn; 307d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mStatus = NO_ERROR; 308d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 312698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias AgopianSurfaceComposerClient::~SurfaceComposerClient() { 313d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian dispose(); 314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 316698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::initCheck() const { 317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 320698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopiansp<IBinder> SurfaceComposerClient::connection() const { 321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (mClient != 0) ? mClient->asBinder() : 0; 322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 324d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianstatus_t SurfaceComposerClient::linkToComposerDeath( 325d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian const sp<IBinder::DeathRecipient>& recipient, 326698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian void* cookie, uint32_t flags) { 327d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian sp<ISurfaceComposer> sm(getComposerService()); 328d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian return sm->asBinder()->linkToDeath(recipient, cookie, flags); 329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 331698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::dispose() { 332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this can be called more than once. 3337e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian sp<ISurfaceComposerClient> client; 334d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Mutex::Autolock _lm(mLock); 335d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (mClient != 0) { 336d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian client = mClient; // hold ref while lock is held 337d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mClient.clear(); 338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 339d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mStatus = NO_INIT; 340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface( 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayID display, 344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t w, 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t h, 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PixelFormat format, 347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags) 348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 349285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian String8 name; 350285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian const size_t SIZE = 128; 351285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian char buffer[SIZE]; 352285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian snprintf(buffer, SIZE, "<pid_%d>", getpid()); 353285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian name.append(buffer); 354285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian 3550ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian return SurfaceComposerClient::createSurface(name, display, 356285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian w, h, format, flags); 357285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian} 358285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian 359285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface( 360285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian const String8& name, 361285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian DisplayID display, 362285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t w, 363285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t h, 364285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian PixelFormat format, 365285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t flags) 366285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian{ 36701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian sp<SurfaceControl> result; 368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus == NO_ERROR) { 3697e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian ISurfaceComposerClient::surface_data_t data; 3700ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian sp<ISurface> surface = mClient->createSurface(&data, name, 371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project display, w, h, format, flags); 372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface != 0) { 373c10d9d90b2088a3304076e0dc4bf05cdbb5d45abMathias Agopian result = new SurfaceControl(this, surface, data); 374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return result; 377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 379698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::destroySurface(SurfaceID sid) { 380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus != NO_ERROR) 381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = mClient->destroySurface(sid); 383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return err; 384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 386698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianinline Composer& SurfaceComposerClient::getComposer() { 387698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return mComposer; 388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 390698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 392698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::openGlobalTransaction() { 393698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian // Currently a no-op 394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 39628378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid SurfaceComposerClient::closeGlobalTransaction(bool synchronous) { 39728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis Composer::closeGlobalTransaction(synchronous); 398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 400698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 402698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setFreezeTint(SurfaceID id, uint32_t tint) { 403698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFreezeTint(this, id, tint); 404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 40641b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopianstatus_t SurfaceComposerClient::setPosition(SurfaceID id, float x, float y) { 407698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setPosition(this, id, x, y); 408698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 410698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setSize(SurfaceID id, uint32_t w, uint32_t h) { 411698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setSize(this, id, w, h); 412698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 414698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setLayer(SurfaceID id, int32_t z) { 415698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setLayer(this, id, z); 416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 418698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::hide(SurfaceID id) { 419698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, 420698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ISurfaceComposer::eLayerHidden, 421698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ISurfaceComposer::eLayerHidden); 422698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 424698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::show(SurfaceID id, int32_t) { 425698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, 426698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 0, 427698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ISurfaceComposer::eLayerHidden); 428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 430698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::freeze(SurfaceID id) { 431698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, 432698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ISurfaceComposer::eLayerFrozen, 433698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ISurfaceComposer::eLayerFrozen); 434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 436698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::unfreeze(SurfaceID id) { 437698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, 438698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 0, 439698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ISurfaceComposer::eLayerFrozen); 440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 442698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setFlags(SurfaceID id, uint32_t flags, 443698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t mask) { 444698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, flags, mask); 445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 447698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setTransparentRegionHint(SurfaceID id, 448698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion) { 449698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setTransparentRegionHint(this, id, transparentRegion); 450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 452698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setAlpha(SurfaceID id, float alpha) { 453698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setAlpha(this, id, alpha); 454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 456698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setMatrix(SurfaceID id, float dsdx, float dtdx, 457698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdy, float dtdy) { 458698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setMatrix(this, id, dsdx, dtdx, dsdy, dtdy); 459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 461b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennisstatus_t SurfaceComposerClient::setOrientation(DisplayID dpy, 462b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis int orientation, uint32_t flags) 463b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis{ 464b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis return Composer::getInstance().setOrientation(orientation); 465b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis} 466b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis 467698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 468698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 469698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::getDisplayInfo( 470698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian DisplayID dpy, DisplayInfo* info) 471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 472698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (uint32_t(dpy)>=NUM_DISPLAY_MAX) 473698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_VALUE; 474698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 475698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile surface_flinger_cblk_t const * cblk = get_cblk(); 476698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile display_cblk_t const * dcblk = cblk->displays + dpy; 477698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 478698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->w = dcblk->w; 479698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->h = dcblk->h; 480698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->orientation = dcblk->orientation; 481698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->xdpi = dcblk->xdpi; 482698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->ydpi = dcblk->ydpi; 483698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->fps = dcblk->fps; 484698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->density = dcblk->density; 485698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getPixelFormatInfo(dcblk->format, &(info->pixelFormatInfo)); 486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 488698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getDisplayWidth(DisplayID dpy) 489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 490698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (uint32_t(dpy)>=NUM_DISPLAY_MAX) 491698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_VALUE; 492698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile surface_flinger_cblk_t const * cblk = get_cblk(); 493698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile display_cblk_t const * dcblk = cblk->displays + dpy; 494698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return dcblk->w; 495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 497698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getDisplayHeight(DisplayID dpy) 498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 499698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (uint32_t(dpy)>=NUM_DISPLAY_MAX) 500698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_VALUE; 501698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile surface_flinger_cblk_t const * cblk = get_cblk(); 502698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile display_cblk_t const * dcblk = cblk->displays + dpy; 503698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return dcblk->h; 504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 506698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getDisplayOrientation(DisplayID dpy) 507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 508698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (uint32_t(dpy)>=NUM_DISPLAY_MAX) 509698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_VALUE; 510698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile surface_flinger_cblk_t const * cblk = get_cblk(); 511698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile display_cblk_t const * dcblk = cblk->displays + dpy; 512698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return dcblk->orientation; 513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 515698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getNumberOfDisplays() 516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 517698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile surface_flinger_cblk_t const * cblk = get_cblk(); 518698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t connected = cblk->connected; 519698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian int n = 0; 520698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian while (connected) { 521698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (connected&1) n++; 522698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian connected >>= 1; 523698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 524698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return n; 525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 527698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 528698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 529698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::freezeDisplay(DisplayID dpy, uint32_t flags) 530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 531b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis // This has been made a no-op because it can cause Gralloc buffer deadlocks. 532b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis return NO_ERROR; 533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 535698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::unfreezeDisplay(DisplayID dpy, uint32_t flags) 536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 537b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis // This has been made a no-op because it can cause Gralloc buffer deadlocks. 538b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis return NO_ERROR; 539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 541d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian// ---------------------------------------------------------------------------- 54274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 54374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianScreenshotClient::ScreenshotClient() 54474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian : mWidth(0), mHeight(0), mFormat(PIXEL_FORMAT_NONE) { 54574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 54674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 54774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianstatus_t ScreenshotClient::update() { 54874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 54974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian if (s == NULL) return NO_INIT; 55074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian mHeap = 0; 55174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return s->captureScreen(0, &mHeap, 552bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian &mWidth, &mHeight, &mFormat, 0, 0, 553bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 0, -1UL); 55474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 55574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 55674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianstatus_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight) { 55774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 55874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian if (s == NULL) return NO_INIT; 55974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian mHeap = 0; 56074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return s->captureScreen(0, &mHeap, 561bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian &mWidth, &mHeight, &mFormat, reqWidth, reqHeight, 562bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 0, -1UL); 563bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian} 564bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 565bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopianstatus_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight, 566bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t minLayerZ, uint32_t maxLayerZ) { 567bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 568bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian if (s == NULL) return NO_INIT; 569bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian mHeap = 0; 570bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian return s->captureScreen(0, &mHeap, 571bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian &mWidth, &mHeight, &mFormat, reqWidth, reqHeight, 572bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian minLayerZ, maxLayerZ); 57374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 57474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 57574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid ScreenshotClient::release() { 57674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian mHeap = 0; 57774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 57874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 57974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid const* ScreenshotClient::getPixels() const { 58074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mHeap->getBase(); 58174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 58274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 58374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getWidth() const { 58474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mWidth; 58574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 58674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 58774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getHeight() const { 58874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mHeight; 58974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 59074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 59174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianPixelFormat ScreenshotClient::getFormat() const { 59274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mFormat; 59374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 59474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 59574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getStride() const { 59674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mWidth; 59774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 59874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 59974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopiansize_t ScreenshotClient::getSize() const { 60074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mHeap->getSize(); 60174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 60274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 60374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian// ---------------------------------------------------------------------------- 604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 605