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