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