Layer.cpp revision f810b29ebc8564f94ff7fb14f2d13a0f4d111703
1/* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17//#define LOG_NDEBUG 0 18#undef LOG_TAG 19#define LOG_TAG "Layer" 20#define ATRACE_TAG ATRACE_TAG_GRAPHICS 21 22#include <stdlib.h> 23#include <stdint.h> 24#include <sys/types.h> 25#include <math.h> 26 27#include <cutils/compiler.h> 28#include <cutils/native_handle.h> 29#include <cutils/properties.h> 30 31#include <utils/Errors.h> 32#include <utils/Log.h> 33#include <utils/NativeHandle.h> 34#include <utils/StopWatch.h> 35#include <utils/Trace.h> 36 37#include <ui/GraphicBuffer.h> 38#include <ui/PixelFormat.h> 39 40#include <gui/BufferItem.h> 41#include <gui/Surface.h> 42 43#include "clz.h" 44#include "Colorizer.h" 45#include "DisplayDevice.h" 46#include "Layer.h" 47#include "LayerRejecter.h" 48#include "MonitoredProducer.h" 49#include "SurfaceFlinger.h" 50 51#include "DisplayHardware/HWComposer.h" 52 53#include "RenderEngine/RenderEngine.h" 54 55#include <mutex> 56 57#define DEBUG_RESIZE 0 58 59namespace android { 60 61// --------------------------------------------------------------------------- 62 63int32_t Layer::sSequence = 1; 64 65Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, 66 const String8& name, uint32_t w, uint32_t h, uint32_t flags) 67 : contentDirty(false), 68 sequence(uint32_t(android_atomic_inc(&sSequence))), 69 mFlinger(flinger), 70 mTextureName(-1U), 71 mPremultipliedAlpha(true), 72 mName("unnamed"), 73 mFormat(PIXEL_FORMAT_NONE), 74 mTransactionFlags(0), 75 mPendingStateMutex(), 76 mPendingStates(), 77 mQueuedFrames(0), 78 mSidebandStreamChanged(false), 79 mCurrentTransform(0), 80 mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), 81 mOverrideScalingMode(-1), 82 mCurrentOpacity(true), 83 mBufferLatched(false), 84 mCurrentFrameNumber(0), 85 mPreviousFrameNumber(0), 86 mRefreshPending(false), 87 mFrameLatencyNeeded(false), 88 mFiltering(false), 89 mNeedsFiltering(false), 90 mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2), 91#ifndef USE_HWC2 92 mIsGlesComposition(false), 93#endif 94 mProtectedByApp(false), 95 mHasSurface(false), 96 mClientRef(client), 97 mPotentialCursor(false), 98 mQueueItemLock(), 99 mQueueItemCondition(), 100 mQueueItems(), 101 mLastFrameNumberReceived(0), 102 mUpdateTexImageFailed(false), 103 mAutoRefresh(false), 104 mFreezePositionUpdates(false) 105{ 106#ifdef USE_HWC2 107 ALOGV("Creating Layer %s", name.string()); 108#endif 109 110 mCurrentCrop.makeInvalid(); 111 mFlinger->getRenderEngine().genTextures(1, &mTextureName); 112 mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName); 113 114 uint32_t layerFlags = 0; 115 if (flags & ISurfaceComposerClient::eHidden) 116 layerFlags |= layer_state_t::eLayerHidden; 117 if (flags & ISurfaceComposerClient::eOpaque) 118 layerFlags |= layer_state_t::eLayerOpaque; 119 if (flags & ISurfaceComposerClient::eSecure) 120 layerFlags |= layer_state_t::eLayerSecure; 121 122 if (flags & ISurfaceComposerClient::eNonPremultiplied) 123 mPremultipliedAlpha = false; 124 125 mName = name; 126 127 mCurrentState.active.w = w; 128 mCurrentState.active.h = h; 129 mCurrentState.active.transform.set(0, 0); 130 mCurrentState.crop.makeInvalid(); 131 mCurrentState.finalCrop.makeInvalid(); 132 mCurrentState.z = 0; 133#ifdef USE_HWC2 134 mCurrentState.alpha = 1.0f; 135#else 136 mCurrentState.alpha = 0xFF; 137#endif 138 mCurrentState.layerStack = 0; 139 mCurrentState.flags = layerFlags; 140 mCurrentState.sequence = 0; 141 mCurrentState.requested = mCurrentState.active; 142 mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN; 143 mCurrentState.appId = 0; 144 mCurrentState.type = 0; 145 146 // drawing state & current state are identical 147 mDrawingState = mCurrentState; 148 149#ifdef USE_HWC2 150 const auto& hwc = flinger->getHwComposer(); 151 const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY); 152 nsecs_t displayPeriod = activeConfig->getVsyncPeriod(); 153#else 154 nsecs_t displayPeriod = 155 flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY); 156#endif 157 mFrameTracker.setDisplayRefreshPeriod(displayPeriod); 158 159 CompositorTiming compositorTiming; 160 flinger->getCompositorTiming(&compositorTiming); 161 mFrameEventHistory.initializeCompositorTiming(compositorTiming); 162} 163 164void Layer::onFirstRef() { 165 // Creates a custom BufferQueue for SurfaceFlingerConsumer to use 166 sp<IGraphicBufferProducer> producer; 167 sp<IGraphicBufferConsumer> consumer; 168 BufferQueue::createBufferQueue(&producer, &consumer, nullptr, true); 169 mProducer = new MonitoredProducer(producer, mFlinger, this); 170 mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName, this); 171 mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); 172 mSurfaceFlingerConsumer->setContentsChangedListener(this); 173 mSurfaceFlingerConsumer->setName(mName); 174 175 if (mFlinger->isLayerTripleBufferingDisabled()) { 176 mProducer->setMaxDequeuedBufferCount(2); 177 } 178 179 const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice()); 180 updateTransformHint(hw); 181} 182 183Layer::~Layer() { 184 sp<Client> c(mClientRef.promote()); 185 if (c != 0) { 186 c->detachLayer(this); 187 } 188 189 for (auto& point : mRemoteSyncPoints) { 190 point->setTransactionApplied(); 191 } 192 for (auto& point : mLocalSyncPoints) { 193 point->setFrameAvailable(); 194 } 195 mFlinger->deleteTextureAsync(mTextureName); 196 mFrameTracker.logAndResetStats(mName); 197} 198 199// --------------------------------------------------------------------------- 200// callbacks 201// --------------------------------------------------------------------------- 202 203#ifdef USE_HWC2 204void Layer::onLayerDisplayed(const sp<Fence>& releaseFence) { 205 if (mHwcLayers.empty()) { 206 return; 207 } 208 mSurfaceFlingerConsumer->setReleaseFence(releaseFence); 209} 210#else 211void Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */, 212 HWComposer::HWCLayerInterface* layer) { 213 if (layer) { 214 layer->onDisplayed(); 215 mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence()); 216 } 217} 218#endif 219 220void Layer::onFrameAvailable(const BufferItem& item) { 221 // Add this buffer from our internal queue tracker 222 { // Autolock scope 223 Mutex::Autolock lock(mQueueItemLock); 224 mFlinger->mInterceptor.saveBufferUpdate(this, item.mGraphicBuffer->getWidth(), 225 item.mGraphicBuffer->getHeight(), item.mFrameNumber); 226 // Reset the frame number tracker when we receive the first buffer after 227 // a frame number reset 228 if (item.mFrameNumber == 1) { 229 mLastFrameNumberReceived = 0; 230 } 231 232 // Ensure that callbacks are handled in order 233 while (item.mFrameNumber != mLastFrameNumberReceived + 1) { 234 status_t result = mQueueItemCondition.waitRelative(mQueueItemLock, 235 ms2ns(500)); 236 if (result != NO_ERROR) { 237 ALOGE("[%s] Timed out waiting on callback", mName.string()); 238 } 239 } 240 241 mQueueItems.push_back(item); 242 android_atomic_inc(&mQueuedFrames); 243 244 // Wake up any pending callbacks 245 mLastFrameNumberReceived = item.mFrameNumber; 246 mQueueItemCondition.broadcast(); 247 } 248 249 mFlinger->signalLayerUpdate(); 250} 251 252void Layer::onFrameReplaced(const BufferItem& item) { 253 { // Autolock scope 254 Mutex::Autolock lock(mQueueItemLock); 255 256 // Ensure that callbacks are handled in order 257 while (item.mFrameNumber != mLastFrameNumberReceived + 1) { 258 status_t result = mQueueItemCondition.waitRelative(mQueueItemLock, 259 ms2ns(500)); 260 if (result != NO_ERROR) { 261 ALOGE("[%s] Timed out waiting on callback", mName.string()); 262 } 263 } 264 265 if (mQueueItems.empty()) { 266 ALOGE("Can't replace a frame on an empty queue"); 267 return; 268 } 269 mQueueItems.editItemAt(mQueueItems.size() - 1) = item; 270 271 // Wake up any pending callbacks 272 mLastFrameNumberReceived = item.mFrameNumber; 273 mQueueItemCondition.broadcast(); 274 } 275} 276 277void Layer::onBuffersReleased() { 278#ifdef USE_HWC2 279 Mutex::Autolock lock(mHwcBufferCacheMutex); 280 281 for (auto info : mHwcBufferCaches) { 282 info.second.clear(); 283 } 284#endif 285} 286 287void Layer::onSidebandStreamChanged() { 288 if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) { 289 // mSidebandStreamChanged was false 290 mFlinger->signalLayerUpdate(); 291 } 292} 293 294// called with SurfaceFlinger::mStateLock from the drawing thread after 295// the layer has been remove from the current state list (and just before 296// it's removed from the drawing state list) 297void Layer::onRemoved() { 298 mSurfaceFlingerConsumer->abandon(); 299 for (const auto& child : mCurrentChildren) { 300 child->onRemoved(); 301 } 302} 303 304// --------------------------------------------------------------------------- 305// set-up 306// --------------------------------------------------------------------------- 307 308const String8& Layer::getName() const { 309 return mName; 310} 311 312status_t Layer::setBuffers( uint32_t w, uint32_t h, 313 PixelFormat format, uint32_t flags) 314{ 315 uint32_t const maxSurfaceDims = min( 316 mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims()); 317 318 // never allow a surface larger than what our underlying GL implementation 319 // can handle. 320 if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) { 321 ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h)); 322 return BAD_VALUE; 323 } 324 325 mFormat = format; 326 327 mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false; 328 mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false; 329 mCurrentOpacity = getOpacityForFormat(format); 330 331 mSurfaceFlingerConsumer->setDefaultBufferSize(w, h); 332 mSurfaceFlingerConsumer->setDefaultBufferFormat(format); 333 mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); 334 335 return NO_ERROR; 336} 337 338sp<IBinder> Layer::getHandle() { 339 Mutex::Autolock _l(mLock); 340 341 LOG_ALWAYS_FATAL_IF(mHasSurface, 342 "Layer::getHandle() has already been called"); 343 344 mHasSurface = true; 345 346 return new Handle(mFlinger, this); 347} 348 349sp<IGraphicBufferProducer> Layer::getProducer() const { 350 return mProducer; 351} 352 353// --------------------------------------------------------------------------- 354// h/w composer set-up 355// --------------------------------------------------------------------------- 356 357Rect Layer::getContentCrop() const { 358 // this is the crop rectangle that applies to the buffer 359 // itself (as opposed to the window) 360 Rect crop; 361 if (!mCurrentCrop.isEmpty()) { 362 // if the buffer crop is defined, we use that 363 crop = mCurrentCrop; 364 } else if (mActiveBuffer != NULL) { 365 // otherwise we use the whole buffer 366 crop = mActiveBuffer->getBounds(); 367 } else { 368 // if we don't have a buffer yet, we use an empty/invalid crop 369 crop.makeInvalid(); 370 } 371 return crop; 372} 373 374static Rect reduce(const Rect& win, const Region& exclude) { 375 if (CC_LIKELY(exclude.isEmpty())) { 376 return win; 377 } 378 if (exclude.isRect()) { 379 return win.reduce(exclude.getBounds()); 380 } 381 return Region(win).subtract(exclude).getBounds(); 382} 383 384Rect Layer::computeScreenBounds(bool reduceTransparentRegion) const { 385 const Layer::State& s(getDrawingState()); 386 Rect win(s.active.w, s.active.h); 387 388 if (!s.crop.isEmpty()) { 389 win.intersect(s.crop, &win); 390 } 391 392 Transform t = getTransform(); 393 win = t.transform(win); 394 395 const sp<Layer>& p = getParent(); 396 // Now we need to calculate the parent bounds, so we can clip ourselves to those. 397 // When calculating the parent bounds for purposes of clipping, 398 // we don't need to constrain the parent to its transparent region. 399 // The transparent region is an optimization based on the 400 // buffer contents of the layer, but does not affect the space allocated to 401 // it by policy, and thus children should be allowed to extend into the 402 // parent's transparent region. In fact one of the main uses, is to reduce 403 // buffer allocation size in cases where a child window sits behind a main window 404 // (by marking the hole in the parent window as a transparent region) 405 if (p != nullptr) { 406 Rect bounds = p->computeScreenBounds(false); 407 bounds.intersect(win, &win); 408 } 409 410 if (reduceTransparentRegion) { 411 auto const screenTransparentRegion = t.transform(s.activeTransparentRegion); 412 win = reduce(win, screenTransparentRegion); 413 } 414 415 return win; 416} 417 418Rect Layer::computeBounds() const { 419 const Layer::State& s(getDrawingState()); 420 return computeBounds(s.activeTransparentRegion); 421} 422 423Rect Layer::computeBounds(const Region& activeTransparentRegion) const { 424 const Layer::State& s(getDrawingState()); 425 Rect win(s.active.w, s.active.h); 426 427 if (!s.crop.isEmpty()) { 428 win.intersect(s.crop, &win); 429 } 430 431 Rect bounds = win; 432 const auto& p = getParent(); 433 if (p != nullptr) { 434 // Look in computeScreenBounds recursive call for explanation of 435 // why we pass false here. 436 bounds = p->computeScreenBounds(false /* reduceTransparentRegion */); 437 } 438 439 Transform t = getTransform(); 440 if (p != nullptr) { 441 win = t.transform(win); 442 win.intersect(bounds, &win); 443 win = t.inverse().transform(win); 444 } 445 446 // subtract the transparent region and snap to the bounds 447 return reduce(win, activeTransparentRegion); 448} 449 450Rect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const { 451 // the crop is the area of the window that gets cropped, but not 452 // scaled in any ways. 453 const State& s(getDrawingState()); 454 455 // apply the projection's clipping to the window crop in 456 // layerstack space, and convert-back to layer space. 457 // if there are no window scaling involved, this operation will map to full 458 // pixels in the buffer. 459 // FIXME: the 3 lines below can produce slightly incorrect clipping when we have 460 // a viewport clipping and a window transform. we should use floating point to fix this. 461 462 Rect activeCrop(s.active.w, s.active.h); 463 if (!s.crop.isEmpty()) { 464 activeCrop = s.crop; 465 } 466 467 Transform t = getTransform(); 468 activeCrop = t.transform(activeCrop); 469 if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) { 470 activeCrop.clear(); 471 } 472 if (!s.finalCrop.isEmpty()) { 473 if(!activeCrop.intersect(s.finalCrop, &activeCrop)) { 474 activeCrop.clear(); 475 } 476 } 477 return activeCrop; 478} 479 480FloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const { 481 // the content crop is the area of the content that gets scaled to the 482 // layer's size. This is in buffer space. 483 FloatRect crop = getContentCrop().toFloatRect(); 484 485 // In addition there is a WM-specified crop we pull from our drawing state. 486 const State& s(getDrawingState()); 487 488 // Screen space to make reduction to parent crop clearer. 489 Rect activeCrop = computeInitialCrop(hw); 490 const auto& p = getParent(); 491 if (p != nullptr) { 492 auto parentCrop = p->computeInitialCrop(hw); 493 activeCrop.intersect(parentCrop, &activeCrop); 494 } 495 Transform t = getTransform(); 496 // Back to layer space to work with the content crop. 497 activeCrop = t.inverse().transform(activeCrop); 498 499 // This needs to be here as transform.transform(Rect) computes the 500 // transformed rect and then takes the bounding box of the result before 501 // returning. This means 502 // transform.inverse().transform(transform.transform(Rect)) != Rect 503 // in which case we need to make sure the final rect is clipped to the 504 // display bounds. 505 if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 506 activeCrop.clear(); 507 } 508 509 // subtract the transparent region and snap to the bounds 510 activeCrop = reduce(activeCrop, s.activeTransparentRegion); 511 512 // Transform the window crop to match the buffer coordinate system, 513 // which means using the inverse of the current transform set on the 514 // SurfaceFlingerConsumer. 515 uint32_t invTransform = mCurrentTransform; 516 if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { 517 /* 518 * the code below applies the primary display's inverse transform to the 519 * buffer 520 */ 521 uint32_t invTransformOrient = 522 DisplayDevice::getPrimaryDisplayOrientationTransform(); 523 // calculate the inverse transform 524 if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) { 525 invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 526 NATIVE_WINDOW_TRANSFORM_FLIP_H; 527 } 528 // and apply to the current transform 529 invTransform = (Transform(invTransformOrient) * Transform(invTransform)) 530 .getOrientation(); 531 } 532 533 int winWidth = s.active.w; 534 int winHeight = s.active.h; 535 if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 536 // If the activeCrop has been rotate the ends are rotated but not 537 // the space itself so when transforming ends back we can't rely on 538 // a modification of the axes of rotation. To account for this we 539 // need to reorient the inverse rotation in terms of the current 540 // axes of rotation. 541 bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0; 542 bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0; 543 if (is_h_flipped == is_v_flipped) { 544 invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 545 NATIVE_WINDOW_TRANSFORM_FLIP_H; 546 } 547 winWidth = s.active.h; 548 winHeight = s.active.w; 549 } 550 const Rect winCrop = activeCrop.transform( 551 invTransform, s.active.w, s.active.h); 552 553 // below, crop is intersected with winCrop expressed in crop's coordinate space 554 float xScale = crop.getWidth() / float(winWidth); 555 float yScale = crop.getHeight() / float(winHeight); 556 557 float insetL = winCrop.left * xScale; 558 float insetT = winCrop.top * yScale; 559 float insetR = (winWidth - winCrop.right ) * xScale; 560 float insetB = (winHeight - winCrop.bottom) * yScale; 561 562 crop.left += insetL; 563 crop.top += insetT; 564 crop.right -= insetR; 565 crop.bottom -= insetB; 566 567 return crop; 568} 569 570#ifdef USE_HWC2 571void Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z) 572#else 573void Layer::setGeometry( 574 const sp<const DisplayDevice>& hw, 575 HWComposer::HWCLayerInterface& layer) 576#endif 577{ 578#ifdef USE_HWC2 579 const auto hwcId = displayDevice->getHwcDisplayId(); 580 auto& hwcInfo = mHwcLayers[hwcId]; 581#else 582 layer.setDefaultState(); 583#endif 584 585 // enable this layer 586#ifdef USE_HWC2 587 hwcInfo.forceClientComposition = false; 588 589 if (isSecure() && !displayDevice->isSecure()) { 590 hwcInfo.forceClientComposition = true; 591 } 592 593 auto& hwcLayer = hwcInfo.layer; 594#else 595 layer.setSkip(false); 596 597 if (isSecure() && !hw->isSecure()) { 598 layer.setSkip(true); 599 } 600#endif 601 602 // this gives us only the "orientation" component of the transform 603 const State& s(getDrawingState()); 604#ifdef USE_HWC2 605 if (!isOpaque(s) || s.alpha != 1.0f) { 606 auto blendMode = mPremultipliedAlpha ? 607 HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage; 608 auto error = hwcLayer->setBlendMode(blendMode); 609 ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set blend mode %s:" 610 " %s (%d)", mName.string(), to_string(blendMode).c_str(), 611 to_string(error).c_str(), static_cast<int32_t>(error)); 612 } 613#else 614 if (!isOpaque(s) || s.alpha != 0xFF) { 615 layer.setBlending(mPremultipliedAlpha ? 616 HWC_BLENDING_PREMULT : 617 HWC_BLENDING_COVERAGE); 618 } 619#endif 620 621 // apply the layer's transform, followed by the display's global transform 622 // here we're guaranteed that the layer's transform preserves rects 623 Region activeTransparentRegion(s.activeTransparentRegion); 624 Transform t = getTransform(); 625 if (!s.crop.isEmpty()) { 626 Rect activeCrop(s.crop); 627 activeCrop = t.transform(activeCrop); 628#ifdef USE_HWC2 629 if(!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) { 630#else 631 if(!activeCrop.intersect(hw->getViewport(), &activeCrop)) { 632#endif 633 activeCrop.clear(); 634 } 635 activeCrop = t.inverse().transform(activeCrop, true); 636 // This needs to be here as transform.transform(Rect) computes the 637 // transformed rect and then takes the bounding box of the result before 638 // returning. This means 639 // transform.inverse().transform(transform.transform(Rect)) != Rect 640 // in which case we need to make sure the final rect is clipped to the 641 // display bounds. 642 if(!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 643 activeCrop.clear(); 644 } 645 // mark regions outside the crop as transparent 646 activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top)); 647 activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, 648 s.active.w, s.active.h)); 649 activeTransparentRegion.orSelf(Rect(0, activeCrop.top, 650 activeCrop.left, activeCrop.bottom)); 651 activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top, 652 s.active.w, activeCrop.bottom)); 653 } 654 655 Rect frame(t.transform(computeBounds(activeTransparentRegion))); 656 if (!s.finalCrop.isEmpty()) { 657 if(!frame.intersect(s.finalCrop, &frame)) { 658 frame.clear(); 659 } 660 } 661#ifdef USE_HWC2 662 if (!frame.intersect(displayDevice->getViewport(), &frame)) { 663 frame.clear(); 664 } 665 const Transform& tr(displayDevice->getTransform()); 666 Rect transformedFrame = tr.transform(frame); 667 auto error = hwcLayer->setDisplayFrame(transformedFrame); 668 if (error != HWC2::Error::None) { 669 ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", 670 mName.string(), transformedFrame.left, transformedFrame.top, 671 transformedFrame.right, transformedFrame.bottom, 672 to_string(error).c_str(), static_cast<int32_t>(error)); 673 } else { 674 hwcInfo.displayFrame = transformedFrame; 675 } 676 677 FloatRect sourceCrop = computeCrop(displayDevice); 678 error = hwcLayer->setSourceCrop(sourceCrop); 679 if (error != HWC2::Error::None) { 680 ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: " 681 "%s (%d)", mName.string(), sourceCrop.left, sourceCrop.top, 682 sourceCrop.right, sourceCrop.bottom, to_string(error).c_str(), 683 static_cast<int32_t>(error)); 684 } else { 685 hwcInfo.sourceCrop = sourceCrop; 686 } 687 688 error = hwcLayer->setPlaneAlpha(s.alpha); 689 ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set plane alpha %.3f: " 690 "%s (%d)", mName.string(), s.alpha, to_string(error).c_str(), 691 static_cast<int32_t>(error)); 692 693 error = hwcLayer->setZOrder(z); 694 ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)", 695 mName.string(), z, to_string(error).c_str(), 696 static_cast<int32_t>(error)); 697 698 error = hwcLayer->setInfo(s.type, s.appId); 699 ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)", 700 mName.string(), static_cast<int32_t>(error)); 701#else 702 if (!frame.intersect(hw->getViewport(), &frame)) { 703 frame.clear(); 704 } 705 const Transform& tr(hw->getTransform()); 706 layer.setFrame(tr.transform(frame)); 707 layer.setCrop(computeCrop(hw)); 708 layer.setPlaneAlpha(s.alpha); 709#endif 710 711 /* 712 * Transformations are applied in this order: 713 * 1) buffer orientation/flip/mirror 714 * 2) state transformation (window manager) 715 * 3) layer orientation (screen orientation) 716 * (NOTE: the matrices are multiplied in reverse order) 717 */ 718 719 const Transform bufferOrientation(mCurrentTransform); 720 Transform transform(tr * t * bufferOrientation); 721 722 if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { 723 /* 724 * the code below applies the primary display's inverse transform to the 725 * buffer 726 */ 727 uint32_t invTransform = 728 DisplayDevice::getPrimaryDisplayOrientationTransform(); 729 // calculate the inverse transform 730 if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 731 invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 732 NATIVE_WINDOW_TRANSFORM_FLIP_H; 733 } 734 // and apply to the current transform 735 transform = Transform(invTransform) * transform; 736 } 737 738 // this gives us only the "orientation" component of the transform 739 const uint32_t orientation = transform.getOrientation(); 740#ifdef USE_HWC2 741 if (orientation & Transform::ROT_INVALID) { 742 // we can only handle simple transformation 743 hwcInfo.forceClientComposition = true; 744 } else { 745 auto transform = static_cast<HWC2::Transform>(orientation); 746 auto error = hwcLayer->setTransform(transform); 747 ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set transform %s: " 748 "%s (%d)", mName.string(), to_string(transform).c_str(), 749 to_string(error).c_str(), static_cast<int32_t>(error)); 750 } 751#else 752 if (orientation & Transform::ROT_INVALID) { 753 // we can only handle simple transformation 754 layer.setSkip(true); 755 } else { 756 layer.setTransform(orientation); 757 } 758#endif 759} 760 761#ifdef USE_HWC2 762void Layer::forceClientComposition(int32_t hwcId) { 763 if (mHwcLayers.count(hwcId) == 0) { 764 ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId); 765 return; 766 } 767 768 mHwcLayers[hwcId].forceClientComposition = true; 769} 770#endif 771 772#ifdef USE_HWC2 773void Layer::setPerFrameData(const sp<const DisplayDevice>& displayDevice) { 774 // Apply this display's projection's viewport to the visible region 775 // before giving it to the HWC HAL. 776 const Transform& tr = displayDevice->getTransform(); 777 const auto& viewport = displayDevice->getViewport(); 778 Region visible = tr.transform(visibleRegion.intersect(viewport)); 779 auto hwcId = displayDevice->getHwcDisplayId(); 780 auto& hwcLayer = mHwcLayers[hwcId].layer; 781 auto error = hwcLayer->setVisibleRegion(visible); 782 if (error != HWC2::Error::None) { 783 ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(), 784 to_string(error).c_str(), static_cast<int32_t>(error)); 785 visible.dump(LOG_TAG); 786 } 787 788 error = hwcLayer->setSurfaceDamage(surfaceDamageRegion); 789 if (error != HWC2::Error::None) { 790 ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(), 791 to_string(error).c_str(), static_cast<int32_t>(error)); 792 surfaceDamageRegion.dump(LOG_TAG); 793 } 794 795 // Sideband layers 796 if (mSidebandStream.get()) { 797 setCompositionType(hwcId, HWC2::Composition::Sideband); 798 ALOGV("[%s] Requesting Sideband composition", mName.string()); 799 error = hwcLayer->setSidebandStream(mSidebandStream->handle()); 800 if (error != HWC2::Error::None) { 801 ALOGE("[%s] Failed to set sideband stream %p: %s (%d)", 802 mName.string(), mSidebandStream->handle(), 803 to_string(error).c_str(), static_cast<int32_t>(error)); 804 } 805 return; 806 } 807 808 // Client layers 809 if (mHwcLayers[hwcId].forceClientComposition || 810 (mActiveBuffer != nullptr && mActiveBuffer->handle == nullptr)) { 811 ALOGV("[%s] Requesting Client composition", mName.string()); 812 setCompositionType(hwcId, HWC2::Composition::Client); 813 return; 814 } 815 816 // SolidColor layers 817 if (mActiveBuffer == nullptr) { 818 setCompositionType(hwcId, HWC2::Composition::SolidColor); 819 820 // For now, we only support black for DimLayer 821 error = hwcLayer->setColor({0, 0, 0, 255}); 822 if (error != HWC2::Error::None) { 823 ALOGE("[%s] Failed to set color: %s (%d)", mName.string(), 824 to_string(error).c_str(), static_cast<int32_t>(error)); 825 } 826 827 // Clear out the transform, because it doesn't make sense absent a 828 // source buffer 829 error = hwcLayer->setTransform(HWC2::Transform::None); 830 if (error != HWC2::Error::None) { 831 ALOGE("[%s] Failed to clear transform: %s (%d)", mName.string(), 832 to_string(error).c_str(), static_cast<int32_t>(error)); 833 } 834 835 return; 836 } 837 838 // Device or Cursor layers 839 if (mPotentialCursor) { 840 ALOGV("[%s] Requesting Cursor composition", mName.string()); 841 setCompositionType(hwcId, HWC2::Composition::Cursor); 842 } else { 843 ALOGV("[%s] Requesting Device composition", mName.string()); 844 setCompositionType(hwcId, HWC2::Composition::Device); 845 } 846 847 ALOGV("setPerFrameData: dataspace = %d", mCurrentState.dataSpace); 848 error = hwcLayer->setDataspace(mCurrentState.dataSpace); 849 if (error != HWC2::Error::None) { 850 ALOGE("[%s] Failed to set dataspace %d: %s (%d)", mName.string(), 851 mCurrentState.dataSpace, to_string(error).c_str(), 852 static_cast<int32_t>(error)); 853 } 854 855 uint32_t hwcSlot = 0; 856 buffer_handle_t hwcHandle = nullptr; 857 { 858 Mutex::Autolock lock(mHwcBufferCacheMutex); 859 860 auto& hwcBufferCache = mHwcBufferCaches[hwcId]; 861 sp<GraphicBuffer> hwcBuffer; 862 hwcBufferCache.getHwcBuffer(mActiveBufferSlot, mActiveBuffer, 863 &hwcSlot, &hwcBuffer); 864 if (hwcBuffer != nullptr) { 865 hwcHandle = hwcBuffer->handle; 866 } 867 } 868 869 auto acquireFence = mSurfaceFlingerConsumer->getCurrentFence(); 870 error = hwcLayer->setBuffer(hwcSlot, hwcHandle, acquireFence); 871 if (error != HWC2::Error::None) { 872 ALOGE("[%s] Failed to set buffer %p: %s (%d)", mName.string(), 873 mActiveBuffer->handle, to_string(error).c_str(), 874 static_cast<int32_t>(error)); 875 } 876} 877#else 878void Layer::setPerFrameData(const sp<const DisplayDevice>& hw, 879 HWComposer::HWCLayerInterface& layer) { 880 // we have to set the visible region on every frame because 881 // we currently free it during onLayerDisplayed(), which is called 882 // after HWComposer::commit() -- every frame. 883 // Apply this display's projection's viewport to the visible region 884 // before giving it to the HWC HAL. 885 const Transform& tr = hw->getTransform(); 886 Region visible = tr.transform(visibleRegion.intersect(hw->getViewport())); 887 layer.setVisibleRegionScreen(visible); 888 layer.setSurfaceDamage(surfaceDamageRegion); 889 mIsGlesComposition = (layer.getCompositionType() == HWC_FRAMEBUFFER); 890 891 if (mSidebandStream.get()) { 892 layer.setSidebandStream(mSidebandStream); 893 } else { 894 // NOTE: buffer can be NULL if the client never drew into this 895 // layer yet, or if we ran out of memory 896 layer.setBuffer(mActiveBuffer); 897 } 898} 899#endif 900 901#ifdef USE_HWC2 902void Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) { 903 auto hwcId = displayDevice->getHwcDisplayId(); 904 if (mHwcLayers.count(hwcId) == 0 || 905 getCompositionType(hwcId) != HWC2::Composition::Cursor) { 906 return; 907 } 908 909 // This gives us only the "orientation" component of the transform 910 const State& s(getCurrentState()); 911 912 // Apply the layer's transform, followed by the display's global transform 913 // Here we're guaranteed that the layer's transform preserves rects 914 Rect win(s.active.w, s.active.h); 915 if (!s.crop.isEmpty()) { 916 win.intersect(s.crop, &win); 917 } 918 // Subtract the transparent region and snap to the bounds 919 Rect bounds = reduce(win, s.activeTransparentRegion); 920 Rect frame(getTransform().transform(bounds)); 921 frame.intersect(displayDevice->getViewport(), &frame); 922 if (!s.finalCrop.isEmpty()) { 923 frame.intersect(s.finalCrop, &frame); 924 } 925 auto& displayTransform(displayDevice->getTransform()); 926 auto position = displayTransform.transform(frame); 927 928 auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left, 929 position.top); 930 ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set cursor position " 931 "to (%d, %d): %s (%d)", mName.string(), position.left, 932 position.top, to_string(error).c_str(), 933 static_cast<int32_t>(error)); 934} 935#else 936void Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */, 937 HWComposer::HWCLayerInterface& layer) { 938 int fenceFd = -1; 939 940 // TODO: there is a possible optimization here: we only need to set the 941 // acquire fence the first time a new buffer is acquired on EACH display. 942 943 if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_CURSOR_OVERLAY) { 944 sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence(); 945 if (fence->isValid()) { 946 fenceFd = fence->dup(); 947 if (fenceFd == -1) { 948 ALOGW("failed to dup layer fence, skipping sync: %d", errno); 949 } 950 } 951 } 952 layer.setAcquireFenceFd(fenceFd); 953} 954 955Rect Layer::getPosition( 956 const sp<const DisplayDevice>& hw) 957{ 958 // this gives us only the "orientation" component of the transform 959 const State& s(getCurrentState()); 960 961 // apply the layer's transform, followed by the display's global transform 962 // here we're guaranteed that the layer's transform preserves rects 963 Rect win(s.active.w, s.active.h); 964 if (!s.crop.isEmpty()) { 965 win.intersect(s.crop, &win); 966 } 967 // subtract the transparent region and snap to the bounds 968 Rect bounds = reduce(win, s.activeTransparentRegion); 969 Rect frame(getTransform().transform(bounds)); 970 frame.intersect(hw->getViewport(), &frame); 971 if (!s.finalCrop.isEmpty()) { 972 frame.intersect(s.finalCrop, &frame); 973 } 974 const Transform& tr(hw->getTransform()); 975 return Rect(tr.transform(frame)); 976} 977#endif 978 979// --------------------------------------------------------------------------- 980// drawing... 981// --------------------------------------------------------------------------- 982 983void Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const { 984 onDraw(hw, clip, false); 985} 986 987void Layer::draw(const sp<const DisplayDevice>& hw, 988 bool useIdentityTransform) const { 989 onDraw(hw, Region(hw->bounds()), useIdentityTransform); 990} 991 992void Layer::draw(const sp<const DisplayDevice>& hw) const { 993 onDraw(hw, Region(hw->bounds()), false); 994} 995 996void Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip, 997 bool useIdentityTransform) const 998{ 999 ATRACE_CALL(); 1000 1001 if (CC_UNLIKELY(mActiveBuffer == 0)) { 1002 // the texture has not been created yet, this Layer has 1003 // in fact never been drawn into. This happens frequently with 1004 // SurfaceView because the WindowManager can't know when the client 1005 // has drawn the first time. 1006 1007 // If there is nothing under us, we paint the screen in black, otherwise 1008 // we just skip this update. 1009 1010 // figure out if there is something below us 1011 Region under; 1012 bool finished = false; 1013 mFlinger->mDrawingState.layersSortedByZ.traverseInZOrder([&](Layer* layer) { 1014 if (finished || layer == static_cast<Layer const*>(this)) { 1015 finished = true; 1016 return; 1017 } 1018 under.orSelf( hw->getTransform().transform(layer->visibleRegion) ); 1019 }); 1020 // if not everything below us is covered, we plug the holes! 1021 Region holes(clip.subtract(under)); 1022 if (!holes.isEmpty()) { 1023 clearWithOpenGL(hw, 0, 0, 0, 1); 1024 } 1025 return; 1026 } 1027 1028 // Bind the current buffer to the GL texture, and wait for it to be 1029 // ready for us to draw into. 1030 status_t err = mSurfaceFlingerConsumer->bindTextureImage(); 1031 if (err != NO_ERROR) { 1032 ALOGW("onDraw: bindTextureImage failed (err=%d)", err); 1033 // Go ahead and draw the buffer anyway; no matter what we do the screen 1034 // is probably going to have something visibly wrong. 1035 } 1036 1037 bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure()); 1038 1039 RenderEngine& engine(mFlinger->getRenderEngine()); 1040 1041 if (!blackOutLayer) { 1042 // TODO: we could be more subtle with isFixedSize() 1043 const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize(); 1044 1045 // Query the texture matrix given our current filtering mode. 1046 float textureMatrix[16]; 1047 mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering); 1048 mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix); 1049 1050 if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { 1051 1052 /* 1053 * the code below applies the primary display's inverse transform to 1054 * the texture transform 1055 */ 1056 1057 // create a 4x4 transform matrix from the display transform flags 1058 const mat4 flipH(-1,0,0,0, 0,1,0,0, 0,0,1,0, 1,0,0,1); 1059 const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1); 1060 const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1); 1061 1062 mat4 tr; 1063 uint32_t transform = 1064 DisplayDevice::getPrimaryDisplayOrientationTransform(); 1065 if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90) 1066 tr = tr * rot90; 1067 if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H) 1068 tr = tr * flipH; 1069 if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V) 1070 tr = tr * flipV; 1071 1072 // calculate the inverse 1073 tr = inverse(tr); 1074 1075 // and finally apply it to the original texture matrix 1076 const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr); 1077 memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix)); 1078 } 1079 1080 // Set things up for texturing. 1081 mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight()); 1082 mTexture.setFiltering(useFiltering); 1083 mTexture.setMatrix(textureMatrix); 1084 1085 engine.setupLayerTexturing(mTexture); 1086 } else { 1087 engine.setupLayerBlackedOut(); 1088 } 1089 drawWithOpenGL(hw, useIdentityTransform); 1090 engine.disableTexturing(); 1091} 1092 1093 1094void Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw, 1095 float red, float green, float blue, 1096 float alpha) const 1097{ 1098 RenderEngine& engine(mFlinger->getRenderEngine()); 1099 computeGeometry(hw, mMesh, false); 1100 engine.setupFillWithColor(red, green, blue, alpha); 1101 engine.drawMesh(mMesh); 1102} 1103 1104void Layer::clearWithOpenGL( 1105 const sp<const DisplayDevice>& hw) const { 1106 clearWithOpenGL(hw, 0,0,0,0); 1107} 1108 1109void Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw, 1110 bool useIdentityTransform) const { 1111 const State& s(getDrawingState()); 1112 1113 computeGeometry(hw, mMesh, useIdentityTransform); 1114 1115 /* 1116 * NOTE: the way we compute the texture coordinates here produces 1117 * different results than when we take the HWC path -- in the later case 1118 * the "source crop" is rounded to texel boundaries. 1119 * This can produce significantly different results when the texture 1120 * is scaled by a large amount. 1121 * 1122 * The GL code below is more logical (imho), and the difference with 1123 * HWC is due to a limitation of the HWC API to integers -- a question 1124 * is suspend is whether we should ignore this problem or revert to 1125 * GL composition when a buffer scaling is applied (maybe with some 1126 * minimal value)? Or, we could make GL behave like HWC -- but this feel 1127 * like more of a hack. 1128 */ 1129 Rect win(computeBounds()); 1130 1131 Transform t = getTransform(); 1132 if (!s.finalCrop.isEmpty()) { 1133 win = t.transform(win); 1134 if (!win.intersect(s.finalCrop, &win)) { 1135 win.clear(); 1136 } 1137 win = t.inverse().transform(win); 1138 if (!win.intersect(computeBounds(), &win)) { 1139 win.clear(); 1140 } 1141 } 1142 1143 float left = float(win.left) / float(s.active.w); 1144 float top = float(win.top) / float(s.active.h); 1145 float right = float(win.right) / float(s.active.w); 1146 float bottom = float(win.bottom) / float(s.active.h); 1147 1148 // TODO: we probably want to generate the texture coords with the mesh 1149 // here we assume that we only have 4 vertices 1150 Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>()); 1151 texCoords[0] = vec2(left, 1.0f - top); 1152 texCoords[1] = vec2(left, 1.0f - bottom); 1153 texCoords[2] = vec2(right, 1.0f - bottom); 1154 texCoords[3] = vec2(right, 1.0f - top); 1155 1156 RenderEngine& engine(mFlinger->getRenderEngine()); 1157 engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), s.alpha); 1158 engine.drawMesh(mMesh); 1159 engine.disableBlending(); 1160} 1161 1162#ifdef USE_HWC2 1163void Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, 1164 bool callIntoHwc) { 1165 if (mHwcLayers.count(hwcId) == 0) { 1166 ALOGE("setCompositionType called without a valid HWC layer"); 1167 return; 1168 } 1169 auto& hwcInfo = mHwcLayers[hwcId]; 1170 auto& hwcLayer = hwcInfo.layer; 1171 ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(), 1172 to_string(type).c_str(), static_cast<int>(callIntoHwc)); 1173 if (hwcInfo.compositionType != type) { 1174 ALOGV(" actually setting"); 1175 hwcInfo.compositionType = type; 1176 if (callIntoHwc) { 1177 auto error = hwcLayer->setCompositionType(type); 1178 ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set " 1179 "composition type %s: %s (%d)", mName.string(), 1180 to_string(type).c_str(), to_string(error).c_str(), 1181 static_cast<int32_t>(error)); 1182 } 1183 } 1184} 1185 1186HWC2::Composition Layer::getCompositionType(int32_t hwcId) const { 1187 if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) { 1188 // If we're querying the composition type for a display that does not 1189 // have a HWC counterpart, then it will always be Client 1190 return HWC2::Composition::Client; 1191 } 1192 if (mHwcLayers.count(hwcId) == 0) { 1193 ALOGE("getCompositionType called with an invalid HWC layer"); 1194 return HWC2::Composition::Invalid; 1195 } 1196 return mHwcLayers.at(hwcId).compositionType; 1197} 1198 1199void Layer::setClearClientTarget(int32_t hwcId, bool clear) { 1200 if (mHwcLayers.count(hwcId) == 0) { 1201 ALOGE("setClearClientTarget called without a valid HWC layer"); 1202 return; 1203 } 1204 mHwcLayers[hwcId].clearClientTarget = clear; 1205} 1206 1207bool Layer::getClearClientTarget(int32_t hwcId) const { 1208 if (mHwcLayers.count(hwcId) == 0) { 1209 ALOGE("getClearClientTarget called without a valid HWC layer"); 1210 return false; 1211 } 1212 return mHwcLayers.at(hwcId).clearClientTarget; 1213} 1214#endif 1215 1216uint32_t Layer::getProducerStickyTransform() const { 1217 int producerStickyTransform = 0; 1218 int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform); 1219 if (ret != OK) { 1220 ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__, 1221 strerror(-ret), ret); 1222 return 0; 1223 } 1224 return static_cast<uint32_t>(producerStickyTransform); 1225} 1226 1227bool Layer::latchUnsignaledBuffers() { 1228 static bool propertyLoaded = false; 1229 static bool latch = false; 1230 static std::mutex mutex; 1231 std::lock_guard<std::mutex> lock(mutex); 1232 if (!propertyLoaded) { 1233 char value[PROPERTY_VALUE_MAX] = {}; 1234 property_get("debug.sf.latch_unsignaled", value, "0"); 1235 latch = atoi(value); 1236 propertyLoaded = true; 1237 } 1238 return latch; 1239} 1240 1241uint64_t Layer::getHeadFrameNumber() const { 1242 Mutex::Autolock lock(mQueueItemLock); 1243 if (!mQueueItems.empty()) { 1244 return mQueueItems[0].mFrameNumber; 1245 } else { 1246 return mCurrentFrameNumber; 1247 } 1248} 1249 1250bool Layer::headFenceHasSignaled() const { 1251#ifdef USE_HWC2 1252 if (latchUnsignaledBuffers()) { 1253 return true; 1254 } 1255 1256 Mutex::Autolock lock(mQueueItemLock); 1257 if (mQueueItems.empty()) { 1258 return true; 1259 } 1260 if (mQueueItems[0].mIsDroppable) { 1261 // Even though this buffer's fence may not have signaled yet, it could 1262 // be replaced by another buffer before it has a chance to, which means 1263 // that it's possible to get into a situation where a buffer is never 1264 // able to be latched. To avoid this, grab this buffer anyway. 1265 return true; 1266 } 1267 return mQueueItems[0].mFence->getSignalTime() != INT64_MAX; 1268#else 1269 return true; 1270#endif 1271} 1272 1273bool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) { 1274 if (point->getFrameNumber() <= mCurrentFrameNumber) { 1275 // Don't bother with a SyncPoint, since we've already latched the 1276 // relevant frame 1277 return false; 1278 } 1279 1280 Mutex::Autolock lock(mLocalSyncPointMutex); 1281 mLocalSyncPoints.push_back(point); 1282 return true; 1283} 1284 1285void Layer::setFiltering(bool filtering) { 1286 mFiltering = filtering; 1287} 1288 1289bool Layer::getFiltering() const { 1290 return mFiltering; 1291} 1292 1293// As documented in libhardware header, formats in the range 1294// 0x100 - 0x1FF are specific to the HAL implementation, and 1295// are known to have no alpha channel 1296// TODO: move definition for device-specific range into 1297// hardware.h, instead of using hard-coded values here. 1298#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF) 1299 1300bool Layer::getOpacityForFormat(uint32_t format) { 1301 if (HARDWARE_IS_DEVICE_FORMAT(format)) { 1302 return true; 1303 } 1304 switch (format) { 1305 case HAL_PIXEL_FORMAT_RGBA_8888: 1306 case HAL_PIXEL_FORMAT_BGRA_8888: 1307 case HAL_PIXEL_FORMAT_RGBA_FP16: 1308 case HAL_PIXEL_FORMAT_RGBA_1010102: 1309 return false; 1310 } 1311 // in all other case, we have no blending (also for unknown formats) 1312 return true; 1313} 1314 1315// ---------------------------------------------------------------------------- 1316// local state 1317// ---------------------------------------------------------------------------- 1318 1319static void boundPoint(vec2* point, const Rect& crop) { 1320 if (point->x < crop.left) { 1321 point->x = crop.left; 1322 } 1323 if (point->x > crop.right) { 1324 point->x = crop.right; 1325 } 1326 if (point->y < crop.top) { 1327 point->y = crop.top; 1328 } 1329 if (point->y > crop.bottom) { 1330 point->y = crop.bottom; 1331 } 1332} 1333 1334void Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh, 1335 bool useIdentityTransform) const 1336{ 1337 const Layer::State& s(getDrawingState()); 1338 const Transform hwTransform(hw->getTransform()); 1339 const uint32_t hw_h = hw->getHeight(); 1340 Rect win = computeBounds(); 1341 1342 vec2 lt = vec2(win.left, win.top); 1343 vec2 lb = vec2(win.left, win.bottom); 1344 vec2 rb = vec2(win.right, win.bottom); 1345 vec2 rt = vec2(win.right, win.top); 1346 1347 Transform layerTransform = getTransform(); 1348 if (!useIdentityTransform) { 1349 lt = layerTransform.transform(lt); 1350 lb = layerTransform.transform(lb); 1351 rb = layerTransform.transform(rb); 1352 rt = layerTransform.transform(rt); 1353 } 1354 1355 if (!s.finalCrop.isEmpty()) { 1356 boundPoint(<, s.finalCrop); 1357 boundPoint(&lb, s.finalCrop); 1358 boundPoint(&rb, s.finalCrop); 1359 boundPoint(&rt, s.finalCrop); 1360 } 1361 1362 Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>()); 1363 position[0] = hwTransform.transform(lt); 1364 position[1] = hwTransform.transform(lb); 1365 position[2] = hwTransform.transform(rb); 1366 position[3] = hwTransform.transform(rt); 1367 for (size_t i=0 ; i<4 ; i++) { 1368 position[i].y = hw_h - position[i].y; 1369 } 1370} 1371 1372bool Layer::isOpaque(const Layer::State& s) const 1373{ 1374 // if we don't have a buffer yet, we're translucent regardless of the 1375 // layer's opaque flag. 1376 if (mActiveBuffer == 0) { 1377 return false; 1378 } 1379 1380 // if the layer has the opaque flag, then we're always opaque, 1381 // otherwise we use the current buffer's format. 1382 return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity; 1383} 1384 1385bool Layer::isSecure() const 1386{ 1387 const Layer::State& s(mDrawingState); 1388 return (s.flags & layer_state_t::eLayerSecure); 1389} 1390 1391bool Layer::isProtected() const 1392{ 1393 const sp<GraphicBuffer>& activeBuffer(mActiveBuffer); 1394 return (activeBuffer != 0) && 1395 (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED); 1396} 1397 1398bool Layer::isFixedSize() const { 1399 return getEffectiveScalingMode() != NATIVE_WINDOW_SCALING_MODE_FREEZE; 1400} 1401 1402bool Layer::isCropped() const { 1403 return !mCurrentCrop.isEmpty(); 1404} 1405 1406bool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const { 1407 return mNeedsFiltering || hw->needsFiltering(); 1408} 1409 1410void Layer::setVisibleRegion(const Region& visibleRegion) { 1411 // always called from main thread 1412 this->visibleRegion = visibleRegion; 1413} 1414 1415void Layer::setCoveredRegion(const Region& coveredRegion) { 1416 // always called from main thread 1417 this->coveredRegion = coveredRegion; 1418} 1419 1420void Layer::setVisibleNonTransparentRegion(const Region& 1421 setVisibleNonTransparentRegion) { 1422 // always called from main thread 1423 this->visibleNonTransparentRegion = setVisibleNonTransparentRegion; 1424} 1425 1426// ---------------------------------------------------------------------------- 1427// transaction 1428// ---------------------------------------------------------------------------- 1429 1430void Layer::pushPendingState() { 1431 if (!mCurrentState.modified) { 1432 return; 1433 } 1434 1435 // If this transaction is waiting on the receipt of a frame, generate a sync 1436 // point and send it to the remote layer. 1437 if (mCurrentState.handle != nullptr) { 1438 sp<IBinder> strongBinder = mCurrentState.handle.promote(); 1439 sp<Handle> handle = nullptr; 1440 sp<Layer> handleLayer = nullptr; 1441 if (strongBinder != nullptr) { 1442 handle = static_cast<Handle*>(strongBinder.get()); 1443 handleLayer = handle->owner.promote(); 1444 } 1445 if (strongBinder == nullptr || handleLayer == nullptr) { 1446 ALOGE("[%s] Unable to promote Layer handle", mName.string()); 1447 // If we can't promote the layer we are intended to wait on, 1448 // then it is expired or otherwise invalid. Allow this transaction 1449 // to be applied as per normal (no synchronization). 1450 mCurrentState.handle = nullptr; 1451 } else { 1452 auto syncPoint = std::make_shared<SyncPoint>( 1453 mCurrentState.frameNumber); 1454 if (handleLayer->addSyncPoint(syncPoint)) { 1455 mRemoteSyncPoints.push_back(std::move(syncPoint)); 1456 } else { 1457 // We already missed the frame we're supposed to synchronize 1458 // on, so go ahead and apply the state update 1459 mCurrentState.handle = nullptr; 1460 } 1461 } 1462 1463 // Wake us up to check if the frame has been received 1464 setTransactionFlags(eTransactionNeeded); 1465 mFlinger->setTransactionFlags(eTraversalNeeded); 1466 } 1467 mPendingStates.push_back(mCurrentState); 1468} 1469 1470void Layer::popPendingState(State* stateToCommit) { 1471 auto oldFlags = stateToCommit->flags; 1472 *stateToCommit = mPendingStates[0]; 1473 stateToCommit->flags = (oldFlags & ~stateToCommit->mask) | 1474 (stateToCommit->flags & stateToCommit->mask); 1475 1476 mPendingStates.removeAt(0); 1477} 1478 1479bool Layer::applyPendingStates(State* stateToCommit) { 1480 bool stateUpdateAvailable = false; 1481 while (!mPendingStates.empty()) { 1482 if (mPendingStates[0].handle != nullptr) { 1483 if (mRemoteSyncPoints.empty()) { 1484 // If we don't have a sync point for this, apply it anyway. It 1485 // will be visually wrong, but it should keep us from getting 1486 // into too much trouble. 1487 ALOGE("[%s] No local sync point found", mName.string()); 1488 popPendingState(stateToCommit); 1489 stateUpdateAvailable = true; 1490 continue; 1491 } 1492 1493 if (mRemoteSyncPoints.front()->getFrameNumber() != 1494 mPendingStates[0].frameNumber) { 1495 ALOGE("[%s] Unexpected sync point frame number found", 1496 mName.string()); 1497 1498 // Signal our end of the sync point and then dispose of it 1499 mRemoteSyncPoints.front()->setTransactionApplied(); 1500 mRemoteSyncPoints.pop_front(); 1501 continue; 1502 } 1503 1504 if (mRemoteSyncPoints.front()->frameIsAvailable()) { 1505 // Apply the state update 1506 popPendingState(stateToCommit); 1507 stateUpdateAvailable = true; 1508 1509 // Signal our end of the sync point and then dispose of it 1510 mRemoteSyncPoints.front()->setTransactionApplied(); 1511 mRemoteSyncPoints.pop_front(); 1512 } else { 1513 break; 1514 } 1515 } else { 1516 popPendingState(stateToCommit); 1517 stateUpdateAvailable = true; 1518 } 1519 } 1520 1521 // If we still have pending updates, wake SurfaceFlinger back up and point 1522 // it at this layer so we can process them 1523 if (!mPendingStates.empty()) { 1524 setTransactionFlags(eTransactionNeeded); 1525 mFlinger->setTransactionFlags(eTraversalNeeded); 1526 } 1527 1528 mCurrentState.modified = false; 1529 return stateUpdateAvailable; 1530} 1531 1532void Layer::notifyAvailableFrames() { 1533 auto headFrameNumber = getHeadFrameNumber(); 1534 bool headFenceSignaled = headFenceHasSignaled(); 1535 Mutex::Autolock lock(mLocalSyncPointMutex); 1536 for (auto& point : mLocalSyncPoints) { 1537 if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled) { 1538 point->setFrameAvailable(); 1539 } 1540 } 1541} 1542 1543uint32_t Layer::doTransaction(uint32_t flags) { 1544 ATRACE_CALL(); 1545 1546 pushPendingState(); 1547 Layer::State c = getCurrentState(); 1548 if (!applyPendingStates(&c)) { 1549 return 0; 1550 } 1551 1552 const Layer::State& s(getDrawingState()); 1553 1554 const bool sizeChanged = (c.requested.w != s.requested.w) || 1555 (c.requested.h != s.requested.h); 1556 1557 if (sizeChanged) { 1558 // the size changed, we need to ask our client to request a new buffer 1559 ALOGD_IF(DEBUG_RESIZE, 1560 "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n" 1561 " current={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 1562 " requested={ wh={%4u,%4u} }}\n" 1563 " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 1564 " requested={ wh={%4u,%4u} }}\n", 1565 this, getName().string(), mCurrentTransform, 1566 getEffectiveScalingMode(), 1567 c.active.w, c.active.h, 1568 c.crop.left, 1569 c.crop.top, 1570 c.crop.right, 1571 c.crop.bottom, 1572 c.crop.getWidth(), 1573 c.crop.getHeight(), 1574 c.requested.w, c.requested.h, 1575 s.active.w, s.active.h, 1576 s.crop.left, 1577 s.crop.top, 1578 s.crop.right, 1579 s.crop.bottom, 1580 s.crop.getWidth(), 1581 s.crop.getHeight(), 1582 s.requested.w, s.requested.h); 1583 1584 // record the new size, form this point on, when the client request 1585 // a buffer, it'll get the new size. 1586 mSurfaceFlingerConsumer->setDefaultBufferSize( 1587 c.requested.w, c.requested.h); 1588 } 1589 1590 const bool resizePending = (c.requested.w != c.active.w) || 1591 (c.requested.h != c.active.h); 1592 if (!isFixedSize()) { 1593 if (resizePending && mSidebandStream == NULL) { 1594 // don't let Layer::doTransaction update the drawing state 1595 // if we have a pending resize, unless we are in fixed-size mode. 1596 // the drawing state will be updated only once we receive a buffer 1597 // with the correct size. 1598 // 1599 // in particular, we want to make sure the clip (which is part 1600 // of the geometry state) is latched together with the size but is 1601 // latched immediately when no resizing is involved. 1602 // 1603 // If a sideband stream is attached, however, we want to skip this 1604 // optimization so that transactions aren't missed when a buffer 1605 // never arrives 1606 1607 flags |= eDontUpdateGeometryState; 1608 } 1609 } 1610 1611 // always set active to requested, unless we're asked not to 1612 // this is used by Layer, which special cases resizes. 1613 if (flags & eDontUpdateGeometryState) { 1614 } else { 1615 Layer::State& editCurrentState(getCurrentState()); 1616 if (mFreezePositionUpdates) { 1617 float tx = c.active.transform.tx(); 1618 float ty = c.active.transform.ty(); 1619 c.active = c.requested; 1620 c.active.transform.set(tx, ty); 1621 editCurrentState.active = c.active; 1622 } else { 1623 editCurrentState.active = editCurrentState.requested; 1624 c.active = c.requested; 1625 } 1626 } 1627 1628 if (s.active != c.active) { 1629 // invalidate and recompute the visible regions if needed 1630 flags |= Layer::eVisibleRegion; 1631 } 1632 1633 if (c.sequence != s.sequence) { 1634 // invalidate and recompute the visible regions if needed 1635 flags |= eVisibleRegion; 1636 this->contentDirty = true; 1637 1638 // we may use linear filtering, if the matrix scales us 1639 const uint8_t type = c.active.transform.getType(); 1640 mNeedsFiltering = (!c.active.transform.preserveRects() || 1641 (type >= Transform::SCALE)); 1642 } 1643 1644 // If the layer is hidden, signal and clear out all local sync points so 1645 // that transactions for layers depending on this layer's frames becoming 1646 // visible are not blocked 1647 if (c.flags & layer_state_t::eLayerHidden) { 1648 clearSyncPoints(); 1649 } 1650 1651 // Commit the transaction 1652 commitTransaction(c); 1653 return flags; 1654} 1655 1656void Layer::commitTransaction(const State& stateToCommit) { 1657 mDrawingState = stateToCommit; 1658} 1659 1660uint32_t Layer::getTransactionFlags(uint32_t flags) { 1661 return android_atomic_and(~flags, &mTransactionFlags) & flags; 1662} 1663 1664uint32_t Layer::setTransactionFlags(uint32_t flags) { 1665 return android_atomic_or(flags, &mTransactionFlags); 1666} 1667 1668bool Layer::setPosition(float x, float y, bool immediate) { 1669 if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y) 1670 return false; 1671 mCurrentState.sequence++; 1672 1673 // We update the requested and active position simultaneously because 1674 // we want to apply the position portion of the transform matrix immediately, 1675 // but still delay scaling when resizing a SCALING_MODE_FREEZE layer. 1676 mCurrentState.requested.transform.set(x, y); 1677 if (immediate && !mFreezePositionUpdates) { 1678 mCurrentState.active.transform.set(x, y); 1679 } 1680 mFreezePositionUpdates = mFreezePositionUpdates || !immediate; 1681 1682 mCurrentState.modified = true; 1683 setTransactionFlags(eTransactionNeeded); 1684 return true; 1685} 1686 1687bool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) { 1688 ssize_t idx = mCurrentChildren.indexOf(childLayer); 1689 if (idx < 0) { 1690 return false; 1691 } 1692 if (childLayer->setLayer(z)) { 1693 mCurrentChildren.removeAt(idx); 1694 mCurrentChildren.add(childLayer); 1695 } 1696 return true; 1697} 1698 1699bool Layer::setLayer(int32_t z) { 1700 if (mCurrentState.z == z) 1701 return false; 1702 mCurrentState.sequence++; 1703 mCurrentState.z = z; 1704 mCurrentState.modified = true; 1705 setTransactionFlags(eTransactionNeeded); 1706 return true; 1707} 1708 1709bool Layer::setSize(uint32_t w, uint32_t h) { 1710 if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) 1711 return false; 1712 mCurrentState.requested.w = w; 1713 mCurrentState.requested.h = h; 1714 mCurrentState.modified = true; 1715 setTransactionFlags(eTransactionNeeded); 1716 return true; 1717} 1718#ifdef USE_HWC2 1719bool Layer::setAlpha(float alpha) { 1720#else 1721bool Layer::setAlpha(uint8_t alpha) { 1722#endif 1723 if (mCurrentState.alpha == alpha) 1724 return false; 1725 mCurrentState.sequence++; 1726 mCurrentState.alpha = alpha; 1727 mCurrentState.modified = true; 1728 setTransactionFlags(eTransactionNeeded); 1729 return true; 1730} 1731bool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) { 1732 mCurrentState.sequence++; 1733 mCurrentState.requested.transform.set( 1734 matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy); 1735 mCurrentState.modified = true; 1736 setTransactionFlags(eTransactionNeeded); 1737 return true; 1738} 1739bool Layer::setTransparentRegionHint(const Region& transparent) { 1740 mCurrentState.requestedTransparentRegion = transparent; 1741 mCurrentState.modified = true; 1742 setTransactionFlags(eTransactionNeeded); 1743 return true; 1744} 1745bool Layer::setFlags(uint8_t flags, uint8_t mask) { 1746 const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 1747 if (mCurrentState.flags == newFlags) 1748 return false; 1749 mCurrentState.sequence++; 1750 mCurrentState.flags = newFlags; 1751 mCurrentState.mask = mask; 1752 mCurrentState.modified = true; 1753 setTransactionFlags(eTransactionNeeded); 1754 return true; 1755} 1756 1757bool Layer::setCrop(const Rect& crop, bool immediate) { 1758 if (mCurrentState.crop == crop) 1759 return false; 1760 mCurrentState.sequence++; 1761 mCurrentState.requestedCrop = crop; 1762 if (immediate) { 1763 mCurrentState.crop = crop; 1764 } 1765 mCurrentState.modified = true; 1766 setTransactionFlags(eTransactionNeeded); 1767 return true; 1768} 1769bool Layer::setFinalCrop(const Rect& crop) { 1770 if (mCurrentState.finalCrop == crop) 1771 return false; 1772 mCurrentState.sequence++; 1773 mCurrentState.finalCrop = crop; 1774 mCurrentState.modified = true; 1775 setTransactionFlags(eTransactionNeeded); 1776 return true; 1777} 1778 1779bool Layer::setOverrideScalingMode(int32_t scalingMode) { 1780 if (scalingMode == mOverrideScalingMode) 1781 return false; 1782 mOverrideScalingMode = scalingMode; 1783 setTransactionFlags(eTransactionNeeded); 1784 return true; 1785} 1786 1787void Layer::setInfo(uint32_t type, uint32_t appId) { 1788 mCurrentState.appId = appId; 1789 mCurrentState.type = type; 1790 mCurrentState.modified = true; 1791 setTransactionFlags(eTransactionNeeded); 1792} 1793 1794uint32_t Layer::getEffectiveScalingMode() const { 1795 if (mOverrideScalingMode >= 0) { 1796 return mOverrideScalingMode; 1797 } 1798 return mCurrentScalingMode; 1799} 1800 1801bool Layer::setLayerStack(uint32_t layerStack) { 1802 if (mCurrentState.layerStack == layerStack) 1803 return false; 1804 mCurrentState.sequence++; 1805 mCurrentState.layerStack = layerStack; 1806 mCurrentState.modified = true; 1807 setTransactionFlags(eTransactionNeeded); 1808 return true; 1809} 1810 1811bool Layer::setDataSpace(android_dataspace dataSpace) { 1812 if (mCurrentState.dataSpace == dataSpace) 1813 return false; 1814 mCurrentState.sequence++; 1815 mCurrentState.dataSpace = dataSpace; 1816 mCurrentState.modified = true; 1817 setTransactionFlags(eTransactionNeeded); 1818 return true; 1819} 1820 1821uint32_t Layer::getLayerStack() const { 1822 auto p = getParent(); 1823 if (p == nullptr) { 1824 return getDrawingState().layerStack; 1825 } 1826 return p->getLayerStack(); 1827} 1828 1829void Layer::deferTransactionUntil(const sp<IBinder>& handle, 1830 uint64_t frameNumber) { 1831 mCurrentState.handle = handle; 1832 mCurrentState.frameNumber = frameNumber; 1833 // We don't set eTransactionNeeded, because just receiving a deferral 1834 // request without any other state updates shouldn't actually induce a delay 1835 mCurrentState.modified = true; 1836 pushPendingState(); 1837 mCurrentState.handle = nullptr; 1838 mCurrentState.frameNumber = 0; 1839 mCurrentState.modified = false; 1840} 1841 1842void Layer::useSurfaceDamage() { 1843 if (mFlinger->mForceFullDamage) { 1844 surfaceDamageRegion = Region::INVALID_REGION; 1845 } else { 1846 surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage(); 1847 } 1848} 1849 1850void Layer::useEmptyDamage() { 1851 surfaceDamageRegion.clear(); 1852} 1853 1854// ---------------------------------------------------------------------------- 1855// pageflip handling... 1856// ---------------------------------------------------------------------------- 1857 1858bool Layer::shouldPresentNow(const DispSync& dispSync) const { 1859 if (mSidebandStreamChanged || mAutoRefresh) { 1860 return true; 1861 } 1862 1863 Mutex::Autolock lock(mQueueItemLock); 1864 if (mQueueItems.empty()) { 1865 return false; 1866 } 1867 auto timestamp = mQueueItems[0].mTimestamp; 1868 nsecs_t expectedPresent = 1869 mSurfaceFlingerConsumer->computeExpectedPresent(dispSync); 1870 1871 // Ignore timestamps more than a second in the future 1872 bool isPlausible = timestamp < (expectedPresent + s2ns(1)); 1873 ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible " 1874 "relative to expectedPresent %" PRId64, mName.string(), timestamp, 1875 expectedPresent); 1876 1877 bool isDue = timestamp < expectedPresent; 1878 return isDue || !isPlausible; 1879} 1880 1881bool Layer::onPreComposition(nsecs_t refreshStartTime) { 1882 if (mBufferLatched) { 1883 Mutex::Autolock lock(mFrameEventHistoryMutex); 1884 mFrameEventHistory.addPreComposition(mCurrentFrameNumber, refreshStartTime); 1885 } 1886 mRefreshPending = false; 1887 return mQueuedFrames > 0 || mSidebandStreamChanged || mAutoRefresh; 1888} 1889 1890bool Layer::onPostComposition(const std::shared_ptr<FenceTime>& glDoneFence, 1891 const std::shared_ptr<FenceTime>& presentFence, 1892 const std::shared_ptr<FenceTime>& retireFence, 1893 const CompositorTiming& compositorTiming) { 1894 mAcquireTimeline.updateSignalTimes(); 1895 mReleaseTimeline.updateSignalTimes(); 1896 1897 // mFrameLatencyNeeded is true when a new frame was latched for the 1898 // composition. 1899 if (!mFrameLatencyNeeded) 1900 return false; 1901 1902 // Update mFrameEventHistory. 1903 { 1904 Mutex::Autolock lock(mFrameEventHistoryMutex); 1905 mFrameEventHistory.addPostComposition(mCurrentFrameNumber, 1906 glDoneFence, presentFence, compositorTiming); 1907 if (mPreviousFrameNumber != 0) { 1908 mFrameEventHistory.addRetire(mPreviousFrameNumber, 1909 retireFence); 1910 } 1911 } 1912 1913 // Update mFrameTracker. 1914 nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp(); 1915 mFrameTracker.setDesiredPresentTime(desiredPresentTime); 1916 1917 std::shared_ptr<FenceTime> frameReadyFence = 1918 mSurfaceFlingerConsumer->getCurrentFenceTime(); 1919 if (frameReadyFence->isValid()) { 1920 mFrameTracker.setFrameReadyFence(std::move(frameReadyFence)); 1921 } else { 1922 // There was no fence for this frame, so assume that it was ready 1923 // to be presented at the desired present time. 1924 mFrameTracker.setFrameReadyTime(desiredPresentTime); 1925 } 1926 1927 if (presentFence->isValid()) { 1928 mFrameTracker.setActualPresentFence( 1929 std::shared_ptr<FenceTime>(presentFence)); 1930 } else if (retireFence->isValid()) { 1931 mFrameTracker.setActualPresentFence( 1932 std::shared_ptr<FenceTime>(retireFence)); 1933 } else { 1934 // The HWC doesn't support present fences, so use the refresh 1935 // timestamp instead. 1936 mFrameTracker.setActualPresentTime( 1937 mFlinger->getHwComposer().getRefreshTimestamp( 1938 HWC_DISPLAY_PRIMARY)); 1939 } 1940 1941 mFrameTracker.advanceFrame(); 1942 mFrameLatencyNeeded = false; 1943 return true; 1944} 1945 1946#ifdef USE_HWC2 1947void Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) { 1948 if (!mSurfaceFlingerConsumer->releasePendingBuffer()) { 1949 return; 1950 } 1951 1952 auto releaseFenceTime = std::make_shared<FenceTime>( 1953 mSurfaceFlingerConsumer->getPrevFinalReleaseFence()); 1954 mReleaseTimeline.push(releaseFenceTime); 1955 1956 Mutex::Autolock lock(mFrameEventHistoryMutex); 1957 if (mPreviousFrameNumber != 0) { 1958 mFrameEventHistory.addRelease(mPreviousFrameNumber, 1959 dequeueReadyTime, std::move(releaseFenceTime)); 1960 } 1961} 1962#endif 1963 1964bool Layer::isHiddenByPolicy() const { 1965 const Layer::State& s(mDrawingState); 1966 const auto& parent = getParent(); 1967 if (parent != nullptr && parent->isHiddenByPolicy()) { 1968 return true; 1969 } 1970 return s.flags & layer_state_t::eLayerHidden; 1971} 1972 1973bool Layer::isVisible() const { 1974 const Layer::State& s(mDrawingState); 1975#ifdef USE_HWC2 1976 return !(isHiddenByPolicy()) && s.alpha > 0.0f 1977 && (mActiveBuffer != NULL || mSidebandStream != NULL); 1978#else 1979 return !(isHiddenByPolicy()) && s.alpha 1980 && (mActiveBuffer != NULL || mSidebandStream != NULL); 1981#endif 1982} 1983 1984bool Layer::allTransactionsSignaled() { 1985 auto headFrameNumber = getHeadFrameNumber(); 1986 bool matchingFramesFound = false; 1987 bool allTransactionsApplied = true; 1988 Mutex::Autolock lock(mLocalSyncPointMutex); 1989 1990 for (auto& point : mLocalSyncPoints) { 1991 if (point->getFrameNumber() > headFrameNumber) { 1992 break; 1993 } 1994 matchingFramesFound = true; 1995 1996 if (!point->frameIsAvailable()) { 1997 // We haven't notified the remote layer that the frame for 1998 // this point is available yet. Notify it now, and then 1999 // abort this attempt to latch. 2000 point->setFrameAvailable(); 2001 allTransactionsApplied = false; 2002 break; 2003 } 2004 2005 allTransactionsApplied = allTransactionsApplied && point->transactionIsApplied(); 2006 } 2007 return !matchingFramesFound || allTransactionsApplied; 2008} 2009 2010Region Layer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime) 2011{ 2012 ATRACE_CALL(); 2013 2014 if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) { 2015 // mSidebandStreamChanged was true 2016 mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream(); 2017 if (mSidebandStream != NULL) { 2018 setTransactionFlags(eTransactionNeeded); 2019 mFlinger->setTransactionFlags(eTraversalNeeded); 2020 } 2021 recomputeVisibleRegions = true; 2022 2023 const State& s(getDrawingState()); 2024 return getTransform().transform(Region(Rect(s.active.w, s.active.h))); 2025 } 2026 2027 Region outDirtyRegion; 2028 if (mQueuedFrames <= 0 && !mAutoRefresh) { 2029 return outDirtyRegion; 2030 } 2031 2032 // if we've already called updateTexImage() without going through 2033 // a composition step, we have to skip this layer at this point 2034 // because we cannot call updateTeximage() without a corresponding 2035 // compositionComplete() call. 2036 // we'll trigger an update in onPreComposition(). 2037 if (mRefreshPending) { 2038 return outDirtyRegion; 2039 } 2040 2041 // If the head buffer's acquire fence hasn't signaled yet, return and 2042 // try again later 2043 if (!headFenceHasSignaled()) { 2044 mFlinger->signalLayerUpdate(); 2045 return outDirtyRegion; 2046 } 2047 2048 // Capture the old state of the layer for comparisons later 2049 const State& s(getDrawingState()); 2050 const bool oldOpacity = isOpaque(s); 2051 sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer; 2052 2053 if (!allTransactionsSignaled()) { 2054 mFlinger->signalLayerUpdate(); 2055 return outDirtyRegion; 2056 } 2057 2058 // This boolean is used to make sure that SurfaceFlinger's shadow copy 2059 // of the buffer queue isn't modified when the buffer queue is returning 2060 // BufferItem's that weren't actually queued. This can happen in shared 2061 // buffer mode. 2062 bool queuedBuffer = false; 2063 LayerRejecter r(mDrawingState, getCurrentState(), recomputeVisibleRegions, 2064 getProducerStickyTransform() != 0, mName.string(), 2065 mOverrideScalingMode, mFreezePositionUpdates); 2066 status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r, 2067 mFlinger->mPrimaryDispSync, &mAutoRefresh, &queuedBuffer, 2068 mLastFrameNumberReceived); 2069 if (updateResult == BufferQueue::PRESENT_LATER) { 2070 // Producer doesn't want buffer to be displayed yet. Signal a 2071 // layer update so we check again at the next opportunity. 2072 mFlinger->signalLayerUpdate(); 2073 return outDirtyRegion; 2074 } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) { 2075 // If the buffer has been rejected, remove it from the shadow queue 2076 // and return early 2077 if (queuedBuffer) { 2078 Mutex::Autolock lock(mQueueItemLock); 2079 mQueueItems.removeAt(0); 2080 android_atomic_dec(&mQueuedFrames); 2081 } 2082 return outDirtyRegion; 2083 } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) { 2084 // This can occur if something goes wrong when trying to create the 2085 // EGLImage for this buffer. If this happens, the buffer has already 2086 // been released, so we need to clean up the queue and bug out 2087 // early. 2088 if (queuedBuffer) { 2089 Mutex::Autolock lock(mQueueItemLock); 2090 mQueueItems.clear(); 2091 android_atomic_and(0, &mQueuedFrames); 2092 } 2093 2094 // Once we have hit this state, the shadow queue may no longer 2095 // correctly reflect the incoming BufferQueue's contents, so even if 2096 // updateTexImage starts working, the only safe course of action is 2097 // to continue to ignore updates. 2098 mUpdateTexImageFailed = true; 2099 2100 return outDirtyRegion; 2101 } 2102 2103 if (queuedBuffer) { 2104 // Autolock scope 2105 auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber(); 2106 2107 Mutex::Autolock lock(mQueueItemLock); 2108 2109 // Remove any stale buffers that have been dropped during 2110 // updateTexImage 2111 while (mQueueItems[0].mFrameNumber != currentFrameNumber) { 2112 mQueueItems.removeAt(0); 2113 android_atomic_dec(&mQueuedFrames); 2114 } 2115 2116 mQueueItems.removeAt(0); 2117 } 2118 2119 2120 // Decrement the queued-frames count. Signal another event if we 2121 // have more frames pending. 2122 if ((queuedBuffer && android_atomic_dec(&mQueuedFrames) > 1) 2123 || mAutoRefresh) { 2124 mFlinger->signalLayerUpdate(); 2125 } 2126 2127 // update the active buffer 2128 mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer( 2129 &mActiveBufferSlot); 2130 if (mActiveBuffer == NULL) { 2131 // this can only happen if the very first buffer was rejected. 2132 return outDirtyRegion; 2133 } 2134 2135 mBufferLatched = true; 2136 mPreviousFrameNumber = mCurrentFrameNumber; 2137 mCurrentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber(); 2138 2139 { 2140 Mutex::Autolock lock(mFrameEventHistoryMutex); 2141 mFrameEventHistory.addLatch(mCurrentFrameNumber, latchTime); 2142#ifndef USE_HWC2 2143 auto releaseFenceTime = std::make_shared<FenceTime>( 2144 mSurfaceFlingerConsumer->getPrevFinalReleaseFence()); 2145 mReleaseTimeline.push(releaseFenceTime); 2146 if (mPreviousFrameNumber != 0) { 2147 mFrameEventHistory.addRelease(mPreviousFrameNumber, 2148 latchTime, std::move(releaseFenceTime)); 2149 } 2150#endif 2151 } 2152 2153 mRefreshPending = true; 2154 mFrameLatencyNeeded = true; 2155 if (oldActiveBuffer == NULL) { 2156 // the first time we receive a buffer, we need to trigger a 2157 // geometry invalidation. 2158 recomputeVisibleRegions = true; 2159 } 2160 2161 setDataSpace(mSurfaceFlingerConsumer->getCurrentDataSpace()); 2162 2163 Rect crop(mSurfaceFlingerConsumer->getCurrentCrop()); 2164 const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform()); 2165 const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode()); 2166 if ((crop != mCurrentCrop) || 2167 (transform != mCurrentTransform) || 2168 (scalingMode != mCurrentScalingMode)) 2169 { 2170 mCurrentCrop = crop; 2171 mCurrentTransform = transform; 2172 mCurrentScalingMode = scalingMode; 2173 recomputeVisibleRegions = true; 2174 } 2175 2176 if (oldActiveBuffer != NULL) { 2177 uint32_t bufWidth = mActiveBuffer->getWidth(); 2178 uint32_t bufHeight = mActiveBuffer->getHeight(); 2179 if (bufWidth != uint32_t(oldActiveBuffer->width) || 2180 bufHeight != uint32_t(oldActiveBuffer->height)) { 2181 recomputeVisibleRegions = true; 2182 } 2183 } 2184 2185 mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format); 2186 if (oldOpacity != isOpaque(s)) { 2187 recomputeVisibleRegions = true; 2188 } 2189 2190 // Remove any sync points corresponding to the buffer which was just 2191 // latched 2192 { 2193 Mutex::Autolock lock(mLocalSyncPointMutex); 2194 auto point = mLocalSyncPoints.begin(); 2195 while (point != mLocalSyncPoints.end()) { 2196 if (!(*point)->frameIsAvailable() || 2197 !(*point)->transactionIsApplied()) { 2198 // This sync point must have been added since we started 2199 // latching. Don't drop it yet. 2200 ++point; 2201 continue; 2202 } 2203 2204 if ((*point)->getFrameNumber() <= mCurrentFrameNumber) { 2205 point = mLocalSyncPoints.erase(point); 2206 } else { 2207 ++point; 2208 } 2209 } 2210 } 2211 2212 // FIXME: postedRegion should be dirty & bounds 2213 Region dirtyRegion(Rect(s.active.w, s.active.h)); 2214 2215 // transform the dirty region to window-manager space 2216 outDirtyRegion = (getTransform().transform(dirtyRegion)); 2217 2218 return outDirtyRegion; 2219} 2220 2221uint32_t Layer::getEffectiveUsage(uint32_t usage) const 2222{ 2223 // TODO: should we do something special if mSecure is set? 2224 if (mProtectedByApp) { 2225 // need a hardware-protected path to external video sink 2226 usage |= GraphicBuffer::USAGE_PROTECTED; 2227 } 2228 if (mPotentialCursor) { 2229 usage |= GraphicBuffer::USAGE_CURSOR; 2230 } 2231 usage |= GraphicBuffer::USAGE_HW_COMPOSER; 2232 return usage; 2233} 2234 2235void Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const { 2236 uint32_t orientation = 0; 2237 if (!mFlinger->mDebugDisableTransformHint) { 2238 // The transform hint is used to improve performance, but we can 2239 // only have a single transform hint, it cannot 2240 // apply to all displays. 2241 const Transform& planeTransform(hw->getTransform()); 2242 orientation = planeTransform.getOrientation(); 2243 if (orientation & Transform::ROT_INVALID) { 2244 orientation = 0; 2245 } 2246 } 2247 mSurfaceFlingerConsumer->setTransformHint(orientation); 2248} 2249 2250// ---------------------------------------------------------------------------- 2251// debugging 2252// ---------------------------------------------------------------------------- 2253 2254void Layer::dump(String8& result, Colorizer& colorizer) const 2255{ 2256 const Layer::State& s(getDrawingState()); 2257 2258 colorizer.colorize(result, Colorizer::GREEN); 2259 result.appendFormat( 2260 "+ %s %p (%s)\n", 2261 getTypeId(), this, getName().string()); 2262 colorizer.reset(result); 2263 2264 s.activeTransparentRegion.dump(result, "transparentRegion"); 2265 visibleRegion.dump(result, "visibleRegion"); 2266 surfaceDamageRegion.dump(result, "surfaceDamageRegion"); 2267 sp<Client> client(mClientRef.promote()); 2268 2269 result.appendFormat( " " 2270 "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), " 2271 "crop=(%4d,%4d,%4d,%4d), finalCrop=(%4d,%4d,%4d,%4d), " 2272 "isOpaque=%1d, invalidate=%1d, " 2273#ifdef USE_HWC2 2274 "alpha=%.3f, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n" 2275#else 2276 "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n" 2277#endif 2278 " client=%p\n", 2279 getLayerStack(), s.z, 2280 s.active.transform.tx(), s.active.transform.ty(), 2281 s.active.w, s.active.h, 2282 s.crop.left, s.crop.top, 2283 s.crop.right, s.crop.bottom, 2284 s.finalCrop.left, s.finalCrop.top, 2285 s.finalCrop.right, s.finalCrop.bottom, 2286 isOpaque(s), contentDirty, 2287 s.alpha, s.flags, 2288 s.active.transform[0][0], s.active.transform[0][1], 2289 s.active.transform[1][0], s.active.transform[1][1], 2290 client.get()); 2291 2292 sp<const GraphicBuffer> buf0(mActiveBuffer); 2293 uint32_t w0=0, h0=0, s0=0, f0=0; 2294 if (buf0 != 0) { 2295 w0 = buf0->getWidth(); 2296 h0 = buf0->getHeight(); 2297 s0 = buf0->getStride(); 2298 f0 = buf0->format; 2299 } 2300 result.appendFormat( 2301 " " 2302 "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X]," 2303 " queued-frames=%d, mRefreshPending=%d\n", 2304 mFormat, w0, h0, s0,f0, 2305 mQueuedFrames, mRefreshPending); 2306 2307 if (mSurfaceFlingerConsumer != 0) { 2308 mSurfaceFlingerConsumer->dumpState(result, " "); 2309 } 2310} 2311 2312#ifdef USE_HWC2 2313void Layer::miniDumpHeader(String8& result) { 2314 result.append("----------------------------------------"); 2315 result.append("---------------------------------------\n"); 2316 result.append(" Layer name\n"); 2317 result.append(" Z | "); 2318 result.append(" Comp Type | "); 2319 result.append(" Disp Frame (LTRB) | "); 2320 result.append(" Source Crop (LTRB)\n"); 2321 result.append("----------------------------------------"); 2322 result.append("---------------------------------------\n"); 2323} 2324 2325void Layer::miniDump(String8& result, int32_t hwcId) const { 2326 if (mHwcLayers.count(hwcId) == 0) { 2327 return; 2328 } 2329 2330 String8 name; 2331 if (mName.length() > 77) { 2332 std::string shortened; 2333 shortened.append(mName.string(), 36); 2334 shortened.append("[...]"); 2335 shortened.append(mName.string() + (mName.length() - 36), 36); 2336 name = shortened.c_str(); 2337 } else { 2338 name = mName; 2339 } 2340 2341 result.appendFormat(" %s\n", name.string()); 2342 2343 const Layer::State& layerState(getDrawingState()); 2344 const HWCInfo& hwcInfo = mHwcLayers.at(hwcId); 2345 result.appendFormat(" %10u | ", layerState.z); 2346 result.appendFormat("%10s | ", 2347 to_string(getCompositionType(hwcId)).c_str()); 2348 const Rect& frame = hwcInfo.displayFrame; 2349 result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, 2350 frame.right, frame.bottom); 2351 const FloatRect& crop = hwcInfo.sourceCrop; 2352 result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, 2353 crop.right, crop.bottom); 2354 2355 result.append("- - - - - - - - - - - - - - - - - - - - "); 2356 result.append("- - - - - - - - - - - - - - - - - - - -\n"); 2357} 2358#endif 2359 2360void Layer::dumpFrameStats(String8& result) const { 2361 mFrameTracker.dumpStats(result); 2362} 2363 2364void Layer::clearFrameStats() { 2365 mFrameTracker.clearStats(); 2366} 2367 2368void Layer::logFrameStats() { 2369 mFrameTracker.logAndResetStats(mName); 2370} 2371 2372void Layer::getFrameStats(FrameStats* outStats) const { 2373 mFrameTracker.getStats(outStats); 2374} 2375 2376void Layer::dumpFrameEvents(String8& result) { 2377 result.appendFormat("- Layer %s (%s, %p)\n", 2378 getName().string(), getTypeId(), this); 2379 Mutex::Autolock lock(mFrameEventHistoryMutex); 2380 mFrameEventHistory.checkFencesForCompletion(); 2381 mFrameEventHistory.dump(result); 2382} 2383 2384void Layer::onDisconnect() { 2385 Mutex::Autolock lock(mFrameEventHistoryMutex); 2386 mFrameEventHistory.onDisconnect(); 2387} 2388 2389void Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps, 2390 FrameEventHistoryDelta *outDelta) { 2391 Mutex::Autolock lock(mFrameEventHistoryMutex); 2392 if (newTimestamps) { 2393 mAcquireTimeline.push(newTimestamps->acquireFence); 2394 mFrameEventHistory.addQueue(*newTimestamps); 2395 } 2396 2397 if (outDelta) { 2398 mFrameEventHistory.getAndResetDelta(outDelta); 2399 } 2400} 2401 2402std::vector<OccupancyTracker::Segment> Layer::getOccupancyHistory( 2403 bool forceFlush) { 2404 std::vector<OccupancyTracker::Segment> history; 2405 status_t result = mSurfaceFlingerConsumer->getOccupancyHistory(forceFlush, 2406 &history); 2407 if (result != NO_ERROR) { 2408 ALOGW("[%s] Failed to obtain occupancy history (%d)", mName.string(), 2409 result); 2410 return {}; 2411 } 2412 return history; 2413} 2414 2415bool Layer::getTransformToDisplayInverse() const { 2416 return mSurfaceFlingerConsumer->getTransformToDisplayInverse(); 2417} 2418 2419void Layer::addChild(const sp<Layer>& layer) { 2420 mCurrentChildren.add(layer); 2421 layer->setParent(this); 2422} 2423 2424ssize_t Layer::removeChild(const sp<Layer>& layer) { 2425 layer->setParent(nullptr); 2426 return mCurrentChildren.remove(layer); 2427} 2428 2429bool Layer::reparentChildren(const sp<IBinder>& newParentHandle) { 2430 sp<Handle> handle = nullptr; 2431 sp<Layer> newParent = nullptr; 2432 if (newParentHandle == nullptr) { 2433 return false; 2434 } 2435 handle = static_cast<Handle*>(newParentHandle.get()); 2436 newParent = handle->owner.promote(); 2437 if (newParent == nullptr) { 2438 ALOGE("Unable to promote Layer handle"); 2439 return false; 2440 } 2441 2442 for (const sp<Layer>& child : mCurrentChildren) { 2443 newParent->addChild(child); 2444 2445 sp<Client> client(child->mClientRef.promote()); 2446 if (client != nullptr) { 2447 client->setParentLayer(newParent); 2448 } 2449 } 2450 mCurrentChildren.clear(); 2451 2452 return true; 2453} 2454 2455void Layer::setParent(const sp<Layer>& layer) { 2456 mParent = layer; 2457} 2458 2459void Layer::clearSyncPoints() { 2460 for (const auto& child : mCurrentChildren) { 2461 child->clearSyncPoints(); 2462 } 2463 2464 Mutex::Autolock lock(mLocalSyncPointMutex); 2465 for (auto& point : mLocalSyncPoints) { 2466 point->setFrameAvailable(); 2467 } 2468 mLocalSyncPoints.clear(); 2469} 2470 2471int32_t Layer::getZ() const { 2472 return mDrawingState.z; 2473} 2474 2475/** 2476 * Negatively signed children are before 'this' in Z-order. 2477 */ 2478void Layer::traverseInZOrder(const std::function<void(Layer*)>& exec) { 2479 size_t i = 0; 2480 for (; i < mDrawingChildren.size(); i++) { 2481 const auto& child = mDrawingChildren[i]; 2482 if (child->getZ() >= 0) 2483 break; 2484 child->traverseInZOrder(exec); 2485 } 2486 exec(this); 2487 for (; i < mDrawingChildren.size(); i++) { 2488 const auto& child = mDrawingChildren[i]; 2489 child->traverseInZOrder(exec); 2490 } 2491} 2492 2493/** 2494 * Positively signed children are before 'this' in reverse Z-order. 2495 */ 2496void Layer::traverseInReverseZOrder(const std::function<void(Layer*)>& exec) { 2497 int32_t i = 0; 2498 for (i = mDrawingChildren.size()-1; i>=0; i--) { 2499 const auto& child = mDrawingChildren[i]; 2500 if (child->getZ() < 0) { 2501 break; 2502 } 2503 child->traverseInReverseZOrder(exec); 2504 } 2505 exec(this); 2506 for (; i>=0; i--) { 2507 const auto& child = mDrawingChildren[i]; 2508 child->traverseInReverseZOrder(exec); 2509 } 2510} 2511 2512Transform Layer::getTransform() const { 2513 Transform t; 2514 const auto& p = getParent(); 2515 if (p != nullptr) { 2516 t = p->getTransform(); 2517 } 2518 return t * getDrawingState().active.transform; 2519} 2520 2521void Layer::commitChildList() { 2522 for (size_t i = 0; i < mCurrentChildren.size(); i++) { 2523 const auto& child = mCurrentChildren[i]; 2524 child->commitChildList(); 2525 } 2526 mDrawingChildren = mCurrentChildren; 2527} 2528 2529// --------------------------------------------------------------------------- 2530 2531}; // namespace android 2532 2533#if defined(__gl_h_) 2534#error "don't include gl/gl.h in this file" 2535#endif 2536 2537#if defined(__gl2_h_) 2538#error "don't include gl2/gl2.h in this file" 2539#endif 2540