SurfaceComposerClient.cpp revision 41f673c9b3aac0d96e41c928845c39186d565212
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
34a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <surfaceflinger/ISurface.h>
359cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/ISurfaceComposer.h>
367e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian#include <surfaceflinger/ISurfaceComposerClient.h>
379cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/SurfaceComposerClient.h>
389cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
399cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <private/surfaceflinger/LayerState.h>
409cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <private/surfaceflinger/SharedBufferStack.h>
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4241f673c9b3aac0d96e41c928845c39186d565212Mathias Agopian#include <private/gui/ComposerService.h>
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(ComposerService);
487e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
49b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianComposerService::ComposerService()
50b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian: Singleton<ComposerService>() {
51b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    const String16 name("SurfaceFlinger");
52b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    while (getService(name, &mComposerService) != NO_ERROR) {
53b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        usleep(250000);
547e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    }
55b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    mServerCblkMemory = mComposerService->getCblk();
56b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    mServerCblk = static_cast<surface_flinger_cblk_t volatile *>(
57b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian            mServerCblkMemory->getBase());
58b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
597e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
60b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopiansp<ISurfaceComposer> ComposerService::getComposerService() {
61b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    return ComposerService::getInstance().mComposerService;
62b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
637e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
64b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopiansurface_flinger_cblk_t const volatile * ComposerService::getControlBlock() {
65b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    return ComposerService::getInstance().mServerCblk;
66b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
677e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
687e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianstatic inline sp<ISurfaceComposer> getComposerService() {
697e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    return ComposerService::getComposerService();
707e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian}
717e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
727e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianstatic inline surface_flinger_cblk_t const volatile * get_cblk() {
737e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    return ComposerService::getControlBlock();
747e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian}
757e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
767e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian// ---------------------------------------------------------------------------
777e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
78698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// NOTE: this is NOT a member function (it's a friend defined with its
79698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// declaration).
80698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatic inline
81698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianint compare_type( const ComposerState& lhs, const ComposerState& rhs) {
82698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (lhs.client < rhs.client)  return -1;
83698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (lhs.client > rhs.client)  return 1;
84698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (lhs.state.surface < rhs.state.surface)  return -1;
85698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (lhs.state.surface > rhs.state.surface)  return 1;
86698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return 0;
87698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
88698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
897e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianclass Composer : public Singleton<Composer>
907e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian{
91698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    friend class Singleton<Composer>;
927e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
93698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    mutable Mutex               mLock;
94698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    SortedVector<ComposerState> mStates;
95b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    int                         mOrientation;
9628378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    uint32_t                    mForceSynchronous;
977e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
98b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    Composer() : Singleton<Composer>(),
9928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        mOrientation(ISurfaceComposer::eOrientationUnchanged),
10028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        mForceSynchronous(0)
10128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    { }
102d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
10328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    void closeGlobalTransactionImpl(bool synchronous);
104d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
105698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* getLayerStateLocked(
106698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            const sp<SurfaceComposerClient>& client, SurfaceID id);
107d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
108698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianpublic:
109d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
110698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setPosition(const sp<SurfaceComposerClient>& client, SurfaceID id,
11141b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian            float x, float y);
112698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setSize(const sp<SurfaceComposerClient>& client, SurfaceID id,
113698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            uint32_t w, uint32_t h);
114698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setLayer(const sp<SurfaceComposerClient>& client, SurfaceID id,
115698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            int32_t z);
116698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setFlags(const sp<SurfaceComposerClient>& client, SurfaceID id,
117698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            uint32_t flags, uint32_t mask);
118698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setTransparentRegionHint(
119698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            const sp<SurfaceComposerClient>& client, SurfaceID id,
120698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            const Region& transparentRegion);
121698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setAlpha(const sp<SurfaceComposerClient>& client, SurfaceID id,
122698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            float alpha);
123698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setMatrix(const sp<SurfaceComposerClient>& client, SurfaceID id,
124698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            float dsdx, float dtdx, float dsdy, float dtdy);
125698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setFreezeTint(
126698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            const sp<SurfaceComposerClient>& client, SurfaceID id,
127698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            uint32_t tint);
128b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    status_t setOrientation(int orientation);
129d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
13028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    static void closeGlobalTransaction(bool synchronous) {
13128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        Composer::getInstance().closeGlobalTransactionImpl(synchronous);
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
133d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian};
134d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
135d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(Composer);
136d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid Composer::closeGlobalTransactionImpl(bool synchronous) {
140698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    sp<ISurfaceComposer> sm(getComposerService());
141698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
142698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Vector<ComposerState> transaction;
143b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    int orientation;
14428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    uint32_t flags = 0;
145698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
146698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    { // scope for the lock
147698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        Mutex::Autolock _l(mLock);
148698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        transaction = mStates;
149698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        mStates.clear();
150b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis
151b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis        orientation = mOrientation;
152b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis        mOrientation = ISurfaceComposer::eOrientationUnchanged;
15328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
15428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        if (synchronous || mForceSynchronous) {
15528378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis            flags |= ISurfaceComposer::eSynchronous;
15628378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        }
15728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        mForceSynchronous = false;
158698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    }
159698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
16028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis   sm->setTransactionState(transaction, orientation, flags);
161698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
162698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
163698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianlayer_state_t* Composer::getLayerStateLocked(
164698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        const sp<SurfaceComposerClient>& client, SurfaceID id) {
165698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
166698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    ComposerState s;
167698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s.client = client->mClient;
168698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s.state.surface = id;
169698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
170698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    ssize_t index = mStates.indexOf(s);
171698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (index < 0) {
172698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        // we don't have it, add an initialized layer_state to our list
173698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        index = mStates.add(s);
174698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    }
175698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
176698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    ComposerState* const out = mStates.editArray();
177698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return &(out[index].state);
178698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
179698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
180698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setPosition(const sp<SurfaceComposerClient>& client,
18141b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian        SurfaceID id, float x, float y) {
182698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
183698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
184698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
185698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
186698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::ePositionChanged;
187698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->x = x;
188698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->y = y;
189698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
190698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
191698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
192698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setSize(const sp<SurfaceComposerClient>& client,
193698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceID id, uint32_t w, uint32_t h) {
194698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
195698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
196698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
197698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
198698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eSizeChanged;
199698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->w = w;
200698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->h = h;
20128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
20228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    // Resizing a surface makes the transaction synchronous.
20328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    mForceSynchronous = true;
20428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
205698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
206698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
207698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
208698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setLayer(const sp<SurfaceComposerClient>& client,
209698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceID id, int32_t z) {
210698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
211698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
212698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
213698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
214698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eLayerChanged;
215698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->z = z;
216698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
217698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
218698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
219698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setFlags(const sp<SurfaceComposerClient>& client,
220698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceID id, uint32_t flags,
221698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        uint32_t mask) {
222698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
223698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
224698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
225698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
226698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eVisibilityChanged;
227698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->flags &= ~mask;
228698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->flags |= (flags & mask);
229698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->mask |= mask;
230698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
231698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
232698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
233698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setTransparentRegionHint(
234698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        const sp<SurfaceComposerClient>& client, SurfaceID id,
235698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        const Region& transparentRegion) {
236698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
237698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
238698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
239698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
240698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eTransparentRegionChanged;
241698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->transparentRegion = transparentRegion;
242698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
243698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
244698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
245698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setAlpha(const sp<SurfaceComposerClient>& client,
246698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceID id, float alpha) {
247698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
248698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
249698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
250698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
251698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eAlphaChanged;
252698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->alpha = alpha;
253698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
254698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
255698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
256698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setMatrix(const sp<SurfaceComposerClient>& client,
257698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceID id, float dsdx, float dtdx,
258698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        float dsdy, float dtdy) {
259698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
260698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
261698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
262698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
263698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eMatrixChanged;
264698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t::matrix22_t matrix;
265698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dsdx = dsdx;
266698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dtdx = dtdx;
267698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dsdy = dsdy;
268698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dtdy = dtdy;
269698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->matrix = matrix;
270698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
273698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setFreezeTint(const sp<SurfaceComposerClient>& client,
274698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceID id, uint32_t tint) {
275698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
276698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
277698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
278698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
279698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eFreezeTintChanged;
280698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->tint = tint;
281698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
282698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
283698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
284b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennisstatus_t Composer::setOrientation(int orientation) {
285b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    Mutex::Autolock _l(mLock);
286b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    mOrientation = orientation;
28728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
28828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    // Changing the orientation makes the transaction synchronous.
28928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    mForceSynchronous = true;
29028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
291b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    return NO_ERROR;
292b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis}
293b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis
294698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------
295698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurfaceComposerClient::SurfaceComposerClient()
297698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    : mStatus(NO_INIT), mComposer(Composer::getInstance())
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
301698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::onFirstRef() {
302dd3423c6247965bf67ea30c75e484a6f5d72b1a2Mathias Agopian    sp<ISurfaceComposer> sm(getComposerService());
303d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    if (sm != 0) {
3047e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian        sp<ISurfaceComposerClient> conn = sm->createConnection();
305d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        if (conn != 0) {
306d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            mClient = conn;
307d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            mStatus = NO_ERROR;
308d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        }
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
312698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias AgopianSurfaceComposerClient::~SurfaceComposerClient() {
313d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    dispose();
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
316698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::initCheck() const {
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mStatus;
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
320698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopiansp<IBinder> SurfaceComposerClient::connection() const {
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (mClient != 0) ? mClient->asBinder() : 0;
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
324d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianstatus_t SurfaceComposerClient::linkToComposerDeath(
325d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        const sp<IBinder::DeathRecipient>& recipient,
326698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        void* cookie, uint32_t flags) {
327d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    sp<ISurfaceComposer> sm(getComposerService());
328d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    return sm->asBinder()->linkToDeath(recipient, cookie, flags);
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
331698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::dispose() {
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this can be called more than once.
3337e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    sp<ISurfaceComposerClient> client;
334d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    Mutex::Autolock _lm(mLock);
335d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    if (mClient != 0) {
336d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        client = mClient; // hold ref while lock is held
337d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        mClient.clear();
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
339d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    mStatus = NO_INIT;
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface(
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        DisplayID display,
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t w,
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t h,
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PixelFormat format,
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t flags)
348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
349285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    String8 name;
350285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    const size_t SIZE = 128;
351285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    char buffer[SIZE];
352285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    snprintf(buffer, SIZE, "<pid_%d>", getpid());
353285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    name.append(buffer);
354285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian
3550ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian    return SurfaceComposerClient::createSurface(name, display,
356285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian            w, h, format, flags);
357285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian}
358285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian
359285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface(
360285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        const String8& name,
361285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        DisplayID display,
362285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t w,
363285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t h,
364285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        PixelFormat format,
365285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t flags)
366285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian{
36701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    sp<SurfaceControl> result;
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mStatus == NO_ERROR) {
3697e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian        ISurfaceComposerClient::surface_data_t data;
3700ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian        sp<ISurface> surface = mClient->createSurface(&data, name,
371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                display, w, h, format, flags);
372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface != 0) {
373c10d9d90b2088a3304076e0dc4bf05cdbb5d45abMathias Agopian            result = new SurfaceControl(this, surface, data);
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return result;
377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
379698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::destroySurface(SurfaceID sid) {
380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mStatus != NO_ERROR)
381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return mStatus;
382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t err = mClient->destroySurface(sid);
383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return err;
384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
386698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianinline Composer& SurfaceComposerClient::getComposer() {
387698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return mComposer;
388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
390698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
392698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::openGlobalTransaction() {
393698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    // Currently a no-op
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39628378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid SurfaceComposerClient::closeGlobalTransaction(bool synchronous) {
39728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    Composer::closeGlobalTransaction(synchronous);
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
400698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
402698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setFreezeTint(SurfaceID id, uint32_t tint) {
403698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFreezeTint(this, id, tint);
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40641b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopianstatus_t SurfaceComposerClient::setPosition(SurfaceID id, float x, float y) {
407698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setPosition(this, id, x, y);
408698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
410698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setSize(SurfaceID id, uint32_t w, uint32_t h) {
411698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setSize(this, id, w, h);
412698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
414698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setLayer(SurfaceID id, int32_t z) {
415698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setLayer(this, id, z);
416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
418698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::hide(SurfaceID id) {
419698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id,
420698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ISurfaceComposer::eLayerHidden,
421698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ISurfaceComposer::eLayerHidden);
422698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
424698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::show(SurfaceID id, int32_t) {
425698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id,
426698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            0,
427698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ISurfaceComposer::eLayerHidden);
428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
430698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::freeze(SurfaceID id) {
431698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id,
432698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ISurfaceComposer::eLayerFrozen,
433698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ISurfaceComposer::eLayerFrozen);
434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
436698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::unfreeze(SurfaceID id) {
437698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id,
438698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            0,
439698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ISurfaceComposer::eLayerFrozen);
440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
442698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setFlags(SurfaceID id, uint32_t flags,
443698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        uint32_t mask) {
444698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id, flags, mask);
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
447698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setTransparentRegionHint(SurfaceID id,
448698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        const Region& transparentRegion) {
449698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setTransparentRegionHint(this, id, transparentRegion);
450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
452698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setAlpha(SurfaceID id, float alpha) {
453698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setAlpha(this, id, alpha);
454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
456698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setMatrix(SurfaceID id, float dsdx, float dtdx,
457698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        float dsdy, float dtdy) {
458698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setMatrix(this, id, dsdx, dtdx, dsdy, dtdy);
459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
461b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennisstatus_t SurfaceComposerClient::setOrientation(DisplayID dpy,
462b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis        int orientation, uint32_t flags)
463b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis{
464b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    return Composer::getInstance().setOrientation(orientation);
465b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis}
466b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis
467698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
468698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
469698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::getDisplayInfo(
470698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        DisplayID dpy, DisplayInfo* info)
471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
472698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (uint32_t(dpy)>=NUM_DISPLAY_MAX)
473698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_VALUE;
474698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
475698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile surface_flinger_cblk_t const * cblk = get_cblk();
476698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile display_cblk_t const * dcblk = cblk->displays + dpy;
477698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
478698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->w              = dcblk->w;
479698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->h              = dcblk->h;
480698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->orientation    = dcblk->orientation;
481698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->xdpi           = dcblk->xdpi;
482698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->ydpi           = dcblk->ydpi;
483698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->fps            = dcblk->fps;
484698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->density        = dcblk->density;
485698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getPixelFormatInfo(dcblk->format, &(info->pixelFormatInfo));
486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
488698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getDisplayWidth(DisplayID dpy)
489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
490698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (uint32_t(dpy)>=NUM_DISPLAY_MAX)
491698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_VALUE;
492698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile surface_flinger_cblk_t const * cblk = get_cblk();
493698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile display_cblk_t const * dcblk = cblk->displays + dpy;
494698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return dcblk->w;
495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
497698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getDisplayHeight(DisplayID dpy)
498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
499698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (uint32_t(dpy)>=NUM_DISPLAY_MAX)
500698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_VALUE;
501698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile surface_flinger_cblk_t const * cblk = get_cblk();
502698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile display_cblk_t const * dcblk = cblk->displays + dpy;
503698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return dcblk->h;
504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
506698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getDisplayOrientation(DisplayID dpy)
507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
508698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (uint32_t(dpy)>=NUM_DISPLAY_MAX)
509698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_VALUE;
510698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile surface_flinger_cblk_t const * cblk = get_cblk();
511698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile display_cblk_t const * dcblk = cblk->displays + dpy;
512698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return dcblk->orientation;
513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
515698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getNumberOfDisplays()
516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
517698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile surface_flinger_cblk_t const * cblk = get_cblk();
518698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    uint32_t connected = cblk->connected;
519698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    int n = 0;
520698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    while (connected) {
521698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        if (connected&1) n++;
522698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        connected >>= 1;
523698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    }
524698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return n;
525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
527698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
528698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
529698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::freezeDisplay(DisplayID dpy, uint32_t flags)
530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
531b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    // This has been made a no-op because it can cause Gralloc buffer deadlocks.
532b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    return NO_ERROR;
533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
535698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::unfreezeDisplay(DisplayID dpy, uint32_t flags)
536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
537b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    // This has been made a no-op because it can cause Gralloc buffer deadlocks.
538b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    return NO_ERROR;
539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
541d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian// ----------------------------------------------------------------------------
54274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
54374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianScreenshotClient::ScreenshotClient()
54474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    : mWidth(0), mHeight(0), mFormat(PIXEL_FORMAT_NONE) {
54574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
54674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
54774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianstatus_t ScreenshotClient::update() {
54874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
54974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    if (s == NULL) return NO_INIT;
55074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    mHeap = 0;
55174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return s->captureScreen(0, &mHeap,
552bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            &mWidth, &mHeight, &mFormat, 0, 0,
553bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            0, -1UL);
55474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
55574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
55674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianstatus_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight) {
55774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
55874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    if (s == NULL) return NO_INIT;
55974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    mHeap = 0;
56074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return s->captureScreen(0, &mHeap,
561bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            &mWidth, &mHeight, &mFormat, reqWidth, reqHeight,
562bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            0, -1UL);
563bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian}
564bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian
565bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopianstatus_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight,
566bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian        uint32_t minLayerZ, uint32_t maxLayerZ) {
567bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
568bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    if (s == NULL) return NO_INIT;
569bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    mHeap = 0;
570bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    return s->captureScreen(0, &mHeap,
571bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            &mWidth, &mHeight, &mFormat, reqWidth, reqHeight,
572bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            minLayerZ, maxLayerZ);
57374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
57474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
57574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid ScreenshotClient::release() {
57674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    mHeap = 0;
57774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
57874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
57974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid const* ScreenshotClient::getPixels() const {
58074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mHeap->getBase();
58174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
58274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
58374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getWidth() const {
58474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mWidth;
58574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
58674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
58774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getHeight() const {
58874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mHeight;
58974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
59074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
59174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianPixelFormat ScreenshotClient::getFormat() const {
59274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mFormat;
59374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
59474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
59574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getStride() const {
59674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mWidth;
59774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
59874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
59974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopiansize_t ScreenshotClient::getSize() const {
60074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mHeap->getSize();
60174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
60274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
60374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian// ----------------------------------------------------------------------------
604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
605