SurfaceComposerClient.cpp revision ac9fa427d4a86745e60a5f7fd8e3ea340c4db907
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "SurfaceComposerClient"
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
239cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <utils/Log.h>
24d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian#include <utils/Singleton.h>
25a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/SortedVector.h>
26a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/String8.h>
27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/threads.h>
289cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
29c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IMemory.h>
30a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <binder/IServiceManager.h>
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/DisplayInfo.h>
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurface.h>
3590ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposer.h>
3690ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposerClient.h>
3790ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/SurfaceComposerClient.h>
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3941f673c9b3aac0d96e41c928845c39186d565212Mathias Agopian#include <private/gui/ComposerService.h>
4090ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <private/gui/LayerState.h>
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
45b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(ComposerService);
467e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
47b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianComposerService::ComposerService()
48b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian: Singleton<ComposerService>() {
496652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    Mutex::Autolock _l(mLock);
506652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    connectLocked();
516652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden}
526652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden
536652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFaddenvoid ComposerService::connectLocked() {
54b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    const String16 name("SurfaceFlinger");
55b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    while (getService(name, &mComposerService) != NO_ERROR) {
56b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        usleep(250000);
577e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    }
586652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    assert(mComposerService != NULL);
596652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden
606652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    // Create the death listener.
616652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    class DeathObserver : public IBinder::DeathRecipient {
626652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden        ComposerService& mComposerService;
636652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden        virtual void binderDied(const wp<IBinder>& who) {
646652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden            ALOGW("ComposerService remote (surfaceflinger) died [%p]",
656652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden                  who.unsafe_get());
666652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden            mComposerService.composerServiceDied();
676652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden        }
686652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden     public:
696652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden        DeathObserver(ComposerService& mgr) : mComposerService(mgr) { }
706652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    };
716652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden
726652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this));
736652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    mComposerService->asBinder()->linkToDeath(mDeathObserver);
746652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden}
756652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden
766652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden/*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() {
776652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    ComposerService& instance = ComposerService::getInstance();
786652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    Mutex::Autolock _l(instance.mLock);
796652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    if (instance.mComposerService == NULL) {
806652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden        ComposerService::getInstance().connectLocked();
816652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden        assert(instance.mComposerService != NULL);
826652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden        ALOGD("ComposerService reconnected");
836652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    }
846652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    return instance.mComposerService;
85b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
867e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
876652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFaddenvoid ComposerService::composerServiceDied()
886652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden{
896652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    Mutex::Autolock _l(mLock);
906652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    mComposerService = NULL;
916652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden    mDeathObserver = NULL;
92b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
937e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
947e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian// ---------------------------------------------------------------------------
957e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
96698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatic inline
97e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianint compare_type(const ComposerState& lhs, const ComposerState& rhs) {
98698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (lhs.client < rhs.client)  return -1;
99698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (lhs.client > rhs.client)  return 1;
100698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (lhs.state.surface < rhs.state.surface)  return -1;
101698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (lhs.state.surface > rhs.state.surface)  return 1;
102698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return 0;
103698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
104698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
105e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianstatic inline
106e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianint compare_type(const DisplayState& lhs, const DisplayState& rhs) {
107e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    return compare_type(lhs.token, rhs.token);
108e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
109e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
1107e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianclass Composer : public Singleton<Composer>
1117e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian{
112698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    friend class Singleton<Composer>;
1137e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
114698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    mutable Mutex               mLock;
115e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    SortedVector<ComposerState> mComposerStates;
116e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    SortedVector<DisplayState > mDisplayStates;
11728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    uint32_t                    mForceSynchronous;
118f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    uint32_t                    mTransactionNestCount;
1192d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    bool                        mAnimation;
1207e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
121b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    Composer() : Singleton<Composer>(),
122f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        mForceSynchronous(0), mTransactionNestCount(0),
1232d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis        mAnimation(false)
12428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    { }
125d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
126f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    void openGlobalTransactionImpl();
12728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    void closeGlobalTransactionImpl(bool synchronous);
1282d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    void setAnimationTransactionImpl();
129d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
130698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* getLayerStateLocked(
131ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian            const sp<SurfaceComposerClient>& client, const sp<IBinder>& id);
132d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
133e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    DisplayState& getDisplayStateLocked(const sp<IBinder>& token);
134e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
135698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianpublic:
136dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    sp<IBinder> createDisplay(const String8& displayName, bool secure);
1379d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    sp<IBinder> getBuiltInDisplay(int32_t id);
138d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
139ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian    status_t setPosition(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
14041b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian            float x, float y);
141ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian    status_t setSize(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
142698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            uint32_t w, uint32_t h);
143ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian    status_t setLayer(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
144698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            int32_t z);
145ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian    status_t setFlags(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
146698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            uint32_t flags, uint32_t mask);
147698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setTransparentRegionHint(
148ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian            const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
149698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            const Region& transparentRegion);
150ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian    status_t setAlpha(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
151698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            float alpha);
152ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian    status_t setMatrix(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
153698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            float dsdx, float dtdx, float dsdy, float dtdy);
154b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    status_t setOrientation(int orientation);
155ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian    status_t setCrop(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
156f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis            const Rect& crop);
1578785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    status_t setLayerStack(const sp<SurfaceComposerClient>& client,
158ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian            const sp<IBinder>& id, uint32_t layerStack);
159d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
1602adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    void setDisplaySurface(const sp<IBinder>& token,
1612adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            const sp<IGraphicBufferProducer>& bufferProducer);
162e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    void setDisplayLayerStack(const sp<IBinder>& token, uint32_t layerStack);
16300e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    void setDisplayProjection(const sp<IBinder>& token,
16400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian            uint32_t orientation,
16500e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian            const Rect& layerStackRect,
16600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian            const Rect& displayRect);
167e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
1682d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    static void setAnimationTransaction() {
1692d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis        Composer::getInstance().setAnimationTransactionImpl();
1702d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    }
1712d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis
172f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    static void openGlobalTransaction() {
173f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        Composer::getInstance().openGlobalTransactionImpl();
174f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    }
175f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown
17628378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    static void closeGlobalTransaction(bool synchronous) {
17728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        Composer::getInstance().closeGlobalTransactionImpl(synchronous);
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
179d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian};
180d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
181d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(Composer);
182d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
185dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennissp<IBinder> Composer::createDisplay(const String8& displayName, bool secure) {
186dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    return ComposerService::getComposerService()->createDisplay(displayName,
187dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis            secure);
188e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
189e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
1909d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownsp<IBinder> Composer::getBuiltInDisplay(int32_t id) {
1919d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    return ComposerService::getComposerService()->getBuiltInDisplay(id);
1929d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown}
1939d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown
194f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brownvoid Composer::openGlobalTransactionImpl() {
195f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    { // scope for the lock
196f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        Mutex::Autolock _l(mLock);
197f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        mTransactionNestCount += 1;
198f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    }
199f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown}
200f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown
20128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid Composer::closeGlobalTransactionImpl(bool synchronous) {
202e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    sp<ISurfaceComposer> sm(ComposerService::getComposerService());
203698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
204698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Vector<ComposerState> transaction;
2058b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian    Vector<DisplayState> displayTransaction;
20628378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    uint32_t flags = 0;
207698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
208698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    { // scope for the lock
209698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        Mutex::Autolock _l(mLock);
210f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        mForceSynchronous |= synchronous;
211f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        if (!mTransactionNestCount) {
212f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown            ALOGW("At least one call to closeGlobalTransaction() was not matched by a prior "
213f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown                    "call to openGlobalTransaction().");
214f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        } else if (--mTransactionNestCount) {
215f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown            return;
216f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        }
217f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown
218e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        transaction = mComposerStates;
219e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        mComposerStates.clear();
2208b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian
221e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        displayTransaction = mDisplayStates;
222e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        mDisplayStates.clear();
22328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
224f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown        if (mForceSynchronous) {
22528378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis            flags |= ISurfaceComposer::eSynchronous;
22628378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        }
2272d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis        if (mAnimation) {
2282d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis            flags |= ISurfaceComposer::eAnimation;
2292d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis        }
2302d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis
23128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        mForceSynchronous = false;
2322d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis        mAnimation = false;
233698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    }
234698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
2358b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian   sm->setTransactionState(transaction, displayTransaction, flags);
236698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
237698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
2382d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennisvoid Composer::setAnimationTransactionImpl() {
2392d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    Mutex::Autolock _l(mLock);
2402d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    mAnimation = true;
2412d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis}
2422d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis
243698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianlayer_state_t* Composer::getLayerStateLocked(
244ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<SurfaceComposerClient>& client, const sp<IBinder>& id) {
245698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
246698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    ComposerState s;
247698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s.client = client->mClient;
248698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s.state.surface = id;
249698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
250e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    ssize_t index = mComposerStates.indexOf(s);
251698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (index < 0) {
252698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        // we don't have it, add an initialized layer_state to our list
253e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        index = mComposerStates.add(s);
254698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    }
255698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
256e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    ComposerState* const out = mComposerStates.editArray();
257698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return &(out[index].state);
258698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
259698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
260698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setPosition(const sp<SurfaceComposerClient>& client,
261ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, float x, float y) {
262698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
263698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
264698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
265698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
2663165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::ePositionChanged;
267698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->x = x;
268698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->y = y;
269698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
270698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
271698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
272698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setSize(const sp<SurfaceComposerClient>& client,
273ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, uint32_t w, uint32_t h) {
274698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
275698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
276698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
277698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
2783165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eSizeChanged;
279698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->w = w;
280698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->h = h;
28128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
28228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    // Resizing a surface makes the transaction synchronous.
28328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    mForceSynchronous = true;
28428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
285698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
286698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
287698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
288698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setLayer(const sp<SurfaceComposerClient>& client,
289ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, int32_t z) {
290698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
291698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
292698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
293698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
2943165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eLayerChanged;
295698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->z = z;
296698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
297698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
298698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
299698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setFlags(const sp<SurfaceComposerClient>& client,
300ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, uint32_t flags,
301698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        uint32_t mask) {
302698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
303698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
304698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
305698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
3063165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eVisibilityChanged;
307698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->flags &= ~mask;
308698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->flags |= (flags & mask);
309698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->mask |= mask;
310698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
311698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
312698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
313698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setTransparentRegionHint(
314ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
315698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        const Region& transparentRegion) {
316698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
317698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
318698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
319698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
3203165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eTransparentRegionChanged;
321698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->transparentRegion = transparentRegion;
322698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
323698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
324698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
325698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setAlpha(const sp<SurfaceComposerClient>& client,
326ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, float alpha) {
327698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
328698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
329698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
330698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
3313165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eAlphaChanged;
332698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->alpha = alpha;
333698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
334698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
335698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
3368785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopianstatus_t Composer::setLayerStack(const sp<SurfaceComposerClient>& client,
337ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, uint32_t layerStack) {
3388785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    Mutex::Autolock _l(mLock);
3398785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
3408785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    if (!s)
3418785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian        return BAD_INDEX;
3423165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eLayerStackChanged;
3438785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    s->layerStack = layerStack;
3448785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    return NO_ERROR;
3458785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian}
3468785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian
347698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setMatrix(const sp<SurfaceComposerClient>& client,
348ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, float dsdx, float dtdx,
349698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        float dsdy, float dtdy) {
350698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
351698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
352698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
353698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
3543165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eMatrixChanged;
355698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t::matrix22_t matrix;
356698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dsdx = dsdx;
357698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dtdx = dtdx;
358698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dsdy = dsdy;
359698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dtdy = dtdy;
360698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->matrix = matrix;
361698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
364f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatus_t Composer::setCrop(const sp<SurfaceComposerClient>& client,
365ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        const sp<IBinder>& id, const Rect& crop) {
366f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Mutex::Autolock _l(mLock);
367f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    layer_state_t* s = getLayerStateLocked(client, id);
368f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!s)
369f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        return BAD_INDEX;
3703165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    s->what |= layer_state_t::eCropChanged;
371f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    s->crop = crop;
372f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return NO_ERROR;
373f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
374f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
375698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------
376698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
377e57f292595bec48f65c8088b00ff6beea01217e9Mathias AgopianDisplayState& Composer::getDisplayStateLocked(const sp<IBinder>& token) {
378e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    DisplayState s;
379e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    s.token = token;
380e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    ssize_t index = mDisplayStates.indexOf(s);
381e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    if (index < 0) {
382e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        // we don't have it, add an initialized layer_state to our list
383e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        s.what = 0;
384e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        index = mDisplayStates.add(s);
385e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    }
386e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    return mDisplayStates.editItemAt(index);
387e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
388e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
389e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid Composer::setDisplaySurface(const sp<IBinder>& token,
3902adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        const sp<IGraphicBufferProducer>& bufferProducer) {
391e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    Mutex::Autolock _l(mLock);
392e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    DisplayState& s(getDisplayStateLocked(token));
3932adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    s.surface = bufferProducer;
394e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    s.what |= DisplayState::eSurfaceChanged;
395e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
396e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
397e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid Composer::setDisplayLayerStack(const sp<IBinder>& token,
398e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        uint32_t layerStack) {
399e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    Mutex::Autolock _l(mLock);
400e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    DisplayState& s(getDisplayStateLocked(token));
401e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    s.layerStack = layerStack;
402e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    s.what |= DisplayState::eLayerStackChanged;
403e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
404e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
40500e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid Composer::setDisplayProjection(const sp<IBinder>& token,
40600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        uint32_t orientation,
40700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        const Rect& layerStackRect,
40800e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        const Rect& displayRect) {
409e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    Mutex::Autolock _l(mLock);
410e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    DisplayState& s(getDisplayStateLocked(token));
411e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    s.orientation = orientation;
41200e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    s.viewport = layerStackRect;
41300e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    s.frame = displayRect;
41400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    s.what |= DisplayState::eDisplayProjectionChanged;
415e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    mForceSynchronous = true; // TODO: do we actually still need this?
416e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
417e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
418e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian// ---------------------------------------------------------------------------
419e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurfaceComposerClient::SurfaceComposerClient()
421698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    : mStatus(NO_INIT), mComposer(Composer::getInstance())
422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
425698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::onFirstRef() {
426e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    sp<ISurfaceComposer> sm(ComposerService::getComposerService());
427d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    if (sm != 0) {
4287e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian        sp<ISurfaceComposerClient> conn = sm->createConnection();
429d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        if (conn != 0) {
430d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            mClient = conn;
431d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            mStatus = NO_ERROR;
432d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        }
433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
436698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias AgopianSurfaceComposerClient::~SurfaceComposerClient() {
437d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    dispose();
438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
440698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::initCheck() const {
441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mStatus;
442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
444698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopiansp<IBinder> SurfaceComposerClient::connection() const {
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (mClient != 0) ? mClient->asBinder() : 0;
446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
448d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianstatus_t SurfaceComposerClient::linkToComposerDeath(
449d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        const sp<IBinder::DeathRecipient>& recipient,
450698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        void* cookie, uint32_t flags) {
451e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    sp<ISurfaceComposer> sm(ComposerService::getComposerService());
452d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    return sm->asBinder()->linkToDeath(recipient, cookie, flags);
453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
455698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::dispose() {
456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this can be called more than once.
4577e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    sp<ISurfaceComposerClient> client;
458d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    Mutex::Autolock _lm(mLock);
459d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    if (mClient != 0) {
460d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        client = mClient; // hold ref while lock is held
461d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        mClient.clear();
462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
463d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    mStatus = NO_INIT;
464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
46601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface(
467285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        const String8& name,
468285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t w,
469285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t h,
470285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        PixelFormat format,
471285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t flags)
472285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian{
47301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    sp<SurfaceControl> result;
474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mStatus == NO_ERROR) {
475ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian        sp<ISurface> surface = mClient->createSurface(name, w, h, format, flags);
476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface != 0) {
477ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopian            result = new SurfaceControl(this, surface);
478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return result;
481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
483dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennissp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName,
484dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        bool secure) {
485dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    return Composer::getInstance().createDisplay(displayName, secure);
486e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
487e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
4889d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownsp<IBinder> SurfaceComposerClient::getBuiltInDisplay(int32_t id) {
4899d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    return Composer::getInstance().getBuiltInDisplay(id);
4909d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown}
4919d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown
492ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::destroySurface(const sp<IBinder>& sid) {
493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mStatus != NO_ERROR)
494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return mStatus;
495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t err = mClient->destroySurface(sid);
496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return err;
497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
499698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianinline Composer& SurfaceComposerClient::getComposer() {
500698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return mComposer;
501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
503698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
505698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::openGlobalTransaction() {
506f3f7db6346323ca3ec4ec449a2622adddc6306b4Jeff Brown    Composer::openGlobalTransaction();
507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
50928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid SurfaceComposerClient::closeGlobalTransaction(bool synchronous) {
51028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    Composer::closeGlobalTransaction(synchronous);
511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
5132d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennisvoid SurfaceComposerClient::setAnimationTransaction() {
5142d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis    Composer::setAnimationTransaction();
5152d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis}
5162d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis
517698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
519ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setCrop(const sp<IBinder>& id, const Rect& crop) {
520f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return getComposer().setCrop(this, id, crop);
521f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
522f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
523ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setPosition(const sp<IBinder>& id, float x, float y) {
524698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setPosition(this, id, x, y);
525698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
527ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setSize(const sp<IBinder>& id, uint32_t w, uint32_t h) {
528698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setSize(this, id, w, h);
529698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
531ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setLayer(const sp<IBinder>& id, int32_t z) {
532698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setLayer(this, id, z);
533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
535ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::hide(const sp<IBinder>& id) {
536698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id,
5373165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian            layer_state_t::eLayerHidden,
5383165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian            layer_state_t::eLayerHidden);
539698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
541ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::show(const sp<IBinder>& id) {
542698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id,
543698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            0,
5443165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian            layer_state_t::eLayerHidden);
545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
547ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setFlags(const sp<IBinder>& id, uint32_t flags,
548698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        uint32_t mask) {
549698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id, flags, mask);
550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
552ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setTransparentRegionHint(const sp<IBinder>& id,
553698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        const Region& transparentRegion) {
554698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setTransparentRegionHint(this, id, transparentRegion);
555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
557ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setAlpha(const sp<IBinder>& id, float alpha) {
558698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setAlpha(this, id, alpha);
559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
561ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setLayerStack(const sp<IBinder>& id, uint32_t layerStack) {
5628785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian    return getComposer().setLayerStack(this, id, layerStack);
5638785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian}
5648785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian
565ac9fa427d4a86745e60a5f7fd8e3ea340c4db907Mathias Agopianstatus_t SurfaceComposerClient::setMatrix(const sp<IBinder>& id, float dsdx, float dtdx,
566698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        float dsdy, float dtdy) {
567698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setMatrix(this, id, dsdx, dtdx, dsdy, dtdy);
568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
570698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
571698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
572e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid SurfaceComposerClient::setDisplaySurface(const sp<IBinder>& token,
5732adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        const sp<IGraphicBufferProducer>& bufferProducer) {
5742adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    Composer::getInstance().setDisplaySurface(token, bufferProducer);
575e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
576e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
577e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid SurfaceComposerClient::setDisplayLayerStack(const sp<IBinder>& token,
578e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        uint32_t layerStack) {
579e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    Composer::getInstance().setDisplayLayerStack(token, layerStack);
580e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
581e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
58200e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid SurfaceComposerClient::setDisplayProjection(const sp<IBinder>& token,
58300e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        uint32_t orientation,
58400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        const Rect& layerStackRect,
58500e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian        const Rect& displayRect) {
58600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian    Composer::getInstance().setDisplayProjection(token, orientation,
58700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian            layerStackRect, displayRect);
588e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian}
589e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
590e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian// ----------------------------------------------------------------------------
591e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
592698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::getDisplayInfo(
5939d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown        const sp<IBinder>& display, DisplayInfo* info)
594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
5959d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    return ComposerService::getComposerService()->getDisplayInfo(display, info);
596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
5982a09bb321930e1f782599ec902bca1db58b9af77Jeff Brownvoid SurfaceComposerClient::blankDisplay(const sp<IBinder>& token) {
5992a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown    ComposerService::getComposerService()->blank(token);
6002a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown}
6012a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown
6022a09bb321930e1f782599ec902bca1db58b9af77Jeff Brownvoid SurfaceComposerClient::unblankDisplay(const sp<IBinder>& token) {
6032a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown    ComposerService::getComposerService()->unblank(token);
6042a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown}
6052a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown
606698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
607698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
60874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianScreenshotClient::ScreenshotClient()
60974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    : mWidth(0), mHeight(0), mFormat(PIXEL_FORMAT_NONE) {
61074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
61174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
6129d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownstatus_t ScreenshotClient::update(const sp<IBinder>& display) {
61374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
61474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    if (s == NULL) return NO_INIT;
61574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    mHeap = 0;
6169d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    return s->captureScreen(display, &mHeap,
617bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            &mWidth, &mHeight, &mFormat, 0, 0,
618bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            0, -1UL);
61974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
62074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
6219d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownstatus_t ScreenshotClient::update(const sp<IBinder>& display,
6229d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown        uint32_t reqWidth, uint32_t reqHeight) {
62374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
62474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    if (s == NULL) return NO_INIT;
62574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    mHeap = 0;
6269d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    return s->captureScreen(display, &mHeap,
627bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            &mWidth, &mHeight, &mFormat, reqWidth, reqHeight,
628bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            0, -1UL);
629bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian}
630bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian
6319d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownstatus_t ScreenshotClient::update(const sp<IBinder>& display,
6329d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown        uint32_t reqWidth, uint32_t reqHeight,
633bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian        uint32_t minLayerZ, uint32_t maxLayerZ) {
634bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
635bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    if (s == NULL) return NO_INIT;
636bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    mHeap = 0;
6379d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    return s->captureScreen(display, &mHeap,
638bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            &mWidth, &mHeight, &mFormat, reqWidth, reqHeight,
639bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            minLayerZ, maxLayerZ);
64074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
64174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
64274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid ScreenshotClient::release() {
64374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    mHeap = 0;
64474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
64574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
64674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid const* ScreenshotClient::getPixels() const {
64774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mHeap->getBase();
64874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
64974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
65074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getWidth() const {
65174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mWidth;
65274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
65374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
65474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getHeight() const {
65574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mHeight;
65674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
65774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
65874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianPixelFormat ScreenshotClient::getFormat() const {
65974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mFormat;
66074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
66174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
66274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getStride() const {
66374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mWidth;
66474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
66574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
66674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopiansize_t ScreenshotClient::getSize() const {
66774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mHeap->getSize();
66874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
66974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
67074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian// ----------------------------------------------------------------------------
671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
672