blob: 8d39c85345a4f1fe5af0d5e82cf50495c51c8fe6 [file] [log] [blame]
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "SurfaceComposerClient"
18
19#include <stdint.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080020#include <sys/types.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080021
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080022#include <utils/Errors.h>
23#include <utils/threads.h>
Mathias Agopiand4784a32010-05-27 19:41:15 -070024#include <utils/SortedVector.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080025#include <utils/Log.h>
Mathias Agopiand4784a32010-05-27 19:41:15 -070026#include <utils/Singleton.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080027
Mathias Agopian9cce3252010-02-09 17:46:37 -080028#include <binder/IServiceManager.h>
29#include <binder/IMemory.h>
30
Mathias Agopian076b1cc2009-04-10 14:24:30 -070031#include <ui/DisplayInfo.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080032
Mathias Agopian9cce3252010-02-09 17:46:37 -080033#include <surfaceflinger/ISurfaceComposer.h>
34#include <surfaceflinger/ISurfaceFlingerClient.h>
35#include <surfaceflinger/ISurface.h>
36#include <surfaceflinger/SurfaceComposerClient.h>
37
38#include <private/surfaceflinger/LayerState.h>
39#include <private/surfaceflinger/SharedBufferStack.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080040
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080041
42namespace android {
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080043// ---------------------------------------------------------------------------
44
Mathias Agopiand4784a32010-05-27 19:41:15 -070045class Composer : public Singleton<Composer>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080046{
Mathias Agopiand4784a32010-05-27 19:41:15 -070047 // these are constants
48 sp<ISurfaceComposer> mComposerService;
49 sp<IMemoryHeap> mServerCblkMemory;
50 surface_flinger_cblk_t volatile* mServerCblk;
Mathias Agopiandd3423c2009-09-23 15:44:05 -070051
Mathias Agopiand4784a32010-05-27 19:41:15 -070052 Mutex mLock;
53 SortedVector< wp<SurfaceComposerClient> > mActiveConnections;
54 SortedVector<sp<SurfaceComposerClient> > mOpenTransactions;
55
56 Composer() : Singleton<Composer>() {
57 const String16 name("SurfaceFlinger");
58 while (getService(name, &mComposerService) != NO_ERROR) {
59 usleep(250000);
60 }
61 mServerCblkMemory = mComposerService->getCblk();
62 mServerCblk = static_cast<surface_flinger_cblk_t volatile *>(
63 mServerCblkMemory->getBase());
64 }
65
66 void addClientImpl(const sp<SurfaceComposerClient>& client) {
67 Mutex::Autolock _l(mLock);
68 mActiveConnections.add(client);
69 }
70
71 void removeClientImpl(const sp<SurfaceComposerClient>& client) {
72 Mutex::Autolock _l(mLock);
73 mActiveConnections.remove(client);
74 }
75
76 void openGlobalTransactionImpl()
77 {
78 Mutex::Autolock _l(mLock);
79 if (mOpenTransactions.size()) {
80 LOGE("openGlobalTransaction() called more than once. skipping.");
81 return;
82 }
83 const size_t N = mActiveConnections.size();
84 for (size_t i=0; i<N; i++) {
85 sp<SurfaceComposerClient> client(mActiveConnections[i].promote());
86 if (client != 0 && mOpenTransactions.indexOf(client) < 0) {
87 if (client->openTransaction() == NO_ERROR) {
88 mOpenTransactions.add(client);
89 } else {
90 LOGE("openTransaction on client %p failed", client.get());
91 // let it go, it'll fail later when the user
92 // tries to do something with the transaction
93 }
Mathias Agopiandd3423c2009-09-23 15:44:05 -070094 }
Mathias Agopiandd3423c2009-09-23 15:44:05 -070095 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080096 }
Mathias Agopiand4784a32010-05-27 19:41:15 -070097
98 void closeGlobalTransactionImpl()
99 {
100 mLock.lock();
101 SortedVector< sp<SurfaceComposerClient> > clients(mOpenTransactions);
102 mOpenTransactions.clear();
103 mLock.unlock();
104
105 sp<ISurfaceComposer> sm(mComposerService);
106 sm->openGlobalTransaction();
107 const size_t N = clients.size();
108 for (size_t i=0; i<N; i++) {
109 clients[i]->closeTransaction();
110 }
111 sm->closeGlobalTransaction();
112 }
113
114 friend class Singleton<Composer>;
115
116public:
117 static sp<ISurfaceComposer> getComposerService() {
118 return Composer::getInstance().mComposerService;
119 }
120 static surface_flinger_cblk_t const volatile * getControlBlock() {
121 return Composer::getInstance().mServerCblk;
122 }
123 static void addClient(const sp<SurfaceComposerClient>& client) {
124 Composer::getInstance().addClientImpl(client);
125 }
126 static void removeClient(const sp<SurfaceComposerClient>& client) {
127 Composer::getInstance().removeClientImpl(client);
128 }
129 static void openGlobalTransaction() {
130 Composer::getInstance().openGlobalTransactionImpl();
131 }
132 static void closeGlobalTransaction() {
133 Composer::getInstance().closeGlobalTransactionImpl();
134 }
135};
136
137ANDROID_SINGLETON_STATIC_INSTANCE(Composer);
138
139static inline sp<ISurfaceComposer> getComposerService() {
140 return Composer::getComposerService();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800141}
142
Mathias Agopiand4784a32010-05-27 19:41:15 -0700143static inline surface_flinger_cblk_t const volatile * get_cblk() {
144 return Composer::getControlBlock();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800145}
146
147// ---------------------------------------------------------------------------
148
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800149static inline int compare_type( const layer_state_t& lhs,
150 const layer_state_t& rhs) {
151 if (lhs.surface < rhs.surface) return -1;
152 if (lhs.surface > rhs.surface) return 1;
153 return 0;
154}
155
156SurfaceComposerClient::SurfaceComposerClient()
Mathias Agopiand4784a32010-05-27 19:41:15 -0700157 : mTransactionOpen(0), mPrebuiltLayerState(0), mStatus(NO_INIT)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800158{
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800159}
160
Mathias Agopiand4784a32010-05-27 19:41:15 -0700161void SurfaceComposerClient::onFirstRef()
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800162{
Mathias Agopiand4784a32010-05-27 19:41:15 -0700163 sp<ISurfaceComposer> sm(getComposerService());
164 if (sm != 0) {
165 sp<ISurfaceFlingerClient> conn = sm->createConnection();
166 if (conn != 0) {
167 mClient = conn;
168 Composer::addClient(this);
169 mPrebuiltLayerState = new layer_state_t;
170 mStatus = NO_ERROR;
171 }
172 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800173}
174
Mathias Agopian631f3582010-05-25 17:51:34 -0700175SurfaceComposerClient::~SurfaceComposerClient()
176{
Mathias Agopiand4784a32010-05-27 19:41:15 -0700177 delete mPrebuiltLayerState;
Mathias Agopian631f3582010-05-25 17:51:34 -0700178 dispose();
179}
Mathias Agopiandd3423c2009-09-23 15:44:05 -0700180
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800181status_t SurfaceComposerClient::initCheck() const
182{
183 return mStatus;
184}
185
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800186sp<IBinder> SurfaceComposerClient::connection() const
187{
188 return (mClient != 0) ? mClient->asBinder() : 0;
189}
190
Mathias Agopiand4784a32010-05-27 19:41:15 -0700191status_t SurfaceComposerClient::linkToComposerDeath(
192 const sp<IBinder::DeathRecipient>& recipient,
193 void* cookie, uint32_t flags)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800194{
Mathias Agopiand4784a32010-05-27 19:41:15 -0700195 sp<ISurfaceComposer> sm(getComposerService());
196 return sm->asBinder()->linkToDeath(recipient, cookie, flags);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800197}
198
199void SurfaceComposerClient::dispose()
200{
201 // this can be called more than once.
Mathias Agopiand4784a32010-05-27 19:41:15 -0700202 sp<ISurfaceFlingerClient> client;
203 Mutex::Autolock _lm(mLock);
204 if (mClient != 0) {
205 Composer::removeClient(this);
206 client = mClient; // hold ref while lock is held
207 mClient.clear();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800208 }
Mathias Agopiand4784a32010-05-27 19:41:15 -0700209 mStatus = NO_INIT;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800210}
211
212status_t SurfaceComposerClient::getDisplayInfo(
213 DisplayID dpy, DisplayInfo* info)
214{
Mathias Agopianbb641242010-05-18 17:06:55 -0700215 if (uint32_t(dpy)>=SharedBufferStack::NUM_DISPLAY_MAX)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800216 return BAD_VALUE;
217
218 volatile surface_flinger_cblk_t const * cblk = get_cblk();
219 volatile display_cblk_t const * dcblk = cblk->displays + dpy;
220
221 info->w = dcblk->w;
222 info->h = dcblk->h;
223 info->orientation = dcblk->orientation;
224 info->xdpi = dcblk->xdpi;
225 info->ydpi = dcblk->ydpi;
226 info->fps = dcblk->fps;
227 info->density = dcblk->density;
228 return getPixelFormatInfo(dcblk->format, &(info->pixelFormatInfo));
229}
230
231ssize_t SurfaceComposerClient::getDisplayWidth(DisplayID dpy)
232{
Mathias Agopianbb641242010-05-18 17:06:55 -0700233 if (uint32_t(dpy)>=SharedBufferStack::NUM_DISPLAY_MAX)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800234 return BAD_VALUE;
235 volatile surface_flinger_cblk_t const * cblk = get_cblk();
236 volatile display_cblk_t const * dcblk = cblk->displays + dpy;
237 return dcblk->w;
238}
239
240ssize_t SurfaceComposerClient::getDisplayHeight(DisplayID dpy)
241{
Mathias Agopianbb641242010-05-18 17:06:55 -0700242 if (uint32_t(dpy)>=SharedBufferStack::NUM_DISPLAY_MAX)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800243 return BAD_VALUE;
244 volatile surface_flinger_cblk_t const * cblk = get_cblk();
245 volatile display_cblk_t const * dcblk = cblk->displays + dpy;
246 return dcblk->h;
247}
248
249ssize_t SurfaceComposerClient::getDisplayOrientation(DisplayID dpy)
250{
Mathias Agopianbb641242010-05-18 17:06:55 -0700251 if (uint32_t(dpy)>=SharedBufferStack::NUM_DISPLAY_MAX)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800252 return BAD_VALUE;
253 volatile surface_flinger_cblk_t const * cblk = get_cblk();
254 volatile display_cblk_t const * dcblk = cblk->displays + dpy;
255 return dcblk->orientation;
256}
257
258ssize_t SurfaceComposerClient::getNumberOfDisplays()
259{
260 volatile surface_flinger_cblk_t const * cblk = get_cblk();
261 uint32_t connected = cblk->connected;
262 int n = 0;
263 while (connected) {
264 if (connected&1) n++;
265 connected >>= 1;
266 }
267 return n;
268}
269
Mathias Agopian01b76682009-04-16 20:04:08 -0700270sp<SurfaceControl> SurfaceComposerClient::createSurface(
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800271 int pid,
272 DisplayID display,
273 uint32_t w,
274 uint32_t h,
275 PixelFormat format,
276 uint32_t flags)
277{
Mathias Agopian285dbde2010-03-01 16:09:43 -0800278 String8 name;
279 const size_t SIZE = 128;
280 char buffer[SIZE];
281 snprintf(buffer, SIZE, "<pid_%d>", getpid());
282 name.append(buffer);
283
284 return SurfaceComposerClient::createSurface(pid, name, display,
285 w, h, format, flags);
Mathias Agopian285dbde2010-03-01 16:09:43 -0800286}
287
288sp<SurfaceControl> SurfaceComposerClient::createSurface(
289 int pid,
290 const String8& name,
291 DisplayID display,
292 uint32_t w,
293 uint32_t h,
294 PixelFormat format,
295 uint32_t flags)
296{
Mathias Agopian01b76682009-04-16 20:04:08 -0700297 sp<SurfaceControl> result;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800298 if (mStatus == NO_ERROR) {
299 ISurfaceFlingerClient::surface_data_t data;
Mathias Agopian285dbde2010-03-01 16:09:43 -0800300 sp<ISurface> surface = mClient->createSurface(&data, pid, name,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800301 display, w, h, format, flags);
302 if (surface != 0) {
Mathias Agopianbb641242010-05-18 17:06:55 -0700303 if (uint32_t(data.token) < SharedBufferStack::NUM_LAYERS_MAX) {
Mathias Agopian01b76682009-04-16 20:04:08 -0700304 result = new SurfaceControl(this, surface, data, w, h, format, flags);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800305 }
306 }
307 }
308 return result;
309}
310
311status_t SurfaceComposerClient::destroySurface(SurfaceID sid)
312{
313 if (mStatus != NO_ERROR)
314 return mStatus;
315
316 // it's okay to destroy a surface while a transaction is open,
317 // (transactions really are a client-side concept)
318 // however, this indicates probably a misuse of the API or a bug
319 // in the client code.
320 LOGW_IF(mTransactionOpen,
321 "Destroying surface while a transaction is open. "
322 "Client %p: destroying surface %d, mTransactionOpen=%d",
323 this, sid, mTransactionOpen);
324
325 status_t err = mClient->destroySurface(sid);
326 return err;
327}
328
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800329void SurfaceComposerClient::openGlobalTransaction()
330{
Mathias Agopiand4784a32010-05-27 19:41:15 -0700331 Composer::openGlobalTransaction();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800332}
333
334void SurfaceComposerClient::closeGlobalTransaction()
335{
Mathias Agopiand4784a32010-05-27 19:41:15 -0700336 Composer::closeGlobalTransaction();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800337}
338
339status_t SurfaceComposerClient::freezeDisplay(DisplayID dpy, uint32_t flags)
340{
Mathias Agopiandd3423c2009-09-23 15:44:05 -0700341 sp<ISurfaceComposer> sm(getComposerService());
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800342 return sm->freezeDisplay(dpy, flags);
343}
344
345status_t SurfaceComposerClient::unfreezeDisplay(DisplayID dpy, uint32_t flags)
346{
Mathias Agopiandd3423c2009-09-23 15:44:05 -0700347 sp<ISurfaceComposer> sm(getComposerService());
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800348 return sm->unfreezeDisplay(dpy, flags);
349}
350
Mathias Agopianc08731e2009-03-27 18:11:38 -0700351int SurfaceComposerClient::setOrientation(DisplayID dpy,
352 int orientation, uint32_t flags)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800353{
Mathias Agopiandd3423c2009-09-23 15:44:05 -0700354 sp<ISurfaceComposer> sm(getComposerService());
Mathias Agopianc08731e2009-03-27 18:11:38 -0700355 return sm->setOrientation(dpy, orientation, flags);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800356}
357
358status_t SurfaceComposerClient::openTransaction()
359{
360 if (mStatus != NO_ERROR)
361 return mStatus;
362 Mutex::Autolock _l(mLock);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800363 mTransactionOpen++;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800364 return NO_ERROR;
365}
366
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800367status_t SurfaceComposerClient::closeTransaction()
368{
369 if (mStatus != NO_ERROR)
370 return mStatus;
371
372 Mutex::Autolock _l(mLock);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800373 if (mTransactionOpen <= 0) {
374 LOGE( "closeTransaction (client %p, mTransactionOpen=%d) "
375 "called more times than openTransaction()",
376 this, mTransactionOpen);
377 return INVALID_OPERATION;
378 }
379
380 if (mTransactionOpen >= 2) {
381 mTransactionOpen--;
382 return NO_ERROR;
383 }
384
385 mTransactionOpen = 0;
386 const ssize_t count = mStates.size();
387 if (count) {
388 mClient->setState(count, mStates.array());
389 mStates.clear();
390 }
391 return NO_ERROR;
392}
393
Mathias Agopian631f3582010-05-25 17:51:34 -0700394layer_state_t* SurfaceComposerClient::get_state_l(SurfaceID index)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800395{
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800396 // API usage error, do nothing.
397 if (mTransactionOpen<=0) {
398 LOGE("Not in transaction (client=%p, SurfaceID=%d, mTransactionOpen=%d",
399 this, int(index), mTransactionOpen);
400 return 0;
401 }
402
403 // use mPrebuiltLayerState just to find out if we already have it
Mathias Agopiand4784a32010-05-27 19:41:15 -0700404 layer_state_t& dummy(*mPrebuiltLayerState);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800405 dummy.surface = index;
406 ssize_t i = mStates.indexOf(dummy);
407 if (i < 0) {
408 // we don't have it, add an initialized layer_state to our list
409 i = mStates.add(dummy);
410 }
411 return mStates.editArray() + i;
412}
413
Mathias Agopian631f3582010-05-25 17:51:34 -0700414layer_state_t* SurfaceComposerClient::lockLayerState(SurfaceID id)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800415{
416 layer_state_t* s;
417 mLock.lock();
Mathias Agopian631f3582010-05-25 17:51:34 -0700418 s = get_state_l(id);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800419 if (!s) mLock.unlock();
420 return s;
421}
422
Mathias Agopian631f3582010-05-25 17:51:34 -0700423void SurfaceComposerClient::unlockLayerState()
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800424{
425 mLock.unlock();
426}
427
Mathias Agopian62185b72009-04-16 16:19:50 -0700428status_t SurfaceComposerClient::setPosition(SurfaceID id, int32_t x, int32_t y)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800429{
Mathias Agopian631f3582010-05-25 17:51:34 -0700430 layer_state_t* s = lockLayerState(id);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800431 if (!s) return BAD_INDEX;
432 s->what |= ISurfaceComposer::ePositionChanged;
433 s->x = x;
434 s->y = y;
Mathias Agopian631f3582010-05-25 17:51:34 -0700435 unlockLayerState();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800436 return NO_ERROR;
437}
438
Mathias Agopian62185b72009-04-16 16:19:50 -0700439status_t SurfaceComposerClient::setSize(SurfaceID id, uint32_t w, uint32_t h)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800440{
Mathias Agopian631f3582010-05-25 17:51:34 -0700441 layer_state_t* s = lockLayerState(id);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800442 if (!s) return BAD_INDEX;
443 s->what |= ISurfaceComposer::eSizeChanged;
444 s->w = w;
445 s->h = h;
Mathias Agopian631f3582010-05-25 17:51:34 -0700446 unlockLayerState();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800447 return NO_ERROR;
448}
449
Mathias Agopian62185b72009-04-16 16:19:50 -0700450status_t SurfaceComposerClient::setLayer(SurfaceID id, int32_t z)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800451{
Mathias Agopian631f3582010-05-25 17:51:34 -0700452 layer_state_t* s = lockLayerState(id);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800453 if (!s) return BAD_INDEX;
454 s->what |= ISurfaceComposer::eLayerChanged;
455 s->z = z;
Mathias Agopian631f3582010-05-25 17:51:34 -0700456 unlockLayerState();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800457 return NO_ERROR;
458}
459
Mathias Agopian62185b72009-04-16 16:19:50 -0700460status_t SurfaceComposerClient::hide(SurfaceID id)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800461{
Mathias Agopian62185b72009-04-16 16:19:50 -0700462 return setFlags(id, ISurfaceComposer::eLayerHidden,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800463 ISurfaceComposer::eLayerHidden);
464}
465
Mathias Agopian62185b72009-04-16 16:19:50 -0700466status_t SurfaceComposerClient::show(SurfaceID id, int32_t)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800467{
Mathias Agopian62185b72009-04-16 16:19:50 -0700468 return setFlags(id, 0, ISurfaceComposer::eLayerHidden);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800469}
470
Mathias Agopian62185b72009-04-16 16:19:50 -0700471status_t SurfaceComposerClient::freeze(SurfaceID id)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800472{
Mathias Agopian62185b72009-04-16 16:19:50 -0700473 return setFlags(id, ISurfaceComposer::eLayerFrozen,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800474 ISurfaceComposer::eLayerFrozen);
475}
476
Mathias Agopian62185b72009-04-16 16:19:50 -0700477status_t SurfaceComposerClient::unfreeze(SurfaceID id)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800478{
Mathias Agopian62185b72009-04-16 16:19:50 -0700479 return setFlags(id, 0, ISurfaceComposer::eLayerFrozen);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800480}
481
Mathias Agopian62185b72009-04-16 16:19:50 -0700482status_t SurfaceComposerClient::setFlags(SurfaceID id,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800483 uint32_t flags, uint32_t mask)
484{
Mathias Agopian631f3582010-05-25 17:51:34 -0700485 layer_state_t* s = lockLayerState(id);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800486 if (!s) return BAD_INDEX;
487 s->what |= ISurfaceComposer::eVisibilityChanged;
488 s->flags &= ~mask;
489 s->flags |= (flags & mask);
490 s->mask |= mask;
Mathias Agopian631f3582010-05-25 17:51:34 -0700491 unlockLayerState();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800492 return NO_ERROR;
493}
494
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800495status_t SurfaceComposerClient::setTransparentRegionHint(
Mathias Agopian62185b72009-04-16 16:19:50 -0700496 SurfaceID id, const Region& transparentRegion)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800497{
Mathias Agopian631f3582010-05-25 17:51:34 -0700498 layer_state_t* s = lockLayerState(id);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800499 if (!s) return BAD_INDEX;
500 s->what |= ISurfaceComposer::eTransparentRegionChanged;
501 s->transparentRegion = transparentRegion;
Mathias Agopian631f3582010-05-25 17:51:34 -0700502 unlockLayerState();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800503 return NO_ERROR;
504}
505
Mathias Agopian62185b72009-04-16 16:19:50 -0700506status_t SurfaceComposerClient::setAlpha(SurfaceID id, float alpha)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800507{
Mathias Agopian631f3582010-05-25 17:51:34 -0700508 layer_state_t* s = lockLayerState(id);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800509 if (!s) return BAD_INDEX;
510 s->what |= ISurfaceComposer::eAlphaChanged;
511 s->alpha = alpha;
Mathias Agopian631f3582010-05-25 17:51:34 -0700512 unlockLayerState();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800513 return NO_ERROR;
514}
515
516status_t SurfaceComposerClient::setMatrix(
Mathias Agopian62185b72009-04-16 16:19:50 -0700517 SurfaceID id,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800518 float dsdx, float dtdx,
519 float dsdy, float dtdy )
520{
Mathias Agopian631f3582010-05-25 17:51:34 -0700521 layer_state_t* s = lockLayerState(id);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800522 if (!s) return BAD_INDEX;
523 s->what |= ISurfaceComposer::eMatrixChanged;
524 layer_state_t::matrix22_t matrix;
525 matrix.dsdx = dsdx;
526 matrix.dtdx = dtdx;
527 matrix.dsdy = dsdy;
528 matrix.dtdy = dtdy;
529 s->matrix = matrix;
Mathias Agopian631f3582010-05-25 17:51:34 -0700530 unlockLayerState();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800531 return NO_ERROR;
532}
533
Mathias Agopian62185b72009-04-16 16:19:50 -0700534status_t SurfaceComposerClient::setFreezeTint(SurfaceID id, uint32_t tint)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800535{
Mathias Agopian631f3582010-05-25 17:51:34 -0700536 layer_state_t* s = lockLayerState(id);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800537 if (!s) return BAD_INDEX;
538 s->what |= ISurfaceComposer::eFreezeTintChanged;
539 s->tint = tint;
Mathias Agopian631f3582010-05-25 17:51:34 -0700540 unlockLayerState();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800541 return NO_ERROR;
542}
543
Mathias Agopiand4784a32010-05-27 19:41:15 -0700544// ----------------------------------------------------------------------------
545
546SurfaceClient::SurfaceClient(const sp<SurfaceComposerClient>& client)
547 : mStatus(NO_INIT), mControl(0)
548{
549 if (client != 0) {
550 sp<IBinder> conn = client->connection();
551 init(conn);
552 }
553}
554SurfaceClient::SurfaceClient(const sp<IBinder>& conn)
555 : mStatus(NO_INIT), mControl(0)
556{
557 init(conn);
558}
559void SurfaceClient::init(const sp<IBinder>& conn)
560{
561 mSignalServer = getComposerService();
562 sp<ISurfaceFlingerClient> sf(interface_cast<ISurfaceFlingerClient>(conn));
563 if (sf != 0) {
564 mConnection = conn;
565 mControlMemory = sf->getControlBlock();
566 mControl = static_cast<SharedClient *>(mControlMemory->getBase());
567 mStatus = NO_ERROR;
568 }
569}
570status_t SurfaceClient::initCheck() const {
571 return mStatus;
572}
573SharedClient* SurfaceClient::getSharedClient() const {
574 return mControl;
575}
576void SurfaceClient::signalServer() const {
577 mSignalServer->signal();
578}
579
580// ----------------------------------------------------------------------------
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800581}; // namespace android
582