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> 24a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/SortedVector.h> 25a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/String8.h> 26a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/threads.h> 279cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 28a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <binder/IServiceManager.h> 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright#include <system/graphics.h> 3128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/DisplayInfo.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34673134ed213458e8d92920a9819f7b714947e211Robert Carr#include <gui/BufferItemConsumer.h> 35abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian#include <gui/CpuConsumer.h> 36e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/IGraphicBufferProducer.h> 3790ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposer.h> 3890ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposerClient.h> 394cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr#include <gui/LayerState.h> 400d48072f6047140119ff194c1194ce402fca2c0bRobert Carr#include <gui/Surface.h> 4190ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/SurfaceComposerClient.h> 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 4341f673c9b3aac0d96e41c928845c39186d565212Mathias Agopian#include <private/gui/ComposerService.h> 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 46fd997e0969100418b4df8b8d97d21d497afa76c3Peiyong Lin 47fd997e0969100418b4df8b8d97d21d497afa76c3Peiyong Linusing ui::ColorMode; 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 50b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(ComposerService); 517e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 52b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianComposerService::ComposerService() 53b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian: Singleton<ComposerService>() { 546652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden Mutex::Autolock _l(mLock); 556652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden connectLocked(); 566652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden} 576652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden 586652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFaddenvoid ComposerService::connectLocked() { 59b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian const String16 name("SurfaceFlinger"); 60b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian while (getService(name, &mComposerService) != NO_ERROR) { 61b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian usleep(250000); 627e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian } 636652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden assert(mComposerService != NULL); 646652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden 656652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden // Create the death listener. 666652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden class DeathObserver : public IBinder::DeathRecipient { 676652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ComposerService& mComposerService; 686652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden virtual void binderDied(const wp<IBinder>& who) { 696652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ALOGW("ComposerService remote (surfaceflinger) died [%p]", 706652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden who.unsafe_get()); 716652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mComposerService.composerServiceDied(); 726652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden } 736652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden public: 74e2347b7953f70232541bdc1b392230d6231aaeb9Chih-Hung Hsieh explicit DeathObserver(ComposerService& mgr) : mComposerService(mgr) { } 756652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden }; 766652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden 776652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this)); 782ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver); 796652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden} 806652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden 816652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden/*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() { 826652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ComposerService& instance = ComposerService::getInstance(); 836652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden Mutex::Autolock _l(instance.mLock); 846652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden if (instance.mComposerService == NULL) { 856652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ComposerService::getInstance().connectLocked(); 866652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden assert(instance.mComposerService != NULL); 876652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ALOGD("ComposerService reconnected"); 886652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden } 896652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden return instance.mComposerService; 90b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 917e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 926652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFaddenvoid ComposerService::composerServiceDied() 936652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden{ 946652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden Mutex::Autolock _l(mLock); 956652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mComposerService = NULL; 966652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mDeathObserver = NULL; 97b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 987e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 997e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian// --------------------------------------------------------------------------- 1007e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 1014cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction::Transaction(const Transaction& other) : 1024cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mForceSynchronous(other.mForceSynchronous), 1034cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mTransactionNestCount(other.mTransactionNestCount), 1042713c30843816d3511b39b85a2c268a2b7682047Dan Stoza mAnimation(other.mAnimation), 1052713c30843816d3511b39b85a2c268a2b7682047Dan Stoza mEarlyWakeup(other.mEarlyWakeup) { 1064cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mDisplayStates = other.mDisplayStates; 1074cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mComposerStates = other.mComposerStates; 108698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 109698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 1102c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::merge(Transaction&& other) { 1118e3fe5d6a78d92e0bcbd90ca98cf7b3f9de7512dchaviw for (auto const& kv : other.mComposerStates) { 1128e3fe5d6a78d92e0bcbd90ca98cf7b3f9de7512dchaviw if (mComposerStates.count(kv.first) == 0) { 1138e3fe5d6a78d92e0bcbd90ca98cf7b3f9de7512dchaviw mComposerStates[kv.first] = kv.second; 1142c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert Carr } else { 1158e3fe5d6a78d92e0bcbd90ca98cf7b3f9de7512dchaviw mComposerStates[kv.first].state.merge(kv.second.state); 1162c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert Carr } 1172c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert Carr } 1182c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert Carr other.mComposerStates.clear(); 1192c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert Carr 1202c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert Carr for (auto const& state : other.mDisplayStates) { 1212c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert Carr ssize_t index = mDisplayStates.indexOf(state); 1222c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert Carr if (index < 0) { 1232c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert Carr mDisplayStates.add(state); 1242c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert Carr } else { 1252c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert Carr mDisplayStates.editItemAt(static_cast<size_t>(index)).merge(state); 1262c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert Carr } 1272c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert Carr } 1282c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert Carr other.mDisplayStates.clear(); 1292c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert Carr 1302c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert Carr return *this; 1312c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert Carr} 1322c5f6d2257075c8b5ced78b07ed8b2c2323f0df2Robert Carr 1334cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carrstatus_t SurfaceComposerClient::Transaction::apply(bool synchronous) { 1344cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr if (mStatus != NO_ERROR) { 1354cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return mStatus; 1364cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr } 137e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1384cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr sp<ISurfaceComposer> sf(ComposerService::getComposerService()); 139d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 1404cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr Vector<ComposerState> composerStates; 1414cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr Vector<DisplayState> displayStates; 1424cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr uint32_t flags = 0; 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1444cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mForceSynchronous |= synchronous; 145e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1468e3fe5d6a78d92e0bcbd90ca98cf7b3f9de7512dchaviw for (auto const& kv : mComposerStates){ 1478e3fe5d6a78d92e0bcbd90ca98cf7b3f9de7512dchaviw composerStates.add(kv.second); 1488e3fe5d6a78d92e0bcbd90ca98cf7b3f9de7512dchaviw } 1498e3fe5d6a78d92e0bcbd90ca98cf7b3f9de7512dchaviw 1504cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mComposerStates.clear(); 1516c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall 1524cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr displayStates = mDisplayStates; 1534cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mDisplayStates.clear(); 1549d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown 1554cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr if (mForceSynchronous) { 1564cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr flags |= ISurfaceComposer::eSynchronous; 1574cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr } 1584cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr if (mAnimation) { 1594cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr flags |= ISurfaceComposer::eAnimation; 160f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown } 1612713c30843816d3511b39b85a2c268a2b7682047Dan Stoza if (mEarlyWakeup) { 1622713c30843816d3511b39b85a2c268a2b7682047Dan Stoza flags |= ISurfaceComposer::eEarlyWakeup; 1632713c30843816d3511b39b85a2c268a2b7682047Dan Stoza } 1648b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian 1654cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mForceSynchronous = false; 1664cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mAnimation = false; 1672713c30843816d3511b39b85a2c268a2b7682047Dan Stoza mEarlyWakeup = false; 16828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 1694cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr sf->setTransactionState(composerStates, displayStates, flags); 1704cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = NO_ERROR; 1714cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return NO_ERROR; 1724cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr} 1732d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis 1744cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr// --------------------------------------------------------------------------- 175698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 1764cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carrsp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName, bool secure) { 1774cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return ComposerService::getComposerService()->createDisplay(displayName, 1784cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr secure); 179698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 180698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 1814cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carrvoid SurfaceComposerClient::destroyDisplay(const sp<IBinder>& display) { 1824cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return ComposerService::getComposerService()->destroyDisplay(display); 183c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 184c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 1854cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carrsp<IBinder> SurfaceComposerClient::getBuiltInDisplay(int32_t id) { 1864cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return ComposerService::getComposerService()->getBuiltInDisplay(id); 187c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 188c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 1894cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carrvoid SurfaceComposerClient::Transaction::setAnimationTransaction() { 1902d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis mAnimation = true; 1912d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis} 1922d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis 1932713c30843816d3511b39b85a2c268a2b7682047Dan Stozavoid SurfaceComposerClient::Transaction::setEarlyWakeup() { 1942713c30843816d3511b39b85a2c268a2b7682047Dan Stoza mEarlyWakeup = true; 1952713c30843816d3511b39b85a2c268a2b7682047Dan Stoza} 1962713c30843816d3511b39b85a2c268a2b7682047Dan Stoza 197763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviwlayer_state_t* SurfaceComposerClient::Transaction::getLayerState(const sp<SurfaceControl>& sc) { 1988e3fe5d6a78d92e0bcbd90ca98cf7b3f9de7512dchaviw if (mComposerStates.count(sc) == 0) { 199698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian // we don't have it, add an initialized layer_state to our list 2008e3fe5d6a78d92e0bcbd90ca98cf7b3f9de7512dchaviw ComposerState s; 2018e3fe5d6a78d92e0bcbd90ca98cf7b3f9de7512dchaviw s.client = sc->getClient()->mClient; 2028e3fe5d6a78d92e0bcbd90ca98cf7b3f9de7512dchaviw s.state.surface = sc->getHandle(); 2038e3fe5d6a78d92e0bcbd90ca98cf7b3f9de7512dchaviw mComposerStates[sc] = s; 204698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 205698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 2068e3fe5d6a78d92e0bcbd90ca98cf7b3f9de7512dchaviw return &(mComposerStates[sc].state); 207698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 208698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 2094cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setPosition( 2104cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc, float x, float y) { 211763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 2124cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr if (!s) { 2134cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 2144cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 2154cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr } 2163165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::ePositionChanged; 217698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->x = x; 218698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->y = y; 2194cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 220698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 221698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 2224cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::show( 2234cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc) { 2244cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return setFlags(sc, 0, layer_state_t::eLayerHidden); 2254cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr} 2264cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr 2274cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::hide( 2284cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc) { 2294cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return setFlags(sc, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden); 2304cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr} 2314cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr 2324cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setSize( 2334cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc, uint32_t w, uint32_t h) { 234763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 2354cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr if (!s) { 2364cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 2374cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 2384cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr } 2393165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eSizeChanged; 240698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->w = w; 241698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->h = h; 24228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 243092123cf5abe88c82deb89bb0188e1cc8d8338beJorim Jaggi // Resizing a surface makes the transaction synchronous. 244092123cf5abe88c82deb89bb0188e1cc8d8338beJorim Jaggi mForceSynchronous = true; 245092123cf5abe88c82deb89bb0188e1cc8d8338beJorim Jaggi 2464cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 247698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 248698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 2494cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLayer( 2504cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc, int32_t z) { 251763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 2524cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr if (!s) { 2534cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 2544cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 2554cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr } 2563165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eLayerChanged; 257698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->z = z; 2584cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 259698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 260698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 2614cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setRelativeLayer(const sp<SurfaceControl>& sc, const sp<IBinder>& relativeTo, 262db66e627ad8904491e384c64f82fc77a939b9705Robert Carr int32_t z) { 263763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 264db66e627ad8904491e384c64f82fc77a939b9705Robert Carr if (!s) { 2654cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 266db66e627ad8904491e384c64f82fc77a939b9705Robert Carr } 267db66e627ad8904491e384c64f82fc77a939b9705Robert Carr s->what |= layer_state_t::eRelativeLayerChanged; 268db66e627ad8904491e384c64f82fc77a939b9705Robert Carr s->relativeLayerHandle = relativeTo; 269db66e627ad8904491e384c64f82fc77a939b9705Robert Carr s->z = z; 2704cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 271db66e627ad8904491e384c64f82fc77a939b9705Robert Carr} 272db66e627ad8904491e384c64f82fc77a939b9705Robert Carr 2734cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFlags( 2744cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc, uint32_t flags, 275698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t mask) { 276763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 2774cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr if (!s) { 2784cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 2794cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 2804cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr } 28153390e1e8c33ebee5bb8100e846f5263ba05ff73Pablo Ceballos if ((mask & layer_state_t::eLayerOpaque) || 28253390e1e8c33ebee5bb8100e846f5263ba05ff73Pablo Ceballos (mask & layer_state_t::eLayerHidden) || 28353390e1e8c33ebee5bb8100e846f5263ba05ff73Pablo Ceballos (mask & layer_state_t::eLayerSecure)) { 284231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza s->what |= layer_state_t::eFlagsChanged; 2854125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden } 286698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->flags &= ~mask; 287698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->flags |= (flags & mask); 288698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->mask |= mask; 2894cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 290698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 291698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 2924cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setTransparentRegionHint( 2934cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc, 294698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion) { 295763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 2964cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr if (!s) { 2974cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 2984cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 2994cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr } 3003165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eTransparentRegionChanged; 301698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->transparentRegion = transparentRegion; 3024cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 303698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 304698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 3054cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setAlpha( 3064cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc, float alpha) { 307763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 3084cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr if (!s) { 3094cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 3104cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 3114cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr } 3123165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eAlphaChanged; 313698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->alpha = alpha; 3144cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 31513fdc49516d17f41e64e62e73c313b0928bf13ccchaviw} 31613fdc49516d17f41e64e62e73c313b0928bf13ccchaviw 3174cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLayerStack( 3184cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc, uint32_t layerStack) { 319763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 3204cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr if (!s) { 3214cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 3224cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 3234cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr } 3243165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eLayerStackChanged; 3258785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian s->layerStack = layerStack; 3264cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 3278785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian} 3288785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian 3294cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setMatrix( 3304cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc, float dsdx, float dtdx, 331cb6e1e385edd44fbc68718e792b7180b1015d438Robert Carr float dtdy, float dsdy) { 332763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 3334cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr if (!s) { 3344cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 3354cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 3364cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr } 3373165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eMatrixChanged; 338698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t::matrix22_t matrix; 339698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dsdx = dsdx; 340698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dtdx = dtdx; 341698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dsdy = dsdy; 342698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dtdy = dtdy; 343698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->matrix = matrix; 3444cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3474cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setCrop( 3484cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc, const Rect& crop) { 349763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 3504cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr if (!s) { 3514cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 3524cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 3534cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr } 3543165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eCropChanged; 355f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis s->crop = crop; 3564cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 357f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 358f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 3594cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFinalCrop(const sp<SurfaceControl>& sc, const Rect& crop) { 360763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 361acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!s) { 3624cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 3634cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 364acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 365acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos s->what |= layer_state_t::eFinalCropChanged; 366acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos s->finalCrop = crop; 3674cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 368acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 369acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 3704cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::deferTransactionUntil( 3714cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc, 3727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza const sp<IBinder>& handle, uint64_t frameNumber) { 373763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 3747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!s) { 3754cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 3764cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 3777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 3787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza s->what |= layer_state_t::eDeferTransaction; 3790d48072f6047140119ff194c1194ce402fca2c0bRobert Carr s->barrierHandle = handle; 3800d48072f6047140119ff194c1194ce402fca2c0bRobert Carr s->frameNumber = frameNumber; 3814cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 3820d48072f6047140119ff194c1194ce402fca2c0bRobert Carr} 3830d48072f6047140119ff194c1194ce402fca2c0bRobert Carr 3844cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::deferTransactionUntil( 3854cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc, 3860d48072f6047140119ff194c1194ce402fca2c0bRobert Carr const sp<Surface>& barrierSurface, uint64_t frameNumber) { 387763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 3880d48072f6047140119ff194c1194ce402fca2c0bRobert Carr if (!s) { 3894cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 3904cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 3910d48072f6047140119ff194c1194ce402fca2c0bRobert Carr } 3920d48072f6047140119ff194c1194ce402fca2c0bRobert Carr s->what |= layer_state_t::eDeferTransaction; 3930d48072f6047140119ff194c1194ce402fca2c0bRobert Carr s->barrierGbp = barrierSurface->getIGraphicBufferProducer(); 3947dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza s->frameNumber = frameNumber; 3954cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 3967dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 3977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 3984cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::reparentChildren( 3994cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc, 4001db73f66624e7d151710483dd58e03eed672f064Robert Carr const sp<IBinder>& newParentHandle) { 401763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 4021db73f66624e7d151710483dd58e03eed672f064Robert Carr if (!s) { 4034cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 4044cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 4051db73f66624e7d151710483dd58e03eed672f064Robert Carr } 4061db73f66624e7d151710483dd58e03eed672f064Robert Carr s->what |= layer_state_t::eReparentChildren; 4071db73f66624e7d151710483dd58e03eed672f064Robert Carr s->reparentHandle = newParentHandle; 4084cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 4091db73f66624e7d151710483dd58e03eed672f064Robert Carr} 4101db73f66624e7d151710483dd58e03eed672f064Robert Carr 4114cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::reparent( 4124cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc, 413f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw const sp<IBinder>& newParentHandle) { 414763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 4150617894190ea0c3ee50889bee1d4df0f369b0761chaviw if (!s) { 4164cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 4174cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 4180617894190ea0c3ee50889bee1d4df0f369b0761chaviw } 419f1961f713de2b3f54c8ce7653964b969e1a02bc8chaviw s->what |= layer_state_t::eReparent; 4200617894190ea0c3ee50889bee1d4df0f369b0761chaviw s->parentHandleForChild = newParentHandle; 4214cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 4224cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr} 4234cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr 4244cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColor( 4254cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc, 4264cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const half3& color) { 427763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 4284cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr if (!s) { 4294cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 4304cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 4314cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr } 4324cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr s->what |= layer_state_t::eColorChanged; 4334cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr s->color = color; 4344cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 4350617894190ea0c3ee50889bee1d4df0f369b0761chaviw} 4360617894190ea0c3ee50889bee1d4df0f369b0761chaviw 4374cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::detachChildren( 4384cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc) { 439763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 4409524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr if (!s) { 4414cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 4429524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr } 4439524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr s->what |= layer_state_t::eDetachChildren; 4444cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 4459524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr} 4469524cb3b37a91b5741790c77ff24fd825b02bca7Robert Carr 4474cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setOverrideScalingMode( 4484cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc, int32_t overrideScalingMode) { 449763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 450c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr if (!s) { 4514cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 4524cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 453c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr } 454c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 455c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr switch (overrideScalingMode) { 456c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr case NATIVE_WINDOW_SCALING_MODE_FREEZE: 457c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW: 458c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP: 459c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr case NATIVE_WINDOW_SCALING_MODE_NO_SCALE_CROP: 460c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr case -1: 461c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr break; 462c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr default: 463c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr ALOGE("unknown scaling mode: %d", 464c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr overrideScalingMode); 4654cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_VALUE; 4664cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 467c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr } 468c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 469c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr s->what |= layer_state_t::eOverrideScalingModeChanged; 470c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr s->overrideScalingMode = overrideScalingMode; 4714cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 472c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr} 473c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 4744cdc58f6840d15b4952149d2b345ec1f97d505bcRobert CarrSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setGeometryAppliesWithResize( 4754cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<SurfaceControl>& sc) { 476763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 47782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr if (!s) { 4784cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr mStatus = BAD_INDEX; 4794cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 48082364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr } 48199e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr s->what |= layer_state_t::eGeometryAppliesWithResize; 4824cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return *this; 48382364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr} 48482364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr 485ca27f2500cff74ae1e08b3ae06f18e9b3414ffb7chaviwSurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::destroySurface( 486ca27f2500cff74ae1e08b3ae06f18e9b3414ffb7chaviw const sp<SurfaceControl>& sc) { 487763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw layer_state_t* s = getLayerState(sc); 488ca27f2500cff74ae1e08b3ae06f18e9b3414ffb7chaviw if (!s) { 489ca27f2500cff74ae1e08b3ae06f18e9b3414ffb7chaviw mStatus = BAD_INDEX; 490ca27f2500cff74ae1e08b3ae06f18e9b3414ffb7chaviw return *this; 491ca27f2500cff74ae1e08b3ae06f18e9b3414ffb7chaviw } 492ca27f2500cff74ae1e08b3ae06f18e9b3414ffb7chaviw s->what |= layer_state_t::eDestroySurface; 493ca27f2500cff74ae1e08b3ae06f18e9b3414ffb7chaviw return *this; 494ca27f2500cff74ae1e08b3ae06f18e9b3414ffb7chaviw} 495ca27f2500cff74ae1e08b3ae06f18e9b3414ffb7chaviw 496698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// --------------------------------------------------------------------------- 497698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 498763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviwDisplayState& SurfaceComposerClient::Transaction::getDisplayState(const sp<IBinder>& token) { 499e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState s; 500e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.token = token; 501e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian ssize_t index = mDisplayStates.indexOf(s); 502e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (index < 0) { 503e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian // we don't have it, add an initialized layer_state to our list 504e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.what = 0; 505e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian index = mDisplayStates.add(s); 506e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 507d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza return mDisplayStates.editItemAt(static_cast<size_t>(index)); 508e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 509e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 5104cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carrstatus_t SurfaceComposerClient::Transaction::setDisplaySurface(const sp<IBinder>& token, 5114cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr const sp<IGraphicBufferProducer>& bufferProducer) { 512eddbef88cf78deb9b08a6cad2c9cb67e4ddcea0dPablo Ceballos if (bufferProducer.get() != nullptr) { 513eddbef88cf78deb9b08a6cad2c9cb67e4ddcea0dPablo Ceballos // Make sure that composition can never be stalled by a virtual display 514eddbef88cf78deb9b08a6cad2c9cb67e4ddcea0dPablo Ceballos // consumer that isn't processing buffers fast enough. 515eddbef88cf78deb9b08a6cad2c9cb67e4ddcea0dPablo Ceballos status_t err = bufferProducer->setAsyncMode(true); 516eddbef88cf78deb9b08a6cad2c9cb67e4ddcea0dPablo Ceballos if (err != NO_ERROR) { 517eddbef88cf78deb9b08a6cad2c9cb67e4ddcea0dPablo Ceballos ALOGE("Composer::setDisplaySurface Failed to enable async mode on the " 518eddbef88cf78deb9b08a6cad2c9cb67e4ddcea0dPablo Ceballos "BufferQueue. This BufferQueue cannot be used for virtual " 519eddbef88cf78deb9b08a6cad2c9cb67e4ddcea0dPablo Ceballos "display. (%d)", err); 520eddbef88cf78deb9b08a6cad2c9cb67e4ddcea0dPablo Ceballos return err; 521eddbef88cf78deb9b08a6cad2c9cb67e4ddcea0dPablo Ceballos } 5221aad24c0c47598b0cce5ea2cadd5c2a5f3c5196dPablo Ceballos } 523763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw DisplayState& s(getDisplayState(token)); 5242adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden s.surface = bufferProducer; 525e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.what |= DisplayState::eSurfaceChanged; 5261aad24c0c47598b0cce5ea2cadd5c2a5f3c5196dPablo Ceballos return NO_ERROR; 527e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 528e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 5294cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carrvoid SurfaceComposerClient::Transaction::setDisplayLayerStack(const sp<IBinder>& token, 530e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian uint32_t layerStack) { 531763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw DisplayState& s(getDisplayState(token)); 532e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.layerStack = layerStack; 533e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.what |= DisplayState::eLayerStackChanged; 534e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 535e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 5364cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carrvoid SurfaceComposerClient::Transaction::setDisplayProjection(const sp<IBinder>& token, 53700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian uint32_t orientation, 53800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& layerStackRect, 53900e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& displayRect) { 540763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw DisplayState& s(getDisplayState(token)); 541e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.orientation = orientation; 54200e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian s.viewport = layerStackRect; 54300e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian s.frame = displayRect; 54400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian s.what |= DisplayState::eDisplayProjectionChanged; 545092123cf5abe88c82deb89bb0188e1cc8d8338beJorim Jaggi mForceSynchronous = true; // TODO: do we actually still need this? 546e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 547e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 5484cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carrvoid SurfaceComposerClient::Transaction::setDisplaySize(const sp<IBinder>& token, uint32_t width, uint32_t height) { 549763ef57459aa9f10f3587581b119fe8d4ece3cd3chaviw DisplayState& s(getDisplayState(token)); 5501f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright s.width = width; 5511f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright s.height = height; 5521f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright s.what |= DisplayState::eDisplaySizeChanged; 5531f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright} 5541f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright 555e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian// --------------------------------------------------------------------------- 556e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurfaceComposerClient::SurfaceComposerClient() 5584cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr : mStatus(NO_INIT) 559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5621db73f66624e7d151710483dd58e03eed672f064Robert CarrSurfaceComposerClient::SurfaceComposerClient(const sp<IGraphicBufferProducer>& root) 5634cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr : mStatus(NO_INIT), mParent(root) 5641db73f66624e7d151710483dd58e03eed672f064Robert Carr{ 5651db73f66624e7d151710483dd58e03eed672f064Robert Carr} 5661db73f66624e7d151710483dd58e03eed672f064Robert Carr 567f3cf4bcfa2c558f03e178f7044d3cb12fa0e73edJorim JaggiSurfaceComposerClient::SurfaceComposerClient(const sp<ISurfaceComposerClient>& client) 568f3cf4bcfa2c558f03e178f7044d3cb12fa0e73edJorim Jaggi : mStatus(NO_ERROR), mClient(client) 569f3cf4bcfa2c558f03e178f7044d3cb12fa0e73edJorim Jaggi{ 570f3cf4bcfa2c558f03e178f7044d3cb12fa0e73edJorim Jaggi} 571f3cf4bcfa2c558f03e178f7044d3cb12fa0e73edJorim Jaggi 572698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::onFirstRef() { 5734cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr sp<ISurfaceComposer> sf(ComposerService::getComposerService()); 574f3cf4bcfa2c558f03e178f7044d3cb12fa0e73edJorim Jaggi if (sf != 0 && mStatus == NO_INIT) { 5751db73f66624e7d151710483dd58e03eed672f064Robert Carr auto rootProducer = mParent.promote(); 5761db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<ISurfaceComposerClient> conn; 5774cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr conn = (rootProducer != nullptr) ? sf->createScopedConnection(rootProducer) : 5784cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr sf->createConnection(); 579d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (conn != 0) { 580d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mClient = conn; 581d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mStatus = NO_ERROR; 582d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 586698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias AgopianSurfaceComposerClient::~SurfaceComposerClient() { 587d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian dispose(); 588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 590698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::initCheck() const { 591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 594698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopiansp<IBinder> SurfaceComposerClient::connection() const { 5952ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen return IInterface::asBinder(mClient); 596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 598d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianstatus_t SurfaceComposerClient::linkToComposerDeath( 599d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian const sp<IBinder::DeathRecipient>& recipient, 600698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian void* cookie, uint32_t flags) { 6014cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr sp<ISurfaceComposer> sf(ComposerService::getComposerService()); 6024cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return IInterface::asBinder(sf)->linkToDeath(recipient, cookie, flags); 603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 605698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::dispose() { 606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this can be called more than once. 6077e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian sp<ISurfaceComposerClient> client; 608d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Mutex::Autolock _lm(mLock); 609d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (mClient != 0) { 610d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian client = mClient; // hold ref while lock is held 611d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mClient.clear(); 612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 613d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mStatus = NO_INIT; 614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 61601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface( 617285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian const String8& name, 618285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t w, 619285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t h, 620285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian PixelFormat format, 6211f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr uint32_t flags, 622479c60c85c40fd3536b0c88036e838dc1a4c56a0Albert Chaulk SurfaceControl* parent, 623ccd348460ca25890a8fb709e82e6f780e3ce878erongliu int32_t windowType, 624ccd348460ca25890a8fb709e82e6f780e3ce878erongliu int32_t ownerUid) 625285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian{ 6263b382ed2e8a6a79698fb8e65913946bba109d836Robert Carr sp<SurfaceControl> s; 6273b382ed2e8a6a79698fb8e65913946bba109d836Robert Carr createSurfaceChecked(name, w, h, format, &s, flags, parent, windowType, ownerUid); 6283b382ed2e8a6a79698fb8e65913946bba109d836Robert Carr return s; 6293b382ed2e8a6a79698fb8e65913946bba109d836Robert Carr} 6303b382ed2e8a6a79698fb8e65913946bba109d836Robert Carr 6313b382ed2e8a6a79698fb8e65913946bba109d836Robert Carrstatus_t SurfaceComposerClient::createSurfaceChecked( 6323b382ed2e8a6a79698fb8e65913946bba109d836Robert Carr const String8& name, 6333b382ed2e8a6a79698fb8e65913946bba109d836Robert Carr uint32_t w, 6343b382ed2e8a6a79698fb8e65913946bba109d836Robert Carr uint32_t h, 6353b382ed2e8a6a79698fb8e65913946bba109d836Robert Carr PixelFormat format, 6363b382ed2e8a6a79698fb8e65913946bba109d836Robert Carr sp<SurfaceControl>* outSurface, 6373b382ed2e8a6a79698fb8e65913946bba109d836Robert Carr uint32_t flags, 6383b382ed2e8a6a79698fb8e65913946bba109d836Robert Carr SurfaceControl* parent, 639ccd348460ca25890a8fb709e82e6f780e3ce878erongliu int32_t windowType, 640ccd348460ca25890a8fb709e82e6f780e3ce878erongliu int32_t ownerUid) 6413b382ed2e8a6a79698fb8e65913946bba109d836Robert Carr{ 6424d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian sp<SurfaceControl> sur; 643740eaf09b41c0e47c492ae34dc84ccef3ad54bf5Robert Carr status_t err = mStatus; 6443b382ed2e8a6a79698fb8e65913946bba109d836Robert Carr 645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus == NO_ERROR) { 6464d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian sp<IBinder> handle; 6471f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr sp<IBinder> parentHandle; 6484d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian sp<IGraphicBufferProducer> gbp; 6491f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr 6501f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr if (parent != nullptr) { 6511f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr parentHandle = parent->getHandle(); 6521f0a16a5d7cd00ba7fda82e7d315afa1fd1303b9Robert Carr } 6533b382ed2e8a6a79698fb8e65913946bba109d836Robert Carr err = mClient->createSurface(name, w, h, format, flags, parentHandle, 654479c60c85c40fd3536b0c88036e838dc1a4c56a0Albert Chaulk windowType, ownerUid, &handle, &gbp); 6554d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian ALOGE_IF(err, "SurfaceComposerClient::createSurface error %s", strerror(-err)); 6564d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian if (err == NO_ERROR) { 6573b382ed2e8a6a79698fb8e65913946bba109d836Robert Carr *outSurface = new SurfaceControl(this, handle, gbp, true /* owned */); 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 6603b382ed2e8a6a79698fb8e65913946bba109d836Robert Carr return err; 661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 663ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::destroySurface(const sp<IBinder>& sid) { 664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus != NO_ERROR) 665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = mClient->destroySurface(sid); 667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return err; 668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 670d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavstatus_t SurfaceComposerClient::clearLayerFrameStats(const sp<IBinder>& token) const { 671d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav if (mStatus != NO_ERROR) { 672d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return mStatus; 673d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 674d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return mClient->clearLayerFrameStats(token); 675d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 676d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 677d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavstatus_t SurfaceComposerClient::getLayerFrameStats(const sp<IBinder>& token, 678d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav FrameStats* outStats) const { 679d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav if (mStatus != NO_ERROR) { 680d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return mStatus; 681d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 682d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return mClient->getLayerFrameStats(token, outStats); 683d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 684d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 685698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 687c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustatus_t SurfaceComposerClient::enableVSyncInjections(bool enable) { 6884cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr sp<ISurfaceComposer> sf(ComposerService::getComposerService()); 6894cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return sf->enableVSyncInjections(enable); 690c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 691c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 692c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustatus_t SurfaceComposerClient::injectVSync(nsecs_t when) { 6934cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr sp<ISurfaceComposer> sf(ComposerService::getComposerService()); 6944cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr return sf->injectVSync(when); 695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6977f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stozastatus_t SurfaceComposerClient::getDisplayConfigs( 6987f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza const sp<IBinder>& display, Vector<DisplayInfo>* configs) 699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 7007f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return ComposerService::getComposerService()->getDisplayConfigs(display, configs); 7017f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza} 7027f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza 7037f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stozastatus_t SurfaceComposerClient::getDisplayInfo(const sp<IBinder>& display, 7047f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza DisplayInfo* info) { 7057f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Vector<DisplayInfo> configs; 7067f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza status_t result = getDisplayConfigs(display, &configs); 7077f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza if (result != NO_ERROR) { 7087f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return result; 7097f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 7107f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza 7117f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza int activeId = getActiveConfig(display); 7127f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza if (activeId < 0) { 7137f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza ALOGE("No active configuration found"); 7147f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return NAME_NOT_FOUND; 7157f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 7167f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza 717d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza *info = configs[static_cast<size_t>(activeId)]; 7187f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return NO_ERROR; 7197f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza} 7207f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza 7217f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stozaint SurfaceComposerClient::getActiveConfig(const sp<IBinder>& display) { 7227f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return ComposerService::getComposerService()->getActiveConfig(display); 7237f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza} 7247f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza 7257f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stozastatus_t SurfaceComposerClient::setActiveConfig(const sp<IBinder>& display, int id) { 7267f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return ComposerService::getComposerService()->setActiveConfig(display, id); 727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 72928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wrightstatus_t SurfaceComposerClient::getDisplayColorModes(const sp<IBinder>& display, 730a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin Vector<ColorMode>* outColorModes) { 73128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return ComposerService::getComposerService()->getDisplayColorModes(display, outColorModes); 73228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright} 73328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 734a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong LinColorMode SurfaceComposerClient::getActiveColorMode(const sp<IBinder>& display) { 73528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return ComposerService::getComposerService()->getActiveColorMode(display); 73628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright} 73728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 73828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wrightstatus_t SurfaceComposerClient::setActiveColorMode(const sp<IBinder>& display, 739a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin ColorMode colorMode) { 74028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return ComposerService::getComposerService()->setActiveColorMode(display, colorMode); 74128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright} 74228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 7432c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanivoid SurfaceComposerClient::setDisplayPowerMode(const sp<IBinder>& token, 7442c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani int mode) { 7452c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani ComposerService::getComposerService()->setPowerMode(token, mode); 7462a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown} 7472a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown 748d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavstatus_t SurfaceComposerClient::clearAnimationFrameStats() { 749d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return ComposerService::getComposerService()->clearAnimationFrameStats(); 750d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 751d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 752d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavstatus_t SurfaceComposerClient::getAnimationFrameStats(FrameStats* outStats) { 753d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return ComposerService::getComposerService()->getAnimationFrameStats(outStats); 754d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 755d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 756c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stozastatus_t SurfaceComposerClient::getHdrCapabilities(const sp<IBinder>& display, 757c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza HdrCapabilities* outCapabilities) { 758c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza return ComposerService::getComposerService()->getHdrCapabilities(display, 759c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza outCapabilities); 760c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza} 761c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza 762698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 763698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 76440482ff650751819d4104c10a30974838168438cChavi Weingartenstatus_t ScreenshotClient::capture(const sp<IBinder>& display, Rect sourceCrop, uint32_t reqWidth, 76540482ff650751819d4104c10a30974838168438cChavi Weingarten uint32_t reqHeight, int32_t minLayerZ, int32_t maxLayerZ, 76640482ff650751819d4104c10a30974838168438cChavi Weingarten bool useIdentityTransform, uint32_t rotation, 76740482ff650751819d4104c10a30974838168438cChavi Weingarten sp<GraphicBuffer>* outBuffer) { 7682a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 7692a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian if (s == NULL) return NO_INIT; 77040482ff650751819d4104c10a30974838168438cChavi Weingarten status_t ret = s->captureScreen(display, outBuffer, sourceCrop, reqWidth, reqHeight, minLayerZ, 77140482ff650751819d4104c10a30974838168438cChavi Weingarten maxLayerZ, useIdentityTransform, 77240482ff650751819d4104c10a30974838168438cChavi Weingarten static_cast<ISurfaceComposer::Rotation>(rotation)); 773673134ed213458e8d92920a9819f7b714947e211Robert Carr if (ret != NO_ERROR) { 774673134ed213458e8d92920a9819f7b714947e211Robert Carr return ret; 775673134ed213458e8d92920a9819f7b714947e211Robert Carr } 776673134ed213458e8d92920a9819f7b714947e211Robert Carr return ret; 777673134ed213458e8d92920a9819f7b714947e211Robert Carr} 778673134ed213458e8d92920a9819f7b714947e211Robert Carr 77940482ff650751819d4104c10a30974838168438cChavi Weingartenstatus_t ScreenshotClient::captureLayers(const sp<IBinder>& layerHandle, Rect sourceCrop, 78040482ff650751819d4104c10a30974838168438cChavi Weingarten float frameScale, sp<GraphicBuffer>* outBuffer) { 781a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw sp<ISurfaceComposer> s(ComposerService::getComposerService()); 782a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw if (s == NULL) return NO_INIT; 783578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr status_t ret = s->captureLayers(layerHandle, outBuffer, sourceCrop, frameScale, 784578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr false /* childrenOnly */); 785578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr return ret; 786578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr} 787578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr 788578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carrstatus_t ScreenshotClient::captureChildLayers(const sp<IBinder>& layerHandle, Rect sourceCrop, 789578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr float frameScale, sp<GraphicBuffer>* outBuffer) { 790578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr sp<ISurfaceComposer> s(ComposerService::getComposerService()); 791578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr if (s == NULL) return NO_INIT; 792578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr status_t ret = s->captureLayers(layerHandle, outBuffer, sourceCrop, frameScale, 793578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr true /* childrenOnly */); 7947206d49b2963ce2e926a5f25fe94aca9c06471e6chaviw return ret; 795a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw} 79674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian// ---------------------------------------------------------------------------- 797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 798