1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "SurfaceComposerClient"
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
239cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <utils/Log.h>
24d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian#include <utils/Singleton.h>
25a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/SortedVector.h>
26a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/String8.h>
27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/threads.h>
289cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
29c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IMemory.h>
30a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <binder/IServiceManager.h>
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/DisplayInfo.h>
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian#include <gui/CpuConsumer.h>
35e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/IGraphicBufferProducer.h>
3690ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposer.h>
3790ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposerClient.h>
3890ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/SurfaceComposerClient.h>
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4041f673c9b3aac0d96e41c928845c39186d565212Mathias Agopian#include <private/gui/ComposerService.h>
4190ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <private/gui/LayerState.h>
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
46b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(ComposerService);
477e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
48b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianComposerService::ComposerService()
49b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian: Singleton<ComposerService>() {
506652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    Mutex::Autolock _l(mLock);
516652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    connectLocked();
526652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden}
536652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden
546652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFaddenvoid ComposerService::connectLocked() {
55b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    const String16 name("SurfaceFlinger");
56b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    while (getService(name, &mComposerService) != NO_ERROR) {
57b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        usleep(250000);
587e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    }
596652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    assert(mComposerService != NULL);
606652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden
616652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    // Create the death listener.
626652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    class DeathObserver : public IBinder::DeathRecipient {
636652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden        ComposerService& mComposerService;
646652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden        virtual void binderDied(const wp<IBinder>& who) {
656652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden            ALOGW("ComposerService remote (surfaceflinger) died [%p]",
666652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden                  who.unsafe_get());
676652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden            mComposerService.composerServiceDied();
686652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden        }
696652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden     public:
706652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden        DeathObserver(ComposerService& mgr) : mComposerService(mgr) { }
716652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    };
726652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden
736652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this));
746652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    mComposerService->asBinder()->linkToDeath(mDeathObserver);
756652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden}
766652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden
776652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden/*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() {
786652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    ComposerService& instance = ComposerService::getInstance();
796652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    Mutex::Autolock _l(instance.mLock);
806652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    if (instance.mComposerService == NULL) {
816652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden        ComposerService::getInstance().connectLocked();
826652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden        assert(instance.mComposerService != NULL);
836652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden        ALOGD("ComposerService reconnected");
846652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    }
856652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    return instance.mComposerService;
86b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
877e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
886652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFaddenvoid ComposerService::composerServiceDied()
896652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden{
906652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    Mutex::Autolock _l(mLock);
916652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    mComposerService = NULL;
926652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    mDeathObserver = NULL;
93b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
947e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
957e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian// ---------------------------------------------------------------------------
967e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
97698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatic inline
98e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianint compare_type(const ComposerState& lhs, const ComposerState& rhs) {
99698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (lhs.client < rhs.client)  return -1;
100698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (lhs.client > rhs.client)  return 1;
101698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (lhs.state.surface < rhs.state.surface)  return -1;
102698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (lhs.state.surface > rhs.state.surface)  return 1;
103698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return 0;
104698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
105698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
106e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianstatic inline
107e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianint compare_type(const DisplayState& lhs, const DisplayState& rhs) {
108e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    return compare_type(lhs.token, rhs.token);
109e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
110e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
1117e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianclass Composer : public Singleton<Composer>
1127e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian{
113698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    friend class Singleton<Composer>;
1147e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
115698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    mutable Mutex               mLock;
116e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    SortedVector<ComposerState> mComposerStates;
117e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    SortedVector<DisplayState > mDisplayStates;
11828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    uint32_t                    mForceSynchronous;
119f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    uint32_t                    mTransactionNestCount;
1202d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    bool                        mAnimation;
1217e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
122b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    Composer() : Singleton<Composer>(),
123f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        mForceSynchronous(0), mTransactionNestCount(0),
1242d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis        mAnimation(false)
12528378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    { }
126d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
127f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    void openGlobalTransactionImpl();
12828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    void closeGlobalTransactionImpl(bool synchronous);
1292d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    void setAnimationTransactionImpl();
130d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
131698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* getLayerStateLocked(
132ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian            const sp<SurfaceComposerClient>& client, const sp<IBinder>& id);
133d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
134e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    DisplayState& getDisplayStateLocked(const sp<IBinder>& token);
135e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
136698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianpublic:
137dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    sp<IBinder> createDisplay(const String8& displayName, bool secure);
1386c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    void destroyDisplay(const sp<IBinder>& display);
1399d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    sp<IBinder> getBuiltInDisplay(int32_t id);
140d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
141ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian    status_t setPosition(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
14241b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian            float x, float y);
143ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian    status_t setSize(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
144698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            uint32_t w, uint32_t h);
145ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian    status_t setLayer(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
146698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            int32_t z);
147ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian    status_t setFlags(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
148698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            uint32_t flags, uint32_t mask);
149698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setTransparentRegionHint(
150ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian            const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
151698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            const Region& transparentRegion);
152ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian    status_t setAlpha(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
153698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            float alpha);
154ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian    status_t setMatrix(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
155698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            float dsdx, float dtdx, float dsdy, float dtdy);
156b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    status_t setOrientation(int orientation);
157ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian    status_t setCrop(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
158f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis            const Rect& crop);
1598785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    status_t setLayerStack(const sp<SurfaceComposerClient>& client,
160ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian            const sp<IBinder>& id, uint32_t layerStack);
161d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
1622adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    void setDisplaySurface(const sp<IBinder>& token,
1632adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            const sp<IGraphicBufferProducer>& bufferProducer);
164e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    void setDisplayLayerStack(const sp<IBinder>& token, uint32_t layerStack);
16500e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    void setDisplayProjection(const sp<IBinder>& token,
16600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian            uint32_t orientation,
16700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian            const Rect& layerStackRect,
16800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian            const Rect& displayRect);
1691f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright    void setDisplaySize(const sp<IBinder>& token, uint32_t width, uint32_t height);
170e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
1712d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    static void setAnimationTransaction() {
1722d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis        Composer::getInstance().setAnimationTransactionImpl();
1732d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    }
1742d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis
175f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    static void openGlobalTransaction() {
176f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        Composer::getInstance().openGlobalTransactionImpl();
177f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    }
178f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown
17928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    static void closeGlobalTransaction(bool synchronous) {
18028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        Composer::getInstance().closeGlobalTransactionImpl(synchronous);
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
182d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian};
183d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
184d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(Composer);
185d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
188dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennissp<IBinder> Composer::createDisplay(const String8& displayName, bool secure) {
189dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    return ComposerService::getComposerService()->createDisplay(displayName,
190dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis            secure);
191e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
192e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
1936c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hallvoid Composer::destroyDisplay(const sp<IBinder>& display) {
1946c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    return ComposerService::getComposerService()->destroyDisplay(display);
1956c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall}
1966c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall
1979d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownsp<IBinder> Composer::getBuiltInDisplay(int32_t id) {
1989d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    return ComposerService::getComposerService()->getBuiltInDisplay(id);
1999d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown}
2009d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown
201f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brownvoid Composer::openGlobalTransactionImpl() {
202f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    { // scope for the lock
203f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        Mutex::Autolock _l(mLock);
204f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        mTransactionNestCount += 1;
205f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    }
206f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown}
207f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown
20828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid Composer::closeGlobalTransactionImpl(bool synchronous) {
209e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    sp<ISurfaceComposer> sm(ComposerService::getComposerService());
210698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
211698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Vector<ComposerState> transaction;
2128b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian    Vector<DisplayState> displayTransaction;
21328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    uint32_t flags = 0;
214698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
215698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    { // scope for the lock
216698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        Mutex::Autolock _l(mLock);
217f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        mForceSynchronous |= synchronous;
218f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        if (!mTransactionNestCount) {
219f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown            ALOGW("At least one call to closeGlobalTransaction() was not matched by a prior "
220f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown                    "call to openGlobalTransaction().");
221f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        } else if (--mTransactionNestCount) {
222f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown            return;
223f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        }
224f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown
225e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        transaction = mComposerStates;
226e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        mComposerStates.clear();
2278b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian
228e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        displayTransaction = mDisplayStates;
229e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        mDisplayStates.clear();
23028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
231f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        if (mForceSynchronous) {
23228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis            flags |= ISurfaceComposer::eSynchronous;
23328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        }
2342d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis        if (mAnimation) {
2352d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis            flags |= ISurfaceComposer::eAnimation;
2362d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis        }
2372d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis
23828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        mForceSynchronous = false;
2392d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis        mAnimation = false;
240698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    }
241698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
2428b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian   sm->setTransactionState(transaction, displayTransaction, flags);
243698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
244698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
2452d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennisvoid Composer::setAnimationTransactionImpl() {
2462d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    Mutex::Autolock _l(mLock);
2472d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    mAnimation = true;
2482d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis}
2492d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis
250698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianlayer_state_t* Composer::getLayerStateLocked(
251ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<SurfaceComposerClient>& client, const sp<IBinder>& id) {
252698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
253698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    ComposerState s;
254698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s.client = client->mClient;
255698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s.state.surface = id;
256698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
257e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    ssize_t index = mComposerStates.indexOf(s);
258698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (index < 0) {
259698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        // we don't have it, add an initialized layer_state to our list
260e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        index = mComposerStates.add(s);
261698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    }
262698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
263e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    ComposerState* const out = mComposerStates.editArray();
264698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return &(out[index].state);
265698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
266698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
267698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setPosition(const sp<SurfaceComposerClient>& client,
268ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, float x, float y) {
269698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
270698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
271698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
272698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
2733165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::ePositionChanged;
274698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->x = x;
275698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->y = y;
276698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
277698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
278698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
279698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setSize(const sp<SurfaceComposerClient>& client,
280ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, uint32_t w, uint32_t h) {
281698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
282698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
283698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
284698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
2853165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eSizeChanged;
286698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->w = w;
287698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->h = h;
28828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
28928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    // Resizing a surface makes the transaction synchronous.
29028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    mForceSynchronous = true;
29128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
292698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
293698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
294698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
295698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setLayer(const sp<SurfaceComposerClient>& client,
296ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, int32_t z) {
297698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
298698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
299698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
300698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
3013165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eLayerChanged;
302698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->z = z;
303698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
304698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
305698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
306698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setFlags(const sp<SurfaceComposerClient>& client,
307ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, uint32_t flags,
308698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        uint32_t mask) {
309698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
310698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
311698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
312698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
3134125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    if (mask & layer_state_t::eLayerOpaque) {
3144125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden        s->what |= layer_state_t::eOpacityChanged;
3154125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    }
3164125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    if (mask & layer_state_t::eLayerHidden) {
3174125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden        s->what |= layer_state_t::eVisibilityChanged;
3184125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden    }
319698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->flags &= ~mask;
320698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->flags |= (flags & mask);
321698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->mask |= mask;
322698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
323698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
324698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
325698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setTransparentRegionHint(
326ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
327698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        const Region& transparentRegion) {
328698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
329698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
330698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
331698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
3323165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eTransparentRegionChanged;
333698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->transparentRegion = transparentRegion;
334698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
335698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
336698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
337698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setAlpha(const sp<SurfaceComposerClient>& client,
338ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, float alpha) {
339698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
340698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
341698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
342698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
3433165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eAlphaChanged;
344698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->alpha = alpha;
345698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
346698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
347698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
3488785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopianstatus_t Composer::setLayerStack(const sp<SurfaceComposerClient>& client,
349ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, uint32_t layerStack) {
3508785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    Mutex::Autolock _l(mLock);
3518785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
3528785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    if (!s)
3538785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian        return BAD_INDEX;
3543165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eLayerStackChanged;
3558785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    s->layerStack = layerStack;
3568785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    return NO_ERROR;
3578785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian}
3588785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian
359698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setMatrix(const sp<SurfaceComposerClient>& client,
360ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, float dsdx, float dtdx,
361698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        float dsdy, float dtdy) {
362698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
363698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
364698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
365698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
3663165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eMatrixChanged;
367698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t::matrix22_t matrix;
368698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dsdx = dsdx;
369698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dtdx = dtdx;
370698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dsdy = dsdy;
371698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dtdy = dtdy;
372698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->matrix = matrix;
373698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
376f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatus_t Composer::setCrop(const sp<SurfaceComposerClient>& client,
377ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, const Rect& crop) {
378f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Mutex::Autolock _l(mLock);
379f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    layer_state_t* s = getLayerStateLocked(client, id);
380f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!s)
381f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        return BAD_INDEX;
3823165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eCropChanged;
383f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    s->crop = crop;
384f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return NO_ERROR;
385f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
386f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
387698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------
388698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
389e57f292595bec48f65c8088b00ff6beea01217e9Mathias AgopianDisplayState& Composer::getDisplayStateLocked(const sp<IBinder>& token) {
390e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    DisplayState s;
391e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    s.token = token;
392e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    ssize_t index = mDisplayStates.indexOf(s);
393e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    if (index < 0) {
394e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        // we don't have it, add an initialized layer_state to our list
395e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        s.what = 0;
396e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        index = mDisplayStates.add(s);
397e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    }
398e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    return mDisplayStates.editItemAt(index);
399e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
400e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
401e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid Composer::setDisplaySurface(const sp<IBinder>& token,
4022adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        const sp<IGraphicBufferProducer>& bufferProducer) {
403e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    Mutex::Autolock _l(mLock);
404e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    DisplayState& s(getDisplayStateLocked(token));
4052adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    s.surface = bufferProducer;
406e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    s.what |= DisplayState::eSurfaceChanged;
407e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
408e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
409e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid Composer::setDisplayLayerStack(const sp<IBinder>& token,
410e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        uint32_t layerStack) {
411e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    Mutex::Autolock _l(mLock);
412e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    DisplayState& s(getDisplayStateLocked(token));
413e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    s.layerStack = layerStack;
414e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    s.what |= DisplayState::eLayerStackChanged;
415e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
416e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
41700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid Composer::setDisplayProjection(const sp<IBinder>& token,
41800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        uint32_t orientation,
41900e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        const Rect& layerStackRect,
42000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        const Rect& displayRect) {
421e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    Mutex::Autolock _l(mLock);
422e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    DisplayState& s(getDisplayStateLocked(token));
423e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    s.orientation = orientation;
42400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    s.viewport = layerStackRect;
42500e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    s.frame = displayRect;
42600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    s.what |= DisplayState::eDisplayProjectionChanged;
427e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    mForceSynchronous = true; // TODO: do we actually still need this?
428e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
429e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
4301f6078aef71b1d3f080cd565adbec350c71088ddMichael Wrightvoid Composer::setDisplaySize(const sp<IBinder>& token, uint32_t width, uint32_t height) {
4311f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright    Mutex::Autolock _l(mLock);
4321f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright    DisplayState& s(getDisplayStateLocked(token));
4331f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright    s.width = width;
4341f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright    s.height = height;
4351f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright    s.what |= DisplayState::eDisplaySizeChanged;
4361f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright}
4371f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright
438e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian// ---------------------------------------------------------------------------
439e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurfaceComposerClient::SurfaceComposerClient()
441698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    : mStatus(NO_INIT), mComposer(Composer::getInstance())
442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
445698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::onFirstRef() {
446e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    sp<ISurfaceComposer> sm(ComposerService::getComposerService());
447d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    if (sm != 0) {
4487e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian        sp<ISurfaceComposerClient> conn = sm->createConnection();
449d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        if (conn != 0) {
450d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            mClient = conn;
451d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            mStatus = NO_ERROR;
452d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        }
453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
456698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias AgopianSurfaceComposerClient::~SurfaceComposerClient() {
457d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    dispose();
458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
460698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::initCheck() const {
461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mStatus;
462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
464698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopiansp<IBinder> SurfaceComposerClient::connection() const {
465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (mClient != 0) ? mClient->asBinder() : 0;
466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
468d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianstatus_t SurfaceComposerClient::linkToComposerDeath(
469d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        const sp<IBinder::DeathRecipient>& recipient,
470698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        void* cookie, uint32_t flags) {
471e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    sp<ISurfaceComposer> sm(ComposerService::getComposerService());
472d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    return sm->asBinder()->linkToDeath(recipient, cookie, flags);
473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
475698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::dispose() {
476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this can be called more than once.
4777e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    sp<ISurfaceComposerClient> client;
478d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    Mutex::Autolock _lm(mLock);
479d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    if (mClient != 0) {
480d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        client = mClient; // hold ref while lock is held
481d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        mClient.clear();
482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
483d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    mStatus = NO_INIT;
484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
48601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface(
487285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        const String8& name,
488285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t w,
489285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t h,
490285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        PixelFormat format,
491285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t flags)
492285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian{
4934d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    sp<SurfaceControl> sur;
494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mStatus == NO_ERROR) {
4954d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        sp<IBinder> handle;
4964d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        sp<IGraphicBufferProducer> gbp;
4974d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        status_t err = mClient->createSurface(name, w, h, format, flags,
4984d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian                &handle, &gbp);
4994d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        ALOGE_IF(err, "SurfaceComposerClient::createSurface error %s", strerror(-err));
5004d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        if (err == NO_ERROR) {
5014d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian            sur = new SurfaceControl(this, handle, gbp);
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
5044d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    return sur;
505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
507dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennissp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName,
508dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        bool secure) {
509dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    return Composer::getInstance().createDisplay(displayName, secure);
510e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
511e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
5126c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hallvoid SurfaceComposerClient::destroyDisplay(const sp<IBinder>& display) {
5136c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    Composer::getInstance().destroyDisplay(display);
5146c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall}
5156c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall
5169d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownsp<IBinder> SurfaceComposerClient::getBuiltInDisplay(int32_t id) {
5179d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    return Composer::getInstance().getBuiltInDisplay(id);
5189d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown}
5199d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown
520ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::destroySurface(const sp<IBinder>& sid) {
521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mStatus != NO_ERROR)
522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return mStatus;
523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t err = mClient->destroySurface(sid);
524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return err;
525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
527d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavstatus_t SurfaceComposerClient::clearLayerFrameStats(const sp<IBinder>& token) const {
528d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    if (mStatus != NO_ERROR) {
529d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        return mStatus;
530d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    }
531d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    return mClient->clearLayerFrameStats(token);
532d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav}
533d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
534d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavstatus_t SurfaceComposerClient::getLayerFrameStats(const sp<IBinder>& token,
535d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        FrameStats* outStats) const {
536d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    if (mStatus != NO_ERROR) {
537d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        return mStatus;
538d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    }
539d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    return mClient->getLayerFrameStats(token, outStats);
540d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav}
541d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
542698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianinline Composer& SurfaceComposerClient::getComposer() {
543698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return mComposer;
544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
546698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
548698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::openGlobalTransaction() {
549f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    Composer::openGlobalTransaction();
550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
55228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid SurfaceComposerClient::closeGlobalTransaction(bool synchronous) {
55328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    Composer::closeGlobalTransaction(synchronous);
554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
5562d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennisvoid SurfaceComposerClient::setAnimationTransaction() {
5572d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    Composer::setAnimationTransaction();
5582d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis}
5592d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis
560698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
562ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setCrop(const sp<IBinder>& id, const Rect& crop) {
563f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return getComposer().setCrop(this, id, crop);
564f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
565f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
566ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setPosition(const sp<IBinder>& id, float x, float y) {
567698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setPosition(this, id, x, y);
568698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
570ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setSize(const sp<IBinder>& id, uint32_t w, uint32_t h) {
571698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setSize(this, id, w, h);
572698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
574ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setLayer(const sp<IBinder>& id, int32_t z) {
575698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setLayer(this, id, z);
576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
578ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::hide(const sp<IBinder>& id) {
579698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id,
5803165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian            layer_state_t::eLayerHidden,
5813165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian            layer_state_t::eLayerHidden);
582698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
584ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::show(const sp<IBinder>& id) {
585698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id,
586698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            0,
5873165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian            layer_state_t::eLayerHidden);
588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
590ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setFlags(const sp<IBinder>& id, uint32_t flags,
591698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        uint32_t mask) {
592698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id, flags, mask);
593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
595ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setTransparentRegionHint(const sp<IBinder>& id,
596698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        const Region& transparentRegion) {
597698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setTransparentRegionHint(this, id, transparentRegion);
598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
600ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setAlpha(const sp<IBinder>& id, float alpha) {
601698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setAlpha(this, id, alpha);
602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
604ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setLayerStack(const sp<IBinder>& id, uint32_t layerStack) {
6058785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    return getComposer().setLayerStack(this, id, layerStack);
6068785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian}
6078785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian
608ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setMatrix(const sp<IBinder>& id, float dsdx, float dtdx,
609698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        float dsdy, float dtdy) {
610698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setMatrix(this, id, dsdx, dtdx, dsdy, dtdy);
611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
613698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
614698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
615e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid SurfaceComposerClient::setDisplaySurface(const sp<IBinder>& token,
6162adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        const sp<IGraphicBufferProducer>& bufferProducer) {
6172adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    Composer::getInstance().setDisplaySurface(token, bufferProducer);
618e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
619e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
620e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid SurfaceComposerClient::setDisplayLayerStack(const sp<IBinder>& token,
621e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        uint32_t layerStack) {
622e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    Composer::getInstance().setDisplayLayerStack(token, layerStack);
623e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
624e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
62500e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid SurfaceComposerClient::setDisplayProjection(const sp<IBinder>& token,
62600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        uint32_t orientation,
62700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        const Rect& layerStackRect,
62800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        const Rect& displayRect) {
62900e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    Composer::getInstance().setDisplayProjection(token, orientation,
63000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian            layerStackRect, displayRect);
631e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
632e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
6331f6078aef71b1d3f080cd565adbec350c71088ddMichael Wrightvoid SurfaceComposerClient::setDisplaySize(const sp<IBinder>& token,
6341f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright        uint32_t width, uint32_t height) {
6351f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright    Composer::getInstance().setDisplaySize(token, width, height);
6361f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright}
6371f6078aef71b1d3f080cd565adbec350c71088ddMichael Wright
638e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian// ----------------------------------------------------------------------------
639e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
6407f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stozastatus_t SurfaceComposerClient::getDisplayConfigs(
6417f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        const sp<IBinder>& display, Vector<DisplayInfo>* configs)
642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
6437f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    return ComposerService::getComposerService()->getDisplayConfigs(display, configs);
6447f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza}
6457f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza
6467f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stozastatus_t SurfaceComposerClient::getDisplayInfo(const sp<IBinder>& display,
6477f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        DisplayInfo* info) {
6487f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    Vector<DisplayInfo> configs;
6497f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    status_t result = getDisplayConfigs(display, &configs);
6507f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    if (result != NO_ERROR) {
6517f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        return result;
6527f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    }
6537f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza
6547f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    int activeId = getActiveConfig(display);
6557f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    if (activeId < 0) {
6567f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        ALOGE("No active configuration found");
6577f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        return NAME_NOT_FOUND;
6587f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    }
6597f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza
6607f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    *info = configs[activeId];
6617f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    return NO_ERROR;
6627f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza}
6637f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza
6647f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stozaint SurfaceComposerClient::getActiveConfig(const sp<IBinder>& display) {
6657f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    return ComposerService::getComposerService()->getActiveConfig(display);
6667f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza}
6677f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza
6687f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stozastatus_t SurfaceComposerClient::setActiveConfig(const sp<IBinder>& display, int id) {
6697f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    return ComposerService::getComposerService()->setActiveConfig(display, id);
670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6722c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malanivoid SurfaceComposerClient::setDisplayPowerMode(const sp<IBinder>& token,
6732c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        int mode) {
6742c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    ComposerService::getComposerService()->setPowerMode(token, mode);
6752a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown}
6762a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown
677d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavstatus_t SurfaceComposerClient::clearAnimationFrameStats() {
678d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    return ComposerService::getComposerService()->clearAnimationFrameStats();
679d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav}
680d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
681d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavstatus_t SurfaceComposerClient::getAnimationFrameStats(FrameStats* outStats) {
682d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    return ComposerService::getComposerService()->getAnimationFrameStats(outStats);
683d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav}
684d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
685698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
686698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
6872a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopianstatus_t ScreenshotClient::capture(
6882a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        const sp<IBinder>& display,
6892a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        const sp<IGraphicBufferProducer>& producer,
690c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza        Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
691c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        uint32_t minLayerZ, uint32_t maxLayerZ, bool useIdentityTransform) {
6922a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
6932a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    if (s == NULL) return NO_INIT;
694c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    return s->captureScreen(display, producer, sourceCrop,
695c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza            reqWidth, reqHeight, minLayerZ, maxLayerZ, useIdentityTransform);
6962a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian}
6972a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian
69874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianScreenshotClient::ScreenshotClient()
699abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    : mHaveBuffer(false) {
700abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    memset(&mBuffer, 0, sizeof(mBuffer));
70174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
70274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
7038000d0694bc34bc17d869da546d8ff8790ae7be4Mathias AgopianScreenshotClient::~ScreenshotClient() {
7048000d0694bc34bc17d869da546d8ff8790ae7be4Mathias Agopian    ScreenshotClient::release();
7058000d0694bc34bc17d869da546d8ff8790ae7be4Mathias Agopian}
7068000d0694bc34bc17d869da546d8ff8790ae7be4Mathias Agopian
707abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopiansp<CpuConsumer> ScreenshotClient::getCpuConsumer() const {
708abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    if (mCpuConsumer == NULL) {
7096d5a7bb970dd5cfd5a51fe2de7f10b9fc75732b2Dan Stoza        sp<IGraphicBufferConsumer> consumer;
7106d5a7bb970dd5cfd5a51fe2de7f10b9fc75732b2Dan Stoza        BufferQueue::createBufferQueue(&mProducer, &consumer);
7116d5a7bb970dd5cfd5a51fe2de7f10b9fc75732b2Dan Stoza        mCpuConsumer = new CpuConsumer(consumer, 1);
712abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        mCpuConsumer->setName(String8("ScreenshotClient"));
713abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    }
714abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    return mCpuConsumer;
71574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
71674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
7179d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownstatus_t ScreenshotClient::update(const sp<IBinder>& display,
718c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza        Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
719c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        uint32_t minLayerZ, uint32_t maxLayerZ,
720d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews        bool useIdentityTransform, uint32_t rotation) {
72174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
72274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    if (s == NULL) return NO_INIT;
723abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    sp<CpuConsumer> cpuConsumer = getCpuConsumer();
724abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian
725abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    if (mHaveBuffer) {
726abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        mCpuConsumer->unlockBuffer(mBuffer);
727abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        memset(&mBuffer, 0, sizeof(mBuffer));
728abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        mHaveBuffer = false;
729abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    }
730abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian
731c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    status_t err = s->captureScreen(display, mProducer, sourceCrop,
732d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews            reqWidth, reqHeight, minLayerZ, maxLayerZ, useIdentityTransform,
733d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews            static_cast<ISurfaceComposer::Rotation>(rotation));
734abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian
735abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    if (err == NO_ERROR) {
736abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        err = mCpuConsumer->lockNextBuffer(&mBuffer);
737abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        if (err == NO_ERROR) {
738abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian            mHaveBuffer = true;
739abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        }
740abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    }
741abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    return err;
742abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian}
743abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian
744d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrewsstatus_t ScreenshotClient::update(const sp<IBinder>& display,
745d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews        Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
746d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews        uint32_t minLayerZ, uint32_t maxLayerZ,
747d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews        bool useIdentityTransform) {
748d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews
749d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews    return ScreenshotClient::update(display, sourceCrop, reqWidth, reqHeight,
750d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews            minLayerZ, maxLayerZ, useIdentityTransform, ISurfaceComposer::eRotateNone);
751d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews}
752d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews
753c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stozastatus_t ScreenshotClient::update(const sp<IBinder>& display, Rect sourceCrop,
754c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        bool useIdentityTransform) {
755c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    return ScreenshotClient::update(display, sourceCrop, 0, 0, 0, -1UL,
756d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews            useIdentityTransform, ISurfaceComposer::eRotateNone);
757bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian}
758bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian
759c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stozastatus_t ScreenshotClient::update(const sp<IBinder>& display, Rect sourceCrop,
760c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        uint32_t reqWidth, uint32_t reqHeight, bool useIdentityTransform) {
761c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    return ScreenshotClient::update(display, sourceCrop, reqWidth, reqHeight,
762d15ef27f9b13727fa7358e3c09572f66bb1e0668Riley Andrews            0, -1UL, useIdentityTransform, ISurfaceComposer::eRotateNone);
76374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
76474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
76574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid ScreenshotClient::release() {
766abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    if (mHaveBuffer) {
767abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        mCpuConsumer->unlockBuffer(mBuffer);
768abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        memset(&mBuffer, 0, sizeof(mBuffer));
769abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        mHaveBuffer = false;
770abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    }
771abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    mCpuConsumer.clear();
77274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
77374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
77474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid const* ScreenshotClient::getPixels() const {
775abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    return mBuffer.data;
77674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
77774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
77874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getWidth() const {
779abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    return mBuffer.width;
78074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
78174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
78274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getHeight() const {
783abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    return mBuffer.height;
78474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
78574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
78674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianPixelFormat ScreenshotClient::getFormat() const {
787abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    return mBuffer.format;
78874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
78974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
79074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getStride() const {
791abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    return mBuffer.stride;
79274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
79374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
79474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopiansize_t ScreenshotClient::getSize() const {
795abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    return mBuffer.stride * mBuffer.height * bytesPerPixel(mBuffer.format);
79674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
79774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
79874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian// ----------------------------------------------------------------------------
799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
800