1 /* 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> 20 #include <sys/types.h> 21 22 #include <utils/Errors.h> 23 #include <utils/threads.h> 24 #include <utils/SortedVector.h> 25 #include <utils/Log.h> 26 #include <utils/Singleton.h> 27 28 #include <binder/IServiceManager.h> 29 #include <binder/IMemory.h> 30 31 #include <ui/DisplayInfo.h> 32 33 #include <surfaceflinger/ISurfaceComposer.h> 34 #include <surfaceflinger/ISurfaceComposerClient.h> 35 #include <surfaceflinger/ISurface.h> 36 #include <surfaceflinger/SurfaceComposerClient.h> 37 38 #include <private/surfaceflinger/LayerState.h> 39 #include <private/surfaceflinger/SharedBufferStack.h> 40 41 42 namespace android { 43 // --------------------------------------------------------------------------- 44 45 ANDROID_SINGLETON_STATIC_INSTANCE(ComposerService); 46 47 ComposerService::ComposerService() 48 : Singleton<ComposerService>() { 49 const String16 name("SurfaceFlinger"); 50 while (getService(name, &mComposerService) != NO_ERROR) { 51 usleep(250000); 52 } 53 mServerCblkMemory = mComposerService->getCblk(); 54 mServerCblk = static_cast<surface_flinger_cblk_t volatile *>( 55 mServerCblkMemory->getBase()); 56 } 57 58 sp<ISurfaceComposer> ComposerService::getComposerService() { 59 return ComposerService::getInstance().mComposerService; 60 } 61 62 surface_flinger_cblk_t const volatile * ComposerService::getControlBlock() { 63 return ComposerService::getInstance().mServerCblk; 64 } 65 66 static inline sp<ISurfaceComposer> getComposerService() { 67 return ComposerService::getComposerService(); 68 } 69 70 static inline surface_flinger_cblk_t const volatile * get_cblk() { 71 return ComposerService::getControlBlock(); 72 } 73 74 // --------------------------------------------------------------------------- 75 76 class Composer : public Singleton<Composer> 77 { 78 Mutex mLock; 79 SortedVector< wp<SurfaceComposerClient> > mActiveConnections; 80 SortedVector<sp<SurfaceComposerClient> > mOpenTransactions; 81 82 Composer() : Singleton<Composer>() { 83 } 84 85 void addClientImpl(const sp<SurfaceComposerClient>& client) { 86 Mutex::Autolock _l(mLock); 87 mActiveConnections.add(client); 88 } 89 90 void removeClientImpl(const sp<SurfaceComposerClient>& client) { 91 Mutex::Autolock _l(mLock); 92 mActiveConnections.remove(client); 93 } 94 95 void openGlobalTransactionImpl() 96 { 97 Mutex::Autolock _l(mLock); 98 if (mOpenTransactions.size()) { 99 LOGE("openGlobalTransaction() called more than once. skipping."); 100 return; 101 } 102 const size_t N = mActiveConnections.size(); 103 for (size_t i=0; i<N; i++) { 104 sp<SurfaceComposerClient> client(mActiveConnections[i].promote()); 105 if (client != 0 && mOpenTransactions.indexOf(client) < 0) { 106 if (client->openTransaction() == NO_ERROR) { 107 mOpenTransactions.add(client); 108 } else { 109 LOGE("openTransaction on client %p failed", client.get()); 110 // let it go, it'll fail later when the user 111 // tries to do something with the transaction 112 } 113 } 114 } 115 } 116 117 void closeGlobalTransactionImpl() 118 { 119 mLock.lock(); 120 SortedVector< sp<SurfaceComposerClient> > clients(mOpenTransactions); 121 mOpenTransactions.clear(); 122 mLock.unlock(); 123 124 sp<ISurfaceComposer> sm(getComposerService()); 125 sm->openGlobalTransaction(); 126 const size_t N = clients.size(); 127 for (size_t i=0; i<N; i++) { 128 clients[i]->closeTransaction(); 129 } 130 sm->closeGlobalTransaction(); 131 } 132 133 friend class Singleton<Composer>; 134 135 public: 136 static void addClient(const sp<SurfaceComposerClient>& client) { 137 Composer::getInstance().addClientImpl(client); 138 } 139 static void removeClient(const sp<SurfaceComposerClient>& client) { 140 Composer::getInstance().removeClientImpl(client); 141 } 142 static void openGlobalTransaction() { 143 Composer::getInstance().openGlobalTransactionImpl(); 144 } 145 static void closeGlobalTransaction() { 146 Composer::getInstance().closeGlobalTransactionImpl(); 147 } 148 }; 149 150 ANDROID_SINGLETON_STATIC_INSTANCE(Composer); 151 152 // --------------------------------------------------------------------------- 153 154 static inline int compare_type( const layer_state_t& lhs, 155 const layer_state_t& rhs) { 156 if (lhs.surface < rhs.surface) return -1; 157 if (lhs.surface > rhs.surface) return 1; 158 return 0; 159 } 160 161 SurfaceComposerClient::SurfaceComposerClient() 162 : mTransactionOpen(0), mPrebuiltLayerState(0), mStatus(NO_INIT) 163 { 164 } 165 166 void SurfaceComposerClient::onFirstRef() 167 { 168 sp<ISurfaceComposer> sm(getComposerService()); 169 if (sm != 0) { 170 sp<ISurfaceComposerClient> conn = sm->createConnection(); 171 if (conn != 0) { 172 mClient = conn; 173 Composer::addClient(this); 174 mPrebuiltLayerState = new layer_state_t; 175 mStatus = NO_ERROR; 176 } 177 } 178 } 179 180 SurfaceComposerClient::~SurfaceComposerClient() 181 { 182 delete mPrebuiltLayerState; 183 dispose(); 184 } 185 186 status_t SurfaceComposerClient::initCheck() const 187 { 188 return mStatus; 189 } 190 191 sp<IBinder> SurfaceComposerClient::connection() const 192 { 193 return (mClient != 0) ? mClient->asBinder() : 0; 194 } 195 196 status_t SurfaceComposerClient::linkToComposerDeath( 197 const sp<IBinder::DeathRecipient>& recipient, 198 void* cookie, uint32_t flags) 199 { 200 sp<ISurfaceComposer> sm(getComposerService()); 201 return sm->asBinder()->linkToDeath(recipient, cookie, flags); 202 } 203 204 void SurfaceComposerClient::dispose() 205 { 206 // this can be called more than once. 207 sp<ISurfaceComposerClient> client; 208 Mutex::Autolock _lm(mLock); 209 if (mClient != 0) { 210 Composer::removeClient(this); 211 client = mClient; // hold ref while lock is held 212 mClient.clear(); 213 } 214 mStatus = NO_INIT; 215 } 216 217 status_t SurfaceComposerClient::getDisplayInfo( 218 DisplayID dpy, DisplayInfo* info) 219 { 220 if (uint32_t(dpy)>=SharedBufferStack::NUM_DISPLAY_MAX) 221 return BAD_VALUE; 222 223 volatile surface_flinger_cblk_t const * cblk = get_cblk(); 224 volatile display_cblk_t const * dcblk = cblk->displays + dpy; 225 226 info->w = dcblk->w; 227 info->h = dcblk->h; 228 info->orientation = dcblk->orientation; 229 info->xdpi = dcblk->xdpi; 230 info->ydpi = dcblk->ydpi; 231 info->fps = dcblk->fps; 232 info->density = dcblk->density; 233 return getPixelFormatInfo(dcblk->format, &(info->pixelFormatInfo)); 234 } 235 236 ssize_t SurfaceComposerClient::getDisplayWidth(DisplayID dpy) 237 { 238 if (uint32_t(dpy)>=SharedBufferStack::NUM_DISPLAY_MAX) 239 return BAD_VALUE; 240 volatile surface_flinger_cblk_t const * cblk = get_cblk(); 241 volatile display_cblk_t const * dcblk = cblk->displays + dpy; 242 return dcblk->w; 243 } 244 245 ssize_t SurfaceComposerClient::getDisplayHeight(DisplayID dpy) 246 { 247 if (uint32_t(dpy)>=SharedBufferStack::NUM_DISPLAY_MAX) 248 return BAD_VALUE; 249 volatile surface_flinger_cblk_t const * cblk = get_cblk(); 250 volatile display_cblk_t const * dcblk = cblk->displays + dpy; 251 return dcblk->h; 252 } 253 254 ssize_t SurfaceComposerClient::getDisplayOrientation(DisplayID dpy) 255 { 256 if (uint32_t(dpy)>=SharedBufferStack::NUM_DISPLAY_MAX) 257 return BAD_VALUE; 258 volatile surface_flinger_cblk_t const * cblk = get_cblk(); 259 volatile display_cblk_t const * dcblk = cblk->displays + dpy; 260 return dcblk->orientation; 261 } 262 263 ssize_t SurfaceComposerClient::getNumberOfDisplays() 264 { 265 volatile surface_flinger_cblk_t const * cblk = get_cblk(); 266 uint32_t connected = cblk->connected; 267 int n = 0; 268 while (connected) { 269 if (connected&1) n++; 270 connected >>= 1; 271 } 272 return n; 273 } 274 275 sp<SurfaceControl> SurfaceComposerClient::createSurface( 276 int pid, 277 DisplayID display, 278 uint32_t w, 279 uint32_t h, 280 PixelFormat format, 281 uint32_t flags) 282 { 283 String8 name; 284 const size_t SIZE = 128; 285 char buffer[SIZE]; 286 snprintf(buffer, SIZE, "<pid_%d>", getpid()); 287 name.append(buffer); 288 289 return SurfaceComposerClient::createSurface(pid, name, display, 290 w, h, format, flags); 291 } 292 293 sp<SurfaceControl> SurfaceComposerClient::createSurface( 294 int pid, 295 const String8& name, 296 DisplayID display, 297 uint32_t w, 298 uint32_t h, 299 PixelFormat format, 300 uint32_t flags) 301 { 302 sp<SurfaceControl> result; 303 if (mStatus == NO_ERROR) { 304 ISurfaceComposerClient::surface_data_t data; 305 sp<ISurface> surface = mClient->createSurface(&data, pid, name, 306 display, w, h, format, flags); 307 if (surface != 0) { 308 result = new SurfaceControl(this, surface, data, w, h, format, flags); 309 } 310 } 311 return result; 312 } 313 314 status_t SurfaceComposerClient::destroySurface(SurfaceID sid) 315 { 316 if (mStatus != NO_ERROR) 317 return mStatus; 318 319 // it's okay to destroy a surface while a transaction is open, 320 // (transactions really are a client-side concept) 321 // however, this indicates probably a misuse of the API or a bug 322 // in the client code. 323 LOGW_IF(mTransactionOpen, 324 "Destroying surface while a transaction is open. " 325 "Client %p: destroying surface %d, mTransactionOpen=%d", 326 this, sid, mTransactionOpen); 327 328 status_t err = mClient->destroySurface(sid); 329 return err; 330 } 331 332 void SurfaceComposerClient::openGlobalTransaction() 333 { 334 Composer::openGlobalTransaction(); 335 } 336 337 void SurfaceComposerClient::closeGlobalTransaction() 338 { 339 Composer::closeGlobalTransaction(); 340 } 341 342 status_t SurfaceComposerClient::freezeDisplay(DisplayID dpy, uint32_t flags) 343 { 344 sp<ISurfaceComposer> sm(getComposerService()); 345 return sm->freezeDisplay(dpy, flags); 346 } 347 348 status_t SurfaceComposerClient::unfreezeDisplay(DisplayID dpy, uint32_t flags) 349 { 350 sp<ISurfaceComposer> sm(getComposerService()); 351 return sm->unfreezeDisplay(dpy, flags); 352 } 353 354 int SurfaceComposerClient::setOrientation(DisplayID dpy, 355 int orientation, uint32_t flags) 356 { 357 sp<ISurfaceComposer> sm(getComposerService()); 358 return sm->setOrientation(dpy, orientation, flags); 359 } 360 361 status_t SurfaceComposerClient::openTransaction() 362 { 363 if (mStatus != NO_ERROR) 364 return mStatus; 365 Mutex::Autolock _l(mLock); 366 mTransactionOpen++; 367 return NO_ERROR; 368 } 369 370 status_t SurfaceComposerClient::closeTransaction() 371 { 372 if (mStatus != NO_ERROR) 373 return mStatus; 374 375 Mutex::Autolock _l(mLock); 376 if (mTransactionOpen <= 0) { 377 LOGE( "closeTransaction (client %p, mTransactionOpen=%d) " 378 "called more times than openTransaction()", 379 this, mTransactionOpen); 380 return INVALID_OPERATION; 381 } 382 383 if (mTransactionOpen >= 2) { 384 mTransactionOpen--; 385 return NO_ERROR; 386 } 387 388 mTransactionOpen = 0; 389 const ssize_t count = mStates.size(); 390 if (count) { 391 mClient->setState(count, mStates.array()); 392 mStates.clear(); 393 } 394 return NO_ERROR; 395 } 396 397 layer_state_t* SurfaceComposerClient::get_state_l(SurfaceID index) 398 { 399 // API usage error, do nothing. 400 if (mTransactionOpen<=0) { 401 LOGE("Not in transaction (client=%p, SurfaceID=%d, mTransactionOpen=%d", 402 this, int(index), mTransactionOpen); 403 return 0; 404 } 405 406 // use mPrebuiltLayerState just to find out if we already have it 407 layer_state_t& dummy(*mPrebuiltLayerState); 408 dummy.surface = index; 409 ssize_t i = mStates.indexOf(dummy); 410 if (i < 0) { 411 // we don't have it, add an initialized layer_state to our list 412 i = mStates.add(dummy); 413 } 414 return mStates.editArray() + i; 415 } 416 417 layer_state_t* SurfaceComposerClient::lockLayerState(SurfaceID id) 418 { 419 layer_state_t* s; 420 mLock.lock(); 421 s = get_state_l(id); 422 if (!s) mLock.unlock(); 423 return s; 424 } 425 426 void SurfaceComposerClient::unlockLayerState() 427 { 428 mLock.unlock(); 429 } 430 431 status_t SurfaceComposerClient::setPosition(SurfaceID id, int32_t x, int32_t y) 432 { 433 layer_state_t* s = lockLayerState(id); 434 if (!s) return BAD_INDEX; 435 s->what |= ISurfaceComposer::ePositionChanged; 436 s->x = x; 437 s->y = y; 438 unlockLayerState(); 439 return NO_ERROR; 440 } 441 442 status_t SurfaceComposerClient::setSize(SurfaceID id, uint32_t w, uint32_t h) 443 { 444 layer_state_t* s = lockLayerState(id); 445 if (!s) return BAD_INDEX; 446 s->what |= ISurfaceComposer::eSizeChanged; 447 s->w = w; 448 s->h = h; 449 unlockLayerState(); 450 return NO_ERROR; 451 } 452 453 status_t SurfaceComposerClient::setLayer(SurfaceID id, int32_t z) 454 { 455 layer_state_t* s = lockLayerState(id); 456 if (!s) return BAD_INDEX; 457 s->what |= ISurfaceComposer::eLayerChanged; 458 s->z = z; 459 unlockLayerState(); 460 return NO_ERROR; 461 } 462 463 status_t SurfaceComposerClient::hide(SurfaceID id) 464 { 465 return setFlags(id, ISurfaceComposer::eLayerHidden, 466 ISurfaceComposer::eLayerHidden); 467 } 468 469 status_t SurfaceComposerClient::show(SurfaceID id, int32_t) 470 { 471 return setFlags(id, 0, ISurfaceComposer::eLayerHidden); 472 } 473 474 status_t SurfaceComposerClient::freeze(SurfaceID id) 475 { 476 return setFlags(id, ISurfaceComposer::eLayerFrozen, 477 ISurfaceComposer::eLayerFrozen); 478 } 479 480 status_t SurfaceComposerClient::unfreeze(SurfaceID id) 481 { 482 return setFlags(id, 0, ISurfaceComposer::eLayerFrozen); 483 } 484 485 status_t SurfaceComposerClient::setFlags(SurfaceID id, 486 uint32_t flags, uint32_t mask) 487 { 488 layer_state_t* s = lockLayerState(id); 489 if (!s) return BAD_INDEX; 490 s->what |= ISurfaceComposer::eVisibilityChanged; 491 s->flags &= ~mask; 492 s->flags |= (flags & mask); 493 s->mask |= mask; 494 unlockLayerState(); 495 return NO_ERROR; 496 } 497 498 status_t SurfaceComposerClient::setTransparentRegionHint( 499 SurfaceID id, const Region& transparentRegion) 500 { 501 layer_state_t* s = lockLayerState(id); 502 if (!s) return BAD_INDEX; 503 s->what |= ISurfaceComposer::eTransparentRegionChanged; 504 s->transparentRegion = transparentRegion; 505 unlockLayerState(); 506 return NO_ERROR; 507 } 508 509 status_t SurfaceComposerClient::setAlpha(SurfaceID id, float alpha) 510 { 511 layer_state_t* s = lockLayerState(id); 512 if (!s) return BAD_INDEX; 513 s->what |= ISurfaceComposer::eAlphaChanged; 514 s->alpha = alpha; 515 unlockLayerState(); 516 return NO_ERROR; 517 } 518 519 status_t SurfaceComposerClient::setMatrix( 520 SurfaceID id, 521 float dsdx, float dtdx, 522 float dsdy, float dtdy ) 523 { 524 layer_state_t* s = lockLayerState(id); 525 if (!s) return BAD_INDEX; 526 s->what |= ISurfaceComposer::eMatrixChanged; 527 layer_state_t::matrix22_t matrix; 528 matrix.dsdx = dsdx; 529 matrix.dtdx = dtdx; 530 matrix.dsdy = dsdy; 531 matrix.dtdy = dtdy; 532 s->matrix = matrix; 533 unlockLayerState(); 534 return NO_ERROR; 535 } 536 537 status_t SurfaceComposerClient::setFreezeTint(SurfaceID id, uint32_t tint) 538 { 539 layer_state_t* s = lockLayerState(id); 540 if (!s) return BAD_INDEX; 541 s->what |= ISurfaceComposer::eFreezeTintChanged; 542 s->tint = tint; 543 unlockLayerState(); 544 return NO_ERROR; 545 } 546 547 // ---------------------------------------------------------------------------- 548 549 ScreenshotClient::ScreenshotClient() 550 : mWidth(0), mHeight(0), mFormat(PIXEL_FORMAT_NONE) { 551 } 552 553 status_t ScreenshotClient::update() { 554 sp<ISurfaceComposer> s(ComposerService::getComposerService()); 555 if (s == NULL) return NO_INIT; 556 mHeap = 0; 557 return s->captureScreen(0, &mHeap, 558 &mWidth, &mHeight, &mFormat, 0, 0); 559 } 560 561 status_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight) { 562 sp<ISurfaceComposer> s(ComposerService::getComposerService()); 563 if (s == NULL) return NO_INIT; 564 mHeap = 0; 565 return s->captureScreen(0, &mHeap, 566 &mWidth, &mHeight, &mFormat, reqWidth, reqHeight); 567 } 568 569 void ScreenshotClient::release() { 570 mHeap = 0; 571 } 572 573 void const* ScreenshotClient::getPixels() const { 574 return mHeap->getBase(); 575 } 576 577 uint32_t ScreenshotClient::getWidth() const { 578 return mWidth; 579 } 580 581 uint32_t ScreenshotClient::getHeight() const { 582 return mHeight; 583 } 584 585 PixelFormat ScreenshotClient::getFormat() const { 586 return mFormat; 587 } 588 589 uint32_t ScreenshotClient::getStride() const { 590 return mWidth; 591 } 592 593 size_t ScreenshotClient::getSize() const { 594 return mHeap->getSize(); 595 } 596 597 // ---------------------------------------------------------------------------- 598 }; // namespace android 599 600