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);
169e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
1702d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    static void setAnimationTransaction() {
1712d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis        Composer::getInstance().setAnimationTransactionImpl();
1722d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    }
1732d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis
174f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    static void openGlobalTransaction() {
175f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        Composer::getInstance().openGlobalTransactionImpl();
176f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    }
177f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown
17828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    static void closeGlobalTransaction(bool synchronous) {
17928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        Composer::getInstance().closeGlobalTransactionImpl(synchronous);
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
181d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian};
182d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
183d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(Composer);
184d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
187dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennissp<IBinder> Composer::createDisplay(const String8& displayName, bool secure) {
188dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    return ComposerService::getComposerService()->createDisplay(displayName,
189dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis            secure);
190e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
191e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
1926c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hallvoid Composer::destroyDisplay(const sp<IBinder>& display) {
1936c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    return ComposerService::getComposerService()->destroyDisplay(display);
1946c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall}
1956c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall
1969d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownsp<IBinder> Composer::getBuiltInDisplay(int32_t id) {
1979d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    return ComposerService::getComposerService()->getBuiltInDisplay(id);
1989d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown}
1999d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown
200f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brownvoid Composer::openGlobalTransactionImpl() {
201f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    { // scope for the lock
202f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        Mutex::Autolock _l(mLock);
203f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        mTransactionNestCount += 1;
204f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    }
205f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown}
206f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown
20728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid Composer::closeGlobalTransactionImpl(bool synchronous) {
208e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    sp<ISurfaceComposer> sm(ComposerService::getComposerService());
209698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
210698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Vector<ComposerState> transaction;
2118b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian    Vector<DisplayState> displayTransaction;
21228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    uint32_t flags = 0;
213698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
214698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    { // scope for the lock
215698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        Mutex::Autolock _l(mLock);
216f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        mForceSynchronous |= synchronous;
217f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        if (!mTransactionNestCount) {
218f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown            ALOGW("At least one call to closeGlobalTransaction() was not matched by a prior "
219f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown                    "call to openGlobalTransaction().");
220f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        } else if (--mTransactionNestCount) {
221f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown            return;
222f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        }
223f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown
224e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        transaction = mComposerStates;
225e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        mComposerStates.clear();
2268b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian
227e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        displayTransaction = mDisplayStates;
228e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        mDisplayStates.clear();
22928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
230f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        if (mForceSynchronous) {
23128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis            flags |= ISurfaceComposer::eSynchronous;
23228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        }
2332d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis        if (mAnimation) {
2342d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis            flags |= ISurfaceComposer::eAnimation;
2352d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis        }
2362d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis
23728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        mForceSynchronous = false;
2382d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis        mAnimation = false;
239698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    }
240698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
2418b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian   sm->setTransactionState(transaction, displayTransaction, flags);
242698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
243698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
2442d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennisvoid Composer::setAnimationTransactionImpl() {
2452d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    Mutex::Autolock _l(mLock);
2462d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    mAnimation = true;
2472d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis}
2482d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis
249698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianlayer_state_t* Composer::getLayerStateLocked(
250ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<SurfaceComposerClient>& client, const sp<IBinder>& id) {
251698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
252698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    ComposerState s;
253698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s.client = client->mClient;
254698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s.state.surface = id;
255698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
256e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    ssize_t index = mComposerStates.indexOf(s);
257698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (index < 0) {
258698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        // we don't have it, add an initialized layer_state to our list
259e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        index = mComposerStates.add(s);
260698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    }
261698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
262e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    ComposerState* const out = mComposerStates.editArray();
263698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return &(out[index].state);
264698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
265698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
266698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setPosition(const sp<SurfaceComposerClient>& client,
267ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, float x, float y) {
268698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
269698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
270698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
271698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
2723165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::ePositionChanged;
273698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->x = x;
274698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->y = y;
275698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
276698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
277698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
278698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setSize(const sp<SurfaceComposerClient>& client,
279ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, uint32_t w, uint32_t h) {
280698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
281698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
282698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
283698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
2843165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eSizeChanged;
285698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->w = w;
286698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->h = h;
28728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
28828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    // Resizing a surface makes the transaction synchronous.
28928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    mForceSynchronous = true;
29028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
291698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
292698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
293698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
294698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setLayer(const sp<SurfaceComposerClient>& client,
295ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, int32_t z) {
296698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
297698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
298698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
299698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
3003165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eLayerChanged;
301698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->z = z;
302698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
303698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
304698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
305698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setFlags(const sp<SurfaceComposerClient>& client,
306ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, uint32_t flags,
307698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        uint32_t mask) {
308698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
309698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
310698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
311698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
3123165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eVisibilityChanged;
313698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->flags &= ~mask;
314698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->flags |= (flags & mask);
315698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->mask |= mask;
316698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
317698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
318698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
319698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setTransparentRegionHint(
320ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
321698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        const Region& transparentRegion) {
322698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
323698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
324698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
325698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
3263165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eTransparentRegionChanged;
327698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->transparentRegion = transparentRegion;
328698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
329698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
330698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
331698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setAlpha(const sp<SurfaceComposerClient>& client,
332ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, float alpha) {
333698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
334698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
335698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
336698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
3373165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eAlphaChanged;
338698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->alpha = alpha;
339698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
340698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
341698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
3428785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopianstatus_t Composer::setLayerStack(const sp<SurfaceComposerClient>& client,
343ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, uint32_t layerStack) {
3448785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    Mutex::Autolock _l(mLock);
3458785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
3468785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    if (!s)
3478785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian        return BAD_INDEX;
3483165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eLayerStackChanged;
3498785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    s->layerStack = layerStack;
3508785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    return NO_ERROR;
3518785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian}
3528785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian
353698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setMatrix(const sp<SurfaceComposerClient>& client,
354ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, float dsdx, float dtdx,
355698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        float dsdy, float dtdy) {
356698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
357698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
358698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
359698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
3603165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eMatrixChanged;
361698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t::matrix22_t matrix;
362698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dsdx = dsdx;
363698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dtdx = dtdx;
364698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dsdy = dsdy;
365698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dtdy = dtdy;
366698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->matrix = matrix;
367698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
370f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatus_t Composer::setCrop(const sp<SurfaceComposerClient>& client,
371ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, const Rect& crop) {
372f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Mutex::Autolock _l(mLock);
373f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    layer_state_t* s = getLayerStateLocked(client, id);
374f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!s)
375f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        return BAD_INDEX;
3763165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eCropChanged;
377f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    s->crop = crop;
378f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return NO_ERROR;
379f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
380f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
381698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------
382698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
383e57f292595bec48f65c8088b00ff6beea01217e9Mathias AgopianDisplayState& Composer::getDisplayStateLocked(const sp<IBinder>& token) {
384e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    DisplayState s;
385e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    s.token = token;
386e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    ssize_t index = mDisplayStates.indexOf(s);
387e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    if (index < 0) {
388e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        // we don't have it, add an initialized layer_state to our list
389e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        s.what = 0;
390e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        index = mDisplayStates.add(s);
391e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    }
392e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    return mDisplayStates.editItemAt(index);
393e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
394e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
395e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid Composer::setDisplaySurface(const sp<IBinder>& token,
3962adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        const sp<IGraphicBufferProducer>& bufferProducer) {
397e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    Mutex::Autolock _l(mLock);
398e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    DisplayState& s(getDisplayStateLocked(token));
3992adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    s.surface = bufferProducer;
400e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    s.what |= DisplayState::eSurfaceChanged;
401e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
402e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
403e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid Composer::setDisplayLayerStack(const sp<IBinder>& token,
404e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        uint32_t layerStack) {
405e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    Mutex::Autolock _l(mLock);
406e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    DisplayState& s(getDisplayStateLocked(token));
407e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    s.layerStack = layerStack;
408e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    s.what |= DisplayState::eLayerStackChanged;
409e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
410e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
41100e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid Composer::setDisplayProjection(const sp<IBinder>& token,
41200e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        uint32_t orientation,
41300e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        const Rect& layerStackRect,
41400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        const Rect& displayRect) {
415e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    Mutex::Autolock _l(mLock);
416e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    DisplayState& s(getDisplayStateLocked(token));
417e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    s.orientation = orientation;
41800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    s.viewport = layerStackRect;
41900e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    s.frame = displayRect;
42000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    s.what |= DisplayState::eDisplayProjectionChanged;
421e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    mForceSynchronous = true; // TODO: do we actually still need this?
422e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
423e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
424e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian// ---------------------------------------------------------------------------
425e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurfaceComposerClient::SurfaceComposerClient()
427698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    : mStatus(NO_INIT), mComposer(Composer::getInstance())
428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
431698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::onFirstRef() {
432e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    sp<ISurfaceComposer> sm(ComposerService::getComposerService());
433d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    if (sm != 0) {
4347e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian        sp<ISurfaceComposerClient> conn = sm->createConnection();
435d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        if (conn != 0) {
436d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            mClient = conn;
437d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            mStatus = NO_ERROR;
438d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        }
439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
442698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias AgopianSurfaceComposerClient::~SurfaceComposerClient() {
443d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    dispose();
444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
446698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::initCheck() const {
447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mStatus;
448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
450698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopiansp<IBinder> SurfaceComposerClient::connection() const {
451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (mClient != 0) ? mClient->asBinder() : 0;
452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
454d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianstatus_t SurfaceComposerClient::linkToComposerDeath(
455d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        const sp<IBinder::DeathRecipient>& recipient,
456698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        void* cookie, uint32_t flags) {
457e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    sp<ISurfaceComposer> sm(ComposerService::getComposerService());
458d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    return sm->asBinder()->linkToDeath(recipient, cookie, flags);
459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
461698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::dispose() {
462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this can be called more than once.
4637e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    sp<ISurfaceComposerClient> client;
464d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    Mutex::Autolock _lm(mLock);
465d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    if (mClient != 0) {
466d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        client = mClient; // hold ref while lock is held
467d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        mClient.clear();
468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
469d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    mStatus = NO_INIT;
470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface(
473285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        const String8& name,
474285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t w,
475285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t h,
476285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        PixelFormat format,
477285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t flags)
478285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian{
4794d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    sp<SurfaceControl> sur;
480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mStatus == NO_ERROR) {
4814d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        sp<IBinder> handle;
4824d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        sp<IGraphicBufferProducer> gbp;
4834d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        status_t err = mClient->createSurface(name, w, h, format, flags,
4844d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian                &handle, &gbp);
4854d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        ALOGE_IF(err, "SurfaceComposerClient::createSurface error %s", strerror(-err));
4864d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        if (err == NO_ERROR) {
4874d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian            sur = new SurfaceControl(this, handle, gbp);
488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
4904d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    return sur;
491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
493dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennissp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName,
494dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        bool secure) {
495dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    return Composer::getInstance().createDisplay(displayName, secure);
496e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
497e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
4986c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hallvoid SurfaceComposerClient::destroyDisplay(const sp<IBinder>& display) {
4996c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    Composer::getInstance().destroyDisplay(display);
5006c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall}
5016c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall
5029d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownsp<IBinder> SurfaceComposerClient::getBuiltInDisplay(int32_t id) {
5039d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    return Composer::getInstance().getBuiltInDisplay(id);
5049d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown}
5059d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown
506ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::destroySurface(const sp<IBinder>& sid) {
507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mStatus != NO_ERROR)
508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return mStatus;
509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t err = mClient->destroySurface(sid);
510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return err;
511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
513698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianinline Composer& SurfaceComposerClient::getComposer() {
514698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return mComposer;
515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
517698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
519698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::openGlobalTransaction() {
520f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    Composer::openGlobalTransaction();
521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
52328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid SurfaceComposerClient::closeGlobalTransaction(bool synchronous) {
52428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    Composer::closeGlobalTransaction(synchronous);
525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
5272d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennisvoid SurfaceComposerClient::setAnimationTransaction() {
5282d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    Composer::setAnimationTransaction();
5292d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis}
5302d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis
531698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
533ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setCrop(const sp<IBinder>& id, const Rect& crop) {
534f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return getComposer().setCrop(this, id, crop);
535f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
536f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
537ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setPosition(const sp<IBinder>& id, float x, float y) {
538698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setPosition(this, id, x, y);
539698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
541ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setSize(const sp<IBinder>& id, uint32_t w, uint32_t h) {
542698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setSize(this, id, w, h);
543698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
545ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setLayer(const sp<IBinder>& id, int32_t z) {
546698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setLayer(this, id, z);
547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
549ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::hide(const sp<IBinder>& id) {
550698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id,
5513165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian            layer_state_t::eLayerHidden,
5523165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian            layer_state_t::eLayerHidden);
553698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
555ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::show(const sp<IBinder>& id) {
556698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id,
557698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            0,
5583165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian            layer_state_t::eLayerHidden);
559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
561ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setFlags(const sp<IBinder>& id, uint32_t flags,
562698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        uint32_t mask) {
563698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id, flags, mask);
564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
566ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setTransparentRegionHint(const sp<IBinder>& id,
567698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        const Region& transparentRegion) {
568698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setTransparentRegionHint(this, id, transparentRegion);
569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
571ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setAlpha(const sp<IBinder>& id, float alpha) {
572698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setAlpha(this, id, alpha);
573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
575ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setLayerStack(const sp<IBinder>& id, uint32_t layerStack) {
5768785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    return getComposer().setLayerStack(this, id, layerStack);
5778785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian}
5788785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian
579ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setMatrix(const sp<IBinder>& id, float dsdx, float dtdx,
580698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        float dsdy, float dtdy) {
581698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setMatrix(this, id, dsdx, dtdx, dsdy, dtdy);
582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
584698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
585698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
586e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid SurfaceComposerClient::setDisplaySurface(const sp<IBinder>& token,
5872adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        const sp<IGraphicBufferProducer>& bufferProducer) {
5882adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    Composer::getInstance().setDisplaySurface(token, bufferProducer);
589e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
590e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
591e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid SurfaceComposerClient::setDisplayLayerStack(const sp<IBinder>& token,
592e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        uint32_t layerStack) {
593e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    Composer::getInstance().setDisplayLayerStack(token, layerStack);
594e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
595e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
59600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid SurfaceComposerClient::setDisplayProjection(const sp<IBinder>& token,
59700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        uint32_t orientation,
59800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        const Rect& layerStackRect,
59900e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        const Rect& displayRect) {
60000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    Composer::getInstance().setDisplayProjection(token, orientation,
60100e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian            layerStackRect, displayRect);
602e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
603e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
604e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian// ----------------------------------------------------------------------------
605e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
606698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::getDisplayInfo(
6079d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown        const sp<IBinder>& display, DisplayInfo* info)
608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
6099d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    return ComposerService::getComposerService()->getDisplayInfo(display, info);
610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6122a09bb321930e1f782599ec902bca1db58b9af77Jeff Brownvoid SurfaceComposerClient::blankDisplay(const sp<IBinder>& token) {
6132a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown    ComposerService::getComposerService()->blank(token);
6142a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown}
6152a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown
6162a09bb321930e1f782599ec902bca1db58b9af77Jeff Brownvoid SurfaceComposerClient::unblankDisplay(const sp<IBinder>& token) {
6172a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown    ComposerService::getComposerService()->unblank(token);
6182a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown}
6192a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown
620698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
621698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
6222a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopianstatus_t ScreenshotClient::capture(
6232a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        const sp<IBinder>& display,
6242a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        const sp<IGraphicBufferProducer>& producer,
6252a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        uint32_t reqWidth, uint32_t reqHeight,
6262a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        uint32_t minLayerZ, uint32_t maxLayerZ) {
6272a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
6282a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    if (s == NULL) return NO_INIT;
6292a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    return s->captureScreen(display, producer,
6303ca76f416bc8665a97636ca8a2d0128b9da9d92cMathias Agopian            reqWidth, reqHeight, minLayerZ, maxLayerZ);
6312a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian}
6322a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian
63374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianScreenshotClient::ScreenshotClient()
634abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    : mHaveBuffer(false) {
635abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    memset(&mBuffer, 0, sizeof(mBuffer));
63674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
63774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
6388000d0694bc34bc17d869da546d8ff8790ae7be4Mathias AgopianScreenshotClient::~ScreenshotClient() {
6398000d0694bc34bc17d869da546d8ff8790ae7be4Mathias Agopian    ScreenshotClient::release();
6408000d0694bc34bc17d869da546d8ff8790ae7be4Mathias Agopian}
6418000d0694bc34bc17d869da546d8ff8790ae7be4Mathias Agopian
642abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopiansp<CpuConsumer> ScreenshotClient::getCpuConsumer() const {
643abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    if (mCpuConsumer == NULL) {
644db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian        mBufferQueue = new BufferQueue();
645db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian        mCpuConsumer = new CpuConsumer(mBufferQueue, 1);
646abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        mCpuConsumer->setName(String8("ScreenshotClient"));
647abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    }
648abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    return mCpuConsumer;
64974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
65074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
6519d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownstatus_t ScreenshotClient::update(const sp<IBinder>& display,
652abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        uint32_t reqWidth, uint32_t reqHeight,
653abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        uint32_t minLayerZ, uint32_t maxLayerZ) {
65474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
65574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    if (s == NULL) return NO_INIT;
656abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    sp<CpuConsumer> cpuConsumer = getCpuConsumer();
657abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian
658abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    if (mHaveBuffer) {
659abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        mCpuConsumer->unlockBuffer(mBuffer);
660abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        memset(&mBuffer, 0, sizeof(mBuffer));
661abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        mHaveBuffer = false;
662abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    }
663abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian
664db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian    status_t err = s->captureScreen(display, mBufferQueue,
6653ca76f416bc8665a97636ca8a2d0128b9da9d92cMathias Agopian            reqWidth, reqHeight, minLayerZ, maxLayerZ);
666abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian
667abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    if (err == NO_ERROR) {
668abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        err = mCpuConsumer->lockNextBuffer(&mBuffer);
669abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        if (err == NO_ERROR) {
670abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian            mHaveBuffer = true;
671abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        }
672abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    }
673abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    return err;
674abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian}
675abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian
676abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopianstatus_t ScreenshotClient::update(const sp<IBinder>& display) {
677abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    return ScreenshotClient::update(display, 0, 0, 0, -1UL);
678bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian}
679bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian
6809d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownstatus_t ScreenshotClient::update(const sp<IBinder>& display,
681abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        uint32_t reqWidth, uint32_t reqHeight) {
682abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    return ScreenshotClient::update(display, reqWidth, reqHeight, 0, -1UL);
68374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
68474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
68574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid ScreenshotClient::release() {
686abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    if (mHaveBuffer) {
687abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        mCpuConsumer->unlockBuffer(mBuffer);
688abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        memset(&mBuffer, 0, sizeof(mBuffer));
689abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian        mHaveBuffer = false;
690abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    }
691abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    mCpuConsumer.clear();
69274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
69374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
69474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid const* ScreenshotClient::getPixels() const {
695abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    return mBuffer.data;
69674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
69774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
69874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getWidth() const {
699abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    return mBuffer.width;
70074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
70174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
70274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getHeight() const {
703abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    return mBuffer.height;
70474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
70574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
70674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianPixelFormat ScreenshotClient::getFormat() const {
707abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    return mBuffer.format;
70874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
70974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
71074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getStride() const {
711abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    return mBuffer.stride;
71274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
71374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
71474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopiansize_t ScreenshotClient::getSize() const {
715abe815dd6978b718c04f6e22e1a893d2b51d11a1Mathias Agopian    return mBuffer.stride * mBuffer.height * bytesPerPixel(mBuffer.format);
71674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
71774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
71874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian// ----------------------------------------------------------------------------
719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
720