SurfaceFlinger_hwc1.cpp revision 1971b63aa4d82db37794f19e0eb01feb1826e422
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 ATRACE_TAG ATRACE_TAG_GRAPHICS 18 19#include <dlfcn.h> 20#include <errno.h> 21#include <inttypes.h> 22#include <math.h> 23#include <stdatomic.h> 24#include <stdint.h> 25#include <sys/types.h> 26 27#include <mutex> 28 29#include <EGL/egl.h> 30 31#include <cutils/properties.h> 32#include <log/log.h> 33 34#include <binder/IPCThreadState.h> 35#include <binder/IServiceManager.h> 36#include <binder/PermissionCache.h> 37 38#include <ui/DisplayInfo.h> 39#include <ui/DisplayStatInfo.h> 40 41#include <gui/BufferQueue.h> 42#include <gui/GuiConfig.h> 43#include <gui/IDisplayEventConnection.h> 44#include <gui/Surface.h> 45#include <gui/GraphicBufferAlloc.h> 46 47#include <ui/GraphicBufferAllocator.h> 48#include <ui/HdrCapabilities.h> 49#include <ui/PixelFormat.h> 50#include <ui/UiConfig.h> 51 52#include <utils/misc.h> 53#include <utils/String8.h> 54#include <utils/String16.h> 55#include <utils/StopWatch.h> 56#include <utils/Timers.h> 57#include <utils/Trace.h> 58 59#include <private/android_filesystem_config.h> 60#include <private/gui/SyncFeatures.h> 61 62#include <set> 63 64#include "Client.h" 65#include "clz.h" 66#include "Colorizer.h" 67#include "DdmConnection.h" 68#include "DisplayDevice.h" 69#include "DispSync.h" 70#include "EventControlThread.h" 71#include "EventThread.h" 72#include "Layer.h" 73#include "LayerVector.h" 74#include "LayerDim.h" 75#include "MonitoredProducer.h" 76#include "SurfaceFlinger.h" 77 78#include "DisplayHardware/FramebufferSurface.h" 79#include "DisplayHardware/HWComposer.h" 80#include "DisplayHardware/VirtualDisplaySurface.h" 81 82#include "Effects/Daltonizer.h" 83 84#include "RenderEngine/RenderEngine.h" 85#include <cutils/compiler.h> 86 87#include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h> 88#include <configstore/Utils.h> 89 90#define DISPLAY_COUNT 1 91 92/* 93 * DEBUG_SCREENSHOTS: set to true to check that screenshots are not all 94 * black pixels. 95 */ 96#define DEBUG_SCREENSHOTS false 97 98EGLAPI const char* eglQueryStringImplementationANDROID(EGLDisplay dpy, EGLint name); 99 100namespace android { 101// --------------------------------------------------------------------------- 102 103using namespace android::hardware::configstore; 104using namespace android::hardware::configstore::V1_0; 105 106const String16 sHardwareTest("android.permission.HARDWARE_TEST"); 107const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER"); 108const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER"); 109const String16 sDump("android.permission.DUMP"); 110 111// --------------------------------------------------------------------------- 112int64_t SurfaceFlinger::vsyncPhaseOffsetNs; 113int64_t SurfaceFlinger::sfVsyncPhaseOffsetNs; 114bool SurfaceFlinger::useContextPriority; 115int64_t SurfaceFlinger::dispSyncPresentTimeOffset; 116bool SurfaceFlinger::useHwcForRgbToYuv; 117uint64_t SurfaceFlinger::maxVirtualDisplaySize; 118bool SurfaceFlinger::hasSyncFramework; 119int64_t SurfaceFlinger::maxFrameBufferAcquiredBuffers; 120 121SurfaceFlinger::SurfaceFlinger() 122 : BnSurfaceComposer(), 123 mTransactionFlags(0), 124 mTransactionPending(false), 125 mAnimTransactionPending(false), 126 mLayersRemoved(false), 127 mLayersAdded(false), 128 mRepaintEverything(0), 129 mRenderEngine(NULL), 130 mBootTime(systemTime()), 131 mVisibleRegionsDirty(false), 132 mHwWorkListDirty(false), 133 mAnimCompositionPending(false), 134 mDebugRegion(0), 135 mDebugDDMS(0), 136 mDebugDisableHWC(0), 137 mDebugDisableTransformHint(0), 138 mDebugInSwapBuffers(0), 139 mLastSwapBufferTime(0), 140 mDebugInTransaction(0), 141 mLastTransactionTime(0), 142 mBootFinished(false), 143 mForceFullDamage(false), 144 mInterceptor(this), 145 mPrimaryDispSync("PrimaryDispSync"), 146 mPrimaryHWVsyncEnabled(false), 147 mHWVsyncAvailable(false), 148 mDaltonize(false), 149 mHasColorMatrix(false), 150 mHasPoweredOff(false), 151 mFrameBuckets(), 152 mTotalTime(0), 153 mLastSwapTime(0), 154 mNumLayers(0) 155{ 156 ALOGI("SurfaceFlinger is starting"); 157 158 vsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs, 159 &ISurfaceFlingerConfigs::vsyncEventPhaseOffsetNs>(1000000); 160 161 sfVsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs, 162 &ISurfaceFlingerConfigs::vsyncSfEventPhaseOffsetNs>(1000000); 163 164 maxVirtualDisplaySize = getUInt64<ISurfaceFlingerConfigs, 165 &ISurfaceFlingerConfigs::maxVirtualDisplaySize>(0); 166 167 hasSyncFramework = getBool< ISurfaceFlingerConfigs, 168 &ISurfaceFlingerConfigs::hasSyncFramework>(true); 169 170 useContextPriority = getBool< ISurfaceFlingerConfigs, 171 &ISurfaceFlingerConfigs::useContextPriority>(false); 172 173 dispSyncPresentTimeOffset = getInt64< ISurfaceFlingerConfigs, 174 &ISurfaceFlingerConfigs::presentTimeOffsetFromVSyncNs>(0); 175 176 useHwcForRgbToYuv = getBool< ISurfaceFlingerConfigs, 177 &ISurfaceFlingerConfigs::useHwcForRGBtoYUV>(false); 178 179 maxFrameBufferAcquiredBuffers = getInt64< ISurfaceFlingerConfigs, 180 &ISurfaceFlingerConfigs::maxFrameBufferAcquiredBuffers>(2); 181 182 char value[PROPERTY_VALUE_MAX]; 183 184 property_get("ro.bq.gpu_to_cpu_unsupported", value, "0"); 185 mGpuToCpuSupported = !atoi(value); 186 187 property_get("debug.sf.showupdates", value, "0"); 188 mDebugRegion = atoi(value); 189 190 property_get("debug.sf.ddms", value, "0"); 191 mDebugDDMS = atoi(value); 192 if (mDebugDDMS) { 193 if (!startDdmConnection()) { 194 // start failed, and DDMS debugging not enabled 195 mDebugDDMS = 0; 196 } 197 } 198 ALOGI_IF(mDebugRegion, "showupdates enabled"); 199 ALOGI_IF(mDebugDDMS, "DDMS debugging enabled"); 200 201 property_get("debug.sf.enable_hwc_vds", value, "0"); 202 mUseHwcVirtualDisplays = atoi(value); 203 ALOGI_IF(!mUseHwcVirtualDisplays, "Enabling HWC virtual displays"); 204 205 property_get("ro.sf.disable_triple_buffer", value, "1"); 206 mLayerTripleBufferingDisabled = atoi(value); 207 ALOGI_IF(mLayerTripleBufferingDisabled, "Disabling Triple Buffering"); 208} 209 210void SurfaceFlinger::onFirstRef() 211{ 212 mEventQueue.init(this); 213} 214 215SurfaceFlinger::~SurfaceFlinger() 216{ 217 EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 218 eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); 219 eglTerminate(display); 220} 221 222void SurfaceFlinger::binderDied(const wp<IBinder>& /* who */) 223{ 224 // the window manager died on us. prepare its eulogy. 225 226 // restore initial conditions (default device unblank, etc) 227 initializeDisplays(); 228 229 // restart the boot-animation 230 startBootAnim(); 231} 232 233static sp<ISurfaceComposerClient> initClient(const sp<Client>& client) { 234 status_t err = client->initCheck(); 235 if (err == NO_ERROR) { 236 return client; 237 } 238 return nullptr; 239} 240 241sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() { 242 return initClient(new Client(this)); 243} 244 245sp<ISurfaceComposerClient> SurfaceFlinger::createScopedConnection( 246 const sp<IGraphicBufferProducer>& gbp) { 247 if (authenticateSurfaceTexture(gbp) == false) { 248 return nullptr; 249 } 250 const auto& layer = (static_cast<MonitoredProducer*>(gbp.get()))->getLayer(); 251 if (layer == nullptr) { 252 return nullptr; 253 } 254 255 return initClient(new Client(this, layer)); 256} 257 258sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName, 259 bool secure) 260{ 261 class DisplayToken : public BBinder { 262 sp<SurfaceFlinger> flinger; 263 virtual ~DisplayToken() { 264 // no more references, this display must be terminated 265 Mutex::Autolock _l(flinger->mStateLock); 266 flinger->mCurrentState.displays.removeItem(this); 267 flinger->setTransactionFlags(eDisplayTransactionNeeded); 268 } 269 public: 270 explicit DisplayToken(const sp<SurfaceFlinger>& flinger) 271 : flinger(flinger) { 272 } 273 }; 274 275 sp<BBinder> token = new DisplayToken(this); 276 277 Mutex::Autolock _l(mStateLock); 278 DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL, secure); 279 info.displayName = displayName; 280 mCurrentState.displays.add(token, info); 281 mInterceptor.saveDisplayCreation(info); 282 return token; 283} 284 285void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) { 286 Mutex::Autolock _l(mStateLock); 287 288 ssize_t idx = mCurrentState.displays.indexOfKey(display); 289 if (idx < 0) { 290 ALOGW("destroyDisplay: invalid display token"); 291 return; 292 } 293 294 const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx)); 295 if (!info.isVirtualDisplay()) { 296 ALOGE("destroyDisplay called for non-virtual display"); 297 return; 298 } 299 mInterceptor.saveDisplayDeletion(info.displayId); 300 mCurrentState.displays.removeItemsAt(idx); 301 setTransactionFlags(eDisplayTransactionNeeded); 302} 303 304void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) { 305 ALOGW_IF(mBuiltinDisplays[type], 306 "Overwriting display token for display type %d", type); 307 mBuiltinDisplays[type] = new BBinder(); 308 // All non-virtual displays are currently considered secure. 309 DisplayDeviceState info(type, true); 310 mCurrentState.displays.add(mBuiltinDisplays[type], info); 311 mInterceptor.saveDisplayCreation(info); 312} 313 314sp<IBinder> SurfaceFlinger::getBuiltInDisplay(int32_t id) { 315 if (uint32_t(id) >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) { 316 ALOGE("getDefaultDisplay: id=%d is not a valid default display id", id); 317 return NULL; 318 } 319 return mBuiltinDisplays[id]; 320} 321 322sp<IGraphicBufferAlloc> SurfaceFlinger::createGraphicBufferAlloc() 323{ 324 sp<GraphicBufferAlloc> gba(new GraphicBufferAlloc()); 325 return gba; 326} 327 328void SurfaceFlinger::bootFinished() 329{ 330 if (mStartBootAnimThread->join() != NO_ERROR) { 331 ALOGE("Join StartBootAnimThread failed!"); 332 } 333 const nsecs_t now = systemTime(); 334 const nsecs_t duration = now - mBootTime; 335 ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) ); 336 mBootFinished = true; 337 338 // wait patiently for the window manager death 339 const String16 name("window"); 340 sp<IBinder> window(defaultServiceManager()->getService(name)); 341 if (window != 0) { 342 window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this)); 343 } 344 345 // stop boot animation 346 // formerly we would just kill the process, but we now ask it to exit so it 347 // can choose where to stop the animation. 348 property_set("service.bootanim.exit", "1"); 349 350 const int LOGTAG_SF_STOP_BOOTANIM = 60110; 351 LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM, 352 ns2ms(systemTime(SYSTEM_TIME_MONOTONIC))); 353} 354 355void SurfaceFlinger::deleteTextureAsync(uint32_t texture) { 356 class MessageDestroyGLTexture : public MessageBase { 357 RenderEngine& engine; 358 uint32_t texture; 359 public: 360 MessageDestroyGLTexture(RenderEngine& engine, uint32_t texture) 361 : engine(engine), texture(texture) { 362 } 363 virtual bool handler() { 364 engine.deleteTextures(1, &texture); 365 return true; 366 } 367 }; 368 postMessageAsync(new MessageDestroyGLTexture(getRenderEngine(), texture)); 369} 370 371class DispSyncSource : public VSyncSource, private DispSync::Callback { 372public: 373 DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync, 374 const char* name) : 375 mName(name), 376 mValue(0), 377 mTraceVsync(traceVsync), 378 mVsyncOnLabel(String8::format("VsyncOn-%s", name)), 379 mVsyncEventLabel(String8::format("VSYNC-%s", name)), 380 mDispSync(dispSync), 381 mCallbackMutex(), 382 mCallback(), 383 mVsyncMutex(), 384 mPhaseOffset(phaseOffset), 385 mEnabled(false) {} 386 387 virtual ~DispSyncSource() {} 388 389 virtual void setVSyncEnabled(bool enable) { 390 Mutex::Autolock lock(mVsyncMutex); 391 if (enable) { 392 status_t err = mDispSync->addEventListener(mName, mPhaseOffset, 393 static_cast<DispSync::Callback*>(this)); 394 if (err != NO_ERROR) { 395 ALOGE("error registering vsync callback: %s (%d)", 396 strerror(-err), err); 397 } 398 //ATRACE_INT(mVsyncOnLabel.string(), 1); 399 } else { 400 status_t err = mDispSync->removeEventListener( 401 static_cast<DispSync::Callback*>(this)); 402 if (err != NO_ERROR) { 403 ALOGE("error unregistering vsync callback: %s (%d)", 404 strerror(-err), err); 405 } 406 //ATRACE_INT(mVsyncOnLabel.string(), 0); 407 } 408 mEnabled = enable; 409 } 410 411 virtual void setCallback(const sp<VSyncSource::Callback>& callback) { 412 Mutex::Autolock lock(mCallbackMutex); 413 mCallback = callback; 414 } 415 416 virtual void setPhaseOffset(nsecs_t phaseOffset) { 417 Mutex::Autolock lock(mVsyncMutex); 418 419 // Normalize phaseOffset to [0, period) 420 auto period = mDispSync->getPeriod(); 421 phaseOffset %= period; 422 if (phaseOffset < 0) { 423 // If we're here, then phaseOffset is in (-period, 0). After this 424 // operation, it will be in (0, period) 425 phaseOffset += period; 426 } 427 mPhaseOffset = phaseOffset; 428 429 // If we're not enabled, we don't need to mess with the listeners 430 if (!mEnabled) { 431 return; 432 } 433 434 // Remove the listener with the old offset 435 status_t err = mDispSync->removeEventListener( 436 static_cast<DispSync::Callback*>(this)); 437 if (err != NO_ERROR) { 438 ALOGE("error unregistering vsync callback: %s (%d)", 439 strerror(-err), err); 440 } 441 442 // Add a listener with the new offset 443 err = mDispSync->addEventListener(mName, mPhaseOffset, 444 static_cast<DispSync::Callback*>(this)); 445 if (err != NO_ERROR) { 446 ALOGE("error registering vsync callback: %s (%d)", 447 strerror(-err), err); 448 } 449 } 450 451private: 452 virtual void onDispSyncEvent(nsecs_t when) { 453 sp<VSyncSource::Callback> callback; 454 { 455 Mutex::Autolock lock(mCallbackMutex); 456 callback = mCallback; 457 458 if (mTraceVsync) { 459 mValue = (mValue + 1) % 2; 460 ATRACE_INT(mVsyncEventLabel.string(), mValue); 461 } 462 } 463 464 if (callback != NULL) { 465 callback->onVSyncEvent(when); 466 } 467 } 468 469 const char* const mName; 470 471 int mValue; 472 473 const bool mTraceVsync; 474 const String8 mVsyncOnLabel; 475 const String8 mVsyncEventLabel; 476 477 DispSync* mDispSync; 478 479 Mutex mCallbackMutex; // Protects the following 480 sp<VSyncSource::Callback> mCallback; 481 482 Mutex mVsyncMutex; // Protects the following 483 nsecs_t mPhaseOffset; 484 bool mEnabled; 485}; 486 487class InjectVSyncSource : public VSyncSource { 488public: 489 InjectVSyncSource() {} 490 491 virtual ~InjectVSyncSource() {} 492 493 virtual void setCallback(const sp<VSyncSource::Callback>& callback) { 494 std::lock_guard<std::mutex> lock(mCallbackMutex); 495 mCallback = callback; 496 } 497 498 virtual void onInjectSyncEvent(nsecs_t when) { 499 std::lock_guard<std::mutex> lock(mCallbackMutex); 500 mCallback->onVSyncEvent(when); 501 } 502 503 virtual void setVSyncEnabled(bool) {} 504 virtual void setPhaseOffset(nsecs_t) {} 505 506private: 507 std::mutex mCallbackMutex; // Protects the following 508 sp<VSyncSource::Callback> mCallback; 509}; 510 511void SurfaceFlinger::init() { 512 ALOGI( "SurfaceFlinger's main thread ready to run. " 513 "Initializing graphics H/W..."); 514 515 Mutex::Autolock _l(mStateLock); 516 517 // initialize EGL for the default display 518 mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); 519 eglInitialize(mEGLDisplay, NULL, NULL); 520 521 // start the EventThread 522 sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync, 523 vsyncPhaseOffsetNs, true, "app"); 524 mEventThread = new EventThread(vsyncSrc, *this, false); 525 sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync, 526 sfVsyncPhaseOffsetNs, true, "sf"); 527 mSFEventThread = new EventThread(sfVsyncSrc, *this, true); 528 mEventQueue.setEventThread(mSFEventThread); 529 530 // set SFEventThread to SCHED_FIFO to minimize jitter 531 struct sched_param param = {0}; 532 param.sched_priority = 2; 533 if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, ¶m) != 0) { 534 ALOGE("Couldn't set SCHED_FIFO for SFEventThread"); 535 } 536 537 538 // Initialize the H/W composer object. There may or may not be an 539 // actual hardware composer underneath. 540 mHwc = new HWComposer(this, 541 *static_cast<HWComposer::EventHandler *>(this)); 542 543 // get a RenderEngine for the given display / config (can't fail) 544 mRenderEngine = RenderEngine::create(mEGLDisplay, mHwc->getVisualID()); 545 546 // retrieve the EGL context that was selected/created 547 mEGLContext = mRenderEngine->getEGLContext(); 548 549 LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT, 550 "couldn't create EGLContext"); 551 552 // initialize our non-virtual displays 553 for (size_t i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) { 554 DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i); 555 // set-up the displays that are already connected 556 if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) { 557 // All non-virtual displays are currently considered secure. 558 bool isSecure = true; 559 createBuiltinDisplayLocked(type); 560 wp<IBinder> token = mBuiltinDisplays[i]; 561 562 sp<IGraphicBufferProducer> producer; 563 sp<IGraphicBufferConsumer> consumer; 564 BufferQueue::createBufferQueue(&producer, &consumer, 565 new GraphicBufferAlloc()); 566 567 sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i, 568 consumer); 569 int32_t hwcId = allocateHwcDisplayId(type); 570 sp<DisplayDevice> hw = new DisplayDevice(this, 571 type, hwcId, mHwc->getFormat(hwcId), isSecure, token, 572 fbs, producer, 573 mRenderEngine->getEGLConfig()); 574 if (i > DisplayDevice::DISPLAY_PRIMARY) { 575 // FIXME: currently we don't get blank/unblank requests 576 // for displays other than the main display, so we always 577 // assume a connected display is unblanked. 578 ALOGD("marking display %zu as acquired/unblanked", i); 579 hw->setPowerMode(HWC_POWER_MODE_NORMAL); 580 } 581 mDisplays.add(token, hw); 582 } 583 } 584 585 // make the GLContext current so that we can create textures when creating Layers 586 // (which may happens before we render something) 587 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext); 588 589 mEventControlThread = new EventControlThread(this); 590 mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY); 591 592 // set a fake vsync period if there is no HWComposer 593 if (mHwc->initCheck() != NO_ERROR) { 594 mPrimaryDispSync.setPeriod(16666667); 595 } 596 597 // initialize our drawing state 598 mDrawingState = mCurrentState; 599 600 // set initial conditions (e.g. unblank default device) 601 initializeDisplays(); 602 603 mRenderEngine->primeCache(); 604 605 mStartBootAnimThread = new StartBootAnimThread(); 606 if (mStartBootAnimThread->Start() != NO_ERROR) { 607 ALOGE("Run StartBootAnimThread failed!"); 608 } 609 610 ALOGV("Done initializing"); 611} 612 613int32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) { 614 return (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) ? 615 type : mHwc->allocateDisplayId(); 616} 617 618void SurfaceFlinger::startBootAnim() { 619 // Start boot animation service by setting a property mailbox 620 // if property setting thread is already running, Start() will be just a NOP 621 mStartBootAnimThread->Start(); 622 // Wait until property was set 623 if (mStartBootAnimThread->join() != NO_ERROR) { 624 ALOGE("Join StartBootAnimThread failed!"); 625 } 626} 627 628size_t SurfaceFlinger::getMaxTextureSize() const { 629 return mRenderEngine->getMaxTextureSize(); 630} 631 632size_t SurfaceFlinger::getMaxViewportDims() const { 633 return mRenderEngine->getMaxViewportDims(); 634} 635 636// ---------------------------------------------------------------------------- 637 638bool SurfaceFlinger::authenticateSurfaceTexture( 639 const sp<IGraphicBufferProducer>& bufferProducer) const { 640 Mutex::Autolock _l(mStateLock); 641 return authenticateSurfaceTextureLocked(bufferProducer); 642} 643 644bool SurfaceFlinger::authenticateSurfaceTextureLocked( 645 const sp<IGraphicBufferProducer>& bufferProducer) const { 646 sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer)); 647 return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0; 648} 649 650status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display, 651 Vector<DisplayInfo>* configs) { 652 if ((configs == NULL) || (display.get() == NULL)) { 653 return BAD_VALUE; 654 } 655 656 int32_t type = getDisplayType(display); 657 if (type < 0) return type; 658 659 // TODO: Not sure if display density should handled by SF any longer 660 class Density { 661 static int getDensityFromProperty(char const* propName) { 662 char property[PROPERTY_VALUE_MAX]; 663 int density = 0; 664 if (property_get(propName, property, NULL) > 0) { 665 density = atoi(property); 666 } 667 return density; 668 } 669 public: 670 static int getEmuDensity() { 671 return getDensityFromProperty("qemu.sf.lcd_density"); } 672 static int getBuildDensity() { 673 return getDensityFromProperty("ro.sf.lcd_density"); } 674 }; 675 676 configs->clear(); 677 678 const Vector<HWComposer::DisplayConfig>& hwConfigs = 679 getHwComposer().getConfigs(type); 680 for (size_t c = 0; c < hwConfigs.size(); ++c) { 681 const HWComposer::DisplayConfig& hwConfig = hwConfigs[c]; 682 DisplayInfo info = DisplayInfo(); 683 684 float xdpi = hwConfig.xdpi; 685 float ydpi = hwConfig.ydpi; 686 687 if (type == DisplayDevice::DISPLAY_PRIMARY) { 688 // The density of the device is provided by a build property 689 float density = Density::getBuildDensity() / 160.0f; 690 if (density == 0) { 691 // the build doesn't provide a density -- this is wrong! 692 // use xdpi instead 693 ALOGE("ro.sf.lcd_density must be defined as a build property"); 694 density = xdpi / 160.0f; 695 } 696 if (Density::getEmuDensity()) { 697 // if "qemu.sf.lcd_density" is specified, it overrides everything 698 xdpi = ydpi = density = Density::getEmuDensity(); 699 density /= 160.0f; 700 } 701 info.density = density; 702 703 // TODO: this needs to go away (currently needed only by webkit) 704 sp<const DisplayDevice> hw(getDefaultDisplayDevice()); 705 info.orientation = hw->getOrientation(); 706 } else { 707 // TODO: where should this value come from? 708 static const int TV_DENSITY = 213; 709 info.density = TV_DENSITY / 160.0f; 710 info.orientation = 0; 711 } 712 713 info.w = hwConfig.width; 714 info.h = hwConfig.height; 715 info.xdpi = xdpi; 716 info.ydpi = ydpi; 717 info.fps = float(1e9 / hwConfig.refresh); 718 info.appVsyncOffset = vsyncPhaseOffsetNs; 719 720 // This is how far in advance a buffer must be queued for 721 // presentation at a given time. If you want a buffer to appear 722 // on the screen at time N, you must submit the buffer before 723 // (N - presentationDeadline). 724 // 725 // Normally it's one full refresh period (to give SF a chance to 726 // latch the buffer), but this can be reduced by configuring a 727 // DispSync offset. Any additional delays introduced by the hardware 728 // composer or panel must be accounted for here. 729 // 730 // We add an additional 1ms to allow for processing time and 731 // differences between the ideal and actual refresh rate. 732 info.presentationDeadline = 733 hwConfig.refresh - sfVsyncPhaseOffsetNs + 1000000; 734 735 // All non-virtual displays are currently considered secure. 736 info.secure = true; 737 738 configs->push_back(info); 739 } 740 741 return NO_ERROR; 742} 743 744status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>& /* display */, 745 DisplayStatInfo* stats) { 746 if (stats == NULL) { 747 return BAD_VALUE; 748 } 749 750 // FIXME for now we always return stats for the primary display 751 memset(stats, 0, sizeof(*stats)); 752 stats->vsyncTime = mPrimaryDispSync.computeNextRefresh(0); 753 stats->vsyncPeriod = mPrimaryDispSync.getPeriod(); 754 return NO_ERROR; 755} 756 757int SurfaceFlinger::getActiveConfig(const sp<IBinder>& display) { 758 sp<DisplayDevice> device(getDisplayDevice(display)); 759 if (device != NULL) { 760 return device->getActiveConfig(); 761 } 762 return BAD_VALUE; 763} 764 765void SurfaceFlinger::setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode) { 766 ALOGD("Set active config mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(), 767 this); 768 int32_t type = hw->getDisplayType(); 769 int currentMode = hw->getActiveConfig(); 770 771 if (mode == currentMode) { 772 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode); 773 return; 774 } 775 776 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) { 777 ALOGW("Trying to set config for virtual display"); 778 return; 779 } 780 781 hw->setActiveConfig(mode); 782 getHwComposer().setActiveConfig(type, mode); 783} 784 785status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& display, int mode) { 786 class MessageSetActiveConfig: public MessageBase { 787 SurfaceFlinger& mFlinger; 788 sp<IBinder> mDisplay; 789 int mMode; 790 public: 791 MessageSetActiveConfig(SurfaceFlinger& flinger, const sp<IBinder>& disp, 792 int mode) : 793 mFlinger(flinger), mDisplay(disp) { mMode = mode; } 794 virtual bool handler() { 795 Vector<DisplayInfo> configs; 796 mFlinger.getDisplayConfigs(mDisplay, &configs); 797 if (mMode < 0 || mMode >= static_cast<int>(configs.size())) { 798 ALOGE("Attempt to set active config = %d for display with %zu configs", 799 mMode, configs.size()); 800 } 801 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay)); 802 if (hw == NULL) { 803 ALOGE("Attempt to set active config = %d for null display %p", 804 mMode, mDisplay.get()); 805 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) { 806 ALOGW("Attempt to set active config = %d for virtual display", 807 mMode); 808 } else { 809 mFlinger.setActiveConfigInternal(hw, mMode); 810 } 811 return true; 812 } 813 }; 814 sp<MessageBase> msg = new MessageSetActiveConfig(*this, display, mode); 815 postMessageSync(msg); 816 return NO_ERROR; 817} 818 819status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& display, 820 Vector<android_color_mode_t>* outColorModes) { 821 if (outColorModes == nullptr || display.get() == nullptr) { 822 return BAD_VALUE; 823 } 824 825 int32_t type = getDisplayType(display); 826 if (type < 0) return type; 827 828 std::set<android_color_mode_t> colorModes; 829 for (const HWComposer::DisplayConfig& hwConfig : getHwComposer().getConfigs(type)) { 830 colorModes.insert(hwConfig.colorMode); 831 } 832 833 outColorModes->clear(); 834 std::copy(colorModes.cbegin(), colorModes.cend(), std::back_inserter(*outColorModes)); 835 836 return NO_ERROR; 837} 838 839android_color_mode_t SurfaceFlinger::getActiveColorMode(const sp<IBinder>& display) { 840 if (display.get() == nullptr) return static_cast<android_color_mode_t>(BAD_VALUE); 841 842 int32_t type = getDisplayType(display); 843 if (type < 0) return static_cast<android_color_mode_t>(type); 844 845 return getHwComposer().getColorMode(type); 846} 847 848status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& display, 849 android_color_mode_t colorMode) { 850 if (display.get() == nullptr || colorMode < 0) { 851 return BAD_VALUE; 852 } 853 854 int32_t type = getDisplayType(display); 855 if (type < 0) return type; 856 const Vector<HWComposer::DisplayConfig>& hwConfigs = getHwComposer().getConfigs(type); 857 HWComposer::DisplayConfig desiredConfig = hwConfigs[getHwComposer().getCurrentConfig(type)]; 858 desiredConfig.colorMode = colorMode; 859 for (size_t c = 0; c < hwConfigs.size(); ++c) { 860 const HWComposer::DisplayConfig config = hwConfigs[c]; 861 if (config == desiredConfig) { 862 return setActiveConfig(display, c); 863 } 864 } 865 return BAD_VALUE; 866} 867 868status_t SurfaceFlinger::clearAnimationFrameStats() { 869 Mutex::Autolock _l(mStateLock); 870 mAnimFrameTracker.clearStats(); 871 return NO_ERROR; 872} 873 874status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const { 875 Mutex::Autolock _l(mStateLock); 876 mAnimFrameTracker.getStats(outStats); 877 return NO_ERROR; 878} 879 880status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& /*display*/, 881 HdrCapabilities* outCapabilities) const { 882 // HWC1 does not provide HDR capabilities 883 *outCapabilities = HdrCapabilities(); 884 return NO_ERROR; 885} 886 887status_t SurfaceFlinger::enableVSyncInjections(bool enable) { 888 if (enable == mInjectVSyncs) { 889 return NO_ERROR; 890 } 891 892 if (enable) { 893 mInjectVSyncs = enable; 894 ALOGV("VSync Injections enabled"); 895 if (mVSyncInjector.get() == nullptr) { 896 mVSyncInjector = new InjectVSyncSource(); 897 mInjectorEventThread = new EventThread(mVSyncInjector, *this, false); 898 } 899 mEventQueue.setEventThread(mInjectorEventThread); 900 } else { 901 mInjectVSyncs = enable; 902 ALOGV("VSync Injections disabled"); 903 mEventQueue.setEventThread(mSFEventThread); 904 mVSyncInjector.clear(); 905 } 906 return NO_ERROR; 907} 908 909status_t SurfaceFlinger::injectVSync(nsecs_t when) { 910 if (!mInjectVSyncs) { 911 ALOGE("VSync Injections not enabled"); 912 return BAD_VALUE; 913 } 914 if (mInjectVSyncs && mInjectorEventThread.get() != nullptr) { 915 ALOGV("Injecting VSync inside SurfaceFlinger"); 916 mVSyncInjector->onInjectSyncEvent(when); 917 } 918 return NO_ERROR; 919} 920 921// ---------------------------------------------------------------------------- 922 923sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection() { 924 return mEventThread->createEventConnection(); 925} 926 927// ---------------------------------------------------------------------------- 928 929void SurfaceFlinger::waitForEvent() { 930 mEventQueue.waitMessage(); 931} 932 933void SurfaceFlinger::signalTransaction() { 934 mEventQueue.invalidate(); 935} 936 937void SurfaceFlinger::signalLayerUpdate() { 938 mEventQueue.invalidate(); 939} 940 941void SurfaceFlinger::signalRefresh() { 942 mEventQueue.refresh(); 943} 944 945status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg, 946 nsecs_t reltime, uint32_t /* flags */) { 947 return mEventQueue.postMessage(msg, reltime); 948} 949 950status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg, 951 nsecs_t reltime, uint32_t /* flags */) { 952 status_t res = mEventQueue.postMessage(msg, reltime); 953 if (res == NO_ERROR) { 954 msg->wait(); 955 } 956 return res; 957} 958 959void SurfaceFlinger::run() { 960 do { 961 waitForEvent(); 962 } while (true); 963} 964 965void SurfaceFlinger::enableHardwareVsync() { 966 Mutex::Autolock _l(mHWVsyncLock); 967 if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) { 968 mPrimaryDispSync.beginResync(); 969 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true); 970 mEventControlThread->setVsyncEnabled(true); 971 mPrimaryHWVsyncEnabled = true; 972 } 973} 974 975void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) { 976 Mutex::Autolock _l(mHWVsyncLock); 977 978 if (makeAvailable) { 979 mHWVsyncAvailable = true; 980 } else if (!mHWVsyncAvailable) { 981 // Hardware vsync is not currently available, so abort the resync 982 // attempt for now 983 return; 984 } 985 986 const nsecs_t period = 987 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY); 988 989 mPrimaryDispSync.reset(); 990 mPrimaryDispSync.setPeriod(period); 991 992 if (!mPrimaryHWVsyncEnabled) { 993 mPrimaryDispSync.beginResync(); 994 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true); 995 mEventControlThread->setVsyncEnabled(true); 996 mPrimaryHWVsyncEnabled = true; 997 } 998} 999 1000void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) { 1001 Mutex::Autolock _l(mHWVsyncLock); 1002 if (mPrimaryHWVsyncEnabled) { 1003 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false); 1004 mEventControlThread->setVsyncEnabled(false); 1005 mPrimaryDispSync.endResync(); 1006 mPrimaryHWVsyncEnabled = false; 1007 } 1008 if (makeUnavailable) { 1009 mHWVsyncAvailable = false; 1010 } 1011} 1012 1013void SurfaceFlinger::resyncWithRateLimit() { 1014 static constexpr nsecs_t kIgnoreDelay = ms2ns(500); 1015 if (systemTime() - mLastSwapTime > kIgnoreDelay) { 1016 resyncToHardwareVsync(false); 1017 } 1018} 1019 1020void SurfaceFlinger::onVSyncReceived(HWComposer* /*composer*/, int type, 1021 nsecs_t timestamp) { 1022 bool needsHwVsync = false; 1023 1024 { // Scope for the lock 1025 Mutex::Autolock _l(mHWVsyncLock); 1026 if (type == 0 && mPrimaryHWVsyncEnabled) { 1027 needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp); 1028 } 1029 } 1030 1031 if (needsHwVsync) { 1032 enableHardwareVsync(); 1033 } else { 1034 disableHardwareVsync(false); 1035 } 1036} 1037 1038void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) { 1039 std::lock_guard<std::mutex> lock(mCompositorTimingLock); 1040 *compositorTiming = mCompositorTiming; 1041} 1042 1043void SurfaceFlinger::onHotplugReceived(int type, bool connected) { 1044 if (mEventThread == NULL) { 1045 // This is a temporary workaround for b/7145521. A non-null pointer 1046 // does not mean EventThread has finished initializing, so this 1047 // is not a correct fix. 1048 ALOGW("WARNING: EventThread not started, ignoring hotplug"); 1049 return; 1050 } 1051 1052 if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) { 1053 Mutex::Autolock _l(mStateLock); 1054 if (connected) { 1055 createBuiltinDisplayLocked((DisplayDevice::DisplayType)type); 1056 } else { 1057 mCurrentState.displays.removeItem(mBuiltinDisplays[type]); 1058 mBuiltinDisplays[type].clear(); 1059 } 1060 setTransactionFlags(eDisplayTransactionNeeded); 1061 1062 // Defer EventThread notification until SF has updated mDisplays. 1063 } 1064} 1065 1066void SurfaceFlinger::onInvalidateReceived(HWComposer* /*composer*/) { 1067 repaintEverything(); 1068} 1069 1070void SurfaceFlinger::eventControl(int disp, int event, int enabled) { 1071 ATRACE_CALL(); 1072 getHwComposer().eventControl(disp, event, enabled); 1073} 1074 1075void SurfaceFlinger::onMessageReceived(int32_t what) { 1076 ATRACE_CALL(); 1077 switch (what) { 1078 case MessageQueue::INVALIDATE: { 1079 bool refreshNeeded = handleMessageTransaction(); 1080 refreshNeeded |= handleMessageInvalidate(); 1081 refreshNeeded |= mRepaintEverything; 1082 if (refreshNeeded) { 1083 // Signal a refresh if a transaction modified the window state, 1084 // a new buffer was latched, or if HWC has requested a full 1085 // repaint 1086 signalRefresh(); 1087 } 1088 break; 1089 } 1090 case MessageQueue::REFRESH: { 1091 handleMessageRefresh(); 1092 break; 1093 } 1094 } 1095} 1096 1097bool SurfaceFlinger::handleMessageTransaction() { 1098 uint32_t transactionFlags = peekTransactionFlags(); 1099 if (transactionFlags) { 1100 handleTransaction(transactionFlags); 1101 return true; 1102 } 1103 return false; 1104} 1105 1106bool SurfaceFlinger::handleMessageInvalidate() { 1107 ATRACE_CALL(); 1108 return handlePageFlip(); 1109} 1110 1111void SurfaceFlinger::handleMessageRefresh() { 1112 ATRACE_CALL(); 1113 1114 nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC); 1115 1116 preComposition(refreshStartTime); 1117 rebuildLayerStacks(); 1118 setUpHWComposer(); 1119 doDebugFlashRegions(); 1120 doComposition(); 1121 postComposition(refreshStartTime); 1122} 1123 1124void SurfaceFlinger::doDebugFlashRegions() 1125{ 1126 // is debugging enabled 1127 if (CC_LIKELY(!mDebugRegion)) 1128 return; 1129 1130 const bool repaintEverything = mRepaintEverything; 1131 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 1132 const sp<DisplayDevice>& hw(mDisplays[dpy]); 1133 if (hw->isDisplayOn()) { 1134 // transform the dirty region into this screen's coordinate space 1135 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything)); 1136 if (!dirtyRegion.isEmpty()) { 1137 // redraw the whole screen 1138 doComposeSurfaces(hw, Region(hw->bounds())); 1139 1140 // and draw the dirty region 1141 const int32_t height = hw->getHeight(); 1142 RenderEngine& engine(getRenderEngine()); 1143 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1); 1144 1145 hw->compositionComplete(); 1146 hw->swapBuffers(getHwComposer()); 1147 } 1148 } 1149 } 1150 1151 postFramebuffer(); 1152 1153 if (mDebugRegion > 1) { 1154 usleep(mDebugRegion * 1000); 1155 } 1156 1157 HWComposer& hwc(getHwComposer()); 1158 if (hwc.initCheck() == NO_ERROR) { 1159 status_t err = hwc.prepare(); 1160 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err)); 1161 } 1162} 1163 1164void SurfaceFlinger::preComposition(nsecs_t refreshStartTime) 1165{ 1166 bool needExtraInvalidate = false; 1167 mDrawingState.traverseInZOrder([&](Layer* layer) { 1168 if (layer->onPreComposition(refreshStartTime)) { 1169 needExtraInvalidate = true; 1170 } 1171 }); 1172 1173 if (needExtraInvalidate) { 1174 signalLayerUpdate(); 1175 } 1176} 1177 1178void SurfaceFlinger::updateCompositorTiming( 1179 nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime, 1180 std::shared_ptr<FenceTime>& presentFenceTime) { 1181 // Update queue of past composite+present times and determine the 1182 // most recently known composite to present latency. 1183 mCompositePresentTimes.push({compositeTime, presentFenceTime}); 1184 nsecs_t compositeToPresentLatency = -1; 1185 while (!mCompositePresentTimes.empty()) { 1186 CompositePresentTime& cpt = mCompositePresentTimes.front(); 1187 // Cached values should have been updated before calling this method, 1188 // which helps avoid duplicate syscalls. 1189 nsecs_t displayTime = cpt.display->getCachedSignalTime(); 1190 if (displayTime == Fence::SIGNAL_TIME_PENDING) { 1191 break; 1192 } 1193 compositeToPresentLatency = displayTime - cpt.composite; 1194 mCompositePresentTimes.pop(); 1195 } 1196 1197 // Don't let mCompositePresentTimes grow unbounded, just in case. 1198 while (mCompositePresentTimes.size() > 16) { 1199 mCompositePresentTimes.pop(); 1200 } 1201 1202 setCompositorTimingSnapped( 1203 vsyncPhase, vsyncInterval, compositeToPresentLatency); 1204} 1205 1206void SurfaceFlinger::setCompositorTimingSnapped(nsecs_t vsyncPhase, 1207 nsecs_t vsyncInterval, nsecs_t compositeToPresentLatency) { 1208 // Integer division and modulo round toward 0 not -inf, so we need to 1209 // treat negative and positive offsets differently. 1210 nsecs_t idealLatency = (sfVsyncPhaseOffsetNs > 0) ? 1211 (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) : 1212 ((-sfVsyncPhaseOffsetNs) % vsyncInterval); 1213 1214 // Just in case sfVsyncPhaseOffsetNs == -vsyncInterval. 1215 if (idealLatency <= 0) { 1216 idealLatency = vsyncInterval; 1217 } 1218 1219 // Snap the latency to a value that removes scheduling jitter from the 1220 // composition and present times, which often have >1ms of jitter. 1221 // Reducing jitter is important if an app attempts to extrapolate 1222 // something (such as user input) to an accurate diasplay time. 1223 // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs 1224 // with (presentLatency % interval). 1225 nsecs_t bias = vsyncInterval / 2; 1226 int64_t extraVsyncs = 1227 (compositeToPresentLatency - idealLatency + bias) / vsyncInterval; 1228 nsecs_t snappedCompositeToPresentLatency = (extraVsyncs > 0) ? 1229 idealLatency + (extraVsyncs * vsyncInterval) : idealLatency; 1230 1231 std::lock_guard<std::mutex> lock(mCompositorTimingLock); 1232 mCompositorTiming.deadline = vsyncPhase - idealLatency; 1233 mCompositorTiming.interval = vsyncInterval; 1234 mCompositorTiming.presentLatency = snappedCompositeToPresentLatency; 1235} 1236 1237void SurfaceFlinger::postComposition(nsecs_t refreshStartTime) 1238{ 1239 const HWComposer& hwc = getHwComposer(); 1240 const sp<const DisplayDevice> hw(getDefaultDisplayDevice()); 1241 1242 std::shared_ptr<FenceTime> glCompositionDoneFenceTime; 1243 if (getHwComposer().hasGlesComposition(hw->getHwcDisplayId())) { 1244 glCompositionDoneFenceTime = 1245 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence()); 1246 mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime); 1247 } else { 1248 glCompositionDoneFenceTime = FenceTime::NO_FENCE; 1249 } 1250 mGlCompositionDoneTimeline.updateSignalTimes(); 1251 1252 sp<Fence> retireFence = mHwc->getDisplayFence(HWC_DISPLAY_PRIMARY); 1253 auto retireFenceTime = std::make_shared<FenceTime>(retireFence); 1254 mDisplayTimeline.push(retireFenceTime); 1255 mDisplayTimeline.updateSignalTimes(); 1256 1257 nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0); 1258 nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod(); 1259 1260 // We use the refreshStartTime which might be sampled a little later than 1261 // when we started doing work for this frame, but that should be okay 1262 // since updateCompositorTiming has snapping logic. 1263 updateCompositorTiming( 1264 vsyncPhase, vsyncInterval, refreshStartTime, retireFenceTime); 1265 CompositorTiming compositorTiming; 1266 { 1267 std::lock_guard<std::mutex> lock(mCompositorTimingLock); 1268 compositorTiming = mCompositorTiming; 1269 } 1270 1271 mDrawingState.traverseInZOrder([&](Layer* layer) { 1272 // TODO(brianderson): The retire fence is incorrectly passed in as the 1273 // present fence. Fix this if this file lives on. 1274 bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime, 1275 retireFenceTime, compositorTiming); 1276 if (frameLatched) { 1277 recordBufferingStats(layer->getName().string(), 1278 layer->getOccupancyHistory(false)); 1279 } 1280 }); 1281 1282 if (retireFence->isValid()) { 1283 if (mPrimaryDispSync.addPresentFence(retireFence)) { 1284 enableHardwareVsync(); 1285 } else { 1286 disableHardwareVsync(false); 1287 } 1288 } 1289 1290 if (!hasSyncFramework) { 1291 if (hw->isDisplayOn()) { 1292 enableHardwareVsync(); 1293 } 1294 } 1295 1296 if (mAnimCompositionPending) { 1297 mAnimCompositionPending = false; 1298 1299 if (retireFenceTime->isValid()) { 1300 mAnimFrameTracker.setActualPresentFence(std::move(retireFenceTime)); 1301 } else { 1302 // The HWC doesn't support present fences, so use the refresh 1303 // timestamp instead. 1304 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY); 1305 mAnimFrameTracker.setActualPresentTime(presentTime); 1306 } 1307 mAnimFrameTracker.advanceFrame(); 1308 } 1309 1310 if (hw->getPowerMode() == HWC_POWER_MODE_OFF) { 1311 return; 1312 } 1313 1314 nsecs_t currentTime = systemTime(); 1315 if (mHasPoweredOff) { 1316 mHasPoweredOff = false; 1317 } else { 1318 nsecs_t period = mPrimaryDispSync.getPeriod(); 1319 nsecs_t elapsedTime = currentTime - mLastSwapTime; 1320 size_t numPeriods = static_cast<size_t>(elapsedTime / period); 1321 if (numPeriods < NUM_BUCKETS - 1) { 1322 mFrameBuckets[numPeriods] += elapsedTime; 1323 } else { 1324 mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime; 1325 } 1326 mTotalTime += elapsedTime; 1327 } 1328 mLastSwapTime = currentTime; 1329} 1330 1331void SurfaceFlinger::rebuildLayerStacks() { 1332 // rebuild the visible layer list per screen 1333 if (CC_UNLIKELY(mVisibleRegionsDirty)) { 1334 ATRACE_CALL(); 1335 mVisibleRegionsDirty = false; 1336 invalidateHwcGeometry(); 1337 1338 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 1339 Region opaqueRegion; 1340 Region dirtyRegion; 1341 Vector< sp<Layer> > layersSortedByZ; 1342 const sp<DisplayDevice>& hw(mDisplays[dpy]); 1343 const Transform& tr(hw->getTransform()); 1344 const Rect bounds(hw->getBounds()); 1345 if (hw->isDisplayOn()) { 1346 computeVisibleRegions(hw->getLayerStack(), dirtyRegion, 1347 opaqueRegion); 1348 1349 mDrawingState.traverseInZOrder([&](Layer* layer) { 1350 if (layer->getLayerStack() == hw->getLayerStack()) { 1351 Region drawRegion(tr.transform( 1352 layer->visibleNonTransparentRegion)); 1353 drawRegion.andSelf(bounds); 1354 if (!drawRegion.isEmpty()) { 1355 layersSortedByZ.add(layer); 1356 } 1357 } 1358 }); 1359 } 1360 hw->setVisibleLayersSortedByZ(layersSortedByZ); 1361 hw->undefinedRegion.set(bounds); 1362 hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion)); 1363 hw->dirtyRegion.orSelf(dirtyRegion); 1364 } 1365 } 1366} 1367 1368void SurfaceFlinger::setUpHWComposer() { 1369 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 1370 bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty(); 1371 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0; 1372 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers; 1373 1374 // If nothing has changed (!dirty), don't recompose. 1375 // If something changed, but we don't currently have any visible layers, 1376 // and didn't when we last did a composition, then skip it this time. 1377 // The second rule does two things: 1378 // - When all layers are removed from a display, we'll emit one black 1379 // frame, then nothing more until we get new layers. 1380 // - When a display is created with a private layer stack, we won't 1381 // emit any black frames until a layer is added to the layer stack. 1382 bool mustRecompose = dirty && !(empty && wasEmpty); 1383 1384 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL, 1385 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy, 1386 mustRecompose ? "doing" : "skipping", 1387 dirty ? "+" : "-", 1388 empty ? "+" : "-", 1389 wasEmpty ? "+" : "-"); 1390 1391 mDisplays[dpy]->beginFrame(mustRecompose); 1392 1393 if (mustRecompose) { 1394 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty; 1395 } 1396 } 1397 1398 HWComposer& hwc(getHwComposer()); 1399 if (hwc.initCheck() == NO_ERROR) { 1400 // build the h/w work list 1401 if (CC_UNLIKELY(mHwWorkListDirty)) { 1402 mHwWorkListDirty = false; 1403 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 1404 sp<const DisplayDevice> hw(mDisplays[dpy]); 1405 const int32_t id = hw->getHwcDisplayId(); 1406 if (id >= 0) { 1407 const Vector< sp<Layer> >& currentLayers( 1408 hw->getVisibleLayersSortedByZ()); 1409 const size_t count = currentLayers.size(); 1410 if (hwc.createWorkList(id, count) == NO_ERROR) { 1411 HWComposer::LayerListIterator cur = hwc.begin(id); 1412 const HWComposer::LayerListIterator end = hwc.end(id); 1413 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) { 1414 const sp<Layer>& layer(currentLayers[i]); 1415 layer->setGeometry(hw, *cur); 1416 if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) { 1417 cur->setSkip(true); 1418 } 1419 } 1420 } 1421 } 1422 } 1423 } 1424 1425 // set the per-frame data 1426 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 1427 sp<const DisplayDevice> hw(mDisplays[dpy]); 1428 const int32_t id = hw->getHwcDisplayId(); 1429 if (id >= 0) { 1430 const Vector< sp<Layer> >& currentLayers( 1431 hw->getVisibleLayersSortedByZ()); 1432 const size_t count = currentLayers.size(); 1433 HWComposer::LayerListIterator cur = hwc.begin(id); 1434 const HWComposer::LayerListIterator end = hwc.end(id); 1435 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) { 1436 /* 1437 * update the per-frame h/w composer data for each layer 1438 * and build the transparent region of the FB 1439 */ 1440 const sp<Layer>& layer(currentLayers[i]); 1441 layer->setPerFrameData(hw, *cur); 1442 } 1443 } 1444 } 1445 1446 // If possible, attempt to use the cursor overlay on each display. 1447 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 1448 sp<const DisplayDevice> hw(mDisplays[dpy]); 1449 const int32_t id = hw->getHwcDisplayId(); 1450 if (id >= 0) { 1451 const Vector< sp<Layer> >& currentLayers( 1452 hw->getVisibleLayersSortedByZ()); 1453 const size_t count = currentLayers.size(); 1454 HWComposer::LayerListIterator cur = hwc.begin(id); 1455 const HWComposer::LayerListIterator end = hwc.end(id); 1456 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) { 1457 const sp<Layer>& layer(currentLayers[i]); 1458 if (layer->isPotentialCursor()) { 1459 cur->setIsCursorLayerHint(); 1460 break; 1461 } 1462 } 1463 } 1464 } 1465 1466 status_t err = hwc.prepare(); 1467 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err)); 1468 1469 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 1470 sp<const DisplayDevice> hw(mDisplays[dpy]); 1471 hw->prepareFrame(hwc); 1472 } 1473 } 1474} 1475 1476void SurfaceFlinger::doComposition() { 1477 ATRACE_CALL(); 1478 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything); 1479 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 1480 const sp<DisplayDevice>& hw(mDisplays[dpy]); 1481 if (hw->isDisplayOn()) { 1482 // transform the dirty region into this screen's coordinate space 1483 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything)); 1484 1485 // repaint the framebuffer (if needed) 1486 doDisplayComposition(hw, dirtyRegion); 1487 1488 hw->dirtyRegion.clear(); 1489 hw->flip(hw->swapRegion); 1490 hw->swapRegion.clear(); 1491 } 1492 // inform the h/w that we're done compositing 1493 hw->compositionComplete(); 1494 } 1495 postFramebuffer(); 1496} 1497 1498void SurfaceFlinger::postFramebuffer() 1499{ 1500 ATRACE_CALL(); 1501 1502 const nsecs_t now = systemTime(); 1503 mDebugInSwapBuffers = now; 1504 1505 HWComposer& hwc(getHwComposer()); 1506 if (hwc.initCheck() == NO_ERROR) { 1507 if (!hwc.supportsFramebufferTarget()) { 1508 // EGL spec says: 1509 // "surface must be bound to the calling thread's current context, 1510 // for the current rendering API." 1511 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext); 1512 } 1513 hwc.commit(); 1514 } 1515 1516 // make the default display current because the VirtualDisplayDevice code cannot 1517 // deal with dequeueBuffer() being called outside of the composition loop; however 1518 // the code below can call glFlush() which is allowed (and does in some case) call 1519 // dequeueBuffer(). 1520 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext); 1521 1522 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 1523 sp<const DisplayDevice> hw(mDisplays[dpy]); 1524 const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ()); 1525 hw->onSwapBuffersCompleted(hwc); 1526 const size_t count = currentLayers.size(); 1527 int32_t id = hw->getHwcDisplayId(); 1528 if (id >=0 && hwc.initCheck() == NO_ERROR) { 1529 HWComposer::LayerListIterator cur = hwc.begin(id); 1530 const HWComposer::LayerListIterator end = hwc.end(id); 1531 for (size_t i = 0; cur != end && i < count; ++i, ++cur) { 1532 currentLayers[i]->onLayerDisplayed(hw, &*cur); 1533 } 1534 } else { 1535 for (size_t i = 0; i < count; i++) { 1536 currentLayers[i]->onLayerDisplayed(hw, NULL); 1537 } 1538 } 1539 } 1540 1541 mLastSwapBufferTime = systemTime() - now; 1542 mDebugInSwapBuffers = 0; 1543 1544 uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount(); 1545 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) { 1546 logFrameStats(); 1547 } 1548} 1549 1550void SurfaceFlinger::handleTransaction(uint32_t transactionFlags) 1551{ 1552 ATRACE_CALL(); 1553 1554 // here we keep a copy of the drawing state (that is the state that's 1555 // going to be overwritten by handleTransactionLocked()) outside of 1556 // mStateLock so that the side-effects of the State assignment 1557 // don't happen with mStateLock held (which can cause deadlocks). 1558 State drawingState(mDrawingState); 1559 1560 Mutex::Autolock _l(mStateLock); 1561 const nsecs_t now = systemTime(); 1562 mDebugInTransaction = now; 1563 1564 // Here we're guaranteed that some transaction flags are set 1565 // so we can call handleTransactionLocked() unconditionally. 1566 // We call getTransactionFlags(), which will also clear the flags, 1567 // with mStateLock held to guarantee that mCurrentState won't change 1568 // until the transaction is committed. 1569 1570 transactionFlags = getTransactionFlags(eTransactionMask); 1571 handleTransactionLocked(transactionFlags); 1572 1573 mLastTransactionTime = systemTime() - now; 1574 mDebugInTransaction = 0; 1575 invalidateHwcGeometry(); 1576 // here the transaction has been committed 1577} 1578 1579void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) 1580{ 1581 // Notify all layers of available frames 1582 mCurrentState.traverseInZOrder([](Layer* layer) { 1583 layer->notifyAvailableFrames(); 1584 }); 1585 1586 /* 1587 * Traversal of the children 1588 * (perform the transaction for each of them if needed) 1589 */ 1590 1591 if (transactionFlags & eTraversalNeeded) { 1592 mCurrentState.traverseInZOrder([&](Layer* layer) { 1593 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded); 1594 if (!trFlags) return; 1595 1596 const uint32_t flags = layer->doTransaction(0); 1597 if (flags & Layer::eVisibleRegion) 1598 mVisibleRegionsDirty = true; 1599 }); 1600 } 1601 1602 /* 1603 * Perform display own transactions if needed 1604 */ 1605 1606 if (transactionFlags & eDisplayTransactionNeeded) { 1607 // here we take advantage of Vector's copy-on-write semantics to 1608 // improve performance by skipping the transaction entirely when 1609 // know that the lists are identical 1610 const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays); 1611 const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays); 1612 if (!curr.isIdenticalTo(draw)) { 1613 mVisibleRegionsDirty = true; 1614 const size_t cc = curr.size(); 1615 size_t dc = draw.size(); 1616 1617 // find the displays that were removed 1618 // (ie: in drawing state but not in current state) 1619 // also handle displays that changed 1620 // (ie: displays that are in both lists) 1621 for (size_t i=0 ; i<dc ; i++) { 1622 const ssize_t j = curr.indexOfKey(draw.keyAt(i)); 1623 if (j < 0) { 1624 // in drawing state but not in current state 1625 if (!draw[i].isMainDisplay()) { 1626 // Call makeCurrent() on the primary display so we can 1627 // be sure that nothing associated with this display 1628 // is current. 1629 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDevice()); 1630 defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext); 1631 sp<DisplayDevice> hw(getDisplayDevice(draw.keyAt(i))); 1632 if (hw != NULL) 1633 hw->disconnect(getHwComposer()); 1634 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) 1635 mEventThread->onHotplugReceived(draw[i].type, false); 1636 mDisplays.removeItem(draw.keyAt(i)); 1637 } else { 1638 ALOGW("trying to remove the main display"); 1639 } 1640 } else { 1641 // this display is in both lists. see if something changed. 1642 const DisplayDeviceState& state(curr[j]); 1643 const wp<IBinder>& display(curr.keyAt(j)); 1644 const sp<IBinder> state_binder = IInterface::asBinder(state.surface); 1645 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface); 1646 if (state_binder != draw_binder) { 1647 // changing the surface is like destroying and 1648 // recreating the DisplayDevice, so we just remove it 1649 // from the drawing state, so that it get re-added 1650 // below. 1651 sp<DisplayDevice> hw(getDisplayDevice(display)); 1652 if (hw != NULL) 1653 hw->disconnect(getHwComposer()); 1654 mDisplays.removeItem(display); 1655 mDrawingState.displays.removeItemsAt(i); 1656 dc--; i--; 1657 // at this point we must loop to the next item 1658 continue; 1659 } 1660 1661 const sp<DisplayDevice> disp(getDisplayDevice(display)); 1662 if (disp != NULL) { 1663 if (state.layerStack != draw[i].layerStack) { 1664 disp->setLayerStack(state.layerStack); 1665 } 1666 if ((state.orientation != draw[i].orientation) 1667 || (state.viewport != draw[i].viewport) 1668 || (state.frame != draw[i].frame)) 1669 { 1670 disp->setProjection(state.orientation, 1671 state.viewport, state.frame); 1672 } 1673 if (state.width != draw[i].width || state.height != draw[i].height) { 1674 disp->setDisplaySize(state.width, state.height); 1675 } 1676 } 1677 } 1678 } 1679 1680 // find displays that were added 1681 // (ie: in current state but not in drawing state) 1682 for (size_t i=0 ; i<cc ; i++) { 1683 if (draw.indexOfKey(curr.keyAt(i)) < 0) { 1684 const DisplayDeviceState& state(curr[i]); 1685 1686 sp<DisplaySurface> dispSurface; 1687 sp<IGraphicBufferProducer> producer; 1688 sp<IGraphicBufferProducer> bqProducer; 1689 sp<IGraphicBufferConsumer> bqConsumer; 1690 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer, 1691 new GraphicBufferAlloc()); 1692 1693 int32_t hwcDisplayId = -1; 1694 if (state.isVirtualDisplay()) { 1695 // Virtual displays without a surface are dormant: 1696 // they have external state (layer stack, projection, 1697 // etc.) but no internal state (i.e. a DisplayDevice). 1698 if (state.surface != NULL) { 1699 1700 int width = 0; 1701 int status = state.surface->query( 1702 NATIVE_WINDOW_WIDTH, &width); 1703 ALOGE_IF(status != NO_ERROR, 1704 "Unable to query width (%d)", status); 1705 int height = 0; 1706 status = state.surface->query( 1707 NATIVE_WINDOW_HEIGHT, &height); 1708 ALOGE_IF(status != NO_ERROR, 1709 "Unable to query height (%d)", status); 1710 if (mUseHwcVirtualDisplays && 1711 (SurfaceFlinger::maxVirtualDisplaySize == 0 || 1712 (width <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize) && 1713 height <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize)))) { 1714 hwcDisplayId = allocateHwcDisplayId(state.type); 1715 } 1716 1717 sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface( 1718 *mHwc, hwcDisplayId, state.surface, 1719 bqProducer, bqConsumer, state.displayName); 1720 1721 dispSurface = vds; 1722 producer = vds; 1723 } 1724 } else { 1725 ALOGE_IF(state.surface!=NULL, 1726 "adding a supported display, but rendering " 1727 "surface is provided (%p), ignoring it", 1728 state.surface.get()); 1729 hwcDisplayId = allocateHwcDisplayId(state.type); 1730 // for supported (by hwc) displays we provide our 1731 // own rendering surface 1732 dispSurface = new FramebufferSurface(*mHwc, state.type, 1733 bqConsumer); 1734 producer = bqProducer; 1735 } 1736 1737 const wp<IBinder>& display(curr.keyAt(i)); 1738 if (dispSurface != NULL) { 1739 sp<DisplayDevice> hw = new DisplayDevice(this, 1740 state.type, hwcDisplayId, 1741 mHwc->getFormat(hwcDisplayId), state.isSecure, 1742 display, dispSurface, producer, 1743 mRenderEngine->getEGLConfig()); 1744 hw->setLayerStack(state.layerStack); 1745 hw->setProjection(state.orientation, 1746 state.viewport, state.frame); 1747 hw->setDisplayName(state.displayName); 1748 mDisplays.add(display, hw); 1749 if (state.isVirtualDisplay()) { 1750 if (hwcDisplayId >= 0) { 1751 mHwc->setVirtualDisplayProperties(hwcDisplayId, 1752 hw->getWidth(), hw->getHeight(), 1753 hw->getFormat()); 1754 } 1755 } else { 1756 mEventThread->onHotplugReceived(state.type, true); 1757 } 1758 } 1759 } 1760 } 1761 } 1762 } 1763 1764 if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) { 1765 // The transform hint might have changed for some layers 1766 // (either because a display has changed, or because a layer 1767 // as changed). 1768 // 1769 // Walk through all the layers in currentLayers, 1770 // and update their transform hint. 1771 // 1772 // If a layer is visible only on a single display, then that 1773 // display is used to calculate the hint, otherwise we use the 1774 // default display. 1775 // 1776 // NOTE: we do this here, rather than in rebuildLayerStacks() so that 1777 // the hint is set before we acquire a buffer from the surface texture. 1778 // 1779 // NOTE: layer transactions have taken place already, so we use their 1780 // drawing state. However, SurfaceFlinger's own transaction has not 1781 // happened yet, so we must use the current state layer list 1782 // (soon to become the drawing state list). 1783 // 1784 sp<const DisplayDevice> disp; 1785 uint32_t currentlayerStack = 0; 1786 bool first = true; 1787 mCurrentState.traverseInZOrder([&](Layer* layer) { 1788 // NOTE: we rely on the fact that layers are sorted by 1789 // layerStack first (so we don't have to traverse the list 1790 // of displays for every layer). 1791 uint32_t layerStack = layer->getLayerStack(); 1792 if (first || currentlayerStack != layerStack) { 1793 currentlayerStack = layerStack; 1794 // figure out if this layerstack is mirrored 1795 // (more than one display) if so, pick the default display, 1796 // if not, pick the only display it's on. 1797 disp.clear(); 1798 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 1799 sp<const DisplayDevice> hw(mDisplays[dpy]); 1800 if (hw->getLayerStack() == currentlayerStack) { 1801 if (disp == NULL) { 1802 disp = hw; 1803 } else { 1804 disp = NULL; 1805 break; 1806 } 1807 } 1808 } 1809 } 1810 if (disp == NULL) { 1811 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to 1812 // redraw after transform hint changes. See bug 8508397. 1813 1814 // could be null when this layer is using a layerStack 1815 // that is not visible on any display. Also can occur at 1816 // screen off/on times. 1817 disp = getDefaultDisplayDevice(); 1818 } 1819 layer->updateTransformHint(disp); 1820 1821 first = false; 1822 }); 1823 } 1824 1825 1826 /* 1827 * Perform our own transaction if needed 1828 */ 1829 1830 if (mLayersAdded) { 1831 mLayersAdded = false; 1832 // Layers have been added. 1833 mVisibleRegionsDirty = true; 1834 } 1835 1836 // some layers might have been removed, so 1837 // we need to update the regions they're exposing. 1838 if (mLayersRemoved) { 1839 mLayersRemoved = false; 1840 mVisibleRegionsDirty = true; 1841 mDrawingState.traverseInZOrder([&](Layer* layer) { 1842 if (mLayersPendingRemoval.indexOf(layer) >= 0) { 1843 // this layer is not visible anymore 1844 // TODO: we could traverse the tree from front to back and 1845 // compute the actual visible region 1846 // TODO: we could cache the transformed region 1847 Region visibleReg; 1848 visibleReg.set(layer->computeScreenBounds()); 1849 invalidateLayerStack(layer->getLayerStack(), visibleReg); 1850 } 1851 }); 1852 } 1853 1854 commitTransaction(); 1855 1856 updateCursorAsync(); 1857} 1858 1859void SurfaceFlinger::updateCursorAsync() 1860{ 1861 HWComposer& hwc(getHwComposer()); 1862 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 1863 sp<const DisplayDevice> hw(mDisplays[dpy]); 1864 const int32_t id = hw->getHwcDisplayId(); 1865 if (id < 0) { 1866 continue; 1867 } 1868 const Vector< sp<Layer> >& currentLayers( 1869 hw->getVisibleLayersSortedByZ()); 1870 const size_t count = currentLayers.size(); 1871 HWComposer::LayerListIterator cur = hwc.begin(id); 1872 const HWComposer::LayerListIterator end = hwc.end(id); 1873 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) { 1874 if (cur->getCompositionType() != HWC_CURSOR_OVERLAY) { 1875 continue; 1876 } 1877 const sp<Layer>& layer(currentLayers[i]); 1878 Rect cursorPos = layer->getPosition(hw); 1879 hwc.setCursorPositionAsync(id, cursorPos); 1880 break; 1881 } 1882 } 1883} 1884 1885void SurfaceFlinger::commitTransaction() 1886{ 1887 if (!mLayersPendingRemoval.isEmpty()) { 1888 // Notify removed layers now that they can't be drawn from 1889 for (const auto& l : mLayersPendingRemoval) { 1890 recordBufferingStats(l->getName().string(), 1891 l->getOccupancyHistory(true)); 1892 l->onRemoved(); 1893 } 1894 mLayersPendingRemoval.clear(); 1895 } 1896 1897 // If this transaction is part of a window animation then the next frame 1898 // we composite should be considered an animation as well. 1899 mAnimCompositionPending = mAnimTransactionPending; 1900 1901 mDrawingState = mCurrentState; 1902 mDrawingState.traverseInZOrder([](Layer* layer) { 1903 layer->commitChildList(); 1904 }); 1905 mTransactionPending = false; 1906 mAnimTransactionPending = false; 1907 mTransactionCV.broadcast(); 1908} 1909 1910void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, 1911 Region& outDirtyRegion, Region& outOpaqueRegion) 1912{ 1913 ATRACE_CALL(); 1914 1915 Region aboveOpaqueLayers; 1916 Region aboveCoveredLayers; 1917 Region dirty; 1918 1919 outDirtyRegion.clear(); 1920 1921 mDrawingState.traverseInReverseZOrder([&](Layer* layer) { 1922 // start with the whole surface at its current location 1923 const Layer::State& s(layer->getDrawingState()); 1924 1925 // only consider the layers on the given layer stack 1926 if (layer->getLayerStack() != layerStack) 1927 return; 1928 1929 /* 1930 * opaqueRegion: area of a surface that is fully opaque. 1931 */ 1932 Region opaqueRegion; 1933 1934 /* 1935 * visibleRegion: area of a surface that is visible on screen 1936 * and not fully transparent. This is essentially the layer's 1937 * footprint minus the opaque regions above it. 1938 * Areas covered by a translucent surface are considered visible. 1939 */ 1940 Region visibleRegion; 1941 1942 /* 1943 * coveredRegion: area of a surface that is covered by all 1944 * visible regions above it (which includes the translucent areas). 1945 */ 1946 Region coveredRegion; 1947 1948 /* 1949 * transparentRegion: area of a surface that is hinted to be completely 1950 * transparent. This is only used to tell when the layer has no visible 1951 * non-transparent regions and can be removed from the layer list. It 1952 * does not affect the visibleRegion of this layer or any layers 1953 * beneath it. The hint may not be correct if apps don't respect the 1954 * SurfaceView restrictions (which, sadly, some don't). 1955 */ 1956 Region transparentRegion; 1957 1958 1959 // handle hidden surfaces by setting the visible region to empty 1960 if (CC_LIKELY(layer->isVisible())) { 1961 const bool translucent = !layer->isOpaque(s); 1962 Rect bounds(layer->computeScreenBounds()); 1963 visibleRegion.set(bounds); 1964 Transform tr = layer->getTransform(); 1965 if (!visibleRegion.isEmpty()) { 1966 // Remove the transparent area from the visible region 1967 if (translucent) { 1968 if (tr.preserveRects()) { 1969 // transform the transparent region 1970 transparentRegion = tr.transform(s.activeTransparentRegion); 1971 } else { 1972 // transformation too complex, can't do the 1973 // transparent region optimization. 1974 transparentRegion.clear(); 1975 } 1976 } 1977 1978 // compute the opaque region 1979 const int32_t layerOrientation = tr.getOrientation(); 1980 if (s.alpha==255 && !translucent && 1981 ((layerOrientation & Transform::ROT_INVALID) == false)) { 1982 // the opaque region is the layer's footprint 1983 opaqueRegion = visibleRegion; 1984 } 1985 } 1986 } 1987 1988 // Clip the covered region to the visible region 1989 coveredRegion = aboveCoveredLayers.intersect(visibleRegion); 1990 1991 // Update aboveCoveredLayers for next (lower) layer 1992 aboveCoveredLayers.orSelf(visibleRegion); 1993 1994 // subtract the opaque region covered by the layers above us 1995 visibleRegion.subtractSelf(aboveOpaqueLayers); 1996 1997 // compute this layer's dirty region 1998 if (layer->contentDirty) { 1999 // we need to invalidate the whole region 2000 dirty = visibleRegion; 2001 // as well, as the old visible region 2002 dirty.orSelf(layer->visibleRegion); 2003 layer->contentDirty = false; 2004 } else { 2005 /* compute the exposed region: 2006 * the exposed region consists of two components: 2007 * 1) what's VISIBLE now and was COVERED before 2008 * 2) what's EXPOSED now less what was EXPOSED before 2009 * 2010 * note that (1) is conservative, we start with the whole 2011 * visible region but only keep what used to be covered by 2012 * something -- which mean it may have been exposed. 2013 * 2014 * (2) handles areas that were not covered by anything but got 2015 * exposed because of a resize. 2016 */ 2017 const Region newExposed = visibleRegion - coveredRegion; 2018 const Region oldVisibleRegion = layer->visibleRegion; 2019 const Region oldCoveredRegion = layer->coveredRegion; 2020 const Region oldExposed = oldVisibleRegion - oldCoveredRegion; 2021 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed); 2022 } 2023 dirty.subtractSelf(aboveOpaqueLayers); 2024 2025 // accumulate to the screen dirty region 2026 outDirtyRegion.orSelf(dirty); 2027 2028 // Update aboveOpaqueLayers for next (lower) layer 2029 aboveOpaqueLayers.orSelf(opaqueRegion); 2030 2031 // Store the visible region in screen space 2032 layer->setVisibleRegion(visibleRegion); 2033 layer->setCoveredRegion(coveredRegion); 2034 layer->setVisibleNonTransparentRegion( 2035 visibleRegion.subtract(transparentRegion)); 2036 }); 2037 2038 outOpaqueRegion = aboveOpaqueLayers; 2039} 2040 2041void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack, 2042 const Region& dirty) { 2043 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 2044 const sp<DisplayDevice>& hw(mDisplays[dpy]); 2045 if (hw->getLayerStack() == layerStack) { 2046 hw->dirtyRegion.orSelf(dirty); 2047 } 2048 } 2049} 2050 2051bool SurfaceFlinger::handlePageFlip() 2052{ 2053 nsecs_t latchTime = systemTime(); 2054 Region dirtyRegion; 2055 2056 bool visibleRegions = false; 2057 bool frameQueued = false; 2058 2059 // Store the set of layers that need updates. This set must not change as 2060 // buffers are being latched, as this could result in a deadlock. 2061 // Example: Two producers share the same command stream and: 2062 // 1.) Layer 0 is latched 2063 // 2.) Layer 0 gets a new frame 2064 // 2.) Layer 1 gets a new frame 2065 // 3.) Layer 1 is latched. 2066 // Display is now waiting on Layer 1's frame, which is behind layer 0's 2067 // second frame. But layer 0's second frame could be waiting on display. 2068 Vector<Layer*> layersWithQueuedFrames; 2069 mDrawingState.traverseInZOrder([&](Layer* layer) { 2070 if (layer->hasQueuedFrame()) { 2071 frameQueued = true; 2072 if (layer->shouldPresentNow(mPrimaryDispSync)) { 2073 layersWithQueuedFrames.push_back(layer); 2074 } else { 2075 layer->useEmptyDamage(); 2076 } 2077 } else { 2078 layer->useEmptyDamage(); 2079 } 2080 }); 2081 for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) { 2082 Layer* layer = layersWithQueuedFrames[i]; 2083 const Region dirty(layer->latchBuffer(visibleRegions, latchTime)); 2084 layer->useSurfaceDamage(); 2085 invalidateLayerStack(layer->getLayerStack(), dirty); 2086 } 2087 2088 mVisibleRegionsDirty |= visibleRegions; 2089 2090 // If we will need to wake up at some time in the future to deal with a 2091 // queued frame that shouldn't be displayed during this vsync period, wake 2092 // up during the next vsync period to check again. 2093 if (frameQueued && layersWithQueuedFrames.empty()) { 2094 signalLayerUpdate(); 2095 } 2096 2097 // Only continue with the refresh if there is actually new work to do 2098 return !layersWithQueuedFrames.empty(); 2099} 2100 2101void SurfaceFlinger::invalidateHwcGeometry() 2102{ 2103 mHwWorkListDirty = true; 2104} 2105 2106 2107void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw, 2108 const Region& inDirtyRegion) 2109{ 2110 // We only need to actually compose the display if: 2111 // 1) It is being handled by hardware composer, which may need this to 2112 // keep its virtual display state machine in sync, or 2113 // 2) There is work to be done (the dirty region isn't empty) 2114 bool isHwcDisplay = hw->getHwcDisplayId() >= 0; 2115 if (!isHwcDisplay && inDirtyRegion.isEmpty()) { 2116 return; 2117 } 2118 2119 Region dirtyRegion(inDirtyRegion); 2120 2121 // compute the invalid region 2122 hw->swapRegion.orSelf(dirtyRegion); 2123 2124 uint32_t flags = hw->getFlags(); 2125 if (flags & DisplayDevice::SWAP_RECTANGLE) { 2126 // we can redraw only what's dirty, but since SWAP_RECTANGLE only 2127 // takes a rectangle, we must make sure to update that whole 2128 // rectangle in that case 2129 dirtyRegion.set(hw->swapRegion.bounds()); 2130 } else { 2131 if (flags & DisplayDevice::PARTIAL_UPDATES) { 2132 // We need to redraw the rectangle that will be updated 2133 // (pushed to the framebuffer). 2134 // This is needed because PARTIAL_UPDATES only takes one 2135 // rectangle instead of a region (see DisplayDevice::flip()) 2136 dirtyRegion.set(hw->swapRegion.bounds()); 2137 } else { 2138 // we need to redraw everything (the whole screen) 2139 dirtyRegion.set(hw->bounds()); 2140 hw->swapRegion = dirtyRegion; 2141 } 2142 } 2143 2144 if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) { 2145 if (!doComposeSurfaces(hw, dirtyRegion)) return; 2146 } else { 2147 RenderEngine& engine(getRenderEngine()); 2148 mat4 colorMatrix = mColorMatrix; 2149 if (mDaltonize) { 2150 colorMatrix = colorMatrix * mDaltonizer(); 2151 } 2152 mat4 oldMatrix = engine.setupColorTransform(colorMatrix); 2153 doComposeSurfaces(hw, dirtyRegion); 2154 engine.setupColorTransform(oldMatrix); 2155 } 2156 2157 // update the swap region and clear the dirty region 2158 hw->swapRegion.orSelf(dirtyRegion); 2159 2160 // swap buffers (presentation) 2161 hw->swapBuffers(getHwComposer()); 2162} 2163 2164bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty) 2165{ 2166 RenderEngine& engine(getRenderEngine()); 2167 const int32_t id = hw->getHwcDisplayId(); 2168 HWComposer& hwc(getHwComposer()); 2169 HWComposer::LayerListIterator cur = hwc.begin(id); 2170 const HWComposer::LayerListIterator end = hwc.end(id); 2171 2172 bool hasGlesComposition = hwc.hasGlesComposition(id); 2173 if (hasGlesComposition) { 2174 if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) { 2175 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s", 2176 hw->getDisplayName().string()); 2177 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); 2178 if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) { 2179 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting."); 2180 } 2181 return false; 2182 } 2183 2184 // Never touch the framebuffer if we don't have any framebuffer layers 2185 const bool hasHwcComposition = hwc.hasHwcComposition(id); 2186 if (hasHwcComposition) { 2187 // when using overlays, we assume a fully transparent framebuffer 2188 // NOTE: we could reduce how much we need to clear, for instance 2189 // remove where there are opaque FB layers. however, on some 2190 // GPUs doing a "clean slate" clear might be more efficient. 2191 // We'll revisit later if needed. 2192 engine.clearWithColor(0, 0, 0, 0); 2193 } else { 2194 // we start with the whole screen area 2195 const Region bounds(hw->getBounds()); 2196 2197 // we remove the scissor part 2198 // we're left with the letterbox region 2199 // (common case is that letterbox ends-up being empty) 2200 const Region letterbox(bounds.subtract(hw->getScissor())); 2201 2202 // compute the area to clear 2203 Region region(hw->undefinedRegion.merge(letterbox)); 2204 2205 // but limit it to the dirty region 2206 region.andSelf(dirty); 2207 2208 // screen is already cleared here 2209 if (!region.isEmpty()) { 2210 // can happen with SurfaceView 2211 drawWormhole(hw, region); 2212 } 2213 } 2214 2215 if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) { 2216 // just to be on the safe side, we don't set the 2217 // scissor on the main display. It should never be needed 2218 // anyways (though in theory it could since the API allows it). 2219 const Rect& bounds(hw->getBounds()); 2220 const Rect& scissor(hw->getScissor()); 2221 if (scissor != bounds) { 2222 // scissor doesn't match the screen's dimensions, so we 2223 // need to clear everything outside of it and enable 2224 // the GL scissor so we don't draw anything where we shouldn't 2225 2226 // enable scissor for this frame 2227 const uint32_t height = hw->getHeight(); 2228 engine.setScissor(scissor.left, height - scissor.bottom, 2229 scissor.getWidth(), scissor.getHeight()); 2230 } 2231 } 2232 } 2233 2234 /* 2235 * and then, render the layers targeted at the framebuffer 2236 */ 2237 2238 const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ()); 2239 const size_t count = layers.size(); 2240 const Transform& tr = hw->getTransform(); 2241 if (cur != end) { 2242 // we're using h/w composer 2243 for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) { 2244 const sp<Layer>& layer(layers[i]); 2245 const Region clip(dirty.intersect(tr.transform(layer->visibleRegion))); 2246 if (!clip.isEmpty()) { 2247 switch (cur->getCompositionType()) { 2248 case HWC_CURSOR_OVERLAY: 2249 case HWC_OVERLAY: { 2250 const Layer::State& state(layer->getDrawingState()); 2251 if ((cur->getHints() & HWC_HINT_CLEAR_FB) 2252 && i 2253 && layer->isOpaque(state) && (state.alpha == 0xFF) 2254 && hasGlesComposition) { 2255 // never clear the very first layer since we're 2256 // guaranteed the FB is already cleared 2257 layer->clearWithOpenGL(hw); 2258 } 2259 break; 2260 } 2261 case HWC_FRAMEBUFFER: { 2262 layer->draw(hw, clip); 2263 break; 2264 } 2265 case HWC_FRAMEBUFFER_TARGET: { 2266 // this should not happen as the iterator shouldn't 2267 // let us get there. 2268 ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i); 2269 break; 2270 } 2271 } 2272 } 2273 layer->setAcquireFence(hw, *cur); 2274 } 2275 } else { 2276 // we're not using h/w composer 2277 for (size_t i=0 ; i<count ; ++i) { 2278 const sp<Layer>& layer(layers[i]); 2279 const Region clip(dirty.intersect( 2280 tr.transform(layer->visibleRegion))); 2281 if (!clip.isEmpty()) { 2282 layer->draw(hw, clip); 2283 } 2284 } 2285 } 2286 2287 // disable scissor at the end of the frame 2288 engine.disableScissor(); 2289 return true; 2290} 2291 2292void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const { 2293 const int32_t height = hw->getHeight(); 2294 RenderEngine& engine(getRenderEngine()); 2295 engine.fillRegionWithColor(region, height, 0, 0, 0, 0); 2296} 2297 2298status_t SurfaceFlinger::addClientLayer(const sp<Client>& client, 2299 const sp<IBinder>& handle, 2300 const sp<IGraphicBufferProducer>& gbc, 2301 const sp<Layer>& lbc, 2302 const sp<Layer>& parent) 2303{ 2304 // add this layer to the current state list 2305 { 2306 Mutex::Autolock _l(mStateLock); 2307 if (mNumLayers >= MAX_LAYERS) { 2308 return NO_MEMORY; 2309 } 2310 if (parent == nullptr) { 2311 mCurrentState.layersSortedByZ.add(lbc); 2312 } else { 2313 parent->addChild(lbc); 2314 } 2315 mGraphicBufferProducerList.add(IInterface::asBinder(gbc)); 2316 mLayersAdded = true; 2317 mNumLayers++; 2318 } 2319 2320 // attach this layer to the client 2321 client->attachLayer(handle, lbc); 2322 2323 return NO_ERROR; 2324} 2325 2326status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) { 2327 Mutex::Autolock _l(mStateLock); 2328 2329 const auto& p = layer->getParent(); 2330 const ssize_t index = (p != nullptr) ? p->removeChild(layer) : 2331 mCurrentState.layersSortedByZ.remove(layer); 2332 2333 // As a matter of normal operation, the LayerCleaner will produce a second 2334 // attempt to remove the surface. The Layer will be kept alive in mDrawingState 2335 // so we will succeed in promoting it, but it's already been removed 2336 // from mCurrentState. As long as we can find it in mDrawingState we have no problem 2337 // otherwise something has gone wrong and we are leaking the layer. 2338 if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) { 2339 ALOGE("Failed to find layer (%s) in layer parent (%s).", 2340 layer->getName().string(), 2341 (p != nullptr) ? p->getName().string() : "no-parent"); 2342 return BAD_VALUE; 2343 } else if (index < 0) { 2344 return NO_ERROR; 2345 } 2346 2347 mLayersPendingRemoval.add(layer); 2348 mLayersRemoved = true; 2349 mNumLayers--; 2350 setTransactionFlags(eTransactionNeeded); 2351 return NO_ERROR; 2352} 2353 2354uint32_t SurfaceFlinger::peekTransactionFlags() { 2355 return android_atomic_release_load(&mTransactionFlags); 2356} 2357 2358uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) { 2359 return android_atomic_and(~flags, &mTransactionFlags) & flags; 2360} 2361 2362uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) { 2363 uint32_t old = android_atomic_or(flags, &mTransactionFlags); 2364 if ((old & flags)==0) { // wake the server up 2365 signalTransaction(); 2366 } 2367 return old; 2368} 2369 2370void SurfaceFlinger::setTransactionState( 2371 const Vector<ComposerState>& state, 2372 const Vector<DisplayState>& displays, 2373 uint32_t flags) 2374{ 2375 ATRACE_CALL(); 2376 Mutex::Autolock _l(mStateLock); 2377 uint32_t transactionFlags = 0; 2378 2379 if (flags & eAnimation) { 2380 // For window updates that are part of an animation we must wait for 2381 // previous animation "frames" to be handled. 2382 while (mAnimTransactionPending) { 2383 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5)); 2384 if (CC_UNLIKELY(err != NO_ERROR)) { 2385 // just in case something goes wrong in SF, return to the 2386 // caller after a few seconds. 2387 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out " 2388 "waiting for previous animation frame"); 2389 mAnimTransactionPending = false; 2390 break; 2391 } 2392 } 2393 } 2394 2395 size_t count = displays.size(); 2396 for (size_t i=0 ; i<count ; i++) { 2397 const DisplayState& s(displays[i]); 2398 transactionFlags |= setDisplayStateLocked(s); 2399 } 2400 2401 count = state.size(); 2402 for (size_t i=0 ; i<count ; i++) { 2403 const ComposerState& s(state[i]); 2404 // Here we need to check that the interface we're given is indeed 2405 // one of our own. A malicious client could give us a NULL 2406 // IInterface, or one of its own or even one of our own but a 2407 // different type. All these situations would cause us to crash. 2408 // 2409 // NOTE: it would be better to use RTTI as we could directly check 2410 // that we have a Client*. however, RTTI is disabled in Android. 2411 if (s.client != NULL) { 2412 sp<IBinder> binder = IInterface::asBinder(s.client); 2413 if (binder != NULL) { 2414 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) != NULL) { 2415 sp<Client> client( static_cast<Client *>(s.client.get()) ); 2416 transactionFlags |= setClientStateLocked(client, s.state); 2417 } 2418 } 2419 } 2420 } 2421 2422 // If a synchronous transaction is explicitly requested without any changes, 2423 // force a transaction anyway. This can be used as a flush mechanism for 2424 // previous async transactions. 2425 if (transactionFlags == 0 && (flags & eSynchronous)) { 2426 transactionFlags = eTransactionNeeded; 2427 } 2428 2429 if (transactionFlags) { 2430 if (mInterceptor.isEnabled()) { 2431 mInterceptor.saveTransaction(state, mCurrentState.displays, displays, flags); 2432 } 2433 2434 // this triggers the transaction 2435 setTransactionFlags(transactionFlags); 2436 2437 // if this is a synchronous transaction, wait for it to take effect 2438 // before returning. 2439 if (flags & eSynchronous) { 2440 mTransactionPending = true; 2441 } 2442 if (flags & eAnimation) { 2443 mAnimTransactionPending = true; 2444 } 2445 while (mTransactionPending) { 2446 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5)); 2447 if (CC_UNLIKELY(err != NO_ERROR)) { 2448 // just in case something goes wrong in SF, return to the 2449 // called after a few seconds. 2450 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!"); 2451 mTransactionPending = false; 2452 break; 2453 } 2454 } 2455 } 2456} 2457 2458uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s) 2459{ 2460 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token); 2461 if (dpyIdx < 0) 2462 return 0; 2463 2464 uint32_t flags = 0; 2465 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx)); 2466 if (disp.isValid()) { 2467 const uint32_t what = s.what; 2468 if (what & DisplayState::eSurfaceChanged) { 2469 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) { 2470 disp.surface = s.surface; 2471 flags |= eDisplayTransactionNeeded; 2472 } 2473 } 2474 if (what & DisplayState::eLayerStackChanged) { 2475 if (disp.layerStack != s.layerStack) { 2476 disp.layerStack = s.layerStack; 2477 flags |= eDisplayTransactionNeeded; 2478 } 2479 } 2480 if (what & DisplayState::eDisplayProjectionChanged) { 2481 if (disp.orientation != s.orientation) { 2482 disp.orientation = s.orientation; 2483 flags |= eDisplayTransactionNeeded; 2484 } 2485 if (disp.frame != s.frame) { 2486 disp.frame = s.frame; 2487 flags |= eDisplayTransactionNeeded; 2488 } 2489 if (disp.viewport != s.viewport) { 2490 disp.viewport = s.viewport; 2491 flags |= eDisplayTransactionNeeded; 2492 } 2493 } 2494 if (what & DisplayState::eDisplaySizeChanged) { 2495 if (disp.width != s.width) { 2496 disp.width = s.width; 2497 flags |= eDisplayTransactionNeeded; 2498 } 2499 if (disp.height != s.height) { 2500 disp.height = s.height; 2501 flags |= eDisplayTransactionNeeded; 2502 } 2503 } 2504 } 2505 return flags; 2506} 2507 2508uint32_t SurfaceFlinger::setClientStateLocked( 2509 const sp<Client>& client, 2510 const layer_state_t& s) 2511{ 2512 uint32_t flags = 0; 2513 sp<Layer> layer(client->getLayerUser(s.surface)); 2514 if (layer != 0) { 2515 const uint32_t what = s.what; 2516 bool geometryAppliesWithResize = 2517 what & layer_state_t::eGeometryAppliesWithResize; 2518 if (what & layer_state_t::ePositionChanged) { 2519 if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) { 2520 flags |= eTraversalNeeded; 2521 } 2522 } 2523 if (what & layer_state_t::eLayerChanged) { 2524 // NOTE: index needs to be calculated before we update the state 2525 const auto& p = layer->getParent(); 2526 if (p == nullptr) { 2527 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer); 2528 if (layer->setLayer(s.z) && idx >= 0) { 2529 mCurrentState.layersSortedByZ.removeAt(idx); 2530 mCurrentState.layersSortedByZ.add(layer); 2531 // we need traversal (state changed) 2532 // AND transaction (list changed) 2533 flags |= eTransactionNeeded|eTraversalNeeded; 2534 } 2535 } else { 2536 if (p->setChildLayer(layer, s.z)) { 2537 flags |= eTransactionNeeded|eTraversalNeeded; 2538 } 2539 } 2540 } 2541 if (what & layer_state_t::eSizeChanged) { 2542 if (layer->setSize(s.w, s.h)) { 2543 flags |= eTraversalNeeded; 2544 } 2545 } 2546 if (what & layer_state_t::eAlphaChanged) { 2547 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f))) 2548 flags |= eTraversalNeeded; 2549 } 2550 if (what & layer_state_t::eMatrixChanged) { 2551 if (layer->setMatrix(s.matrix)) 2552 flags |= eTraversalNeeded; 2553 } 2554 if (what & layer_state_t::eTransparentRegionChanged) { 2555 if (layer->setTransparentRegionHint(s.transparentRegion)) 2556 flags |= eTraversalNeeded; 2557 } 2558 if (what & layer_state_t::eFlagsChanged) { 2559 if (layer->setFlags(s.flags, s.mask)) 2560 flags |= eTraversalNeeded; 2561 } 2562 if (what & layer_state_t::eCropChanged) { 2563 if (layer->setCrop(s.crop, !geometryAppliesWithResize)) 2564 flags |= eTraversalNeeded; 2565 } 2566 if (what & layer_state_t::eFinalCropChanged) { 2567 if (layer->setFinalCrop(s.finalCrop)) 2568 flags |= eTraversalNeeded; 2569 } 2570 if (what & layer_state_t::eLayerStackChanged) { 2571 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer); 2572 // We only allow setting layer stacks for top level layers, 2573 // everything else inherits layer stack from its parent. 2574 if (layer->hasParent()) { 2575 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid", 2576 layer->getName().string()); 2577 } else if (idx < 0) { 2578 ALOGE("Attempt to set layer stack on layer without parent (%s) that " 2579 "that also does not appear in the top level layer list. Something" 2580 " has gone wrong.", layer->getName().string()); 2581 } else if (layer->setLayerStack(s.layerStack)) { 2582 mCurrentState.layersSortedByZ.removeAt(idx); 2583 mCurrentState.layersSortedByZ.add(layer); 2584 // we need traversal (state changed) 2585 // AND transaction (list changed) 2586 flags |= eTransactionNeeded|eTraversalNeeded; 2587 } 2588 } 2589 if (what & layer_state_t::eDeferTransaction) { 2590 if (s.barrierHandle != nullptr) { 2591 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber); 2592 } else if (s.barrierGbp != nullptr) { 2593 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp; 2594 if (authenticateSurfaceTextureLocked(gbp)) { 2595 const auto& otherLayer = 2596 (static_cast<MonitoredProducer*>(gbp.get()))->getLayer(); 2597 layer->deferTransactionUntil(otherLayer, s.frameNumber); 2598 } else { 2599 ALOGE("Attempt to defer transaction to to an" 2600 " unrecognized GraphicBufferProducer"); 2601 } 2602 } 2603 // We don't trigger a traversal here because if no other state is 2604 // changed, we don't want this to cause any more work 2605 } 2606 if (what & layer_state_t::eReparentChildren) { 2607 if (layer->reparentChildren(s.reparentHandle)) { 2608 flags |= eTransactionNeeded|eTraversalNeeded; 2609 } 2610 } 2611 if (what & layer_state_t::eDetachChildren) { 2612 layer->detachChildren(); 2613 } 2614 if (what & layer_state_t::eOverrideScalingModeChanged) { 2615 layer->setOverrideScalingMode(s.overrideScalingMode); 2616 // We don't trigger a traversal here because if no other state is 2617 // changed, we don't want this to cause any more work 2618 } 2619 } 2620 return flags; 2621} 2622 2623status_t SurfaceFlinger::createLayer( 2624 const String8& name, 2625 const sp<Client>& client, 2626 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags, 2627 uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle, 2628 sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent) 2629{ 2630 if (int32_t(w|h) < 0) { 2631 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)", 2632 int(w), int(h)); 2633 return BAD_VALUE; 2634 } 2635 2636 status_t result = NO_ERROR; 2637 2638 sp<Layer> layer; 2639 2640 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) { 2641 case ISurfaceComposerClient::eFXSurfaceNormal: 2642 result = createNormalLayer(client, 2643 name, w, h, flags, format, 2644 handle, gbp, &layer); 2645 break; 2646 case ISurfaceComposerClient::eFXSurfaceDim: 2647 result = createDimLayer(client, 2648 name, w, h, flags, 2649 handle, gbp, &layer); 2650 break; 2651 default: 2652 result = BAD_VALUE; 2653 break; 2654 } 2655 2656 if (result != NO_ERROR) { 2657 return result; 2658 } 2659 2660 layer->setInfo(windowType, ownerUid); 2661 2662 result = addClientLayer(client, *handle, *gbp, layer, *parent); 2663 if (result != NO_ERROR) { 2664 return result; 2665 } 2666 mInterceptor.saveSurfaceCreation(layer); 2667 2668 setTransactionFlags(eTransactionNeeded); 2669 return result; 2670} 2671 2672status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client, 2673 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format, 2674 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer) 2675{ 2676 // initialize the surfaces 2677 switch (format) { 2678 case PIXEL_FORMAT_TRANSPARENT: 2679 case PIXEL_FORMAT_TRANSLUCENT: 2680 format = PIXEL_FORMAT_RGBA_8888; 2681 break; 2682 case PIXEL_FORMAT_OPAQUE: 2683 format = PIXEL_FORMAT_RGBX_8888; 2684 break; 2685 } 2686 2687 *outLayer = new Layer(this, client, name, w, h, flags); 2688 status_t err = (*outLayer)->setBuffers(w, h, format, flags); 2689 if (err == NO_ERROR) { 2690 *handle = (*outLayer)->getHandle(); 2691 *gbp = (*outLayer)->getProducer(); 2692 } 2693 2694 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err)); 2695 return err; 2696} 2697 2698status_t SurfaceFlinger::createDimLayer(const sp<Client>& client, 2699 const String8& name, uint32_t w, uint32_t h, uint32_t flags, 2700 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer) 2701{ 2702 *outLayer = new LayerDim(this, client, name, w, h, flags); 2703 *handle = (*outLayer)->getHandle(); 2704 *gbp = (*outLayer)->getProducer(); 2705 return NO_ERROR; 2706} 2707 2708status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle) 2709{ 2710 // called by a client when it wants to remove a Layer 2711 status_t err = NO_ERROR; 2712 sp<Layer> l(client->getLayerUser(handle)); 2713 if (l != NULL) { 2714 mInterceptor.saveSurfaceDeletion(l); 2715 err = removeLayer(l); 2716 ALOGE_IF(err<0 && err != NAME_NOT_FOUND, 2717 "error removing layer=%p (%s)", l.get(), strerror(-err)); 2718 } 2719 return err; 2720} 2721 2722status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer) 2723{ 2724 // called by ~LayerCleaner() when all references to the IBinder (handle) 2725 // are gone 2726 sp<Layer> l = layer.promote(); 2727 if (l == nullptr) { 2728 // The layer has already been removed, carry on 2729 return NO_ERROR; 2730 } if (l->getParent() != nullptr) { 2731 // If we have a parent, then we can continue to live as long as it does. 2732 return NO_ERROR; 2733 } 2734 return removeLayer(l); 2735} 2736 2737// --------------------------------------------------------------------------- 2738 2739void SurfaceFlinger::onInitializeDisplays() { 2740 // reset screen orientation and use primary layer stack 2741 Vector<ComposerState> state; 2742 Vector<DisplayState> displays; 2743 DisplayState d; 2744 d.what = DisplayState::eDisplayProjectionChanged | 2745 DisplayState::eLayerStackChanged; 2746 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY]; 2747 d.layerStack = 0; 2748 d.orientation = DisplayState::eOrientationDefault; 2749 d.frame.makeInvalid(); 2750 d.viewport.makeInvalid(); 2751 d.width = 0; 2752 d.height = 0; 2753 displays.add(d); 2754 setTransactionState(state, displays, 0); 2755 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL); 2756 2757 const nsecs_t period = 2758 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY); 2759 mAnimFrameTracker.setDisplayRefreshPeriod(period); 2760 2761 // Use phase of 0 since phase is not known. 2762 // Use latency of 0, which will snap to the ideal latency. 2763 setCompositorTimingSnapped(0, period, 0); 2764} 2765 2766void SurfaceFlinger::initializeDisplays() { 2767 class MessageScreenInitialized : public MessageBase { 2768 SurfaceFlinger* flinger; 2769 public: 2770 explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { } 2771 virtual bool handler() { 2772 flinger->onInitializeDisplays(); 2773 return true; 2774 } 2775 }; 2776 sp<MessageBase> msg = new MessageScreenInitialized(this); 2777 postMessageAsync(msg); // we may be called from main thread, use async message 2778} 2779 2780void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw, 2781 int mode) { 2782 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(), 2783 this); 2784 int32_t type = hw->getDisplayType(); 2785 int currentMode = hw->getPowerMode(); 2786 2787 if (mode == currentMode) { 2788 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode); 2789 return; 2790 } 2791 2792 hw->setPowerMode(mode); 2793 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) { 2794 ALOGW("Trying to set power mode for virtual display"); 2795 return; 2796 } 2797 2798 if (mInterceptor.isEnabled()) { 2799 Mutex::Autolock _l(mStateLock); 2800 ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken()); 2801 if (idx < 0) { 2802 ALOGW("Surface Interceptor SavePowerMode: invalid display token"); 2803 return; 2804 } 2805 mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode); 2806 } 2807 2808 if (currentMode == HWC_POWER_MODE_OFF) { 2809 // Turn on the display 2810 getHwComposer().setPowerMode(type, mode); 2811 if (type == DisplayDevice::DISPLAY_PRIMARY) { 2812 // FIXME: eventthread only knows about the main display right now 2813 mEventThread->onScreenAcquired(); 2814 resyncToHardwareVsync(true); 2815 } 2816 2817 mVisibleRegionsDirty = true; 2818 mHasPoweredOff = true; 2819 repaintEverything(); 2820 2821 struct sched_param param = {0}; 2822 param.sched_priority = 1; 2823 if (sched_setscheduler(0, SCHED_FIFO, ¶m) != 0) { 2824 ALOGW("Couldn't set SCHED_FIFO on display on"); 2825 } 2826 } else if (mode == HWC_POWER_MODE_OFF) { 2827 // Turn off the display 2828 struct sched_param param = {0}; 2829 if (sched_setscheduler(0, SCHED_OTHER, ¶m) != 0) { 2830 ALOGW("Couldn't set SCHED_OTHER on display off"); 2831 } 2832 2833 if (type == DisplayDevice::DISPLAY_PRIMARY) { 2834 disableHardwareVsync(true); // also cancels any in-progress resync 2835 2836 // FIXME: eventthread only knows about the main display right now 2837 mEventThread->onScreenReleased(); 2838 } 2839 2840 getHwComposer().setPowerMode(type, mode); 2841 mVisibleRegionsDirty = true; 2842 // from this point on, SF will stop drawing on this display 2843 } else { 2844 getHwComposer().setPowerMode(type, mode); 2845 } 2846} 2847 2848void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) { 2849 class MessageSetPowerMode: public MessageBase { 2850 SurfaceFlinger& mFlinger; 2851 sp<IBinder> mDisplay; 2852 int mMode; 2853 public: 2854 MessageSetPowerMode(SurfaceFlinger& flinger, 2855 const sp<IBinder>& disp, int mode) : mFlinger(flinger), 2856 mDisplay(disp) { mMode = mode; } 2857 virtual bool handler() { 2858 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay)); 2859 if (hw == NULL) { 2860 ALOGE("Attempt to set power mode = %d for null display %p", 2861 mMode, mDisplay.get()); 2862 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) { 2863 ALOGW("Attempt to set power mode = %d for virtual display", 2864 mMode); 2865 } else { 2866 mFlinger.setPowerModeInternal(hw, mMode); 2867 } 2868 return true; 2869 } 2870 }; 2871 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode); 2872 postMessageSync(msg); 2873} 2874 2875// --------------------------------------------------------------------------- 2876 2877status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args) 2878{ 2879 String8 result; 2880 2881 IPCThreadState* ipc = IPCThreadState::self(); 2882 const int pid = ipc->getCallingPid(); 2883 const int uid = ipc->getCallingUid(); 2884 if ((uid != AID_SHELL) && 2885 !PermissionCache::checkPermission(sDump, pid, uid)) { 2886 result.appendFormat("Permission Denial: " 2887 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid); 2888 } else { 2889 // Try to get the main lock, but give up after one second 2890 // (this would indicate SF is stuck, but we want to be able to 2891 // print something in dumpsys). 2892 status_t err = mStateLock.timedLock(s2ns(1)); 2893 bool locked = (err == NO_ERROR); 2894 if (!locked) { 2895 result.appendFormat( 2896 "SurfaceFlinger appears to be unresponsive (%s [%d]), " 2897 "dumping anyways (no locks held)\n", strerror(-err), err); 2898 } 2899 2900 bool dumpAll = true; 2901 size_t index = 0; 2902 size_t numArgs = args.size(); 2903 if (numArgs) { 2904 if ((index < numArgs) && 2905 (args[index] == String16("--list"))) { 2906 index++; 2907 listLayersLocked(args, index, result); 2908 dumpAll = false; 2909 } 2910 2911 if ((index < numArgs) && 2912 (args[index] == String16("--latency"))) { 2913 index++; 2914 dumpStatsLocked(args, index, result); 2915 dumpAll = false; 2916 } 2917 2918 if ((index < numArgs) && 2919 (args[index] == String16("--latency-clear"))) { 2920 index++; 2921 clearStatsLocked(args, index, result); 2922 dumpAll = false; 2923 } 2924 2925 if ((index < numArgs) && 2926 (args[index] == String16("--dispsync"))) { 2927 index++; 2928 mPrimaryDispSync.dump(result); 2929 dumpAll = false; 2930 } 2931 2932 if ((index < numArgs) && 2933 (args[index] == String16("--static-screen"))) { 2934 index++; 2935 dumpStaticScreenStats(result); 2936 dumpAll = false; 2937 } 2938 2939 if ((index < numArgs) && 2940 (args[index] == String16("--frame-events"))) { 2941 index++; 2942 dumpFrameEventsLocked(result); 2943 dumpAll = false; 2944 } 2945 } 2946 2947 if (dumpAll) { 2948 dumpAllLocked(args, index, result); 2949 } 2950 2951 if (locked) { 2952 mStateLock.unlock(); 2953 } 2954 } 2955 write(fd, result.string(), result.size()); 2956 return NO_ERROR; 2957} 2958 2959void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */, 2960 size_t& /* index */, String8& result) const 2961{ 2962 mCurrentState.traverseInZOrder([&](Layer* layer) { 2963 result.appendFormat("%s\n", layer->getName().string()); 2964 }); 2965} 2966 2967void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index, 2968 String8& result) const 2969{ 2970 String8 name; 2971 if (index < args.size()) { 2972 name = String8(args[index]); 2973 index++; 2974 } 2975 2976 const nsecs_t period = 2977 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY); 2978 result.appendFormat("%" PRId64 "\n", period); 2979 2980 if (name.isEmpty()) { 2981 mAnimFrameTracker.dumpStats(result); 2982 } else { 2983 mCurrentState.traverseInZOrder([&](Layer* layer) { 2984 if (name == layer->getName()) { 2985 layer->dumpFrameStats(result); 2986 } 2987 }); 2988 } 2989} 2990 2991void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index, 2992 String8& /* result */) 2993{ 2994 String8 name; 2995 if (index < args.size()) { 2996 name = String8(args[index]); 2997 index++; 2998 } 2999 3000 mCurrentState.traverseInZOrder([&](Layer* layer) { 3001 if (name.isEmpty() || (name == layer->getName())) { 3002 layer->clearFrameStats(); 3003 } 3004 }); 3005 3006 mAnimFrameTracker.clearStats(); 3007} 3008 3009// This should only be called from the main thread. Otherwise it would need 3010// the lock and should use mCurrentState rather than mDrawingState. 3011void SurfaceFlinger::logFrameStats() { 3012 mDrawingState.traverseInZOrder([&](Layer* layer) { 3013 layer->logFrameStats(); 3014 }); 3015 3016 mAnimFrameTracker.logAndResetStats(String8("<win-anim>")); 3017} 3018 3019void SurfaceFlinger::appendSfConfigString(String8& result) const 3020{ 3021 result.append(" [sf"); 3022 result.appendFormat(" HAS_CONTEXT_PRIORITY=%d", useContextPriority); 3023 3024 if (isLayerTripleBufferingDisabled()) 3025 result.append(" DISABLE_TRIPLE_BUFFERING"); 3026 3027 result.appendFormat(" PRESENT_TIME_OFFSET=%" PRId64, dispSyncPresentTimeOffset); 3028 result.appendFormat(" FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv); 3029 result.appendFormat(" MAX_VIRT_DISPLAY_DIM=%" PRIu64, maxVirtualDisplaySize); 3030 result.appendFormat(" RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework); 3031 result.appendFormat(" NUM_FRAMEBUFFER_SURFACE_BUFFERS=%" PRId64, 3032 maxFrameBufferAcquiredBuffers); 3033 result.append("]"); 3034} 3035 3036void SurfaceFlinger::dumpStaticScreenStats(String8& result) const 3037{ 3038 result.appendFormat("Static screen stats:\n"); 3039 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) { 3040 float bucketTimeSec = mFrameBuckets[b] / 1e9; 3041 float percent = 100.0f * 3042 static_cast<float>(mFrameBuckets[b]) / mTotalTime; 3043 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n", 3044 b + 1, bucketTimeSec, percent); 3045 } 3046 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9; 3047 float percent = 100.0f * 3048 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime; 3049 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n", 3050 NUM_BUCKETS - 1, bucketTimeSec, percent); 3051} 3052 3053void SurfaceFlinger::dumpFrameEventsLocked(String8& result) { 3054 result.appendFormat("Layer frame timestamps:\n"); 3055 3056 const LayerVector& currentLayers = mCurrentState.layersSortedByZ; 3057 const size_t count = currentLayers.size(); 3058 for (size_t i=0 ; i<count ; i++) { 3059 currentLayers[i]->dumpFrameEvents(result); 3060 } 3061} 3062 3063void SurfaceFlinger::recordBufferingStats(const char* layerName, 3064 std::vector<OccupancyTracker::Segment>&& history) { 3065 Mutex::Autolock lock(mBufferingStatsMutex); 3066 auto& stats = mBufferingStats[layerName]; 3067 for (const auto& segment : history) { 3068 if (!segment.usedThirdBuffer) { 3069 stats.twoBufferTime += segment.totalTime; 3070 } 3071 if (segment.occupancyAverage < 1.0f) { 3072 stats.doubleBufferedTime += segment.totalTime; 3073 } else if (segment.occupancyAverage < 2.0f) { 3074 stats.tripleBufferedTime += segment.totalTime; 3075 } 3076 ++stats.numSegments; 3077 stats.totalTime += segment.totalTime; 3078 } 3079} 3080 3081void SurfaceFlinger::dumpBufferingStats(String8& result) const { 3082 result.append("Buffering stats:\n"); 3083 result.append(" [Layer name] <Active time> <Two buffer> " 3084 "<Double buffered> <Triple buffered>\n"); 3085 Mutex::Autolock lock(mBufferingStatsMutex); 3086 typedef std::tuple<std::string, float, float, float> BufferTuple; 3087 std::map<float, BufferTuple, std::greater<float>> sorted; 3088 for (const auto& statsPair : mBufferingStats) { 3089 const char* name = statsPair.first.c_str(); 3090 const BufferingStats& stats = statsPair.second; 3091 if (stats.numSegments == 0) { 3092 continue; 3093 } 3094 float activeTime = ns2ms(stats.totalTime) / 1000.0f; 3095 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) / 3096 stats.totalTime; 3097 float doubleBufferRatio = static_cast<float>( 3098 stats.doubleBufferedTime) / stats.totalTime; 3099 float tripleBufferRatio = static_cast<float>( 3100 stats.tripleBufferedTime) / stats.totalTime; 3101 sorted.insert({activeTime, {name, twoBufferRatio, 3102 doubleBufferRatio, tripleBufferRatio}}); 3103 } 3104 for (const auto& sortedPair : sorted) { 3105 float activeTime = sortedPair.first; 3106 const BufferTuple& values = sortedPair.second; 3107 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n", 3108 std::get<0>(values).c_str(), activeTime, 3109 std::get<1>(values), std::get<2>(values), 3110 std::get<3>(values)); 3111 } 3112 result.append("\n"); 3113} 3114 3115void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index, 3116 String8& result) const 3117{ 3118 bool colorize = false; 3119 if (index < args.size() 3120 && (args[index] == String16("--color"))) { 3121 colorize = true; 3122 index++; 3123 } 3124 3125 Colorizer colorizer(colorize); 3126 3127 // figure out if we're stuck somewhere 3128 const nsecs_t now = systemTime(); 3129 const nsecs_t inSwapBuffers(mDebugInSwapBuffers); 3130 const nsecs_t inTransaction(mDebugInTransaction); 3131 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0; 3132 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0; 3133 3134 /* 3135 * Dump library configuration. 3136 */ 3137 3138 colorizer.bold(result); 3139 result.append("Build configuration:"); 3140 colorizer.reset(result); 3141 appendSfConfigString(result); 3142 appendUiConfigString(result); 3143 appendGuiConfigString(result); 3144 result.append("\n"); 3145 3146 colorizer.bold(result); 3147 result.append("Sync configuration: "); 3148 colorizer.reset(result); 3149 result.append(SyncFeatures::getInstance().toString()); 3150 result.append("\n"); 3151 3152 colorizer.bold(result); 3153 result.append("DispSync configuration: "); 3154 colorizer.reset(result); 3155 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, " 3156 "present offset %" PRId64 " ns (refresh %" PRId64 " ns)", 3157 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, dispSyncPresentTimeOffset, 3158 mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY)); 3159 result.append("\n"); 3160 3161 // Dump static screen stats 3162 result.append("\n"); 3163 dumpStaticScreenStats(result); 3164 result.append("\n"); 3165 3166 dumpBufferingStats(result); 3167 3168 /* 3169 * Dump the visible layer list 3170 */ 3171 colorizer.bold(result); 3172 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers); 3173 colorizer.reset(result); 3174 mCurrentState.traverseInZOrder([&](Layer* layer) { 3175 layer->dump(result, colorizer); 3176 }); 3177 3178 /* 3179 * Dump Display state 3180 */ 3181 3182 colorizer.bold(result); 3183 result.appendFormat("Displays (%zu entries)\n", mDisplays.size()); 3184 colorizer.reset(result); 3185 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { 3186 const sp<const DisplayDevice>& hw(mDisplays[dpy]); 3187 hw->dump(result); 3188 } 3189 3190 /* 3191 * Dump SurfaceFlinger global state 3192 */ 3193 3194 colorizer.bold(result); 3195 result.append("SurfaceFlinger global state:\n"); 3196 colorizer.reset(result); 3197 3198 HWComposer& hwc(getHwComposer()); 3199 sp<const DisplayDevice> hw(getDefaultDisplayDevice()); 3200 3201 colorizer.bold(result); 3202 result.appendFormat("EGL implementation : %s\n", 3203 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION)); 3204 colorizer.reset(result); 3205 result.appendFormat("%s\n", 3206 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS)); 3207 3208 mRenderEngine->dump(result); 3209 3210 hw->undefinedRegion.dump(result, "undefinedRegion"); 3211 result.appendFormat(" orientation=%d, isDisplayOn=%d\n", 3212 hw->getOrientation(), hw->isDisplayOn()); 3213 result.appendFormat( 3214 " last eglSwapBuffers() time: %f us\n" 3215 " last transaction time : %f us\n" 3216 " transaction-flags : %08x\n" 3217 " refresh-rate : %f fps\n" 3218 " x-dpi : %f\n" 3219 " y-dpi : %f\n" 3220 " gpu_to_cpu_unsupported : %d\n" 3221 , 3222 mLastSwapBufferTime/1000.0, 3223 mLastTransactionTime/1000.0, 3224 mTransactionFlags, 3225 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY), 3226 hwc.getDpiX(HWC_DISPLAY_PRIMARY), 3227 hwc.getDpiY(HWC_DISPLAY_PRIMARY), 3228 !mGpuToCpuSupported); 3229 3230 result.appendFormat(" eglSwapBuffers time: %f us\n", 3231 inSwapBuffersDuration/1000.0); 3232 3233 result.appendFormat(" transaction time: %f us\n", 3234 inTransactionDuration/1000.0); 3235 3236 /* 3237 * VSYNC state 3238 */ 3239 mEventThread->dump(result); 3240 3241 /* 3242 * Dump HWComposer state 3243 */ 3244 colorizer.bold(result); 3245 result.append("h/w composer state:\n"); 3246 colorizer.reset(result); 3247 result.appendFormat(" h/w composer %s and %s\n", 3248 hwc.initCheck()==NO_ERROR ? "present" : "not present", 3249 (mDebugDisableHWC || mDebugRegion || mDaltonize 3250 || mHasColorMatrix) ? "disabled" : "enabled"); 3251 hwc.dump(result); 3252 3253 /* 3254 * Dump gralloc state 3255 */ 3256 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get()); 3257 alloc.dump(result); 3258} 3259 3260const Vector< sp<Layer> >& 3261SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) { 3262 // Note: mStateLock is held here 3263 wp<IBinder> dpy; 3264 for (size_t i=0 ; i<mDisplays.size() ; i++) { 3265 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) { 3266 dpy = mDisplays.keyAt(i); 3267 break; 3268 } 3269 } 3270 if (dpy == NULL) { 3271 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id); 3272 // Just use the primary display so we have something to return 3273 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY); 3274 } 3275 return getDisplayDevice(dpy)->getVisibleLayersSortedByZ(); 3276} 3277 3278bool SurfaceFlinger::startDdmConnection() 3279{ 3280 void* libddmconnection_dso = 3281 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW); 3282 if (!libddmconnection_dso) { 3283 return false; 3284 } 3285 void (*DdmConnection_start)(const char* name); 3286 DdmConnection_start = 3287 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start"); 3288 if (!DdmConnection_start) { 3289 dlclose(libddmconnection_dso); 3290 return false; 3291 } 3292 (*DdmConnection_start)(getServiceName()); 3293 return true; 3294} 3295 3296status_t SurfaceFlinger::onTransact( 3297 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 3298{ 3299 switch (code) { 3300 case CREATE_CONNECTION: 3301 case CREATE_DISPLAY: 3302 case BOOT_FINISHED: 3303 case CLEAR_ANIMATION_FRAME_STATS: 3304 case GET_ANIMATION_FRAME_STATS: 3305 case SET_POWER_MODE: 3306 case GET_HDR_CAPABILITIES: 3307 { 3308 // codes that require permission check 3309 IPCThreadState* ipc = IPCThreadState::self(); 3310 const int pid = ipc->getCallingPid(); 3311 const int uid = ipc->getCallingUid(); 3312 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) && 3313 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) { 3314 ALOGE("Permission Denial: " 3315 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid); 3316 return PERMISSION_DENIED; 3317 } 3318 break; 3319 } 3320 /* 3321 * Calling setTransactionState is safe, because you need to have been 3322 * granted a reference to Client* and Handle* to do anything with it. 3323 * 3324 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h 3325 */ 3326 case SET_TRANSACTION_STATE: 3327 case CREATE_SCOPED_CONNECTION: 3328 { 3329 break; 3330 } 3331 case CAPTURE_SCREEN: 3332 { 3333 // codes that require permission check 3334 IPCThreadState* ipc = IPCThreadState::self(); 3335 const int pid = ipc->getCallingPid(); 3336 const int uid = ipc->getCallingUid(); 3337 if ((uid != AID_GRAPHICS) && 3338 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) { 3339 ALOGE("Permission Denial: " 3340 "can't read framebuffer pid=%d, uid=%d", pid, uid); 3341 return PERMISSION_DENIED; 3342 } 3343 break; 3344 } 3345 } 3346 3347 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags); 3348 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) { 3349 CHECK_INTERFACE(ISurfaceComposer, data, reply); 3350 if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) { 3351 IPCThreadState* ipc = IPCThreadState::self(); 3352 const int pid = ipc->getCallingPid(); 3353 const int uid = ipc->getCallingUid(); 3354 ALOGE("Permission Denial: " 3355 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid); 3356 return PERMISSION_DENIED; 3357 } 3358 int n; 3359 switch (code) { 3360 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE 3361 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE 3362 return NO_ERROR; 3363 case 1002: // SHOW_UPDATES 3364 n = data.readInt32(); 3365 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1); 3366 invalidateHwcGeometry(); 3367 repaintEverything(); 3368 return NO_ERROR; 3369 case 1004:{ // repaint everything 3370 repaintEverything(); 3371 return NO_ERROR; 3372 } 3373 case 1005:{ // force transaction 3374 setTransactionFlags( 3375 eTransactionNeeded| 3376 eDisplayTransactionNeeded| 3377 eTraversalNeeded); 3378 return NO_ERROR; 3379 } 3380 case 1006:{ // send empty update 3381 signalRefresh(); 3382 return NO_ERROR; 3383 } 3384 case 1008: // toggle use of hw composer 3385 n = data.readInt32(); 3386 mDebugDisableHWC = n ? 1 : 0; 3387 invalidateHwcGeometry(); 3388 repaintEverything(); 3389 return NO_ERROR; 3390 case 1009: // toggle use of transform hint 3391 n = data.readInt32(); 3392 mDebugDisableTransformHint = n ? 1 : 0; 3393 invalidateHwcGeometry(); 3394 repaintEverything(); 3395 return NO_ERROR; 3396 case 1010: // interrogate. 3397 reply->writeInt32(0); 3398 reply->writeInt32(0); 3399 reply->writeInt32(mDebugRegion); 3400 reply->writeInt32(0); 3401 reply->writeInt32(mDebugDisableHWC); 3402 return NO_ERROR; 3403 case 1013: { 3404 Mutex::Autolock _l(mStateLock); 3405 sp<const DisplayDevice> hw(getDefaultDisplayDevice()); 3406 reply->writeInt32(hw->getPageFlipCount()); 3407 return NO_ERROR; 3408 } 3409 case 1014: { 3410 // daltonize 3411 n = data.readInt32(); 3412 switch (n % 10) { 3413 case 1: 3414 mDaltonizer.setType(ColorBlindnessType::Protanomaly); 3415 break; 3416 case 2: 3417 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly); 3418 break; 3419 case 3: 3420 mDaltonizer.setType(ColorBlindnessType::Tritanomaly); 3421 break; 3422 } 3423 if (n >= 10) { 3424 mDaltonizer.setMode(ColorBlindnessMode::Correction); 3425 } else { 3426 mDaltonizer.setMode(ColorBlindnessMode::Simulation); 3427 } 3428 mDaltonize = n > 0; 3429 invalidateHwcGeometry(); 3430 repaintEverything(); 3431 return NO_ERROR; 3432 } 3433 case 1015: { 3434 // apply a color matrix 3435 n = data.readInt32(); 3436 mHasColorMatrix = n ? 1 : 0; 3437 if (n) { 3438 // color matrix is sent as mat3 matrix followed by vec3 3439 // offset, then packed into a mat4 where the last row is 3440 // the offset and extra values are 0 3441 for (size_t i = 0 ; i < 4; i++) { 3442 for (size_t j = 0; j < 4; j++) { 3443 mColorMatrix[i][j] = data.readFloat(); 3444 } 3445 } 3446 } else { 3447 mColorMatrix = mat4(); 3448 } 3449 invalidateHwcGeometry(); 3450 repaintEverything(); 3451 return NO_ERROR; 3452 } 3453 // This is an experimental interface 3454 // Needs to be shifted to proper binder interface when we productize 3455 case 1016: { 3456 n = data.readInt32(); 3457 mPrimaryDispSync.setRefreshSkipCount(n); 3458 return NO_ERROR; 3459 } 3460 case 1017: { 3461 n = data.readInt32(); 3462 mForceFullDamage = static_cast<bool>(n); 3463 return NO_ERROR; 3464 } 3465 case 1018: { // Modify Choreographer's phase offset 3466 n = data.readInt32(); 3467 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n)); 3468 return NO_ERROR; 3469 } 3470 case 1019: { // Modify SurfaceFlinger's phase offset 3471 n = data.readInt32(); 3472 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n)); 3473 return NO_ERROR; 3474 } 3475 case 1020: { // Layer updates interceptor 3476 n = data.readInt32(); 3477 if (n) { 3478 ALOGV("Interceptor enabled"); 3479 mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays); 3480 } 3481 else{ 3482 ALOGV("Interceptor disabled"); 3483 mInterceptor.disable(); 3484 } 3485 return NO_ERROR; 3486 } 3487 case 1021: { // Disable HWC virtual displays 3488 n = data.readInt32(); 3489 mUseHwcVirtualDisplays = !n; 3490 return NO_ERROR; 3491 } 3492 } 3493 } 3494 return err; 3495} 3496 3497void SurfaceFlinger::repaintEverything() { 3498 android_atomic_or(1, &mRepaintEverything); 3499 signalTransaction(); 3500} 3501 3502// --------------------------------------------------------------------------- 3503// Capture screen into an IGraphiBufferProducer 3504// --------------------------------------------------------------------------- 3505 3506/* The code below is here to handle b/8734824 3507 * 3508 * We create a IGraphicBufferProducer wrapper that forwards all calls 3509 * from the surfaceflinger thread to the calling binder thread, where they 3510 * are executed. This allows the calling thread in the calling process to be 3511 * reused and not depend on having "enough" binder threads to handle the 3512 * requests. 3513 */ 3514class GraphicProducerWrapper : public BBinder, public MessageHandler { 3515 /* Parts of GraphicProducerWrapper are run on two different threads, 3516 * communicating by sending messages via Looper but also by shared member 3517 * data. Coherence maintenance is subtle and in places implicit (ugh). 3518 * 3519 * Don't rely on Looper's sendMessage/handleMessage providing 3520 * release/acquire semantics for any data not actually in the Message. 3521 * Data going from surfaceflinger to binder threads needs to be 3522 * synchronized explicitly. 3523 * 3524 * Barrier open/wait do provide release/acquire semantics. This provides 3525 * implicit synchronization for data coming back from binder to 3526 * surfaceflinger threads. 3527 */ 3528 3529 sp<IGraphicBufferProducer> impl; 3530 sp<Looper> looper; 3531 status_t result; 3532 bool exitPending; 3533 bool exitRequested; 3534 Barrier barrier; 3535 uint32_t code; 3536 Parcel const* data; 3537 Parcel* reply; 3538 3539 enum { 3540 MSG_API_CALL, 3541 MSG_EXIT 3542 }; 3543 3544 /* 3545 * Called on surfaceflinger thread. This is called by our "fake" 3546 * BpGraphicBufferProducer. We package the data and reply Parcel and 3547 * forward them to the binder thread. 3548 */ 3549 virtual status_t transact(uint32_t code, 3550 const Parcel& data, Parcel* reply, uint32_t /* flags */) { 3551 this->code = code; 3552 this->data = &data; 3553 this->reply = reply; 3554 if (exitPending) { 3555 // if we've exited, we run the message synchronously right here. 3556 // note (JH): as far as I can tell from looking at the code, this 3557 // never actually happens. if it does, i'm not sure if it happens 3558 // on the surfaceflinger or binder thread. 3559 handleMessage(Message(MSG_API_CALL)); 3560 } else { 3561 barrier.close(); 3562 // Prevent stores to this->{code, data, reply} from being 3563 // reordered later than the construction of Message. 3564 atomic_thread_fence(memory_order_release); 3565 looper->sendMessage(this, Message(MSG_API_CALL)); 3566 barrier.wait(); 3567 } 3568 return result; 3569 } 3570 3571 /* 3572 * here we run on the binder thread. All we've got to do is 3573 * call the real BpGraphicBufferProducer. 3574 */ 3575 virtual void handleMessage(const Message& message) { 3576 int what = message.what; 3577 // Prevent reads below from happening before the read from Message 3578 atomic_thread_fence(memory_order_acquire); 3579 if (what == MSG_API_CALL) { 3580 result = IInterface::asBinder(impl)->transact(code, data[0], reply); 3581 barrier.open(); 3582 } else if (what == MSG_EXIT) { 3583 exitRequested = true; 3584 } 3585 } 3586 3587public: 3588 explicit GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl) 3589 : impl(impl), 3590 looper(new Looper(true)), 3591 result(NO_ERROR), 3592 exitPending(false), 3593 exitRequested(false), 3594 code(0), 3595 data(NULL), 3596 reply(NULL) 3597 {} 3598 3599 // Binder thread 3600 status_t waitForResponse() { 3601 do { 3602 looper->pollOnce(-1); 3603 } while (!exitRequested); 3604 return result; 3605 } 3606 3607 // Client thread 3608 void exit(status_t result) { 3609 this->result = result; 3610 exitPending = true; 3611 // Ensure this->result is visible to the binder thread before it 3612 // handles the message. 3613 atomic_thread_fence(memory_order_release); 3614 looper->sendMessage(this, Message(MSG_EXIT)); 3615 } 3616}; 3617 3618 3619status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display, 3620 const sp<IGraphicBufferProducer>& producer, 3621 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 3622 int32_t minLayerZ, int32_t maxLayerZ, 3623 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) { 3624 3625 if (CC_UNLIKELY(display == 0)) 3626 return BAD_VALUE; 3627 3628 if (CC_UNLIKELY(producer == 0)) 3629 return BAD_VALUE; 3630 3631 // if we have secure windows on this display, never allow the screen capture 3632 // unless the producer interface is local (i.e.: we can take a screenshot for 3633 // ourselves). 3634 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder(); 3635 3636 // Convert to surfaceflinger's internal rotation type. 3637 Transform::orientation_flags rotationFlags; 3638 switch (rotation) { 3639 case ISurfaceComposer::eRotateNone: 3640 rotationFlags = Transform::ROT_0; 3641 break; 3642 case ISurfaceComposer::eRotate90: 3643 rotationFlags = Transform::ROT_90; 3644 break; 3645 case ISurfaceComposer::eRotate180: 3646 rotationFlags = Transform::ROT_180; 3647 break; 3648 case ISurfaceComposer::eRotate270: 3649 rotationFlags = Transform::ROT_270; 3650 break; 3651 default: 3652 rotationFlags = Transform::ROT_0; 3653 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation); 3654 break; 3655 } 3656 3657 class MessageCaptureScreen : public MessageBase { 3658 SurfaceFlinger* flinger; 3659 sp<IBinder> display; 3660 sp<IGraphicBufferProducer> producer; 3661 Rect sourceCrop; 3662 uint32_t reqWidth, reqHeight; 3663 int32_t minLayerZ,maxLayerZ; 3664 bool useIdentityTransform; 3665 Transform::orientation_flags rotation; 3666 status_t result; 3667 bool isLocalScreenshot; 3668 public: 3669 MessageCaptureScreen(SurfaceFlinger* flinger, 3670 const sp<IBinder>& display, 3671 const sp<IGraphicBufferProducer>& producer, 3672 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 3673 int32_t minLayerZ, int32_t maxLayerZ, 3674 bool useIdentityTransform, 3675 Transform::orientation_flags rotation, 3676 bool isLocalScreenshot) 3677 : flinger(flinger), display(display), producer(producer), 3678 sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight), 3679 minLayerZ(minLayerZ), maxLayerZ(maxLayerZ), 3680 useIdentityTransform(useIdentityTransform), 3681 rotation(rotation), result(PERMISSION_DENIED), 3682 isLocalScreenshot(isLocalScreenshot) 3683 { 3684 } 3685 status_t getResult() const { 3686 return result; 3687 } 3688 virtual bool handler() { 3689 Mutex::Autolock _l(flinger->mStateLock); 3690 sp<const DisplayDevice> hw(flinger->getDisplayDevice(display)); 3691 result = flinger->captureScreenImplLocked(hw, producer, 3692 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, 3693 useIdentityTransform, rotation, isLocalScreenshot); 3694 static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result); 3695 return true; 3696 } 3697 }; 3698 3699 // this creates a "fake" BBinder which will serve as a "fake" remote 3700 // binder to receive the marshaled calls and forward them to the 3701 // real remote (a BpGraphicBufferProducer) 3702 sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer); 3703 3704 // the asInterface() call below creates our "fake" BpGraphicBufferProducer 3705 // which does the marshaling work forwards to our "fake remote" above. 3706 sp<MessageBase> msg = new MessageCaptureScreen(this, 3707 display, IGraphicBufferProducer::asInterface( wrapper ), 3708 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, 3709 useIdentityTransform, rotationFlags, isLocalScreenshot); 3710 3711 status_t res = postMessageAsync(msg); 3712 if (res == NO_ERROR) { 3713 res = wrapper->waitForResponse(); 3714 } 3715 return res; 3716} 3717 3718 3719void SurfaceFlinger::renderScreenImplLocked( 3720 const sp<const DisplayDevice>& hw, 3721 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 3722 int32_t minLayerZ, int32_t maxLayerZ, 3723 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation) 3724{ 3725 ATRACE_CALL(); 3726 RenderEngine& engine(getRenderEngine()); 3727 3728 // get screen geometry 3729 const int32_t hw_w = hw->getWidth(); 3730 const int32_t hw_h = hw->getHeight(); 3731 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w || 3732 static_cast<int32_t>(reqHeight) != hw_h; 3733 3734 // if a default or invalid sourceCrop is passed in, set reasonable values 3735 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 || 3736 !sourceCrop.isValid()) { 3737 sourceCrop.setLeftTop(Point(0, 0)); 3738 sourceCrop.setRightBottom(Point(hw_w, hw_h)); 3739 } 3740 3741 // ensure that sourceCrop is inside screen 3742 if (sourceCrop.left < 0) { 3743 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left); 3744 } 3745 if (sourceCrop.right > hw_w) { 3746 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w); 3747 } 3748 if (sourceCrop.top < 0) { 3749 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top); 3750 } 3751 if (sourceCrop.bottom > hw_h) { 3752 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h); 3753 } 3754 3755 // make sure to clear all GL error flags 3756 engine.checkErrors(); 3757 3758 // set-up our viewport 3759 engine.setViewportAndProjection( 3760 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation); 3761 engine.disableTexturing(); 3762 3763 // redraw the screen entirely... 3764 engine.clearWithColor(0, 0, 0, 1); 3765 3766 // We loop through the first level of layers without traversing, 3767 // as we need to interpret min/max layer Z in the top level Z space. 3768 for (const auto& layer : mDrawingState.layersSortedByZ) { 3769 if (layer->getLayerStack() != hw->getLayerStack()) { 3770 continue; 3771 } 3772 const Layer::State& state(layer->getDrawingState()); 3773 if (state.z < minLayerZ || state.z > maxLayerZ) { 3774 continue; 3775 } 3776 layer->traverseInZOrder([&](Layer* layer) { 3777 if (!layer->isVisible()) { 3778 return; 3779 } 3780 if (filtering) layer->setFiltering(true); 3781 layer->draw(hw, useIdentityTransform); 3782 if (filtering) layer->setFiltering(false); 3783 }); 3784 } 3785 3786 // compositionComplete is needed for older driver 3787 hw->compositionComplete(); 3788 hw->setViewportAndProjection(); 3789} 3790 3791 3792status_t SurfaceFlinger::captureScreenImplLocked( 3793 const sp<const DisplayDevice>& hw, 3794 const sp<IGraphicBufferProducer>& producer, 3795 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 3796 int32_t minLayerZ, int32_t maxLayerZ, 3797 bool useIdentityTransform, Transform::orientation_flags rotation, 3798 bool isLocalScreenshot) 3799{ 3800 ATRACE_CALL(); 3801 3802 // get screen geometry 3803 uint32_t hw_w = hw->getWidth(); 3804 uint32_t hw_h = hw->getHeight(); 3805 3806 if (rotation & Transform::ROT_90) { 3807 std::swap(hw_w, hw_h); 3808 } 3809 3810 if ((reqWidth > hw_w) || (reqHeight > hw_h)) { 3811 ALOGE("size mismatch (%d, %d) > (%d, %d)", 3812 reqWidth, reqHeight, hw_w, hw_h); 3813 return BAD_VALUE; 3814 } 3815 3816 reqWidth = (!reqWidth) ? hw_w : reqWidth; 3817 reqHeight = (!reqHeight) ? hw_h : reqHeight; 3818 3819 bool secureLayerIsVisible = false; 3820 for (const auto& layer : mDrawingState.layersSortedByZ) { 3821 const Layer::State& state(layer->getDrawingState()); 3822 if ((layer->getLayerStack() != hw->getLayerStack()) || 3823 (state.z < minLayerZ || state.z > maxLayerZ)) { 3824 continue; 3825 } 3826 layer->traverseInZOrder([&](Layer *layer) { 3827 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() && 3828 layer->isSecure()); 3829 }); 3830 } 3831 3832 if (!isLocalScreenshot && secureLayerIsVisible) { 3833 ALOGW("FB is protected: PERMISSION_DENIED"); 3834 return PERMISSION_DENIED; 3835 } 3836 3837 // create a surface (because we're a producer, and we need to 3838 // dequeue/queue a buffer) 3839 sp<Surface> sur = new Surface(producer, false); 3840 ANativeWindow* window = sur.get(); 3841 3842 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL); 3843 if (result == NO_ERROR) { 3844 uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN | 3845 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE; 3846 3847 int err = 0; 3848 err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight); 3849 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); 3850 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888); 3851 err |= native_window_set_usage(window, usage); 3852 3853 if (err == NO_ERROR) { 3854 ANativeWindowBuffer* buffer; 3855 /* TODO: Once we have the sync framework everywhere this can use 3856 * server-side waits on the fence that dequeueBuffer returns. 3857 */ 3858 result = native_window_dequeue_buffer_and_wait(window, &buffer); 3859 if (result == NO_ERROR) { 3860 int syncFd = -1; 3861 // create an EGLImage from the buffer so we can later 3862 // turn it into a texture 3863 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT, 3864 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL); 3865 if (image != EGL_NO_IMAGE_KHR) { 3866 // this binds the given EGLImage as a framebuffer for the 3867 // duration of this scope. 3868 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image); 3869 if (imageBond.getStatus() == NO_ERROR) { 3870 // this will in fact render into our dequeued buffer 3871 // via an FBO, which means we didn't have to create 3872 // an EGLSurface and therefore we're not 3873 // dependent on the context's EGLConfig. 3874 renderScreenImplLocked( 3875 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true, 3876 useIdentityTransform, rotation); 3877 3878 // Attempt to create a sync khr object that can produce a sync point. If that 3879 // isn't available, create a non-dupable sync object in the fallback path and 3880 // wait on it directly. 3881 EGLSyncKHR sync; 3882 if (!DEBUG_SCREENSHOTS) { 3883 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL); 3884 // native fence fd will not be populated until flush() is done. 3885 getRenderEngine().flush(); 3886 } else { 3887 sync = EGL_NO_SYNC_KHR; 3888 } 3889 if (sync != EGL_NO_SYNC_KHR) { 3890 // get the sync fd 3891 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync); 3892 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) { 3893 ALOGW("captureScreen: failed to dup sync khr object"); 3894 syncFd = -1; 3895 } 3896 eglDestroySyncKHR(mEGLDisplay, sync); 3897 } else { 3898 // fallback path 3899 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL); 3900 if (sync != EGL_NO_SYNC_KHR) { 3901 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync, 3902 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/); 3903 EGLint eglErr = eglGetError(); 3904 if (result == EGL_TIMEOUT_EXPIRED_KHR) { 3905 ALOGW("captureScreen: fence wait timed out"); 3906 } else { 3907 ALOGW_IF(eglErr != EGL_SUCCESS, 3908 "captureScreen: error waiting on EGL fence: %#x", eglErr); 3909 } 3910 eglDestroySyncKHR(mEGLDisplay, sync); 3911 } else { 3912 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError()); 3913 } 3914 } 3915 if (DEBUG_SCREENSHOTS) { 3916 uint32_t* pixels = new uint32_t[reqWidth*reqHeight]; 3917 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels); 3918 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels, 3919 hw, minLayerZ, maxLayerZ); 3920 delete [] pixels; 3921 } 3922 3923 } else { 3924 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot"); 3925 result = INVALID_OPERATION; 3926 window->cancelBuffer(window, buffer, syncFd); 3927 buffer = NULL; 3928 } 3929 // destroy our image 3930 eglDestroyImageKHR(mEGLDisplay, image); 3931 } else { 3932 result = BAD_VALUE; 3933 } 3934 if (buffer) { 3935 // queueBuffer takes ownership of syncFd 3936 result = window->queueBuffer(window, buffer, syncFd); 3937 } 3938 } 3939 } else { 3940 result = BAD_VALUE; 3941 } 3942 native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL); 3943 } 3944 3945 return result; 3946} 3947 3948void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr, 3949 const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) { 3950 if (DEBUG_SCREENSHOTS) { 3951 for (size_t y=0 ; y<h ; y++) { 3952 uint32_t const * p = (uint32_t const *)vaddr + y*s; 3953 for (size_t x=0 ; x<w ; x++) { 3954 if (p[x] != 0xFF000000) return; 3955 } 3956 } 3957 ALOGE("*** we just took a black screenshot ***\n" 3958 "requested minz=%d, maxz=%d, layerStack=%d", 3959 minLayerZ, maxLayerZ, hw->getLayerStack()); 3960 size_t i = 0; 3961 for (const auto& layer : mDrawingState.layersSortedByZ) { 3962 const Layer::State& state(layer->getDrawingState()); 3963 if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ && 3964 state.z <= maxLayerZ) { 3965 layer->traverseInZOrder([&](Layer* layer) { 3966 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x", 3967 layer->isVisible() ? '+' : '-', 3968 i, layer->getName().string(), layer->getLayerStack(), state.z, 3969 layer->isVisible(), state.flags, state.alpha); 3970 i++; 3971 }); 3972 } 3973 } 3974 } 3975} 3976 3977// --------------------------------------------------------------------------- 3978 3979void SurfaceFlinger::State::traverseInZOrder(const std::function<void(Layer*)>& consume) const { 3980 layersSortedByZ.traverseInZOrder(consume); 3981} 3982 3983void SurfaceFlinger::State::traverseInReverseZOrder(const std::function<void(Layer*)>& consume) const { 3984 layersSortedByZ.traverseInReverseZOrder(consume); 3985} 3986 3987}; // namespace android 3988 3989 3990#if defined(__gl_h_) 3991#error "don't include gl/gl.h in this file" 3992#endif 3993 3994#if defined(__gl2_h_) 3995#error "don't include gl2/gl2.h in this file" 3996#endif 3997