SurfaceComposerClient.cpp revision c10d9d90b2088a3304076e0dc4bf05cdbb5d45ab
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
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;
947e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian
95698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Composer() : Singleton<Composer>() { }
96d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
97698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    void closeGlobalTransactionImpl();
98d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
99698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* getLayerStateLocked(
100698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            const sp<SurfaceComposerClient>& client, SurfaceID id);
101d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
102698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianpublic:
103d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
104698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setPosition(const sp<SurfaceComposerClient>& client, SurfaceID id,
105698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            int32_t x, int32_t y);
106698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setSize(const sp<SurfaceComposerClient>& client, SurfaceID id,
107698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            uint32_t w, uint32_t h);
108698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setLayer(const sp<SurfaceComposerClient>& client, SurfaceID id,
109698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            int32_t z);
110698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setFlags(const sp<SurfaceComposerClient>& client, SurfaceID id,
111698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            uint32_t flags, uint32_t mask);
112698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setTransparentRegionHint(
113698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            const sp<SurfaceComposerClient>& client, SurfaceID id,
114698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            const Region& transparentRegion);
115698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setAlpha(const sp<SurfaceComposerClient>& client, SurfaceID id,
116698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            float alpha);
117698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setMatrix(const sp<SurfaceComposerClient>& client, SurfaceID id,
118698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            float dsdx, float dtdx, float dsdy, float dtdy);
119698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    status_t setFreezeTint(
120698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            const sp<SurfaceComposerClient>& client, SurfaceID id,
121698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            uint32_t tint);
122d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
123d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    static void closeGlobalTransaction() {
124d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        Composer::getInstance().closeGlobalTransactionImpl();
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
126d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian};
127d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
128d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(Composer);
129d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
132698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid Composer::closeGlobalTransactionImpl() {
133698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    sp<ISurfaceComposer> sm(getComposerService());
134698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
135698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Vector<ComposerState> transaction;
136698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
137698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    { // scope for the lock
138698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        Mutex::Autolock _l(mLock);
139698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        transaction = mStates;
140698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        mStates.clear();
141698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    }
142698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
143698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian   sm->setTransactionState(transaction);
144698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
145698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
146698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianlayer_state_t* Composer::getLayerStateLocked(
147698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        const sp<SurfaceComposerClient>& client, SurfaceID id) {
148698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
149698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    ComposerState s;
150698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s.client = client->mClient;
151698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s.state.surface = id;
152698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
153698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    ssize_t index = mStates.indexOf(s);
154698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (index < 0) {
155698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        // we don't have it, add an initialized layer_state to our list
156698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        index = mStates.add(s);
157698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    }
158698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
159698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    ComposerState* const out = mStates.editArray();
160698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return &(out[index].state);
161698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
162698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
163698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setPosition(const sp<SurfaceComposerClient>& client,
164698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceID id, int32_t x, int32_t y) {
165698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
166698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
167698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
168698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
169698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::ePositionChanged;
170698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->x = x;
171698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->y = y;
172698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
173698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
174698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
175698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setSize(const sp<SurfaceComposerClient>& client,
176698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceID id, uint32_t w, uint32_t h) {
177698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
178698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
179698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
180698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
181698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eSizeChanged;
182698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->w = w;
183698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->h = h;
184698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
185698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
186698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
187698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setLayer(const sp<SurfaceComposerClient>& client,
188698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceID id, int32_t z) {
189698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
190698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
191698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
192698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
193698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eLayerChanged;
194698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->z = z;
195698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
196698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
197698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
198698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setFlags(const sp<SurfaceComposerClient>& client,
199698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceID id, uint32_t flags,
200698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        uint32_t mask) {
201698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
202698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
203698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
204698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
205698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eVisibilityChanged;
206698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->flags &= ~mask;
207698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->flags |= (flags & mask);
208698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->mask |= mask;
209698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
210698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
211698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
212698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setTransparentRegionHint(
213698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        const sp<SurfaceComposerClient>& client, SurfaceID id,
214698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        const Region& transparentRegion) {
215698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
216698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
217698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
218698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
219698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eTransparentRegionChanged;
220698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->transparentRegion = transparentRegion;
221698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
222698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
223698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
224698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setAlpha(const sp<SurfaceComposerClient>& client,
225698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceID id, float alpha) {
226698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
227698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
228698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
229698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
230698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eAlphaChanged;
231698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->alpha = alpha;
232698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
233698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
234698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
235698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setMatrix(const sp<SurfaceComposerClient>& client,
236698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceID id, float dsdx, float dtdx,
237698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        float dsdy, float dtdy) {
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::eMatrixChanged;
243698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t::matrix22_t matrix;
244698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dsdx = dsdx;
245698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dtdx = dtdx;
246698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dsdy = dsdy;
247698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    matrix.dtdy = dtdy;
248698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->matrix = matrix;
249698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
252698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setFreezeTint(const sp<SurfaceComposerClient>& client,
253698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceID id, uint32_t tint) {
254698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Mutex::Autolock _l(mLock);
255698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    layer_state_t* s = getLayerStateLocked(client, id);
256698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (!s)
257698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_INDEX;
258698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->what |= ISurfaceComposer::eFreezeTintChanged;
259698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    s->tint = tint;
260698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return NO_ERROR;
261698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
262698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
263698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------
264698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurfaceComposerClient::SurfaceComposerClient()
266698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    : mStatus(NO_INIT), mComposer(Composer::getInstance())
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
270698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::onFirstRef() {
271dd3423c6247965bf67ea30c75e484a6f5d72b1a2Mathias Agopian    sp<ISurfaceComposer> sm(getComposerService());
272d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    if (sm != 0) {
2737e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian        sp<ISurfaceComposerClient> conn = sm->createConnection();
274d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        if (conn != 0) {
275d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            mClient = conn;
276d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian            mStatus = NO_ERROR;
277d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        }
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
281698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias AgopianSurfaceComposerClient::~SurfaceComposerClient() {
282d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    dispose();
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
285698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::initCheck() const {
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mStatus;
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
289698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopiansp<IBinder> SurfaceComposerClient::connection() const {
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (mClient != 0) ? mClient->asBinder() : 0;
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
293d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianstatus_t SurfaceComposerClient::linkToComposerDeath(
294d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        const sp<IBinder::DeathRecipient>& recipient,
295698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        void* cookie, uint32_t flags) {
296d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    sp<ISurfaceComposer> sm(getComposerService());
297d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    return sm->asBinder()->linkToDeath(recipient, cookie, flags);
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
300698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::dispose() {
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this can be called more than once.
3027e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    sp<ISurfaceComposerClient> client;
303d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    Mutex::Autolock _lm(mLock);
304d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    if (mClient != 0) {
305d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        client = mClient; // hold ref while lock is held
306d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian        mClient.clear();
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
308d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian    mStatus = NO_INIT;
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31101b766839e06c32540cef100e3a7710d12cf1eefMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface(
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        DisplayID display,
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t w,
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t h,
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PixelFormat format,
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t flags)
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
318285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    String8 name;
319285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    const size_t SIZE = 128;
320285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    char buffer[SIZE];
321285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    snprintf(buffer, SIZE, "<pid_%d>", getpid());
322285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian    name.append(buffer);
323285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian
3240ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian    return SurfaceComposerClient::createSurface(name, display,
325285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian            w, h, format, flags);
326285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian}
327285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian
328285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface(
329285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        const String8& name,
330285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        DisplayID display,
331285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t w,
332285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t h,
333285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        PixelFormat format,
334285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian        uint32_t flags)
335285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian{
33601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    sp<SurfaceControl> result;
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mStatus == NO_ERROR) {
3387e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian        ISurfaceComposerClient::surface_data_t data;
3390ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian        sp<ISurface> surface = mClient->createSurface(&data, name,
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                display, w, h, format, flags);
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface != 0) {
342c10d9d90b2088a3304076e0dc4bf05cdbb5d45abMathias Agopian            result = new SurfaceControl(this, surface, data);
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return result;
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
348698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::destroySurface(SurfaceID sid) {
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mStatus != NO_ERROR)
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return mStatus;
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t err = mClient->destroySurface(sid);
352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return err;
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
355698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianinline Composer& SurfaceComposerClient::getComposer() {
356698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return mComposer;
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
359698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
361698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::openGlobalTransaction() {
362698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    // Currently a no-op
363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
365698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::closeGlobalTransaction() {
366698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    Composer::closeGlobalTransaction();
367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
369698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
371698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setFreezeTint(SurfaceID id, uint32_t tint) {
372698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFreezeTint(this, id, tint);
373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
375698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setPosition(SurfaceID id, int32_t x, int32_t y) {
376698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setPosition(this, id, x, y);
377698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
379698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setSize(SurfaceID id, uint32_t w, uint32_t h) {
380698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setSize(this, id, w, h);
381698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
383698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setLayer(SurfaceID id, int32_t z) {
384698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setLayer(this, id, z);
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
387698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::hide(SurfaceID id) {
388698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id,
389698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ISurfaceComposer::eLayerHidden,
390698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ISurfaceComposer::eLayerHidden);
391698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian}
392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
393698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::show(SurfaceID id, int32_t) {
394698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id,
395698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            0,
396698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ISurfaceComposer::eLayerHidden);
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
399698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::freeze(SurfaceID id) {
400698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id,
401698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ISurfaceComposer::eLayerFrozen,
402698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ISurfaceComposer::eLayerFrozen);
403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
405698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::unfreeze(SurfaceID id) {
406698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id,
407698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            0,
408698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ISurfaceComposer::eLayerFrozen);
409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
411698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setFlags(SurfaceID id, uint32_t flags,
412698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        uint32_t mask) {
413698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setFlags(this, id, flags, mask);
414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
416698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setTransparentRegionHint(SurfaceID id,
417698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        const Region& transparentRegion) {
418698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setTransparentRegionHint(this, id, transparentRegion);
419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
421698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setAlpha(SurfaceID id, float alpha) {
422698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setAlpha(this, id, alpha);
423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
425698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setMatrix(SurfaceID id, float dsdx, float dtdx,
426698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        float dsdy, float dtdy) {
427698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getComposer().setMatrix(this, id, dsdx, dtdx, dsdy, dtdy);
428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
430698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
431698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
432698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::getDisplayInfo(
433698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        DisplayID dpy, DisplayInfo* info)
434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
435698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (uint32_t(dpy)>=NUM_DISPLAY_MAX)
436698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_VALUE;
437698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
438698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile surface_flinger_cblk_t const * cblk = get_cblk();
439698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile display_cblk_t const * dcblk = cblk->displays + dpy;
440698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
441698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->w              = dcblk->w;
442698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->h              = dcblk->h;
443698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->orientation    = dcblk->orientation;
444698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->xdpi           = dcblk->xdpi;
445698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->ydpi           = dcblk->ydpi;
446698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->fps            = dcblk->fps;
447698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    info->density        = dcblk->density;
448698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return getPixelFormatInfo(dcblk->format, &(info->pixelFormatInfo));
449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
451698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getDisplayWidth(DisplayID dpy)
452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
453698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (uint32_t(dpy)>=NUM_DISPLAY_MAX)
454698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_VALUE;
455698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile surface_flinger_cblk_t const * cblk = get_cblk();
456698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile display_cblk_t const * dcblk = cblk->displays + dpy;
457698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return dcblk->w;
458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
460698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getDisplayHeight(DisplayID dpy)
461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
462698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (uint32_t(dpy)>=NUM_DISPLAY_MAX)
463698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_VALUE;
464698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile surface_flinger_cblk_t const * cblk = get_cblk();
465698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile display_cblk_t const * dcblk = cblk->displays + dpy;
466698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return dcblk->h;
467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
469698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getDisplayOrientation(DisplayID dpy)
470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
471698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    if (uint32_t(dpy)>=NUM_DISPLAY_MAX)
472698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        return BAD_VALUE;
473698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile surface_flinger_cblk_t const * cblk = get_cblk();
474698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile display_cblk_t const * dcblk = cblk->displays + dpy;
475698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return dcblk->orientation;
476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
478698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getNumberOfDisplays()
479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
480698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    volatile surface_flinger_cblk_t const * cblk = get_cblk();
481698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    uint32_t connected = cblk->connected;
482698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    int n = 0;
483698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    while (connected) {
484698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        if (connected&1) n++;
485698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        connected >>= 1;
486698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    }
487698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return n;
488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
490698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ----------------------------------------------------------------------------
491698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
492698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::freezeDisplay(DisplayID dpy, uint32_t flags)
493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
494698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    sp<ISurfaceComposer> sm(getComposerService());
495698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return sm->freezeDisplay(dpy, flags);
496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
498698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::unfreezeDisplay(DisplayID dpy, uint32_t flags)
499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
500698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    sp<ISurfaceComposer> sm(getComposerService());
501698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return sm->unfreezeDisplay(dpy, flags);
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
504698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianint SurfaceComposerClient::setOrientation(DisplayID dpy,
505698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        int orientation, uint32_t flags)
506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
507698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    sp<ISurfaceComposer> sm(getComposerService());
508698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian    return sm->setOrientation(dpy, orientation, flags);
509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
511d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian// ----------------------------------------------------------------------------
51274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
51374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianScreenshotClient::ScreenshotClient()
51474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    : mWidth(0), mHeight(0), mFormat(PIXEL_FORMAT_NONE) {
51574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
51674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
51774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianstatus_t ScreenshotClient::update() {
51874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
51974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    if (s == NULL) return NO_INIT;
52074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    mHeap = 0;
52174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return s->captureScreen(0, &mHeap,
522bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            &mWidth, &mHeight, &mFormat, 0, 0,
523bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            0, -1UL);
52474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
52574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
52674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianstatus_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight) {
52774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
52874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    if (s == NULL) return NO_INIT;
52974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    mHeap = 0;
53074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return s->captureScreen(0, &mHeap,
531bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            &mWidth, &mHeight, &mFormat, reqWidth, reqHeight,
532bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            0, -1UL);
533bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian}
534bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian
535bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopianstatus_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight,
536bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian        uint32_t minLayerZ, uint32_t maxLayerZ) {
537bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    sp<ISurfaceComposer> s(ComposerService::getComposerService());
538bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    if (s == NULL) return NO_INIT;
539bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    mHeap = 0;
540bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian    return s->captureScreen(0, &mHeap,
541bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            &mWidth, &mHeight, &mFormat, reqWidth, reqHeight,
542bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            minLayerZ, maxLayerZ);
54374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
54474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
54574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid ScreenshotClient::release() {
54674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    mHeap = 0;
54774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
54874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
54974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid const* ScreenshotClient::getPixels() const {
55074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mHeap->getBase();
55174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
55274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
55374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getWidth() const {
55474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mWidth;
55574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
55674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
55774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getHeight() const {
55874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mHeight;
55974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
56074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
56174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianPixelFormat ScreenshotClient::getFormat() const {
56274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mFormat;
56374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
56474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
56574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getStride() const {
56674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mWidth;
56774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
56874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
56974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopiansize_t ScreenshotClient::getSize() const {
57074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    return mHeap->getSize();
57174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
57274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
57374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian// ----------------------------------------------------------------------------
574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
576