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/Log.h> 24 #include <utils/Singleton.h> 25 #include <utils/SortedVector.h> 26 #include <utils/String8.h> 27 #include <utils/threads.h> 28 29 #include <binder/IServiceManager.h> 30 31 #include <system/graphics.h> 32 33 #include <ui/DisplayInfo.h> 34 35 #include <gui/BufferItemConsumer.h> 36 #include <gui/CpuConsumer.h> 37 #include <gui/IGraphicBufferProducer.h> 38 #include <gui/ISurfaceComposer.h> 39 #include <gui/ISurfaceComposerClient.h> 40 #include <gui/Surface.h> 41 #include <gui/SurfaceComposerClient.h> 42 43 #include <private/gui/ComposerService.h> 44 #include <private/gui/LayerState.h> 45 46 namespace android { 47 // --------------------------------------------------------------------------- 48 49 ANDROID_SINGLETON_STATIC_INSTANCE(ComposerService); 50 51 ComposerService::ComposerService() 52 : Singleton<ComposerService>() { 53 Mutex::Autolock _l(mLock); 54 connectLocked(); 55 } 56 57 void ComposerService::connectLocked() { 58 const String16 name("SurfaceFlinger"); 59 while (getService(name, &mComposerService) != NO_ERROR) { 60 usleep(250000); 61 } 62 assert(mComposerService != NULL); 63 64 // Create the death listener. 65 class DeathObserver : public IBinder::DeathRecipient { 66 ComposerService& mComposerService; 67 virtual void binderDied(const wp<IBinder>& who) { 68 ALOGW("ComposerService remote (surfaceflinger) died [%p]", 69 who.unsafe_get()); 70 mComposerService.composerServiceDied(); 71 } 72 public: 73 explicit DeathObserver(ComposerService& mgr) : mComposerService(mgr) { } 74 }; 75 76 mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this)); 77 IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver); 78 } 79 80 /*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() { 81 ComposerService& instance = ComposerService::getInstance(); 82 Mutex::Autolock _l(instance.mLock); 83 if (instance.mComposerService == NULL) { 84 ComposerService::getInstance().connectLocked(); 85 assert(instance.mComposerService != NULL); 86 ALOGD("ComposerService reconnected"); 87 } 88 return instance.mComposerService; 89 } 90 91 void ComposerService::composerServiceDied() 92 { 93 Mutex::Autolock _l(mLock); 94 mComposerService = NULL; 95 mDeathObserver = NULL; 96 } 97 98 // --------------------------------------------------------------------------- 99 100 static inline 101 int compare_type(const ComposerState& lhs, const ComposerState& rhs) { 102 if (lhs.client < rhs.client) return -1; 103 if (lhs.client > rhs.client) return 1; 104 if (lhs.state.surface < rhs.state.surface) return -1; 105 if (lhs.state.surface > rhs.state.surface) return 1; 106 return 0; 107 } 108 109 static inline 110 int compare_type(const DisplayState& lhs, const DisplayState& rhs) { 111 return compare_type(lhs.token, rhs.token); 112 } 113 114 class Composer : public Singleton<Composer> 115 { 116 friend class Singleton<Composer>; 117 118 mutable Mutex mLock; 119 SortedVector<ComposerState> mComposerStates; 120 SortedVector<DisplayState > mDisplayStates; 121 uint32_t mForceSynchronous; 122 uint32_t mTransactionNestCount; 123 bool mAnimation; 124 125 Composer() : Singleton<Composer>(), 126 mForceSynchronous(0), mTransactionNestCount(0), 127 mAnimation(false) 128 { } 129 130 void openGlobalTransactionImpl(); 131 void closeGlobalTransactionImpl(bool synchronous); 132 void setAnimationTransactionImpl(); 133 status_t enableVSyncInjectionsImpl(bool enable); 134 status_t injectVSyncImpl(nsecs_t when); 135 136 layer_state_t* getLayerStateLocked( 137 const sp<SurfaceComposerClient>& client, const sp<IBinder>& id); 138 139 DisplayState& getDisplayStateLocked(const sp<IBinder>& token); 140 141 public: 142 sp<IBinder> createDisplay(const String8& displayName, bool secure); 143 void destroyDisplay(const sp<IBinder>& display); 144 sp<IBinder> getBuiltInDisplay(int32_t id); 145 146 status_t setPosition(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 147 float x, float y); 148 status_t setSize(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 149 uint32_t w, uint32_t h); 150 status_t setLayer(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 151 int32_t z); 152 status_t setRelativeLayer(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 153 const sp<IBinder>& relativeTo, int32_t z); 154 status_t setFlags(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 155 uint32_t flags, uint32_t mask); 156 status_t setTransparentRegionHint( 157 const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 158 const Region& transparentRegion); 159 status_t setAlpha(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 160 float alpha); 161 status_t setMatrix(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 162 float dsdx, float dtdx, float dtdy, float dsdy); 163 status_t setOrientation(int orientation); 164 status_t setCrop(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 165 const Rect& crop); 166 status_t setFinalCrop(const sp<SurfaceComposerClient>& client, 167 const sp<IBinder>& id, const Rect& crop); 168 status_t setLayerStack(const sp<SurfaceComposerClient>& client, 169 const sp<IBinder>& id, uint32_t layerStack); 170 status_t deferTransactionUntil(const sp<SurfaceComposerClient>& client, 171 const sp<IBinder>& id, const sp<IBinder>& handle, 172 uint64_t frameNumber); 173 status_t deferTransactionUntil(const sp<SurfaceComposerClient>& client, 174 const sp<IBinder>& id, const sp<Surface>& barrierSurface, 175 uint64_t frameNumber); 176 status_t reparentChildren(const sp<SurfaceComposerClient>& client, 177 const sp<IBinder>& id, 178 const sp<IBinder>& newParentHandle); 179 status_t detachChildren(const sp<SurfaceComposerClient>& client, 180 const sp<IBinder>& id); 181 status_t setOverrideScalingMode(const sp<SurfaceComposerClient>& client, 182 const sp<IBinder>& id, int32_t overrideScalingMode); 183 status_t setGeometryAppliesWithResize(const sp<SurfaceComposerClient>& client, 184 const sp<IBinder>& id); 185 186 status_t setDisplaySurface(const sp<IBinder>& token, 187 sp<IGraphicBufferProducer> bufferProducer); 188 void setDisplayLayerStack(const sp<IBinder>& token, uint32_t layerStack); 189 void setDisplayProjection(const sp<IBinder>& token, 190 uint32_t orientation, 191 const Rect& layerStackRect, 192 const Rect& displayRect); 193 void setDisplaySize(const sp<IBinder>& token, uint32_t width, uint32_t height); 194 195 static void setAnimationTransaction() { 196 Composer::getInstance().setAnimationTransactionImpl(); 197 } 198 199 static void openGlobalTransaction() { 200 Composer::getInstance().openGlobalTransactionImpl(); 201 } 202 203 static void closeGlobalTransaction(bool synchronous) { 204 Composer::getInstance().closeGlobalTransactionImpl(synchronous); 205 } 206 207 static status_t enableVSyncInjections(bool enable) { 208 return Composer::getInstance().enableVSyncInjectionsImpl(enable); 209 } 210 211 static status_t injectVSync(nsecs_t when) { 212 return Composer::getInstance().injectVSyncImpl(when); 213 } 214 }; 215 216 ANDROID_SINGLETON_STATIC_INSTANCE(Composer); 217 218 // --------------------------------------------------------------------------- 219 220 sp<IBinder> Composer::createDisplay(const String8& displayName, bool secure) { 221 return ComposerService::getComposerService()->createDisplay(displayName, 222 secure); 223 } 224 225 void Composer::destroyDisplay(const sp<IBinder>& display) { 226 return ComposerService::getComposerService()->destroyDisplay(display); 227 } 228 229 sp<IBinder> Composer::getBuiltInDisplay(int32_t id) { 230 return ComposerService::getComposerService()->getBuiltInDisplay(id); 231 } 232 233 void Composer::openGlobalTransactionImpl() { 234 { // scope for the lock 235 Mutex::Autolock _l(mLock); 236 mTransactionNestCount += 1; 237 } 238 } 239 240 void Composer::closeGlobalTransactionImpl(bool synchronous) { 241 sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 242 243 Vector<ComposerState> transaction; 244 Vector<DisplayState> displayTransaction; 245 uint32_t flags = 0; 246 247 { // scope for the lock 248 Mutex::Autolock _l(mLock); 249 mForceSynchronous |= synchronous; 250 if (!mTransactionNestCount) { 251 ALOGW("At least one call to closeGlobalTransaction() was not matched by a prior " 252 "call to openGlobalTransaction()."); 253 } else if (--mTransactionNestCount) { 254 return; 255 } 256 257 transaction = mComposerStates; 258 mComposerStates.clear(); 259 260 displayTransaction = mDisplayStates; 261 mDisplayStates.clear(); 262 263 if (mForceSynchronous) { 264 flags |= ISurfaceComposer::eSynchronous; 265 } 266 if (mAnimation) { 267 flags |= ISurfaceComposer::eAnimation; 268 } 269 270 mForceSynchronous = false; 271 mAnimation = false; 272 } 273 274 sm->setTransactionState(transaction, displayTransaction, flags); 275 } 276 277 status_t Composer::enableVSyncInjectionsImpl(bool enable) { 278 sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 279 return sm->enableVSyncInjections(enable); 280 } 281 282 status_t Composer::injectVSyncImpl(nsecs_t when) { 283 sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 284 return sm->injectVSync(when); 285 } 286 287 void Composer::setAnimationTransactionImpl() { 288 Mutex::Autolock _l(mLock); 289 mAnimation = true; 290 } 291 292 layer_state_t* Composer::getLayerStateLocked( 293 const sp<SurfaceComposerClient>& client, const sp<IBinder>& id) { 294 295 ComposerState s; 296 s.client = client->mClient; 297 s.state.surface = id; 298 299 ssize_t index = mComposerStates.indexOf(s); 300 if (index < 0) { 301 // we don't have it, add an initialized layer_state to our list 302 index = mComposerStates.add(s); 303 } 304 305 ComposerState* const out = mComposerStates.editArray(); 306 return &(out[index].state); 307 } 308 309 status_t Composer::setPosition(const sp<SurfaceComposerClient>& client, 310 const sp<IBinder>& id, float x, float y) { 311 Mutex::Autolock _l(mLock); 312 layer_state_t* s = getLayerStateLocked(client, id); 313 if (!s) 314 return BAD_INDEX; 315 s->what |= layer_state_t::ePositionChanged; 316 s->x = x; 317 s->y = y; 318 return NO_ERROR; 319 } 320 321 status_t Composer::setSize(const sp<SurfaceComposerClient>& client, 322 const sp<IBinder>& id, uint32_t w, uint32_t h) { 323 Mutex::Autolock _l(mLock); 324 layer_state_t* s = getLayerStateLocked(client, id); 325 if (!s) 326 return BAD_INDEX; 327 s->what |= layer_state_t::eSizeChanged; 328 s->w = w; 329 s->h = h; 330 331 // Resizing a surface makes the transaction synchronous. 332 mForceSynchronous = true; 333 334 return NO_ERROR; 335 } 336 337 status_t Composer::setLayer(const sp<SurfaceComposerClient>& client, 338 const sp<IBinder>& id, int32_t z) { 339 Mutex::Autolock _l(mLock); 340 layer_state_t* s = getLayerStateLocked(client, id); 341 if (!s) 342 return BAD_INDEX; 343 s->what |= layer_state_t::eLayerChanged; 344 s->z = z; 345 return NO_ERROR; 346 } 347 348 status_t Composer::setRelativeLayer(const sp<SurfaceComposerClient>& client, 349 const sp<IBinder>& id, const sp<IBinder>& relativeTo, 350 int32_t z) { 351 Mutex::Autolock _l(mLock); 352 layer_state_t* s = getLayerStateLocked(client, id); 353 if (!s) { 354 return BAD_INDEX; 355 } 356 s->what |= layer_state_t::eRelativeLayerChanged; 357 s->relativeLayerHandle = relativeTo; 358 s->z = z; 359 return NO_ERROR; 360 } 361 362 status_t Composer::setFlags(const sp<SurfaceComposerClient>& client, 363 const sp<IBinder>& id, uint32_t flags, 364 uint32_t mask) { 365 Mutex::Autolock _l(mLock); 366 layer_state_t* s = getLayerStateLocked(client, id); 367 if (!s) 368 return BAD_INDEX; 369 if ((mask & layer_state_t::eLayerOpaque) || 370 (mask & layer_state_t::eLayerHidden) || 371 (mask & layer_state_t::eLayerSecure)) { 372 s->what |= layer_state_t::eFlagsChanged; 373 } 374 s->flags &= ~mask; 375 s->flags |= (flags & mask); 376 s->mask |= mask; 377 return NO_ERROR; 378 } 379 380 status_t Composer::setTransparentRegionHint( 381 const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 382 const Region& transparentRegion) { 383 Mutex::Autolock _l(mLock); 384 layer_state_t* s = getLayerStateLocked(client, id); 385 if (!s) 386 return BAD_INDEX; 387 s->what |= layer_state_t::eTransparentRegionChanged; 388 s->transparentRegion = transparentRegion; 389 return NO_ERROR; 390 } 391 392 status_t Composer::setAlpha(const sp<SurfaceComposerClient>& client, 393 const sp<IBinder>& id, float alpha) { 394 Mutex::Autolock _l(mLock); 395 layer_state_t* s = getLayerStateLocked(client, id); 396 if (!s) 397 return BAD_INDEX; 398 s->what |= layer_state_t::eAlphaChanged; 399 s->alpha = alpha; 400 return NO_ERROR; 401 } 402 403 status_t Composer::setLayerStack(const sp<SurfaceComposerClient>& client, 404 const sp<IBinder>& id, uint32_t layerStack) { 405 Mutex::Autolock _l(mLock); 406 layer_state_t* s = getLayerStateLocked(client, id); 407 if (!s) 408 return BAD_INDEX; 409 s->what |= layer_state_t::eLayerStackChanged; 410 s->layerStack = layerStack; 411 return NO_ERROR; 412 } 413 414 status_t Composer::setMatrix(const sp<SurfaceComposerClient>& client, 415 const sp<IBinder>& id, float dsdx, float dtdx, 416 float dtdy, float dsdy) { 417 Mutex::Autolock _l(mLock); 418 layer_state_t* s = getLayerStateLocked(client, id); 419 if (!s) 420 return BAD_INDEX; 421 s->what |= layer_state_t::eMatrixChanged; 422 layer_state_t::matrix22_t matrix; 423 matrix.dsdx = dsdx; 424 matrix.dtdx = dtdx; 425 matrix.dsdy = dsdy; 426 matrix.dtdy = dtdy; 427 s->matrix = matrix; 428 return NO_ERROR; 429 } 430 431 status_t Composer::setCrop(const sp<SurfaceComposerClient>& client, 432 const sp<IBinder>& id, const Rect& crop) { 433 Mutex::Autolock _l(mLock); 434 layer_state_t* s = getLayerStateLocked(client, id); 435 if (!s) 436 return BAD_INDEX; 437 s->what |= layer_state_t::eCropChanged; 438 s->crop = crop; 439 return NO_ERROR; 440 } 441 442 status_t Composer::setFinalCrop(const sp<SurfaceComposerClient>& client, 443 const sp<IBinder>& id, const Rect& crop) { 444 Mutex::Autolock _l(mLock); 445 layer_state_t* s = getLayerStateLocked(client, id); 446 if (!s) { 447 return BAD_INDEX; 448 } 449 s->what |= layer_state_t::eFinalCropChanged; 450 s->finalCrop = crop; 451 return NO_ERROR; 452 } 453 454 status_t Composer::deferTransactionUntil( 455 const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 456 const sp<IBinder>& handle, uint64_t frameNumber) { 457 Mutex::Autolock lock(mLock); 458 layer_state_t* s = getLayerStateLocked(client, id); 459 if (!s) { 460 return BAD_INDEX; 461 } 462 s->what |= layer_state_t::eDeferTransaction; 463 s->barrierHandle = handle; 464 s->frameNumber = frameNumber; 465 return NO_ERROR; 466 } 467 468 status_t Composer::deferTransactionUntil( 469 const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 470 const sp<Surface>& barrierSurface, uint64_t frameNumber) { 471 Mutex::Autolock lock(mLock); 472 layer_state_t* s = getLayerStateLocked(client, id); 473 if (!s) { 474 return BAD_INDEX; 475 } 476 s->what |= layer_state_t::eDeferTransaction; 477 s->barrierGbp = barrierSurface->getIGraphicBufferProducer(); 478 s->frameNumber = frameNumber; 479 return NO_ERROR; 480 } 481 482 status_t Composer::reparentChildren( 483 const sp<SurfaceComposerClient>& client, 484 const sp<IBinder>& id, 485 const sp<IBinder>& newParentHandle) { 486 Mutex::Autolock lock(mLock); 487 layer_state_t* s = getLayerStateLocked(client, id); 488 if (!s) { 489 return BAD_INDEX; 490 } 491 s->what |= layer_state_t::eReparentChildren; 492 s->reparentHandle = newParentHandle; 493 return NO_ERROR; 494 } 495 496 status_t Composer::detachChildren( 497 const sp<SurfaceComposerClient>& client, 498 const sp<IBinder>& id) { 499 Mutex::Autolock lock(mLock); 500 layer_state_t* s = getLayerStateLocked(client, id); 501 if (!s) { 502 return BAD_INDEX; 503 } 504 s->what |= layer_state_t::eDetachChildren; 505 return NO_ERROR; 506 } 507 508 status_t Composer::setOverrideScalingMode( 509 const sp<SurfaceComposerClient>& client, 510 const sp<IBinder>& id, int32_t overrideScalingMode) { 511 Mutex::Autolock lock(mLock); 512 layer_state_t* s = getLayerStateLocked(client, id); 513 if (!s) { 514 return BAD_INDEX; 515 } 516 517 switch (overrideScalingMode) { 518 case NATIVE_WINDOW_SCALING_MODE_FREEZE: 519 case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW: 520 case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP: 521 case NATIVE_WINDOW_SCALING_MODE_NO_SCALE_CROP: 522 case -1: 523 break; 524 default: 525 ALOGE("unknown scaling mode: %d", 526 overrideScalingMode); 527 return BAD_VALUE; 528 } 529 530 s->what |= layer_state_t::eOverrideScalingModeChanged; 531 s->overrideScalingMode = overrideScalingMode; 532 return NO_ERROR; 533 } 534 535 status_t Composer::setGeometryAppliesWithResize( 536 const sp<SurfaceComposerClient>& client, 537 const sp<IBinder>& id) { 538 Mutex::Autolock lock(mLock); 539 layer_state_t* s = getLayerStateLocked(client, id); 540 if (!s) { 541 return BAD_INDEX; 542 } 543 s->what |= layer_state_t::eGeometryAppliesWithResize; 544 return NO_ERROR; 545 } 546 547 // --------------------------------------------------------------------------- 548 549 DisplayState& Composer::getDisplayStateLocked(const sp<IBinder>& token) { 550 DisplayState s; 551 s.token = token; 552 ssize_t index = mDisplayStates.indexOf(s); 553 if (index < 0) { 554 // we don't have it, add an initialized layer_state to our list 555 s.what = 0; 556 index = mDisplayStates.add(s); 557 } 558 return mDisplayStates.editItemAt(static_cast<size_t>(index)); 559 } 560 561 status_t Composer::setDisplaySurface(const sp<IBinder>& token, 562 sp<IGraphicBufferProducer> bufferProducer) { 563 if (bufferProducer.get() != nullptr) { 564 // Make sure that composition can never be stalled by a virtual display 565 // consumer that isn't processing buffers fast enough. 566 status_t err = bufferProducer->setAsyncMode(true); 567 if (err != NO_ERROR) { 568 ALOGE("Composer::setDisplaySurface Failed to enable async mode on the " 569 "BufferQueue. This BufferQueue cannot be used for virtual " 570 "display. (%d)", err); 571 return err; 572 } 573 } 574 Mutex::Autolock _l(mLock); 575 DisplayState& s(getDisplayStateLocked(token)); 576 s.surface = bufferProducer; 577 s.what |= DisplayState::eSurfaceChanged; 578 return NO_ERROR; 579 } 580 581 void Composer::setDisplayLayerStack(const sp<IBinder>& token, 582 uint32_t layerStack) { 583 Mutex::Autolock _l(mLock); 584 DisplayState& s(getDisplayStateLocked(token)); 585 s.layerStack = layerStack; 586 s.what |= DisplayState::eLayerStackChanged; 587 } 588 589 void Composer::setDisplayProjection(const sp<IBinder>& token, 590 uint32_t orientation, 591 const Rect& layerStackRect, 592 const Rect& displayRect) { 593 Mutex::Autolock _l(mLock); 594 DisplayState& s(getDisplayStateLocked(token)); 595 s.orientation = orientation; 596 s.viewport = layerStackRect; 597 s.frame = displayRect; 598 s.what |= DisplayState::eDisplayProjectionChanged; 599 mForceSynchronous = true; // TODO: do we actually still need this? 600 } 601 602 void Composer::setDisplaySize(const sp<IBinder>& token, uint32_t width, uint32_t height) { 603 Mutex::Autolock _l(mLock); 604 DisplayState& s(getDisplayStateLocked(token)); 605 s.width = width; 606 s.height = height; 607 s.what |= DisplayState::eDisplaySizeChanged; 608 } 609 610 // --------------------------------------------------------------------------- 611 612 SurfaceComposerClient::SurfaceComposerClient() 613 : mStatus(NO_INIT), mComposer(Composer::getInstance()) 614 { 615 } 616 617 SurfaceComposerClient::SurfaceComposerClient(const sp<IGraphicBufferProducer>& root) 618 : mStatus(NO_INIT), mComposer(Composer::getInstance()), mParent(root) 619 { 620 } 621 622 void SurfaceComposerClient::onFirstRef() { 623 sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 624 if (sm != 0) { 625 auto rootProducer = mParent.promote(); 626 sp<ISurfaceComposerClient> conn; 627 conn = (rootProducer != nullptr) ? sm->createScopedConnection(rootProducer) : 628 sm->createConnection(); 629 if (conn != 0) { 630 mClient = conn; 631 mStatus = NO_ERROR; 632 } 633 } 634 } 635 636 SurfaceComposerClient::~SurfaceComposerClient() { 637 dispose(); 638 } 639 640 status_t SurfaceComposerClient::initCheck() const { 641 return mStatus; 642 } 643 644 sp<IBinder> SurfaceComposerClient::connection() const { 645 return IInterface::asBinder(mClient); 646 } 647 648 status_t SurfaceComposerClient::linkToComposerDeath( 649 const sp<IBinder::DeathRecipient>& recipient, 650 void* cookie, uint32_t flags) { 651 sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 652 return IInterface::asBinder(sm)->linkToDeath(recipient, cookie, flags); 653 } 654 655 void SurfaceComposerClient::dispose() { 656 // this can be called more than once. 657 sp<ISurfaceComposerClient> client; 658 Mutex::Autolock _lm(mLock); 659 if (mClient != 0) { 660 client = mClient; // hold ref while lock is held 661 mClient.clear(); 662 } 663 mStatus = NO_INIT; 664 } 665 666 sp<SurfaceControl> SurfaceComposerClient::createSurface( 667 const String8& name, 668 uint32_t w, 669 uint32_t h, 670 PixelFormat format, 671 uint32_t flags, 672 SurfaceControl* parent, 673 uint32_t windowType, 674 uint32_t ownerUid) 675 { 676 sp<SurfaceControl> sur; 677 if (mStatus == NO_ERROR) { 678 sp<IBinder> handle; 679 sp<IBinder> parentHandle; 680 sp<IGraphicBufferProducer> gbp; 681 682 if (parent != nullptr) { 683 parentHandle = parent->getHandle(); 684 } 685 status_t err = mClient->createSurface(name, w, h, format, flags, parentHandle, 686 windowType, ownerUid, &handle, &gbp); 687 ALOGE_IF(err, "SurfaceComposerClient::createSurface error %s", strerror(-err)); 688 if (err == NO_ERROR) { 689 sur = new SurfaceControl(this, handle, gbp); 690 } 691 } 692 return sur; 693 } 694 695 sp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName, 696 bool secure) { 697 return Composer::getInstance().createDisplay(displayName, secure); 698 } 699 700 void SurfaceComposerClient::destroyDisplay(const sp<IBinder>& display) { 701 Composer::getInstance().destroyDisplay(display); 702 } 703 704 sp<IBinder> SurfaceComposerClient::getBuiltInDisplay(int32_t id) { 705 return Composer::getInstance().getBuiltInDisplay(id); 706 } 707 708 status_t SurfaceComposerClient::destroySurface(const sp<IBinder>& sid) { 709 if (mStatus != NO_ERROR) 710 return mStatus; 711 status_t err = mClient->destroySurface(sid); 712 return err; 713 } 714 715 status_t SurfaceComposerClient::clearLayerFrameStats(const sp<IBinder>& token) const { 716 if (mStatus != NO_ERROR) { 717 return mStatus; 718 } 719 return mClient->clearLayerFrameStats(token); 720 } 721 722 status_t SurfaceComposerClient::getLayerFrameStats(const sp<IBinder>& token, 723 FrameStats* outStats) const { 724 if (mStatus != NO_ERROR) { 725 return mStatus; 726 } 727 return mClient->getLayerFrameStats(token, outStats); 728 } 729 730 inline Composer& SurfaceComposerClient::getComposer() { 731 return mComposer; 732 } 733 734 // ---------------------------------------------------------------------------- 735 736 void SurfaceComposerClient::openGlobalTransaction() { 737 Composer::openGlobalTransaction(); 738 } 739 740 void SurfaceComposerClient::closeGlobalTransaction(bool synchronous) { 741 Composer::closeGlobalTransaction(synchronous); 742 } 743 744 void SurfaceComposerClient::setAnimationTransaction() { 745 Composer::setAnimationTransaction(); 746 } 747 748 status_t SurfaceComposerClient::enableVSyncInjections(bool enable) { 749 return Composer::enableVSyncInjections(enable); 750 } 751 752 status_t SurfaceComposerClient::injectVSync(nsecs_t when) { 753 return Composer::injectVSync(when); 754 } 755 756 // ---------------------------------------------------------------------------- 757 758 status_t SurfaceComposerClient::setCrop(const sp<IBinder>& id, const Rect& crop) { 759 return getComposer().setCrop(this, id, crop); 760 } 761 762 status_t SurfaceComposerClient::setFinalCrop(const sp<IBinder>& id, 763 const Rect& crop) { 764 return getComposer().setFinalCrop(this, id, crop); 765 } 766 767 status_t SurfaceComposerClient::setPosition(const sp<IBinder>& id, float x, float y) { 768 return getComposer().setPosition(this, id, x, y); 769 } 770 771 status_t SurfaceComposerClient::setSize(const sp<IBinder>& id, uint32_t w, uint32_t h) { 772 return getComposer().setSize(this, id, w, h); 773 } 774 775 status_t SurfaceComposerClient::setLayer(const sp<IBinder>& id, int32_t z) { 776 return getComposer().setLayer(this, id, z); 777 } 778 779 status_t SurfaceComposerClient::setRelativeLayer(const sp<IBinder>& id, 780 const sp<IBinder>& relativeTo, int32_t z) { 781 return getComposer().setRelativeLayer(this, id, relativeTo, z); 782 } 783 784 status_t SurfaceComposerClient::hide(const sp<IBinder>& id) { 785 return getComposer().setFlags(this, id, 786 layer_state_t::eLayerHidden, 787 layer_state_t::eLayerHidden); 788 } 789 790 status_t SurfaceComposerClient::show(const sp<IBinder>& id) { 791 return getComposer().setFlags(this, id, 792 0, 793 layer_state_t::eLayerHidden); 794 } 795 796 status_t SurfaceComposerClient::setFlags(const sp<IBinder>& id, uint32_t flags, 797 uint32_t mask) { 798 return getComposer().setFlags(this, id, flags, mask); 799 } 800 801 status_t SurfaceComposerClient::setTransparentRegionHint(const sp<IBinder>& id, 802 const Region& transparentRegion) { 803 return getComposer().setTransparentRegionHint(this, id, transparentRegion); 804 } 805 806 status_t SurfaceComposerClient::setAlpha(const sp<IBinder>& id, float alpha) { 807 return getComposer().setAlpha(this, id, alpha); 808 } 809 810 status_t SurfaceComposerClient::setLayerStack(const sp<IBinder>& id, uint32_t layerStack) { 811 return getComposer().setLayerStack(this, id, layerStack); 812 } 813 814 status_t SurfaceComposerClient::setMatrix(const sp<IBinder>& id, float dsdx, float dtdx, 815 float dtdy, float dsdy) { 816 return getComposer().setMatrix(this, id, dsdx, dtdx, dtdy, dsdy); 817 } 818 819 status_t SurfaceComposerClient::deferTransactionUntil(const sp<IBinder>& id, 820 const sp<IBinder>& handle, uint64_t frameNumber) { 821 return getComposer().deferTransactionUntil(this, id, handle, frameNumber); 822 } 823 824 status_t SurfaceComposerClient::deferTransactionUntil(const sp<IBinder>& id, 825 const sp<Surface>& barrierSurface, uint64_t frameNumber) { 826 return getComposer().deferTransactionUntil(this, id, barrierSurface, frameNumber); 827 } 828 829 status_t SurfaceComposerClient::reparentChildren(const sp<IBinder>& id, 830 const sp<IBinder>& newParentHandle) { 831 return getComposer().reparentChildren(this, id, newParentHandle); 832 } 833 834 status_t SurfaceComposerClient::detachChildren(const sp<IBinder>& id) { 835 return getComposer().detachChildren(this, id); 836 } 837 838 status_t SurfaceComposerClient::setOverrideScalingMode( 839 const sp<IBinder>& id, int32_t overrideScalingMode) { 840 return getComposer().setOverrideScalingMode( 841 this, id, overrideScalingMode); 842 } 843 844 status_t SurfaceComposerClient::setGeometryAppliesWithResize( 845 const sp<IBinder>& id) { 846 return getComposer().setGeometryAppliesWithResize(this, id); 847 } 848 849 // ---------------------------------------------------------------------------- 850 851 status_t SurfaceComposerClient::setDisplaySurface(const sp<IBinder>& token, 852 sp<IGraphicBufferProducer> bufferProducer) { 853 return Composer::getInstance().setDisplaySurface(token, bufferProducer); 854 } 855 856 void SurfaceComposerClient::setDisplayLayerStack(const sp<IBinder>& token, 857 uint32_t layerStack) { 858 Composer::getInstance().setDisplayLayerStack(token, layerStack); 859 } 860 861 void SurfaceComposerClient::setDisplayProjection(const sp<IBinder>& token, 862 uint32_t orientation, 863 const Rect& layerStackRect, 864 const Rect& displayRect) { 865 Composer::getInstance().setDisplayProjection(token, orientation, 866 layerStackRect, displayRect); 867 } 868 869 void SurfaceComposerClient::setDisplaySize(const sp<IBinder>& token, 870 uint32_t width, uint32_t height) { 871 Composer::getInstance().setDisplaySize(token, width, height); 872 } 873 874 // ---------------------------------------------------------------------------- 875 876 status_t SurfaceComposerClient::getDisplayConfigs( 877 const sp<IBinder>& display, Vector<DisplayInfo>* configs) 878 { 879 return ComposerService::getComposerService()->getDisplayConfigs(display, configs); 880 } 881 882 status_t SurfaceComposerClient::getDisplayInfo(const sp<IBinder>& display, 883 DisplayInfo* info) { 884 Vector<DisplayInfo> configs; 885 status_t result = getDisplayConfigs(display, &configs); 886 if (result != NO_ERROR) { 887 return result; 888 } 889 890 int activeId = getActiveConfig(display); 891 if (activeId < 0) { 892 ALOGE("No active configuration found"); 893 return NAME_NOT_FOUND; 894 } 895 896 *info = configs[static_cast<size_t>(activeId)]; 897 return NO_ERROR; 898 } 899 900 int SurfaceComposerClient::getActiveConfig(const sp<IBinder>& display) { 901 return ComposerService::getComposerService()->getActiveConfig(display); 902 } 903 904 status_t SurfaceComposerClient::setActiveConfig(const sp<IBinder>& display, int id) { 905 return ComposerService::getComposerService()->setActiveConfig(display, id); 906 } 907 908 status_t SurfaceComposerClient::getDisplayColorModes(const sp<IBinder>& display, 909 Vector<android_color_mode_t>* outColorModes) { 910 return ComposerService::getComposerService()->getDisplayColorModes(display, outColorModes); 911 } 912 913 android_color_mode_t SurfaceComposerClient::getActiveColorMode(const sp<IBinder>& display) { 914 return ComposerService::getComposerService()->getActiveColorMode(display); 915 } 916 917 status_t SurfaceComposerClient::setActiveColorMode(const sp<IBinder>& display, 918 android_color_mode_t colorMode) { 919 return ComposerService::getComposerService()->setActiveColorMode(display, colorMode); 920 } 921 922 void SurfaceComposerClient::setDisplayPowerMode(const sp<IBinder>& token, 923 int mode) { 924 ComposerService::getComposerService()->setPowerMode(token, mode); 925 } 926 927 status_t SurfaceComposerClient::clearAnimationFrameStats() { 928 return ComposerService::getComposerService()->clearAnimationFrameStats(); 929 } 930 931 status_t SurfaceComposerClient::getAnimationFrameStats(FrameStats* outStats) { 932 return ComposerService::getComposerService()->getAnimationFrameStats(outStats); 933 } 934 935 status_t SurfaceComposerClient::getHdrCapabilities(const sp<IBinder>& display, 936 HdrCapabilities* outCapabilities) { 937 return ComposerService::getComposerService()->getHdrCapabilities(display, 938 outCapabilities); 939 } 940 941 // ---------------------------------------------------------------------------- 942 943 status_t ScreenshotClient::capture( 944 const sp<IBinder>& display, 945 const sp<IGraphicBufferProducer>& producer, 946 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 947 int32_t minLayerZ, int32_t maxLayerZ, bool useIdentityTransform) { 948 sp<ISurfaceComposer> s(ComposerService::getComposerService()); 949 if (s == NULL) return NO_INIT; 950 return s->captureScreen(display, producer, sourceCrop, 951 reqWidth, reqHeight, minLayerZ, maxLayerZ, useIdentityTransform); 952 } 953 954 status_t ScreenshotClient::captureToBuffer(const sp<IBinder>& display, 955 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 956 int32_t minLayerZ, int32_t maxLayerZ, bool useIdentityTransform, 957 uint32_t rotation, 958 sp<GraphicBuffer>* outBuffer) { 959 sp<ISurfaceComposer> s(ComposerService::getComposerService()); 960 if (s == NULL) return NO_INIT; 961 962 sp<IGraphicBufferConsumer> gbpConsumer; 963 sp<IGraphicBufferProducer> producer; 964 BufferQueue::createBufferQueue(&producer, &gbpConsumer); 965 sp<BufferItemConsumer> consumer(new BufferItemConsumer(gbpConsumer, 966 GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_NEVER, 967 1, true)); 968 969 status_t ret = s->captureScreen(display, producer, sourceCrop, reqWidth, reqHeight, 970 minLayerZ, maxLayerZ, useIdentityTransform, 971 static_cast<ISurfaceComposer::Rotation>(rotation)); 972 if (ret != NO_ERROR) { 973 return ret; 974 } 975 BufferItem b; 976 consumer->acquireBuffer(&b, 0, true); 977 *outBuffer = b.mGraphicBuffer; 978 return ret; 979 } 980 981 ScreenshotClient::ScreenshotClient() 982 : mHaveBuffer(false) { 983 memset(&mBuffer, 0, sizeof(mBuffer)); 984 } 985 986 ScreenshotClient::~ScreenshotClient() { 987 ScreenshotClient::release(); 988 } 989 990 sp<CpuConsumer> ScreenshotClient::getCpuConsumer() const { 991 if (mCpuConsumer == NULL) { 992 sp<IGraphicBufferConsumer> consumer; 993 BufferQueue::createBufferQueue(&mProducer, &consumer); 994 mCpuConsumer = new CpuConsumer(consumer, 1); 995 mCpuConsumer->setName(String8("ScreenshotClient")); 996 } 997 return mCpuConsumer; 998 } 999 1000 status_t ScreenshotClient::update(const sp<IBinder>& display, 1001 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 1002 int32_t minLayerZ, int32_t maxLayerZ, 1003 bool useIdentityTransform, uint32_t rotation) { 1004 sp<ISurfaceComposer> s(ComposerService::getComposerService()); 1005 if (s == NULL) return NO_INIT; 1006 sp<CpuConsumer> cpuConsumer = getCpuConsumer(); 1007 1008 if (mHaveBuffer) { 1009 mCpuConsumer->unlockBuffer(mBuffer); 1010 memset(&mBuffer, 0, sizeof(mBuffer)); 1011 mHaveBuffer = false; 1012 } 1013 1014 status_t err = s->captureScreen(display, mProducer, sourceCrop, 1015 reqWidth, reqHeight, minLayerZ, maxLayerZ, useIdentityTransform, 1016 static_cast<ISurfaceComposer::Rotation>(rotation)); 1017 1018 if (err == NO_ERROR) { 1019 err = mCpuConsumer->lockNextBuffer(&mBuffer); 1020 if (err == NO_ERROR) { 1021 mHaveBuffer = true; 1022 } 1023 } 1024 return err; 1025 } 1026 1027 status_t ScreenshotClient::update(const sp<IBinder>& display, 1028 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 1029 int32_t minLayerZ, int32_t maxLayerZ, 1030 bool useIdentityTransform) { 1031 1032 return ScreenshotClient::update(display, sourceCrop, reqWidth, reqHeight, 1033 minLayerZ, maxLayerZ, useIdentityTransform, ISurfaceComposer::eRotateNone); 1034 } 1035 1036 status_t ScreenshotClient::update(const sp<IBinder>& display, Rect sourceCrop, 1037 bool useIdentityTransform) { 1038 return ScreenshotClient::update(display, sourceCrop, 0, 0, 1039 INT32_MIN, INT32_MAX, 1040 useIdentityTransform, ISurfaceComposer::eRotateNone); 1041 } 1042 1043 status_t ScreenshotClient::update(const sp<IBinder>& display, Rect sourceCrop, 1044 uint32_t reqWidth, uint32_t reqHeight, bool useIdentityTransform) { 1045 return ScreenshotClient::update(display, sourceCrop, reqWidth, reqHeight, 1046 INT32_MIN, INT32_MAX, 1047 useIdentityTransform, ISurfaceComposer::eRotateNone); 1048 } 1049 1050 void ScreenshotClient::release() { 1051 if (mHaveBuffer) { 1052 mCpuConsumer->unlockBuffer(mBuffer); 1053 memset(&mBuffer, 0, sizeof(mBuffer)); 1054 mHaveBuffer = false; 1055 } 1056 mCpuConsumer.clear(); 1057 } 1058 1059 void const* ScreenshotClient::getPixels() const { 1060 return mBuffer.data; 1061 } 1062 1063 uint32_t ScreenshotClient::getWidth() const { 1064 return mBuffer.width; 1065 } 1066 1067 uint32_t ScreenshotClient::getHeight() const { 1068 return mBuffer.height; 1069 } 1070 1071 PixelFormat ScreenshotClient::getFormat() const { 1072 return mBuffer.format; 1073 } 1074 1075 uint32_t ScreenshotClient::getStride() const { 1076 return mBuffer.stride; 1077 } 1078 1079 size_t ScreenshotClient::getSize() const { 1080 return mBuffer.stride * mBuffer.height * bytesPerPixel(mBuffer.format); 1081 } 1082 1083 android_dataspace ScreenshotClient::getDataSpace() const { 1084 return mBuffer.dataSpace; 1085 } 1086 1087 // ---------------------------------------------------------------------------- 1088 }; // namespace android 1089