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