SurfaceComposerClient.cpp revision 8b33f032327f8de0dcc0e6d0d43ed80f834b51f6
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "SurfaceComposerClient"
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
239cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <utils/Log.h>
24d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian#include <utils/Singleton.h>
25a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/SortedVector.h>
26a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/String8.h>
27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/threads.h>
289cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
29c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IMemory.h>
30a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <binder/IServiceManager.h>
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/DisplayInfo.h>
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurface.h>
3590ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposer.h>
3690ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposerClient.h>
3790ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/SurfaceComposerClient.h>
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3941f673c9b3aac0d96e41c928845c39186d565212Mathias Agopian#include <private/gui/ComposerService.h>
4090ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <private/gui/LayerState.h>
4190ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <private/gui/SharedBufferStack.h>
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
46b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(ComposerService);
477e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
48b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianComposerService::ComposerService()
49b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian: Singleton<ComposerService>() {
50b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    const String16 name("SurfaceFlinger");
51b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    while (getService(name, &mComposerService) != NO_ERROR) {
52b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        usleep(250000);
537e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    }
54b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    mServerCblkMemory = mComposerService->getCblk();
55b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    mServerCblk = static_cast<surface_flinger_cblk_t volatile *>(
56b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian            mServerCblkMemory->getBase());
57b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
587e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
59b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopiansp<ISurfaceComposer> ComposerService::getComposerService() {
60b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    return ComposerService::getInstance().mComposerService;
61b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
627e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
63b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopiansurface_flinger_cblk_t const volatile * ComposerService::getControlBlock() {
64b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    return ComposerService::getInstance().mServerCblk;
65b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian}
667e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
677e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianstatic inline sp<ISurfaceComposer> getComposerService() {
687e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    return ComposerService::getComposerService();
697e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian}
707e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
717e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianstatic inline surface_flinger_cblk_t const volatile * get_cblk() {
727e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    return ComposerService::getControlBlock();
737e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian}
747e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
757e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian// ---------------------------------------------------------------------------
767e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
77698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// NOTE: this is NOT a member function (it's a friend defined with its
78698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// declaration).
79698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatic inline
80698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianint compare_type( const ComposerState& lhs, const ComposerState& rhs) {
81698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (lhs.client < rhs.client)  return -1;
82698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (lhs.client > rhs.client)  return 1;
83698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (lhs.state.surface < rhs.state.surface)  return -1;
84698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (lhs.state.surface > rhs.state.surface)  return 1;
85698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return 0;
86698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
87698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
887e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianclass Composer : public Singleton<Composer>
897e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian{
90698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    friend class Singleton<Composer>;
917e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
92698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    mutable Mutex               mLock;
93698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    SortedVector<ComposerState> mStates;
94b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    int                         mOrientation;
9528378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    uint32_t                    mForceSynchronous;
967e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
97b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    Composer() : Singleton<Composer>(),
9828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        mOrientation(ISurfaceComposer::eOrientationUnchanged),
9928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        mForceSynchronous(0)
10028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    { }
101d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
10228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    void closeGlobalTransactionImpl(bool synchronous);
103d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
104698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* getLayerStateLocked(
105698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            const sp<SurfaceComposerClient>& client, SurfaceID id);
106d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
107698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianpublic:
108d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
109698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setPosition(const sp<SurfaceComposerClient>& client, SurfaceID id,
11041b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian            float x, float y);
111698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setSize(const sp<SurfaceComposerClient>& client, SurfaceID id,
112698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            uint32_t w, uint32_t h);
113698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setLayer(const sp<SurfaceComposerClient>& client, SurfaceID id,
114698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            int32_t z);
115698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setFlags(const sp<SurfaceComposerClient>& client, SurfaceID id,
116698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            uint32_t flags, uint32_t mask);
117698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setTransparentRegionHint(
118698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            const sp<SurfaceComposerClient>& client, SurfaceID id,
119698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            const Region& transparentRegion);
120698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setAlpha(const sp<SurfaceComposerClient>& client, SurfaceID id,
121698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            float alpha);
122698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setMatrix(const sp<SurfaceComposerClient>& client, SurfaceID id,
123698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            float dsdx, float dtdx, float dsdy, float dtdy);
124b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    status_t setOrientation(int orientation);
125f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    status_t setCrop(const sp<SurfaceComposerClient>& client, SurfaceID id,
126f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis            const Rect& crop);
127d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
12828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    static void closeGlobalTransaction(bool synchronous) {
12928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        Composer::getInstance().closeGlobalTransactionImpl(synchronous);
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
131d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian};
132d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
133d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(Composer);
134d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid Composer::closeGlobalTransactionImpl(bool synchronous) {
138698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    sp<ISurfaceComposer> sm(getComposerService());
139698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
140698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Vector<ComposerState> transaction;
1418b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian    Vector<DisplayState> displayTransaction;
14228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    uint32_t flags = 0;
143698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
144698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    { // scope for the lock
145698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        Mutex::Autolock _l(mLock);
146698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        transaction = mStates;
147698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        mStates.clear();
148b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis
1498b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian        // FIXME: this should be the displays transaction state here
1508b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian        DisplayState item;
1518b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian        item.orientation = mOrientation;
1528b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian        displayTransaction.add(item);
1538b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian
154b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis        mOrientation = ISurfaceComposer::eOrientationUnchanged;
15528378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
15628378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        if (synchronous || mForceSynchronous) {
15728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis            flags |= ISurfaceComposer::eSynchronous;
15828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        }
15928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        mForceSynchronous = false;
160698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    }
161698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
1628b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian   sm->setTransactionState(transaction, displayTransaction, flags);
163698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
164698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
165698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianlayer_state_t* Composer::getLayerStateLocked(
166698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        const sp<SurfaceComposerClient>& client, SurfaceID id) {
167698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
168698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    ComposerState s;
169698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s.client = client->mClient;
170698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s.state.surface = id;
171698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
172698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    ssize_t index = mStates.indexOf(s);
173698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (index < 0) {
174698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        // we don't have it, add an initialized layer_state to our list
175698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        index = mStates.add(s);
176698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    }
177698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
178698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    ComposerState* const out = mStates.editArray();
179698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return &(out[index].state);
180698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
181698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
182698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setPosition(const sp<SurfaceComposerClient>& client,
18341b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian        SurfaceID id, float x, float y) {
184698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
185698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
186698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
187698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
188698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::ePositionChanged;
189698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->x = x;
190698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->y = y;
191698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
192698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
193698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
194698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setSize(const sp<SurfaceComposerClient>& client,
195698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceID id, uint32_t w, uint32_t h) {
196698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
197698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
198698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
199698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
200698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eSizeChanged;
201698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->w = w;
202698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->h = h;
20328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
20428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    // Resizing a surface makes the transaction synchronous.
20528378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    mForceSynchronous = true;
20628378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
207698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
208698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
209698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
210698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setLayer(const sp<SurfaceComposerClient>& client,
211698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceID id, int32_t z) {
212698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
213698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
214698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
215698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
216698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eLayerChanged;
217698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->z = z;
218698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
219698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
220698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
221698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setFlags(const sp<SurfaceComposerClient>& client,
222698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceID id, uint32_t flags,
223698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        uint32_t mask) {
224698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
225698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
226698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
227698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
228698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eVisibilityChanged;
229698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->flags &= ~mask;
230698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->flags |= (flags & mask);
231698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->mask |= mask;
232698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
233698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
234698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
235698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setTransparentRegionHint(
236698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        const sp<SurfaceComposerClient>& client, SurfaceID id,
237698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        const Region& transparentRegion) {
238698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
239698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
240698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
241698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
242698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eTransparentRegionChanged;
243698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->transparentRegion = transparentRegion;
244698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
245698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
246698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
247698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setAlpha(const sp<SurfaceComposerClient>& client,
248698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceID id, float alpha) {
249698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
250698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
251698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
252698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
253698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eAlphaChanged;
254698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->alpha = alpha;
255698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
256698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
257698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
258698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setMatrix(const sp<SurfaceComposerClient>& client,
259698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceID id, float dsdx, float dtdx,
260698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        float dsdy, float dtdy) {
261698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
262698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
263698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
264698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
265698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eMatrixChanged;
266698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t::matrix22_t matrix;
267698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dsdx = dsdx;
268698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dtdx = dtdx;
269698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dsdy = dsdy;
270698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dtdy = dtdy;
271698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->matrix = matrix;
272698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
275b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennisstatus_t Composer::setOrientation(int orientation) {
276b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    Mutex::Autolock _l(mLock);
277b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    mOrientation = orientation;
27828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
27928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    // Changing the orientation makes the transaction synchronous.
28028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    mForceSynchronous = true;
28128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis
282b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    return NO_ERROR;
283b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis}
284b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis
285f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatus_t Composer::setCrop(const sp<SurfaceComposerClient>& client,
286f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        SurfaceID id, const Rect& crop) {
287f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Mutex::Autolock _l(mLock);
288f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    layer_state_t* s = getLayerStateLocked(client, id);
289f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!s)
290f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        return BAD_INDEX;
291f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    s->what |= ISurfaceComposer::eCropChanged;
292f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    s->crop = crop;
293f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return NO_ERROR;
294f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
295f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
296698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------
297698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurfaceComposerClient::SurfaceComposerClient()
299698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    : mStatus(NO_INIT), mComposer(Composer::getInstance())
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
303698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::onFirstRef() {
304dd3423c6247965bf67ea30c75e484a6f5d72b1a2Mathias Agopian    sp<ISurfaceComposer> sm(getComposerService());
305d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    if (sm != 0) {
3067e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian        sp<ISurfaceComposerClient> conn = sm->createConnection();
307d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        if (conn != 0) {
308d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            mClient = conn;
309d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            mStatus = NO_ERROR;
310d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        }
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
314698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias AgopianSurfaceComposerClient::~SurfaceComposerClient() {
315d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    dispose();
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
318698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::initCheck() const {
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mStatus;
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
322698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopiansp<IBinder> SurfaceComposerClient::connection() const {
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (mClient != 0) ? mClient->asBinder() : 0;
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
326d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianstatus_t SurfaceComposerClient::linkToComposerDeath(
327d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        const sp<IBinder::DeathRecipient>& recipient,
328698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        void* cookie, uint32_t flags) {
329d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    sp<ISurfaceComposer> sm(getComposerService());
330d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    return sm->asBinder()->linkToDeath(recipient, cookie, flags);
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
333698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::dispose() {
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this can be called more than once.
3357e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    sp<ISurfaceComposerClient> client;
336d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    Mutex::Autolock _lm(mLock);
337d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    if (mClient != 0) {
338d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        client = mClient; // hold ref while lock is held
339d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        mClient.clear();
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
341d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    mStatus = NO_INIT;
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface(
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        DisplayID display,
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t w,
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t h,
348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PixelFormat format,
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t flags)
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
351285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    String8 name;
352285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    const size_t SIZE = 128;
353285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    char buffer[SIZE];
354285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    snprintf(buffer, SIZE, "<pid_%d>", getpid());
355285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    name.append(buffer);
356285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian
3570ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian    return SurfaceComposerClient::createSurface(name, display,
358285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian            w, h, format, flags);
359285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian}
360285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian
361285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface(
362285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        const String8& name,
363285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        DisplayID display,
364285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t w,
365285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t h,
366285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        PixelFormat format,
367285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t flags)
368285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian{
36901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    sp<SurfaceControl> result;
370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mStatus == NO_ERROR) {
3717e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian        ISurfaceComposerClient::surface_data_t data;
3720ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian        sp<ISurface> surface = mClient->createSurface(&data, name,
373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                display, w, h, format, flags);
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface != 0) {
375c10d9d90b2088a3304076e0dc4bf05cdbb5d45abMathias Agopian            result = new SurfaceControl(this, surface, data);
376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return result;
379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
381698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::destroySurface(SurfaceID sid) {
382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mStatus != NO_ERROR)
383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return mStatus;
384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t err = mClient->destroySurface(sid);
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return err;
386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
388698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianinline Composer& SurfaceComposerClient::getComposer() {
389698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return mComposer;
390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
392698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
394698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::openGlobalTransaction() {
395698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    // Currently a no-op
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid SurfaceComposerClient::closeGlobalTransaction(bool synchronous) {
39928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis    Composer::closeGlobalTransaction(synchronous);
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
402698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
404f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatus_t SurfaceComposerClient::setCrop(SurfaceID id, const Rect& crop) {
405f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return getComposer().setCrop(this, id, crop);
406f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
407f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
40841b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopianstatus_t SurfaceComposerClient::setPosition(SurfaceID id, float x, float y) {
409698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setPosition(this, id, x, y);
410698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
412698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setSize(SurfaceID id, uint32_t w, uint32_t h) {
413698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setSize(this, id, w, h);
414698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
416698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setLayer(SurfaceID id, int32_t z) {
417698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setLayer(this, id, z);
418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
420698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::hide(SurfaceID id) {
421698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id,
422698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ISurfaceComposer::eLayerHidden,
423698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ISurfaceComposer::eLayerHidden);
424698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
426698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::show(SurfaceID id, int32_t) {
427698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id,
428698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            0,
429698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ISurfaceComposer::eLayerHidden);
430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
432698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setFlags(SurfaceID id, uint32_t flags,
433698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        uint32_t mask) {
434698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id, flags, mask);
435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
437698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setTransparentRegionHint(SurfaceID id,
438698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        const Region& transparentRegion) {
439698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setTransparentRegionHint(this, id, transparentRegion);
440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
442698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setAlpha(SurfaceID id, float alpha) {
443698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setAlpha(this, id, alpha);
444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
446698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setMatrix(SurfaceID id, float dsdx, float dtdx,
447698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        float dsdy, float dtdy) {
448698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setMatrix(this, id, dsdx, dtdx, dsdy, dtdy);
449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
451b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennisstatus_t SurfaceComposerClient::setOrientation(DisplayID dpy,
452b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis        int orientation, uint32_t flags)
453b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis{
454b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    return Composer::getInstance().setOrientation(orientation);
455b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis}
456b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis
457698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
458698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
459698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::getDisplayInfo(
460698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        DisplayID dpy, DisplayInfo* info)
461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
462698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (uint32_t(dpy)>=NUM_DISPLAY_MAX)
463698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_VALUE;
464698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
465698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile surface_flinger_cblk_t const * cblk = get_cblk();
466698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile display_cblk_t const * dcblk = cblk->displays + dpy;
467698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
468698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->w              = dcblk->w;
469698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->h              = dcblk->h;
470698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->orientation    = dcblk->orientation;
471698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->xdpi           = dcblk->xdpi;
472698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->ydpi           = dcblk->ydpi;
473698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->fps            = dcblk->fps;
474698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->density        = dcblk->density;
475698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getPixelFormatInfo(dcblk->format, &(info->pixelFormatInfo));
476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
478698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getDisplayWidth(DisplayID dpy)
479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
480698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (uint32_t(dpy)>=NUM_DISPLAY_MAX)
481698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_VALUE;
482698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile surface_flinger_cblk_t const * cblk = get_cblk();
483698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile display_cblk_t const * dcblk = cblk->displays + dpy;
484698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return dcblk->w;
485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
487698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getDisplayHeight(DisplayID dpy)
488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
489698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (uint32_t(dpy)>=NUM_DISPLAY_MAX)
490698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_VALUE;
491698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile surface_flinger_cblk_t const * cblk = get_cblk();
492698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile display_cblk_t const * dcblk = cblk->displays + dpy;
493698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return dcblk->h;
494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
496698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getDisplayOrientation(DisplayID dpy)
497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
498698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (uint32_t(dpy)>=NUM_DISPLAY_MAX)
499698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_VALUE;
500698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile surface_flinger_cblk_t const * cblk = get_cblk();
501698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile display_cblk_t const * dcblk = cblk->displays + dpy;
502698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return dcblk->orientation;
503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
505698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getNumberOfDisplays()
506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
507698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile surface_flinger_cblk_t const * cblk = get_cblk();
508698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    uint32_t connected = cblk->connected;
509698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    int n = 0;
510698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    while (connected) {
511698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        if (connected&1) n++;
512698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        connected >>= 1;
513698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    }
514698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return n;
515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
517698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
518698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
51974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianScreenshotClient::ScreenshotClient()
52074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    : mWidth(0), mHeight(0), mFormat(PIXEL_FORMAT_NONE) {
52174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
52274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
52374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianstatus_t ScreenshotClient::update() {
52474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
52574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    if (s == NULL) return NO_INIT;
52674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    mHeap = 0;
52774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return s->captureScreen(0, &mHeap,
528bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            &mWidth, &mHeight, &mFormat, 0, 0,
529bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            0, -1UL);
53074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
53174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
53274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianstatus_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight) {
53374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
53474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    if (s == NULL) return NO_INIT;
53574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    mHeap = 0;
53674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return s->captureScreen(0, &mHeap,
537bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            &mWidth, &mHeight, &mFormat, reqWidth, reqHeight,
538bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            0, -1UL);
539bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian}
540bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian
541bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopianstatus_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight,
542bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian        uint32_t minLayerZ, uint32_t maxLayerZ) {
543bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
544bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    if (s == NULL) return NO_INIT;
545bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    mHeap = 0;
546bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    return s->captureScreen(0, &mHeap,
547bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            &mWidth, &mHeight, &mFormat, reqWidth, reqHeight,
548bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            minLayerZ, maxLayerZ);
54974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
55074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
55174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid ScreenshotClient::release() {
55274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    mHeap = 0;
55374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
55474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
55574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid const* ScreenshotClient::getPixels() const {
55674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mHeap->getBase();
55774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
55874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
55974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getWidth() const {
56074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mWidth;
56174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
56274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
56374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getHeight() const {
56474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mHeight;
56574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
56674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
56774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianPixelFormat ScreenshotClient::getFormat() const {
56874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mFormat;
56974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
57074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
57174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getStride() const {
57274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mWidth;
57374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
57474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
57574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopiansize_t ScreenshotClient::getSize() const {
57674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mHeap->getSize();
57774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
57874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
57974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian// ----------------------------------------------------------------------------
580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
581