SurfaceComposerClient.cpp revision 8b33f032327f8de0dcc0e6d0d43ed80f834b51f6
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "SurfaceComposerClient" 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h> 239cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <utils/Log.h> 24d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian#include <utils/Singleton.h> 25a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/SortedVector.h> 26a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/String8.h> 27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/threads.h> 289cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 29c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IMemory.h> 30a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <binder/IServiceManager.h> 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/DisplayInfo.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurface.h> 3590ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposer.h> 3690ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposerClient.h> 3790ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/SurfaceComposerClient.h> 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3941f673c9b3aac0d96e41c928845c39186d565212Mathias Agopian#include <private/gui/ComposerService.h> 4090ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <private/gui/LayerState.h> 4190ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <private/gui/SharedBufferStack.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>() { 50b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian const String16 name("SurfaceFlinger"); 51b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian while (getService(name, &mComposerService) != NO_ERROR) { 52b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian usleep(250000); 537e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian } 54b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian mServerCblkMemory = mComposerService->getCblk(); 55b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian mServerCblk = static_cast<surface_flinger_cblk_t volatile *>( 56b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian mServerCblkMemory->getBase()); 57b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 587e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 59b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopiansp<ISurfaceComposer> ComposerService::getComposerService() { 60b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian return ComposerService::getInstance().mComposerService; 61b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 627e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 63b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopiansurface_flinger_cblk_t const volatile * ComposerService::getControlBlock() { 64b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian return ComposerService::getInstance().mServerCblk; 65b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 667e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 677e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianstatic inline sp<ISurfaceComposer> getComposerService() { 687e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian return ComposerService::getComposerService(); 697e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian} 707e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 717e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianstatic inline surface_flinger_cblk_t const volatile * get_cblk() { 727e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian return ComposerService::getControlBlock(); 737e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian} 747e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 757e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian// --------------------------------------------------------------------------- 767e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 77698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// NOTE: this is NOT a member function (it's a friend defined with its 78698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// declaration). 79698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatic inline 80698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianint compare_type( const ComposerState& lhs, const ComposerState& rhs) { 81698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.client < rhs.client) return -1; 82698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.client > rhs.client) return 1; 83698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.state.surface < rhs.state.surface) return -1; 84698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.state.surface > rhs.state.surface) return 1; 85698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return 0; 86698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 87698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 887e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianclass Composer : public Singleton<Composer> 897e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian{ 90698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian friend class Singleton<Composer>; 917e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 92698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian mutable Mutex mLock; 93698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SortedVector<ComposerState> mStates; 94b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis int mOrientation; 9528378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis uint32_t mForceSynchronous; 967e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 97b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis Composer() : Singleton<Composer>(), 9828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mOrientation(ISurfaceComposer::eOrientationUnchanged), 9928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mForceSynchronous(0) 10028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis { } 101d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 10228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis void closeGlobalTransactionImpl(bool synchronous); 103d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 104698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* getLayerStateLocked( 105698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const sp<SurfaceComposerClient>& client, SurfaceID id); 106d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 107698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianpublic: 108d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 109698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setPosition(const sp<SurfaceComposerClient>& client, SurfaceID id, 11041b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian float x, float y); 111698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setSize(const sp<SurfaceComposerClient>& client, SurfaceID id, 112698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t w, uint32_t h); 113698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setLayer(const sp<SurfaceComposerClient>& client, SurfaceID id, 114698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian int32_t z); 115698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setFlags(const sp<SurfaceComposerClient>& client, SurfaceID id, 116698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t flags, uint32_t mask); 117698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setTransparentRegionHint( 118698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const sp<SurfaceComposerClient>& client, SurfaceID id, 119698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion); 120698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setAlpha(const sp<SurfaceComposerClient>& client, SurfaceID id, 121698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float alpha); 122698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setMatrix(const sp<SurfaceComposerClient>& client, SurfaceID id, 123698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdx, float dtdx, float dsdy, float dtdy); 124b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis status_t setOrientation(int orientation); 125f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis status_t setCrop(const sp<SurfaceComposerClient>& client, SurfaceID id, 126f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis const Rect& crop); 127d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 12828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis static void closeGlobalTransaction(bool synchronous) { 12928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis Composer::getInstance().closeGlobalTransactionImpl(synchronous); 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 131d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian}; 132d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 133d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(Composer); 134d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid Composer::closeGlobalTransactionImpl(bool synchronous) { 138698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian sp<ISurfaceComposer> sm(getComposerService()); 139698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 140698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Vector<ComposerState> transaction; 1418b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<DisplayState> displayTransaction; 14228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis uint32_t flags = 0; 143698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 144698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian { // scope for the lock 145698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 146698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian transaction = mStates; 147698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian mStates.clear(); 148b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis 1498b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian // FIXME: this should be the displays transaction state here 1508b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian DisplayState item; 1518b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian item.orientation = mOrientation; 1528b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian displayTransaction.add(item); 1538b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian 154b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis mOrientation = ISurfaceComposer::eOrientationUnchanged; 15528378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 15628378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis if (synchronous || mForceSynchronous) { 15728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis flags |= ISurfaceComposer::eSynchronous; 15828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis } 15928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mForceSynchronous = false; 160698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 161698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 1628b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian sm->setTransactionState(transaction, displayTransaction, flags); 163698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 164698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 165698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianlayer_state_t* Composer::getLayerStateLocked( 166698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const sp<SurfaceComposerClient>& client, SurfaceID id) { 167698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 168698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ComposerState s; 169698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s.client = client->mClient; 170698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s.state.surface = id; 171698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 172698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ssize_t index = mStates.indexOf(s); 173698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (index < 0) { 174698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian // we don't have it, add an initialized layer_state to our list 175698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian index = mStates.add(s); 176698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 177698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 178698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ComposerState* const out = mStates.editArray(); 179698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return &(out[index].state); 180698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 181698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 182698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setPosition(const sp<SurfaceComposerClient>& client, 18341b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian SurfaceID id, float x, float y) { 184698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 185698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 186698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 187698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 188698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::ePositionChanged; 189698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->x = x; 190698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->y = y; 191698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 192698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 193698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 194698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setSize(const sp<SurfaceComposerClient>& client, 195698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, uint32_t w, uint32_t h) { 196698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 197698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 198698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 199698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 200698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eSizeChanged; 201698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->w = w; 202698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->h = h; 20328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 20428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis // Resizing a surface makes the transaction synchronous. 20528378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mForceSynchronous = true; 20628378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 207698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 208698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 209698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 210698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setLayer(const sp<SurfaceComposerClient>& client, 211698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, int32_t z) { 212698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 213698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 214698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 215698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 216698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eLayerChanged; 217698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->z = z; 218698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 219698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 220698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 221698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setFlags(const sp<SurfaceComposerClient>& client, 222698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, uint32_t flags, 223698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t mask) { 224698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 225698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 226698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 227698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 228698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eVisibilityChanged; 229698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->flags &= ~mask; 230698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->flags |= (flags & mask); 231698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->mask |= mask; 232698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 233698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 234698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 235698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setTransparentRegionHint( 236698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const sp<SurfaceComposerClient>& client, SurfaceID id, 237698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion) { 238698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 239698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 240698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 241698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 242698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eTransparentRegionChanged; 243698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->transparentRegion = transparentRegion; 244698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 245698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 246698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 247698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setAlpha(const sp<SurfaceComposerClient>& client, 248698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, float alpha) { 249698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 250698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 251698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 252698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 253698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eAlphaChanged; 254698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->alpha = alpha; 255698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 256698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 257698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 258698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setMatrix(const sp<SurfaceComposerClient>& client, 259698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, float dsdx, float dtdx, 260698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdy, float dtdy) { 261698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 262698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 263698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 264698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 265698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eMatrixChanged; 266698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t::matrix22_t matrix; 267698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dsdx = dsdx; 268698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dtdx = dtdx; 269698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dsdy = dsdy; 270698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dtdy = dtdy; 271698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->matrix = matrix; 272698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 275b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennisstatus_t Composer::setOrientation(int orientation) { 276b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis Mutex::Autolock _l(mLock); 277b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis mOrientation = orientation; 27828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 27928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis // Changing the orientation makes the transaction synchronous. 28028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mForceSynchronous = true; 28128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 282b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis return NO_ERROR; 283b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis} 284b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis 285f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatus_t Composer::setCrop(const sp<SurfaceComposerClient>& client, 286f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis SurfaceID id, const Rect& crop) { 287f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis Mutex::Autolock _l(mLock); 288f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis layer_state_t* s = getLayerStateLocked(client, id); 289f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis if (!s) 290f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return BAD_INDEX; 291f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis s->what |= ISurfaceComposer::eCropChanged; 292f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis s->crop = crop; 293f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return NO_ERROR; 294f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 295f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 296698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// --------------------------------------------------------------------------- 297698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurfaceComposerClient::SurfaceComposerClient() 299698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian : mStatus(NO_INIT), mComposer(Composer::getInstance()) 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 303698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::onFirstRef() { 304dd3423c6247965bf67ea30c75e484a6f5d72b1a2Mathias Agopian sp<ISurfaceComposer> sm(getComposerService()); 305d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (sm != 0) { 3067e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian sp<ISurfaceComposerClient> conn = sm->createConnection(); 307d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (conn != 0) { 308d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mClient = conn; 309d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mStatus = NO_ERROR; 310d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 314698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias AgopianSurfaceComposerClient::~SurfaceComposerClient() { 315d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian dispose(); 316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 318698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::initCheck() const { 319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 322698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopiansp<IBinder> SurfaceComposerClient::connection() const { 323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (mClient != 0) ? mClient->asBinder() : 0; 324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 326d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianstatus_t SurfaceComposerClient::linkToComposerDeath( 327d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian const sp<IBinder::DeathRecipient>& recipient, 328698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian void* cookie, uint32_t flags) { 329d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian sp<ISurfaceComposer> sm(getComposerService()); 330d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian return sm->asBinder()->linkToDeath(recipient, cookie, flags); 331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 333698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::dispose() { 334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this can be called more than once. 3357e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian sp<ISurfaceComposerClient> client; 336d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Mutex::Autolock _lm(mLock); 337d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (mClient != 0) { 338d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian client = mClient; // hold ref while lock is held 339d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mClient.clear(); 340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 341d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mStatus = NO_INIT; 342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface( 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayID display, 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t w, 347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t h, 348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PixelFormat format, 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags) 350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 351285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian String8 name; 352285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian const size_t SIZE = 128; 353285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian char buffer[SIZE]; 354285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian snprintf(buffer, SIZE, "<pid_%d>", getpid()); 355285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian name.append(buffer); 356285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian 3570ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian return SurfaceComposerClient::createSurface(name, display, 358285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian w, h, format, flags); 359285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian} 360285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian 361285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface( 362285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian const String8& name, 363285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian DisplayID display, 364285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t w, 365285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t h, 366285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian PixelFormat format, 367285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t flags) 368285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian{ 36901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian sp<SurfaceControl> result; 370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus == NO_ERROR) { 3717e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian ISurfaceComposerClient::surface_data_t data; 3720ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian sp<ISurface> surface = mClient->createSurface(&data, name, 373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project display, w, h, format, flags); 374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface != 0) { 375c10d9d90b2088a3304076e0dc4bf05cdbb5d45abMathias Agopian result = new SurfaceControl(this, surface, data); 376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return result; 379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 381698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::destroySurface(SurfaceID sid) { 382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus != NO_ERROR) 383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = mClient->destroySurface(sid); 385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return err; 386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 388698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianinline Composer& SurfaceComposerClient::getComposer() { 389698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return mComposer; 390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 392698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 394698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::openGlobalTransaction() { 395698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian // Currently a no-op 396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 39828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid SurfaceComposerClient::closeGlobalTransaction(bool synchronous) { 39928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis Composer::closeGlobalTransaction(synchronous); 400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 402698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 404f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatus_t SurfaceComposerClient::setCrop(SurfaceID id, const Rect& crop) { 405f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return getComposer().setCrop(this, id, crop); 406f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 407f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 40841b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopianstatus_t SurfaceComposerClient::setPosition(SurfaceID id, float x, float y) { 409698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setPosition(this, id, x, y); 410698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 412698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setSize(SurfaceID id, uint32_t w, uint32_t h) { 413698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setSize(this, id, w, h); 414698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 416698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setLayer(SurfaceID id, int32_t z) { 417698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setLayer(this, id, z); 418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 420698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::hide(SurfaceID id) { 421698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, 422698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ISurfaceComposer::eLayerHidden, 423698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ISurfaceComposer::eLayerHidden); 424698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 426698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::show(SurfaceID id, int32_t) { 427698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, 428698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 0, 429698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ISurfaceComposer::eLayerHidden); 430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 432698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setFlags(SurfaceID id, uint32_t flags, 433698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t mask) { 434698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, flags, mask); 435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 437698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setTransparentRegionHint(SurfaceID id, 438698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion) { 439698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setTransparentRegionHint(this, id, transparentRegion); 440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 442698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setAlpha(SurfaceID id, float alpha) { 443698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setAlpha(this, id, alpha); 444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 446698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setMatrix(SurfaceID id, float dsdx, float dtdx, 447698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdy, float dtdy) { 448698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setMatrix(this, id, dsdx, dtdx, dsdy, dtdy); 449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 451b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennisstatus_t SurfaceComposerClient::setOrientation(DisplayID dpy, 452b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis int orientation, uint32_t flags) 453b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis{ 454b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis return Composer::getInstance().setOrientation(orientation); 455b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis} 456b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis 457698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 458698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 459698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::getDisplayInfo( 460698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian DisplayID dpy, DisplayInfo* info) 461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 462698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (uint32_t(dpy)>=NUM_DISPLAY_MAX) 463698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_VALUE; 464698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 465698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile surface_flinger_cblk_t const * cblk = get_cblk(); 466698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile display_cblk_t const * dcblk = cblk->displays + dpy; 467698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 468698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->w = dcblk->w; 469698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->h = dcblk->h; 470698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->orientation = dcblk->orientation; 471698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->xdpi = dcblk->xdpi; 472698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->ydpi = dcblk->ydpi; 473698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->fps = dcblk->fps; 474698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->density = dcblk->density; 475698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getPixelFormatInfo(dcblk->format, &(info->pixelFormatInfo)); 476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 478698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getDisplayWidth(DisplayID dpy) 479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 480698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (uint32_t(dpy)>=NUM_DISPLAY_MAX) 481698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_VALUE; 482698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile surface_flinger_cblk_t const * cblk = get_cblk(); 483698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile display_cblk_t const * dcblk = cblk->displays + dpy; 484698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return dcblk->w; 485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 487698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getDisplayHeight(DisplayID dpy) 488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 489698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (uint32_t(dpy)>=NUM_DISPLAY_MAX) 490698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_VALUE; 491698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile surface_flinger_cblk_t const * cblk = get_cblk(); 492698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile display_cblk_t const * dcblk = cblk->displays + dpy; 493698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return dcblk->h; 494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 496698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getDisplayOrientation(DisplayID dpy) 497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 498698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (uint32_t(dpy)>=NUM_DISPLAY_MAX) 499698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_VALUE; 500698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile surface_flinger_cblk_t const * cblk = get_cblk(); 501698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile display_cblk_t const * dcblk = cblk->displays + dpy; 502698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return dcblk->orientation; 503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 505698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getNumberOfDisplays() 506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 507698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile surface_flinger_cblk_t const * cblk = get_cblk(); 508698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t connected = cblk->connected; 509698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian int n = 0; 510698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian while (connected) { 511698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (connected&1) n++; 512698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian connected >>= 1; 513698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 514698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return n; 515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 517698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 518698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 51974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianScreenshotClient::ScreenshotClient() 52074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian : mWidth(0), mHeight(0), mFormat(PIXEL_FORMAT_NONE) { 52174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 52274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 52374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianstatus_t ScreenshotClient::update() { 52474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 52574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian if (s == NULL) return NO_INIT; 52674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian mHeap = 0; 52774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return s->captureScreen(0, &mHeap, 528bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian &mWidth, &mHeight, &mFormat, 0, 0, 529bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 0, -1UL); 53074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 53174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 53274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianstatus_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight) { 53374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 53474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian if (s == NULL) return NO_INIT; 53574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian mHeap = 0; 53674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return s->captureScreen(0, &mHeap, 537bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian &mWidth, &mHeight, &mFormat, reqWidth, reqHeight, 538bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 0, -1UL); 539bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian} 540bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 541bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopianstatus_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight, 542bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t minLayerZ, uint32_t maxLayerZ) { 543bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 544bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian if (s == NULL) return NO_INIT; 545bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian mHeap = 0; 546bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian return s->captureScreen(0, &mHeap, 547bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian &mWidth, &mHeight, &mFormat, reqWidth, reqHeight, 548bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian minLayerZ, maxLayerZ); 54974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 55074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 55174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid ScreenshotClient::release() { 55274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian mHeap = 0; 55374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 55474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 55574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid const* ScreenshotClient::getPixels() const { 55674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mHeap->getBase(); 55774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 55874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 55974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getWidth() const { 56074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mWidth; 56174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 56274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 56374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getHeight() const { 56474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mHeight; 56574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 56674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 56774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianPixelFormat ScreenshotClient::getFormat() const { 56874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mFormat; 56974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 57074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 57174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getStride() const { 57274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mWidth; 57374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 57474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 57574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopiansize_t ScreenshotClient::getSize() const { 57674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mHeap->getSize(); 57774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 57874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 57974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian// ---------------------------------------------------------------------------- 580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 581