SurfaceComposerClient.cpp revision 0ef4e15a6c12778daf464a4953d7e15e651f49ac
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>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h>
24d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian#include <utils/SortedVector.h>
259cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <utils/Log.h>
26d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian#include <utils/Singleton.h>
279cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
28c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IServiceManager.h>
29c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IMemory.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/DisplayInfo.h>
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
339cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/ISurfaceComposer.h>
347e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian#include <surfaceflinger/ISurfaceComposerClient.h>
359cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/ISurface.h>
369cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/SurfaceComposerClient.h>
379cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
389cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <private/surfaceflinger/LayerState.h>
399cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <private/surfaceflinger/SharedBufferStack.h>
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
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>() {
49b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    const String16 name("SurfaceFlinger");
50b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    while (getService(name, &mComposerService) != NO_ERROR) {
51b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        usleep(250000);
527e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    }
53b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    mServerCblkMemory = mComposerService->getCblk();
54b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    mServerCblk = static_cast<surface_flinger_cblk_t volatile *>(
55b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian            mServerCblkMemory->getBase());
56b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
577e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
58b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopiansp<ISurfaceComposer> ComposerService::getComposerService() {
59b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    return ComposerService::getInstance().mComposerService;
60b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
617e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
62b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopiansurface_flinger_cblk_t const volatile * ComposerService::getControlBlock() {
63b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    return ComposerService::getInstance().mServerCblk;
64b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
657e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
667e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianstatic inline sp<ISurfaceComposer> getComposerService() {
677e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    return ComposerService::getComposerService();
687e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian}
697e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
707e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianstatic inline surface_flinger_cblk_t const volatile * get_cblk() {
717e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    return ComposerService::getControlBlock();
727e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian}
737e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
747e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian// ---------------------------------------------------------------------------
757e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
767e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianclass Composer : public Singleton<Composer>
777e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian{
787e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    Mutex mLock;
797e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    SortedVector< wp<SurfaceComposerClient> > mActiveConnections;
807e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    SortedVector<sp<SurfaceComposerClient> > mOpenTransactions;
817e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
827e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    Composer() : Singleton<Composer>() {
837e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    }
847e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
85d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    void addClientImpl(const sp<SurfaceComposerClient>& client) {
86d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        Mutex::Autolock _l(mLock);
87d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        mActiveConnections.add(client);
88d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    }
89d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
90d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    void removeClientImpl(const sp<SurfaceComposerClient>& client) {
91d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        Mutex::Autolock _l(mLock);
92d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        mActiveConnections.remove(client);
93d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    }
94d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
95d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    void openGlobalTransactionImpl()
96d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    {
97d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        Mutex::Autolock _l(mLock);
98d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        if (mOpenTransactions.size()) {
99d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            LOGE("openGlobalTransaction() called more than once. skipping.");
100d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            return;
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
102d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        const size_t N = mActiveConnections.size();
103d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        for (size_t i=0; i<N; i++) {
104d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            sp<SurfaceComposerClient> client(mActiveConnections[i].promote());
105d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            if (client != 0 && mOpenTransactions.indexOf(client) < 0) {
106d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian                if (client->openTransaction() == NO_ERROR) {
107d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian                    mOpenTransactions.add(client);
108d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian                } else {
109d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian                    LOGE("openTransaction on client %p failed", client.get());
110d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian                    // let it go, it'll fail later when the user
111d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian                    // tries to do something with the transaction
112d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian                }
113d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            }
114d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        }
115d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    }
116d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
117d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    void closeGlobalTransactionImpl()
118d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    {
119d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        mLock.lock();
120d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            SortedVector< sp<SurfaceComposerClient> > clients(mOpenTransactions);
121d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            mOpenTransactions.clear();
122d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        mLock.unlock();
123d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
1247e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian        sp<ISurfaceComposer> sm(getComposerService());
125d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        sm->openGlobalTransaction();
126d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            const size_t N = clients.size();
127d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            for (size_t i=0; i<N; i++) {
128d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian                clients[i]->closeTransaction();
129d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            }
130d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        sm->closeGlobalTransaction();
131d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    }
132d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
133d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    friend class Singleton<Composer>;
134d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
135d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianpublic:
136d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    static void addClient(const sp<SurfaceComposerClient>& client) {
137d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        Composer::getInstance().addClientImpl(client);
138d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    }
139d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    static void removeClient(const sp<SurfaceComposerClient>& client) {
140d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        Composer::getInstance().removeClientImpl(client);
141d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    }
142d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    static void openGlobalTransaction() {
143d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        Composer::getInstance().openGlobalTransactionImpl();
144d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    }
145d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    static void closeGlobalTransaction() {
146d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        Composer::getInstance().closeGlobalTransactionImpl();
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
148d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian};
149d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
150d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(Composer);
151d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline int compare_type( const layer_state_t& lhs,
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                const layer_state_t& rhs) {
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (lhs.surface < rhs.surface)  return -1;
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (lhs.surface > rhs.surface)  return 1;
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurfaceComposerClient::SurfaceComposerClient()
162d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    : mTransactionOpen(0), mPrebuiltLayerState(0), mStatus(NO_INIT)
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
166d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianvoid SurfaceComposerClient::onFirstRef()
167dd3423c6247965bf67ea30c75e484a6f5d72b1a2Mathias Agopian{
168dd3423c6247965bf67ea30c75e484a6f5d72b1a2Mathias Agopian    sp<ISurfaceComposer> sm(getComposerService());
169d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    if (sm != 0) {
1707e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian        sp<ISurfaceComposerClient> conn = sm->createConnection();
171d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        if (conn != 0) {
172d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            mClient = conn;
173d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            Composer::addClient(this);
174d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            mPrebuiltLayerState = new layer_state_t;
175d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            mStatus = NO_ERROR;
176d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        }
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
180d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias AgopianSurfaceComposerClient::~SurfaceComposerClient()
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
182d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    delete mPrebuiltLayerState;
183d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    dispose();
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceComposerClient::initCheck() const
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mStatus;
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectsp<IBinder> SurfaceComposerClient::connection() const
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (mClient != 0) ? mClient->asBinder() : 0;
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
196d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianstatus_t SurfaceComposerClient::linkToComposerDeath(
197d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        const sp<IBinder::DeathRecipient>& recipient,
198d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        void* cookie, uint32_t flags)
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
200d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    sp<ISurfaceComposer> sm(getComposerService());
201d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    return sm->asBinder()->linkToDeath(recipient, cookie, flags);
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid SurfaceComposerClient::dispose()
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this can be called more than once.
2077e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    sp<ISurfaceComposerClient> client;
208d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    Mutex::Autolock _lm(mLock);
209d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    if (mClient != 0) {
210d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        Composer::removeClient(this);
211d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        client = mClient; // hold ref while lock is held
212d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        mClient.clear();
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
214d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    mStatus = NO_INIT;
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceComposerClient::getDisplayInfo(
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        DisplayID dpy, DisplayInfo* info)
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
220bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    if (uint32_t(dpy)>=SharedBufferStack::NUM_DISPLAY_MAX)
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return BAD_VALUE;
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile surface_flinger_cblk_t const * cblk = get_cblk();
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile display_cblk_t const * dcblk = cblk->displays + dpy;
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    info->w              = dcblk->w;
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    info->h              = dcblk->h;
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    info->orientation    = dcblk->orientation;
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    info->xdpi           = dcblk->xdpi;
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    info->ydpi           = dcblk->ydpi;
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    info->fps            = dcblk->fps;
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    info->density        = dcblk->density;
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getPixelFormatInfo(dcblk->format, &(info->pixelFormatInfo));
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t SurfaceComposerClient::getDisplayWidth(DisplayID dpy)
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
238bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    if (uint32_t(dpy)>=SharedBufferStack::NUM_DISPLAY_MAX)
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return BAD_VALUE;
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile surface_flinger_cblk_t const * cblk = get_cblk();
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile display_cblk_t const * dcblk = cblk->displays + dpy;
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return dcblk->w;
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t SurfaceComposerClient::getDisplayHeight(DisplayID dpy)
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
247bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    if (uint32_t(dpy)>=SharedBufferStack::NUM_DISPLAY_MAX)
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return BAD_VALUE;
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile surface_flinger_cblk_t const * cblk = get_cblk();
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile display_cblk_t const * dcblk = cblk->displays + dpy;
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return dcblk->h;
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t SurfaceComposerClient::getDisplayOrientation(DisplayID dpy)
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
256bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian    if (uint32_t(dpy)>=SharedBufferStack::NUM_DISPLAY_MAX)
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return BAD_VALUE;
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile surface_flinger_cblk_t const * cblk = get_cblk();
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile display_cblk_t const * dcblk = cblk->displays + dpy;
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return dcblk->orientation;
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t SurfaceComposerClient::getNumberOfDisplays()
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile surface_flinger_cblk_t const * cblk = get_cblk();
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t connected = cblk->connected;
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int n = 0;
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while (connected) {
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (connected&1) n++;
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        connected >>= 1;
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return n;
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface(
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        DisplayID display,
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t w,
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t h,
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PixelFormat format,
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t flags)
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
282285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    String8 name;
283285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    const size_t SIZE = 128;
284285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    char buffer[SIZE];
285285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    snprintf(buffer, SIZE, "<pid_%d>", getpid());
286285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    name.append(buffer);
287285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian
2880ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian    return SurfaceComposerClient::createSurface(name, display,
289285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian            w, h, format, flags);
290285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian}
291285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian
292285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface(
293285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        const String8& name,
294285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        DisplayID display,
295285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t w,
296285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t h,
297285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        PixelFormat format,
298285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t flags)
299285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian{
30001b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    sp<SurfaceControl> result;
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mStatus == NO_ERROR) {
3027e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian        ISurfaceComposerClient::surface_data_t data;
3030ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian        sp<ISurface> surface = mClient->createSurface(&data, name,
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                display, w, h, format, flags);
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface != 0) {
30653503a97a9afa9e876b1e95ca7e3b46c76aa4f15Mathias Agopian            result = new SurfaceControl(this, surface, data, w, h, format, flags);
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return result;
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceComposerClient::destroySurface(SurfaceID sid)
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mStatus != NO_ERROR)
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return mStatus;
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // it's okay to destroy a surface while a transaction is open,
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // (transactions really are a client-side concept)
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // however, this indicates probably a misuse of the API or a bug
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // in the client code.
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    LOGW_IF(mTransactionOpen,
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         "Destroying surface while a transaction is open. "
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         "Client %p: destroying surface %d, mTransactionOpen=%d",
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         this, sid, mTransactionOpen);
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t err = mClient->destroySurface(sid);
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return err;
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid SurfaceComposerClient::openGlobalTransaction()
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
332d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    Composer::openGlobalTransaction();
333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid SurfaceComposerClient::closeGlobalTransaction()
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
337d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    Composer::closeGlobalTransaction();
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceComposerClient::freezeDisplay(DisplayID dpy, uint32_t flags)
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
342dd3423c6247965bf67ea30c75e484a6f5d72b1a2Mathias Agopian    sp<ISurfaceComposer> sm(getComposerService());
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return sm->freezeDisplay(dpy, flags);
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceComposerClient::unfreezeDisplay(DisplayID dpy, uint32_t flags)
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
348dd3423c6247965bf67ea30c75e484a6f5d72b1a2Mathias Agopian    sp<ISurfaceComposer> sm(getComposerService());
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return sm->unfreezeDisplay(dpy, flags);
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
352c08731e756868653d09d3e49b723706df3687070Mathias Agopianint SurfaceComposerClient::setOrientation(DisplayID dpy,
353c08731e756868653d09d3e49b723706df3687070Mathias Agopian        int orientation, uint32_t flags)
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
355dd3423c6247965bf67ea30c75e484a6f5d72b1a2Mathias Agopian    sp<ISurfaceComposer> sm(getComposerService());
356c08731e756868653d09d3e49b723706df3687070Mathias Agopian    return sm->setOrientation(dpy, orientation, flags);
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceComposerClient::openTransaction()
360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mStatus != NO_ERROR)
362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return mStatus;
363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Mutex::Autolock _l(mLock);
364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransactionOpen++;
365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceComposerClient::closeTransaction()
369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mStatus != NO_ERROR)
371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return mStatus;
372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Mutex::Autolock _l(mLock);
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mTransactionOpen <= 0) {
375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        LOGE(   "closeTransaction (client %p, mTransactionOpen=%d) "
376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                "called more times than openTransaction()",
377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                this, mTransactionOpen);
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return INVALID_OPERATION;
379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mTransactionOpen >= 2) {
382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mTransactionOpen--;
383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return NO_ERROR;
384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransactionOpen = 0;
387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const ssize_t count = mStates.size();
388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (count) {
389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mClient->setState(count, mStates.array());
390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mStates.clear();
391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
395631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianlayer_state_t* SurfaceComposerClient::get_state_l(SurfaceID index)
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // API usage error, do nothing.
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mTransactionOpen<=0) {
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        LOGE("Not in transaction (client=%p, SurfaceID=%d, mTransactionOpen=%d",
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                this, int(index), mTransactionOpen);
401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return 0;
402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // use mPrebuiltLayerState just to find out if we already have it
405d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    layer_state_t& dummy(*mPrebuiltLayerState);
406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    dummy.surface = index;
407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ssize_t i = mStates.indexOf(dummy);
408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (i < 0) {
409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // we don't have it, add an initialized layer_state to our list
410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        i = mStates.add(dummy);
411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mStates.editArray() + i;
413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
415631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianlayer_state_t* SurfaceComposerClient::lockLayerState(SurfaceID id)
416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    layer_state_t* s;
418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mLock.lock();
419631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    s = get_state_l(id);
420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!s) mLock.unlock();
421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return s;
422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
424631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianvoid SurfaceComposerClient::unlockLayerState()
425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mLock.unlock();
427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
42962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::setPosition(SurfaceID id, int32_t x, int32_t y)
430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
431631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    layer_state_t* s = lockLayerState(id);
432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!s) return BAD_INDEX;
433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->what |= ISurfaceComposer::ePositionChanged;
434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->x = x;
435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->y = y;
436631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    unlockLayerState();
437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
44062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::setSize(SurfaceID id, uint32_t w, uint32_t h)
441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
442631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    layer_state_t* s = lockLayerState(id);
443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!s) return BAD_INDEX;
444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->what |= ISurfaceComposer::eSizeChanged;
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->w = w;
446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->h = h;
447631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    unlockLayerState();
448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
45162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::setLayer(SurfaceID id, int32_t z)
452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
453631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    layer_state_t* s = lockLayerState(id);
454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!s) return BAD_INDEX;
455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->what |= ISurfaceComposer::eLayerChanged;
456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->z = z;
457631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    unlockLayerState();
458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
46162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::hide(SurfaceID id)
462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
46362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    return setFlags(id, ISurfaceComposer::eLayerHidden,
464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ISurfaceComposer::eLayerHidden);
465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
46762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::show(SurfaceID id, int32_t)
468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
46962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    return setFlags(id, 0, ISurfaceComposer::eLayerHidden);
470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::freeze(SurfaceID id)
473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
47462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    return setFlags(id, ISurfaceComposer::eLayerFrozen,
475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ISurfaceComposer::eLayerFrozen);
476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::unfreeze(SurfaceID id)
479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
48062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    return setFlags(id, 0, ISurfaceComposer::eLayerFrozen);
481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
48362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::setFlags(SurfaceID id,
484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t flags, uint32_t mask)
485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
486631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    layer_state_t* s = lockLayerState(id);
487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!s) return BAD_INDEX;
488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->what |= ISurfaceComposer::eVisibilityChanged;
489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->flags &= ~mask;
490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->flags |= (flags & mask);
491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->mask |= mask;
492631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    unlockLayerState();
493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceComposerClient::setTransparentRegionHint(
49762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian        SurfaceID id, const Region& transparentRegion)
498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
499631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    layer_state_t* s = lockLayerState(id);
500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!s) return BAD_INDEX;
501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->what |= ISurfaceComposer::eTransparentRegionChanged;
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->transparentRegion = transparentRegion;
503631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    unlockLayerState();
504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
50762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::setAlpha(SurfaceID id, float alpha)
508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
509631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    layer_state_t* s = lockLayerState(id);
510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!s) return BAD_INDEX;
511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->what |= ISurfaceComposer::eAlphaChanged;
512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->alpha = alpha;
513631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    unlockLayerState();
514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t SurfaceComposerClient::setMatrix(
51862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian        SurfaceID id,
519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        float dsdx, float dtdx,
520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        float dsdy, float dtdy )
521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
522631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    layer_state_t* s = lockLayerState(id);
523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!s) return BAD_INDEX;
524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->what |= ISurfaceComposer::eMatrixChanged;
525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    layer_state_t::matrix22_t matrix;
526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    matrix.dsdx = dsdx;
527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    matrix.dtdx = dtdx;
528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    matrix.dsdy = dsdy;
529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    matrix.dtdy = dtdy;
530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->matrix = matrix;
531631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    unlockLayerState();
532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
53562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceComposerClient::setFreezeTint(SurfaceID id, uint32_t tint)
536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
537631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    layer_state_t* s = lockLayerState(id);
538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!s) return BAD_INDEX;
539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->what |= ISurfaceComposer::eFreezeTintChanged;
540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s->tint = tint;
541631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    unlockLayerState();
542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
545d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian// ----------------------------------------------------------------------------
54674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
54774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianScreenshotClient::ScreenshotClient()
54874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    : mWidth(0), mHeight(0), mFormat(PIXEL_FORMAT_NONE) {
54974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
55074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
55174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianstatus_t ScreenshotClient::update() {
55274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
55374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    if (s == NULL) return NO_INIT;
55474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    mHeap = 0;
55574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return s->captureScreen(0, &mHeap,
556bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            &mWidth, &mHeight, &mFormat, 0, 0,
557bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            0, -1UL);
55874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
55974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
56074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianstatus_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight) {
56174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
56274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    if (s == NULL) return NO_INIT;
56374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    mHeap = 0;
56474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return s->captureScreen(0, &mHeap,
565bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            &mWidth, &mHeight, &mFormat, reqWidth, reqHeight,
566bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            0, -1UL);
567bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian}
568bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian
569bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopianstatus_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight,
570bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian        uint32_t minLayerZ, uint32_t maxLayerZ) {
571bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
572bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    if (s == NULL) return NO_INIT;
573bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    mHeap = 0;
574bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    return s->captureScreen(0, &mHeap,
575bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            &mWidth, &mHeight, &mFormat, reqWidth, reqHeight,
576bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            minLayerZ, maxLayerZ);
57774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
57874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
57974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid ScreenshotClient::release() {
58074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    mHeap = 0;
58174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
58274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
58374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid const* ScreenshotClient::getPixels() const {
58474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mHeap->getBase();
58574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
58674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
58774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getWidth() const {
58874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mWidth;
58974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
59074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
59174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getHeight() const {
59274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mHeight;
59374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
59474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
59574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianPixelFormat ScreenshotClient::getFormat() const {
59674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mFormat;
59774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
59874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
59974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getStride() const {
60074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mWidth;
60174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
60274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
60374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopiansize_t ScreenshotClient::getSize() const {
60474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mHeap->getSize();
60574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
60674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
60774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian// ----------------------------------------------------------------------------
608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
610