Layer.cpp revision e338df1c2ff4ed2cd575a0e3193ef77c9cd9cb72
1/* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#define ATRACE_TAG ATRACE_TAG_GRAPHICS 18 19#include <stdlib.h> 20#include <stdint.h> 21#include <sys/types.h> 22#include <math.h> 23 24#include <cutils/compiler.h> 25#include <cutils/native_handle.h> 26#include <cutils/properties.h> 27 28#include <utils/Errors.h> 29#include <utils/Log.h> 30#include <utils/NativeHandle.h> 31#include <utils/StopWatch.h> 32#include <utils/Trace.h> 33 34#include <ui/GraphicBuffer.h> 35#include <ui/PixelFormat.h> 36 37#include <gui/BufferItem.h> 38#include <gui/Surface.h> 39 40#include "clz.h" 41#include "Colorizer.h" 42#include "DisplayDevice.h" 43#include "Layer.h" 44#include "MonitoredProducer.h" 45#include "SurfaceFlinger.h" 46 47#include "DisplayHardware/HWComposer.h" 48 49#include "RenderEngine/RenderEngine.h" 50 51#define DEBUG_RESIZE 0 52 53namespace android { 54 55// --------------------------------------------------------------------------- 56 57int32_t Layer::sSequence = 1; 58 59Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, 60 const String8& name, uint32_t w, uint32_t h, uint32_t flags) 61 : contentDirty(false), 62 sequence(uint32_t(android_atomic_inc(&sSequence))), 63 mFlinger(flinger), 64 mTextureName(-1U), 65 mPremultipliedAlpha(true), 66 mName("unnamed"), 67 mFormat(PIXEL_FORMAT_NONE), 68 mTransactionFlags(0), 69 mPendingStateMutex(), 70 mPendingStates(), 71 mQueuedFrames(0), 72 mSidebandStreamChanged(false), 73 mCurrentTransform(0), 74 mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), 75 mCurrentOpacity(true), 76 mRefreshPending(false), 77 mFrameLatencyNeeded(false), 78 mFiltering(false), 79 mNeedsFiltering(false), 80 mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2), 81 mProtectedByApp(false), 82 mHasSurface(false), 83 mClientRef(client), 84 mPotentialCursor(false), 85 mQueueItemLock(), 86 mQueueItemCondition(), 87 mQueueItems(), 88 mLastFrameNumberReceived(0), 89 mUpdateTexImageFailed(false), 90 mSingleBufferMode(false) 91{ 92 mCurrentCrop.makeInvalid(); 93 mFlinger->getRenderEngine().genTextures(1, &mTextureName); 94 mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName); 95 96 uint32_t layerFlags = 0; 97 if (flags & ISurfaceComposerClient::eHidden) 98 layerFlags |= layer_state_t::eLayerHidden; 99 if (flags & ISurfaceComposerClient::eOpaque) 100 layerFlags |= layer_state_t::eLayerOpaque; 101 if (flags & ISurfaceComposerClient::eSecure) 102 layerFlags |= layer_state_t::eLayerSecure; 103 104 if (flags & ISurfaceComposerClient::eNonPremultiplied) 105 mPremultipliedAlpha = false; 106 107 mName = name; 108 109 mCurrentState.active.w = w; 110 mCurrentState.active.h = h; 111 mCurrentState.active.crop.makeInvalid(); 112 mCurrentState.z = 0; 113 mCurrentState.alpha = 0xFF; 114 mCurrentState.layerStack = 0; 115 mCurrentState.flags = layerFlags; 116 mCurrentState.sequence = 0; 117 mCurrentState.transform.set(0, 0); 118 mCurrentState.requested = mCurrentState.active; 119 120 // drawing state & current state are identical 121 mDrawingState = mCurrentState; 122 123 nsecs_t displayPeriod = 124 flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY); 125 mFrameTracker.setDisplayRefreshPeriod(displayPeriod); 126} 127 128void Layer::onFirstRef() { 129 // Creates a custom BufferQueue for SurfaceFlingerConsumer to use 130 sp<IGraphicBufferProducer> producer; 131 sp<IGraphicBufferConsumer> consumer; 132 BufferQueue::createBufferQueue(&producer, &consumer); 133 mProducer = new MonitoredProducer(producer, mFlinger); 134 mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName); 135 mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); 136 mSurfaceFlingerConsumer->setContentsChangedListener(this); 137 mSurfaceFlingerConsumer->setName(mName); 138 139#ifdef TARGET_DISABLE_TRIPLE_BUFFERING 140#warning "disabling triple buffering" 141#else 142 mProducer->setMaxDequeuedBufferCount(2); 143#endif 144 145 const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice()); 146 updateTransformHint(hw); 147} 148 149Layer::~Layer() { 150 mFlinger->deleteTextureAsync(mTextureName); 151 mFrameTracker.logAndResetStats(mName); 152} 153 154// --------------------------------------------------------------------------- 155// callbacks 156// --------------------------------------------------------------------------- 157 158void Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */, 159 HWComposer::HWCLayerInterface* layer) { 160 if (layer) { 161 layer->onDisplayed(); 162 mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence()); 163 } 164} 165 166void Layer::markSyncPointsAvailable(const BufferItem& item) { 167 auto pointIter = mLocalSyncPoints.begin(); 168 while (pointIter != mLocalSyncPoints.end()) { 169 if ((*pointIter)->getFrameNumber() == item.mFrameNumber) { 170 auto syncPoint = *pointIter; 171 pointIter = mLocalSyncPoints.erase(pointIter); 172 Mutex::Autolock lock(mAvailableFrameMutex); 173 mAvailableFrames.push_back(std::move(syncPoint)); 174 } else { 175 ++pointIter; 176 } 177 } 178} 179 180void Layer::onFrameAvailable(const BufferItem& item) { 181 // Add this buffer from our internal queue tracker 182 { // Autolock scope 183 Mutex::Autolock lock(mQueueItemLock); 184 185 // Reset the frame number tracker when we receive the first buffer after 186 // a frame number reset 187 if (item.mFrameNumber == 1) { 188 mLastFrameNumberReceived = 0; 189 } 190 191 // Ensure that callbacks are handled in order 192 while (item.mFrameNumber != mLastFrameNumberReceived + 1) { 193 status_t result = mQueueItemCondition.waitRelative(mQueueItemLock, 194 ms2ns(500)); 195 if (result != NO_ERROR) { 196 ALOGE("[%s] Timed out waiting on callback", mName.string()); 197 } 198 } 199 200 mQueueItems.push_back(item); 201 android_atomic_inc(&mQueuedFrames); 202 203 // Wake up any pending callbacks 204 mLastFrameNumberReceived = item.mFrameNumber; 205 mQueueItemCondition.broadcast(); 206 } 207 208 markSyncPointsAvailable(item); 209 210 mFlinger->signalLayerUpdate(); 211} 212 213void Layer::onFrameReplaced(const BufferItem& item) { 214 { // Autolock scope 215 Mutex::Autolock lock(mQueueItemLock); 216 217 // Ensure that callbacks are handled in order 218 while (item.mFrameNumber != mLastFrameNumberReceived + 1) { 219 status_t result = mQueueItemCondition.waitRelative(mQueueItemLock, 220 ms2ns(500)); 221 if (result != NO_ERROR) { 222 ALOGE("[%s] Timed out waiting on callback", mName.string()); 223 } 224 } 225 226 if (mQueueItems.empty()) { 227 ALOGE("Can't replace a frame on an empty queue"); 228 return; 229 } 230 mQueueItems.editItemAt(0) = item; 231 232 // Wake up any pending callbacks 233 mLastFrameNumberReceived = item.mFrameNumber; 234 mQueueItemCondition.broadcast(); 235 } 236 237 markSyncPointsAvailable(item); 238} 239 240void Layer::onSidebandStreamChanged() { 241 if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) { 242 // mSidebandStreamChanged was false 243 mFlinger->signalLayerUpdate(); 244 } 245} 246 247// called with SurfaceFlinger::mStateLock from the drawing thread after 248// the layer has been remove from the current state list (and just before 249// it's removed from the drawing state list) 250void Layer::onRemoved() { 251 sp<Client> c(mClientRef.promote()); 252 if (c != 0) { 253 c->detachLayer(this); 254 } 255 mSurfaceFlingerConsumer->abandon(); 256} 257 258// --------------------------------------------------------------------------- 259// set-up 260// --------------------------------------------------------------------------- 261 262const String8& Layer::getName() const { 263 return mName; 264} 265 266status_t Layer::setBuffers( uint32_t w, uint32_t h, 267 PixelFormat format, uint32_t flags) 268{ 269 uint32_t const maxSurfaceDims = min( 270 mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims()); 271 272 // never allow a surface larger than what our underlying GL implementation 273 // can handle. 274 if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) { 275 ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h)); 276 return BAD_VALUE; 277 } 278 279 mFormat = format; 280 281 mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false; 282 mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false; 283 mCurrentOpacity = getOpacityForFormat(format); 284 285 mSurfaceFlingerConsumer->setDefaultBufferSize(w, h); 286 mSurfaceFlingerConsumer->setDefaultBufferFormat(format); 287 mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); 288 289 return NO_ERROR; 290} 291 292/* 293 * The layer handle is just a BBinder object passed to the client 294 * (remote process) -- we don't keep any reference on our side such that 295 * the dtor is called when the remote side let go of its reference. 296 * 297 * LayerCleaner ensures that mFlinger->onLayerDestroyed() is called for 298 * this layer when the handle is destroyed. 299 */ 300class Layer::Handle : public BBinder, public LayerCleaner { 301 public: 302 Handle(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer) 303 : LayerCleaner(flinger, layer), owner(layer) {} 304 305 wp<Layer> owner; 306}; 307 308sp<IBinder> Layer::getHandle() { 309 Mutex::Autolock _l(mLock); 310 311 LOG_ALWAYS_FATAL_IF(mHasSurface, 312 "Layer::getHandle() has already been called"); 313 314 mHasSurface = true; 315 316 return new Handle(mFlinger, this); 317} 318 319sp<IGraphicBufferProducer> Layer::getProducer() const { 320 return mProducer; 321} 322 323// --------------------------------------------------------------------------- 324// h/w composer set-up 325// --------------------------------------------------------------------------- 326 327Rect Layer::getContentCrop() const { 328 // this is the crop rectangle that applies to the buffer 329 // itself (as opposed to the window) 330 Rect crop; 331 if (!mCurrentCrop.isEmpty()) { 332 // if the buffer crop is defined, we use that 333 crop = mCurrentCrop; 334 } else if (mActiveBuffer != NULL) { 335 // otherwise we use the whole buffer 336 crop = mActiveBuffer->getBounds(); 337 } else { 338 // if we don't have a buffer yet, we use an empty/invalid crop 339 crop.makeInvalid(); 340 } 341 return crop; 342} 343 344static Rect reduce(const Rect& win, const Region& exclude) { 345 if (CC_LIKELY(exclude.isEmpty())) { 346 return win; 347 } 348 if (exclude.isRect()) { 349 return win.reduce(exclude.getBounds()); 350 } 351 return Region(win).subtract(exclude).getBounds(); 352} 353 354Rect Layer::computeBounds() const { 355 const Layer::State& s(getDrawingState()); 356 return computeBounds(s.activeTransparentRegion); 357} 358 359Rect Layer::computeBounds(const Region& activeTransparentRegion) const { 360 const Layer::State& s(getDrawingState()); 361 Rect win(s.active.w, s.active.h); 362 if (!s.active.crop.isEmpty()) { 363 win.intersect(s.active.crop, &win); 364 } 365 // subtract the transparent region and snap to the bounds 366 return reduce(win, activeTransparentRegion); 367} 368 369FloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const { 370 // the content crop is the area of the content that gets scaled to the 371 // layer's size. 372 FloatRect crop(getContentCrop()); 373 374 // the active.crop is the area of the window that gets cropped, but not 375 // scaled in any ways. 376 const State& s(getDrawingState()); 377 378 // apply the projection's clipping to the window crop in 379 // layerstack space, and convert-back to layer space. 380 // if there are no window scaling involved, this operation will map to full 381 // pixels in the buffer. 382 // FIXME: the 3 lines below can produce slightly incorrect clipping when we have 383 // a viewport clipping and a window transform. we should use floating point to fix this. 384 385 Rect activeCrop(s.active.w, s.active.h); 386 if (!s.active.crop.isEmpty()) { 387 activeCrop = s.active.crop; 388 } 389 390 activeCrop = s.transform.transform(activeCrop); 391 activeCrop.intersect(hw->getViewport(), &activeCrop); 392 activeCrop = s.transform.inverse().transform(activeCrop); 393 394 // This needs to be here as transform.transform(Rect) computes the 395 // transformed rect and then takes the bounding box of the result before 396 // returning. This means 397 // transform.inverse().transform(transform.transform(Rect)) != Rect 398 // in which case we need to make sure the final rect is clipped to the 399 // display bounds. 400 activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop); 401 402 // subtract the transparent region and snap to the bounds 403 activeCrop = reduce(activeCrop, s.activeTransparentRegion); 404 405 if (!activeCrop.isEmpty()) { 406 // Transform the window crop to match the buffer coordinate system, 407 // which means using the inverse of the current transform set on the 408 // SurfaceFlingerConsumer. 409 uint32_t invTransform = mCurrentTransform; 410 if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { 411 /* 412 * the code below applies the display's inverse transform to the buffer 413 */ 414 uint32_t invTransformOrient = hw->getOrientationTransform(); 415 // calculate the inverse transform 416 if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) { 417 invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 418 NATIVE_WINDOW_TRANSFORM_FLIP_H; 419 // If the transform has been rotated the axis of flip has been swapped 420 // so we need to swap which flip operations we are performing 421 bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0; 422 bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0; 423 if (is_h_flipped != is_v_flipped) { 424 invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 425 NATIVE_WINDOW_TRANSFORM_FLIP_H; 426 } 427 } 428 // and apply to the current transform 429 invTransform = (Transform(invTransform) * Transform(invTransformOrient)).getOrientation(); 430 } 431 432 int winWidth = s.active.w; 433 int winHeight = s.active.h; 434 if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 435 // If the activeCrop has been rotate the ends are rotated but not 436 // the space itself so when transforming ends back we can't rely on 437 // a modification of the axes of rotation. To account for this we 438 // need to reorient the inverse rotation in terms of the current 439 // axes of rotation. 440 bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0; 441 bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0; 442 if (is_h_flipped == is_v_flipped) { 443 invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 444 NATIVE_WINDOW_TRANSFORM_FLIP_H; 445 } 446 winWidth = s.active.h; 447 winHeight = s.active.w; 448 } 449 const Rect winCrop = activeCrop.transform( 450 invTransform, s.active.w, s.active.h); 451 452 // below, crop is intersected with winCrop expressed in crop's coordinate space 453 float xScale = crop.getWidth() / float(winWidth); 454 float yScale = crop.getHeight() / float(winHeight); 455 456 float insetL = winCrop.left * xScale; 457 float insetT = winCrop.top * yScale; 458 float insetR = (winWidth - winCrop.right ) * xScale; 459 float insetB = (winHeight - winCrop.bottom) * yScale; 460 461 crop.left += insetL; 462 crop.top += insetT; 463 crop.right -= insetR; 464 crop.bottom -= insetB; 465 } 466 return crop; 467} 468 469void Layer::setGeometry( 470 const sp<const DisplayDevice>& hw, 471 HWComposer::HWCLayerInterface& layer) 472{ 473 layer.setDefaultState(); 474 475 // enable this layer 476 layer.setSkip(false); 477 478 if (isSecure() && !hw->isSecure()) { 479 layer.setSkip(true); 480 } 481 482 // this gives us only the "orientation" component of the transform 483 const State& s(getDrawingState()); 484 if (!isOpaque(s) || s.alpha != 0xFF) { 485 layer.setBlending(mPremultipliedAlpha ? 486 HWC_BLENDING_PREMULT : 487 HWC_BLENDING_COVERAGE); 488 } 489 490 // apply the layer's transform, followed by the display's global transform 491 // here we're guaranteed that the layer's transform preserves rects 492 Region activeTransparentRegion(s.activeTransparentRegion); 493 if (!s.active.crop.isEmpty()) { 494 Rect activeCrop(s.active.crop); 495 activeCrop = s.transform.transform(activeCrop); 496 activeCrop.intersect(hw->getViewport(), &activeCrop); 497 activeCrop = s.transform.inverse().transform(activeCrop); 498 // This needs to be here as transform.transform(Rect) computes the 499 // transformed rect and then takes the bounding box of the result before 500 // returning. This means 501 // transform.inverse().transform(transform.transform(Rect)) != Rect 502 // in which case we need to make sure the final rect is clipped to the 503 // display bounds. 504 activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop); 505 // mark regions outside the crop as transparent 506 activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top)); 507 activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, 508 s.active.w, s.active.h)); 509 activeTransparentRegion.orSelf(Rect(0, activeCrop.top, 510 activeCrop.left, activeCrop.bottom)); 511 activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top, 512 s.active.w, activeCrop.bottom)); 513 } 514 Rect frame(s.transform.transform(computeBounds(activeTransparentRegion))); 515 frame.intersect(hw->getViewport(), &frame); 516 const Transform& tr(hw->getTransform()); 517 layer.setFrame(tr.transform(frame)); 518 layer.setCrop(computeCrop(hw)); 519 layer.setPlaneAlpha(s.alpha); 520 521 /* 522 * Transformations are applied in this order: 523 * 1) buffer orientation/flip/mirror 524 * 2) state transformation (window manager) 525 * 3) layer orientation (screen orientation) 526 * (NOTE: the matrices are multiplied in reverse order) 527 */ 528 529 const Transform bufferOrientation(mCurrentTransform); 530 Transform transform(tr * s.transform * bufferOrientation); 531 532 if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { 533 /* 534 * the code below applies the display's inverse transform to the buffer 535 */ 536 uint32_t invTransform = hw->getOrientationTransform(); 537 uint32_t t_orientation = transform.getOrientation(); 538 // calculate the inverse transform 539 if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 540 invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 541 NATIVE_WINDOW_TRANSFORM_FLIP_H; 542 // If the transform has been rotated the axis of flip has been swapped 543 // so we need to swap which flip operations we are performing 544 bool is_h_flipped = (t_orientation & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0; 545 bool is_v_flipped = (t_orientation & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0; 546 if (is_h_flipped != is_v_flipped) { 547 t_orientation ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 548 NATIVE_WINDOW_TRANSFORM_FLIP_H; 549 } 550 } 551 // and apply to the current transform 552 transform = Transform(t_orientation) * Transform(invTransform); 553 } 554 555 // this gives us only the "orientation" component of the transform 556 const uint32_t orientation = transform.getOrientation(); 557 if (orientation & Transform::ROT_INVALID) { 558 // we can only handle simple transformation 559 layer.setSkip(true); 560 } else { 561 layer.setTransform(orientation); 562 } 563} 564 565void Layer::setPerFrameData(const sp<const DisplayDevice>& hw, 566 HWComposer::HWCLayerInterface& layer) { 567 // we have to set the visible region on every frame because 568 // we currently free it during onLayerDisplayed(), which is called 569 // after HWComposer::commit() -- every frame. 570 // Apply this display's projection's viewport to the visible region 571 // before giving it to the HWC HAL. 572 const Transform& tr = hw->getTransform(); 573 Region visible = tr.transform(visibleRegion.intersect(hw->getViewport())); 574 layer.setVisibleRegionScreen(visible); 575 layer.setSurfaceDamage(surfaceDamageRegion); 576 577 if (mSidebandStream.get()) { 578 layer.setSidebandStream(mSidebandStream); 579 } else { 580 // NOTE: buffer can be NULL if the client never drew into this 581 // layer yet, or if we ran out of memory 582 layer.setBuffer(mActiveBuffer); 583 } 584} 585 586void Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */, 587 HWComposer::HWCLayerInterface& layer) { 588 int fenceFd = -1; 589 590 // TODO: there is a possible optimization here: we only need to set the 591 // acquire fence the first time a new buffer is acquired on EACH display. 592 593 if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_CURSOR_OVERLAY) { 594 sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence(); 595 if (fence->isValid()) { 596 fenceFd = fence->dup(); 597 if (fenceFd == -1) { 598 ALOGW("failed to dup layer fence, skipping sync: %d", errno); 599 } 600 } 601 } 602 layer.setAcquireFenceFd(fenceFd); 603} 604 605Rect Layer::getPosition( 606 const sp<const DisplayDevice>& hw) 607{ 608 // this gives us only the "orientation" component of the transform 609 const State& s(getCurrentState()); 610 611 // apply the layer's transform, followed by the display's global transform 612 // here we're guaranteed that the layer's transform preserves rects 613 Rect win(s.active.w, s.active.h); 614 if (!s.active.crop.isEmpty()) { 615 win.intersect(s.active.crop, &win); 616 } 617 // subtract the transparent region and snap to the bounds 618 Rect bounds = reduce(win, s.activeTransparentRegion); 619 Rect frame(s.transform.transform(bounds)); 620 frame.intersect(hw->getViewport(), &frame); 621 const Transform& tr(hw->getTransform()); 622 return Rect(tr.transform(frame)); 623} 624 625// --------------------------------------------------------------------------- 626// drawing... 627// --------------------------------------------------------------------------- 628 629void Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const { 630 onDraw(hw, clip, false); 631} 632 633void Layer::draw(const sp<const DisplayDevice>& hw, 634 bool useIdentityTransform) const { 635 onDraw(hw, Region(hw->bounds()), useIdentityTransform); 636} 637 638void Layer::draw(const sp<const DisplayDevice>& hw) const { 639 onDraw(hw, Region(hw->bounds()), false); 640} 641 642void Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip, 643 bool useIdentityTransform) const 644{ 645 ATRACE_CALL(); 646 647 if (CC_UNLIKELY(mActiveBuffer == 0)) { 648 // the texture has not been created yet, this Layer has 649 // in fact never been drawn into. This happens frequently with 650 // SurfaceView because the WindowManager can't know when the client 651 // has drawn the first time. 652 653 // If there is nothing under us, we paint the screen in black, otherwise 654 // we just skip this update. 655 656 // figure out if there is something below us 657 Region under; 658 const SurfaceFlinger::LayerVector& drawingLayers( 659 mFlinger->mDrawingState.layersSortedByZ); 660 const size_t count = drawingLayers.size(); 661 for (size_t i=0 ; i<count ; ++i) { 662 const sp<Layer>& layer(drawingLayers[i]); 663 if (layer.get() == static_cast<Layer const*>(this)) 664 break; 665 under.orSelf( hw->getTransform().transform(layer->visibleRegion) ); 666 } 667 // if not everything below us is covered, we plug the holes! 668 Region holes(clip.subtract(under)); 669 if (!holes.isEmpty()) { 670 clearWithOpenGL(hw, holes, 0, 0, 0, 1); 671 } 672 return; 673 } 674 675 // Bind the current buffer to the GL texture, and wait for it to be 676 // ready for us to draw into. 677 status_t err = mSurfaceFlingerConsumer->bindTextureImage(); 678 if (err != NO_ERROR) { 679 ALOGW("onDraw: bindTextureImage failed (err=%d)", err); 680 // Go ahead and draw the buffer anyway; no matter what we do the screen 681 // is probably going to have something visibly wrong. 682 } 683 684 bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure()); 685 686 RenderEngine& engine(mFlinger->getRenderEngine()); 687 688 if (!blackOutLayer) { 689 // TODO: we could be more subtle with isFixedSize() 690 const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize(); 691 692 // Query the texture matrix given our current filtering mode. 693 float textureMatrix[16]; 694 mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering); 695 mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix); 696 697 if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { 698 699 /* 700 * the code below applies the display's inverse transform to the texture transform 701 */ 702 703 // create a 4x4 transform matrix from the display transform flags 704 const mat4 flipH(-1,0,0,0, 0,1,0,0, 0,0,1,0, 1,0,0,1); 705 const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1); 706 const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1); 707 708 mat4 tr; 709 uint32_t transform = hw->getOrientationTransform(); 710 if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90) 711 tr = tr * rot90; 712 if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H) 713 tr = tr * flipH; 714 if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V) 715 tr = tr * flipV; 716 717 // calculate the inverse 718 tr = inverse(tr); 719 720 // and finally apply it to the original texture matrix 721 const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr); 722 memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix)); 723 } 724 725 // Set things up for texturing. 726 mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight()); 727 mTexture.setFiltering(useFiltering); 728 mTexture.setMatrix(textureMatrix); 729 730 engine.setupLayerTexturing(mTexture); 731 } else { 732 engine.setupLayerBlackedOut(); 733 } 734 drawWithOpenGL(hw, clip, useIdentityTransform); 735 engine.disableTexturing(); 736} 737 738 739void Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw, 740 const Region& /* clip */, float red, float green, float blue, 741 float alpha) const 742{ 743 RenderEngine& engine(mFlinger->getRenderEngine()); 744 computeGeometry(hw, mMesh, false); 745 engine.setupFillWithColor(red, green, blue, alpha); 746 engine.drawMesh(mMesh); 747} 748 749void Layer::clearWithOpenGL( 750 const sp<const DisplayDevice>& hw, const Region& clip) const { 751 clearWithOpenGL(hw, clip, 0,0,0,0); 752} 753 754void Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw, 755 const Region& /* clip */, bool useIdentityTransform) const { 756 const State& s(getDrawingState()); 757 758 computeGeometry(hw, mMesh, useIdentityTransform); 759 760 /* 761 * NOTE: the way we compute the texture coordinates here produces 762 * different results than when we take the HWC path -- in the later case 763 * the "source crop" is rounded to texel boundaries. 764 * This can produce significantly different results when the texture 765 * is scaled by a large amount. 766 * 767 * The GL code below is more logical (imho), and the difference with 768 * HWC is due to a limitation of the HWC API to integers -- a question 769 * is suspend is whether we should ignore this problem or revert to 770 * GL composition when a buffer scaling is applied (maybe with some 771 * minimal value)? Or, we could make GL behave like HWC -- but this feel 772 * like more of a hack. 773 */ 774 const Rect win(computeBounds()); 775 776 float left = float(win.left) / float(s.active.w); 777 float top = float(win.top) / float(s.active.h); 778 float right = float(win.right) / float(s.active.w); 779 float bottom = float(win.bottom) / float(s.active.h); 780 781 // TODO: we probably want to generate the texture coords with the mesh 782 // here we assume that we only have 4 vertices 783 Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>()); 784 texCoords[0] = vec2(left, 1.0f - top); 785 texCoords[1] = vec2(left, 1.0f - bottom); 786 texCoords[2] = vec2(right, 1.0f - bottom); 787 texCoords[3] = vec2(right, 1.0f - top); 788 789 RenderEngine& engine(mFlinger->getRenderEngine()); 790 engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), s.alpha); 791 engine.drawMesh(mMesh); 792 engine.disableBlending(); 793} 794 795uint32_t Layer::getProducerStickyTransform() const { 796 int producerStickyTransform = 0; 797 int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform); 798 if (ret != OK) { 799 ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__, 800 strerror(-ret), ret); 801 return 0; 802 } 803 return static_cast<uint32_t>(producerStickyTransform); 804} 805 806void Layer::addSyncPoint(std::shared_ptr<SyncPoint> point) { 807 uint64_t headFrameNumber = 0; 808 { 809 Mutex::Autolock lock(mQueueItemLock); 810 if (!mQueueItems.empty()) { 811 headFrameNumber = mQueueItems[0].mFrameNumber; 812 } else { 813 headFrameNumber = mLastFrameNumberReceived; 814 } 815 } 816 817 if (point->getFrameNumber() <= headFrameNumber) { 818 point->setFrameAvailable(); 819 } else { 820 mLocalSyncPoints.push_back(std::move(point)); 821 } 822} 823 824void Layer::setFiltering(bool filtering) { 825 mFiltering = filtering; 826} 827 828bool Layer::getFiltering() const { 829 return mFiltering; 830} 831 832// As documented in libhardware header, formats in the range 833// 0x100 - 0x1FF are specific to the HAL implementation, and 834// are known to have no alpha channel 835// TODO: move definition for device-specific range into 836// hardware.h, instead of using hard-coded values here. 837#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF) 838 839bool Layer::getOpacityForFormat(uint32_t format) { 840 if (HARDWARE_IS_DEVICE_FORMAT(format)) { 841 return true; 842 } 843 switch (format) { 844 case HAL_PIXEL_FORMAT_RGBA_8888: 845 case HAL_PIXEL_FORMAT_BGRA_8888: 846 return false; 847 } 848 // in all other case, we have no blending (also for unknown formats) 849 return true; 850} 851 852// ---------------------------------------------------------------------------- 853// local state 854// ---------------------------------------------------------------------------- 855 856void Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh, 857 bool useIdentityTransform) const 858{ 859 const Layer::State& s(getDrawingState()); 860 const Transform tr(useIdentityTransform ? 861 hw->getTransform() : hw->getTransform() * s.transform); 862 const uint32_t hw_h = hw->getHeight(); 863 Rect win(s.active.w, s.active.h); 864 if (!s.active.crop.isEmpty()) { 865 win.intersect(s.active.crop, &win); 866 } 867 // subtract the transparent region and snap to the bounds 868 win = reduce(win, s.activeTransparentRegion); 869 870 Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>()); 871 position[0] = tr.transform(win.left, win.top); 872 position[1] = tr.transform(win.left, win.bottom); 873 position[2] = tr.transform(win.right, win.bottom); 874 position[3] = tr.transform(win.right, win.top); 875 for (size_t i=0 ; i<4 ; i++) { 876 position[i].y = hw_h - position[i].y; 877 } 878} 879 880bool Layer::isOpaque(const Layer::State& s) const 881{ 882 // if we don't have a buffer yet, we're translucent regardless of the 883 // layer's opaque flag. 884 if (mActiveBuffer == 0) { 885 return false; 886 } 887 888 // if the layer has the opaque flag, then we're always opaque, 889 // otherwise we use the current buffer's format. 890 return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity; 891} 892 893bool Layer::isSecure() const 894{ 895 const Layer::State& s(mDrawingState); 896 return (s.flags & layer_state_t::eLayerSecure); 897} 898 899bool Layer::isProtected() const 900{ 901 const sp<GraphicBuffer>& activeBuffer(mActiveBuffer); 902 return (activeBuffer != 0) && 903 (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED); 904} 905 906bool Layer::isFixedSize() const { 907 return mCurrentScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE; 908} 909 910bool Layer::isCropped() const { 911 return !mCurrentCrop.isEmpty(); 912} 913 914bool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const { 915 return mNeedsFiltering || hw->needsFiltering(); 916} 917 918void Layer::setVisibleRegion(const Region& visibleRegion) { 919 // always called from main thread 920 this->visibleRegion = visibleRegion; 921} 922 923void Layer::setCoveredRegion(const Region& coveredRegion) { 924 // always called from main thread 925 this->coveredRegion = coveredRegion; 926} 927 928void Layer::setVisibleNonTransparentRegion(const Region& 929 setVisibleNonTransparentRegion) { 930 // always called from main thread 931 this->visibleNonTransparentRegion = setVisibleNonTransparentRegion; 932} 933 934// ---------------------------------------------------------------------------- 935// transaction 936// ---------------------------------------------------------------------------- 937 938void Layer::pushPendingState() { 939 if (!mCurrentState.modified) { 940 return; 941 } 942 943 Mutex::Autolock lock(mPendingStateMutex); 944 945 // If this transaction is waiting on the receipt of a frame, generate a sync 946 // point and send it to the remote layer. 947 if (mCurrentState.handle != nullptr) { 948 sp<Handle> handle = static_cast<Handle*>(mCurrentState.handle.get()); 949 sp<Layer> handleLayer = handle->owner.promote(); 950 if (handleLayer == nullptr) { 951 ALOGE("[%s] Unable to promote Layer handle", mName.string()); 952 // If we can't promote the layer we are intended to wait on, 953 // then it is expired or otherwise invalid. Allow this transaction 954 // to be applied as per normal (no synchronization). 955 mCurrentState.handle = nullptr; 956 } else { 957 auto syncPoint = std::make_shared<SyncPoint>( 958 mCurrentState.frameNumber); 959 handleLayer->addSyncPoint(syncPoint); 960 mRemoteSyncPoints.push_back(std::move(syncPoint)); 961 } 962 963 // Wake us up to check if the frame has been received 964 setTransactionFlags(eTransactionNeeded); 965 } 966 mPendingStates.push_back(mCurrentState); 967} 968 969void Layer::popPendingState() { 970 auto oldFlags = mCurrentState.flags; 971 mCurrentState = mPendingStates[0]; 972 mCurrentState.flags = (oldFlags & ~mCurrentState.mask) | 973 (mCurrentState.flags & mCurrentState.mask); 974 975 mPendingStates.removeAt(0); 976} 977 978bool Layer::applyPendingStates() { 979 Mutex::Autolock lock(mPendingStateMutex); 980 981 bool stateUpdateAvailable = false; 982 while (!mPendingStates.empty()) { 983 if (mPendingStates[0].handle != nullptr) { 984 if (mRemoteSyncPoints.empty()) { 985 // If we don't have a sync point for this, apply it anyway. It 986 // will be visually wrong, but it should keep us from getting 987 // into too much trouble. 988 ALOGE("[%s] No local sync point found", mName.string()); 989 popPendingState(); 990 stateUpdateAvailable = true; 991 continue; 992 } 993 994 if (mRemoteSyncPoints.front()->frameIsAvailable()) { 995 // Apply the state update 996 popPendingState(); 997 stateUpdateAvailable = true; 998 999 // Signal our end of the sync point and then dispose of it 1000 mRemoteSyncPoints.front()->setTransactionApplied(); 1001 mRemoteSyncPoints.pop_front(); 1002 } 1003 break; 1004 } else { 1005 popPendingState(); 1006 stateUpdateAvailable = true; 1007 } 1008 } 1009 1010 // If we still have pending updates, wake SurfaceFlinger back up and point 1011 // it at this layer so we can process them 1012 if (!mPendingStates.empty()) { 1013 setTransactionFlags(eTransactionNeeded); 1014 mFlinger->setTransactionFlags(eTraversalNeeded); 1015 } 1016 1017 mCurrentState.modified = false; 1018 return stateUpdateAvailable; 1019} 1020 1021void Layer::notifyAvailableFrames() { 1022 Mutex::Autolock lock(mAvailableFrameMutex); 1023 for (auto frame : mAvailableFrames) { 1024 frame->setFrameAvailable(); 1025 } 1026} 1027 1028uint32_t Layer::doTransaction(uint32_t flags) { 1029 ATRACE_CALL(); 1030 1031 pushPendingState(); 1032 if (!applyPendingStates()) { 1033 return 0; 1034 } 1035 1036 const Layer::State& s(getDrawingState()); 1037 const Layer::State& c(getCurrentState()); 1038 1039 const bool sizeChanged = (c.requested.w != s.requested.w) || 1040 (c.requested.h != s.requested.h); 1041 1042 if (sizeChanged) { 1043 // the size changed, we need to ask our client to request a new buffer 1044 ALOGD_IF(DEBUG_RESIZE, 1045 "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n" 1046 " current={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 1047 " requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n" 1048 " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 1049 " requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n", 1050 this, getName().string(), mCurrentTransform, mCurrentScalingMode, 1051 c.active.w, c.active.h, 1052 c.active.crop.left, 1053 c.active.crop.top, 1054 c.active.crop.right, 1055 c.active.crop.bottom, 1056 c.active.crop.getWidth(), 1057 c.active.crop.getHeight(), 1058 c.requested.w, c.requested.h, 1059 c.requested.crop.left, 1060 c.requested.crop.top, 1061 c.requested.crop.right, 1062 c.requested.crop.bottom, 1063 c.requested.crop.getWidth(), 1064 c.requested.crop.getHeight(), 1065 s.active.w, s.active.h, 1066 s.active.crop.left, 1067 s.active.crop.top, 1068 s.active.crop.right, 1069 s.active.crop.bottom, 1070 s.active.crop.getWidth(), 1071 s.active.crop.getHeight(), 1072 s.requested.w, s.requested.h, 1073 s.requested.crop.left, 1074 s.requested.crop.top, 1075 s.requested.crop.right, 1076 s.requested.crop.bottom, 1077 s.requested.crop.getWidth(), 1078 s.requested.crop.getHeight()); 1079 1080 // record the new size, form this point on, when the client request 1081 // a buffer, it'll get the new size. 1082 mSurfaceFlingerConsumer->setDefaultBufferSize( 1083 c.requested.w, c.requested.h); 1084 } 1085 1086 if (!isFixedSize()) { 1087 1088 const bool resizePending = (c.requested.w != c.active.w) || 1089 (c.requested.h != c.active.h); 1090 1091 if (resizePending && mSidebandStream == NULL) { 1092 // don't let Layer::doTransaction update the drawing state 1093 // if we have a pending resize, unless we are in fixed-size mode. 1094 // the drawing state will be updated only once we receive a buffer 1095 // with the correct size. 1096 // 1097 // in particular, we want to make sure the clip (which is part 1098 // of the geometry state) is latched together with the size but is 1099 // latched immediately when no resizing is involved. 1100 // 1101 // If a sideband stream is attached, however, we want to skip this 1102 // optimization so that transactions aren't missed when a buffer 1103 // never arrives 1104 1105 flags |= eDontUpdateGeometryState; 1106 } 1107 } 1108 1109 // always set active to requested, unless we're asked not to 1110 // this is used by Layer, which special cases resizes. 1111 if (flags & eDontUpdateGeometryState) { 1112 } else { 1113 Layer::State& editCurrentState(getCurrentState()); 1114 editCurrentState.active = c.requested; 1115 } 1116 1117 if (s.active != c.active) { 1118 // invalidate and recompute the visible regions if needed 1119 flags |= Layer::eVisibleRegion; 1120 } 1121 1122 if (c.sequence != s.sequence) { 1123 // invalidate and recompute the visible regions if needed 1124 flags |= eVisibleRegion; 1125 this->contentDirty = true; 1126 1127 // we may use linear filtering, if the matrix scales us 1128 const uint8_t type = c.transform.getType(); 1129 mNeedsFiltering = (!c.transform.preserveRects() || 1130 (type >= Transform::SCALE)); 1131 } 1132 1133 // Commit the transaction 1134 commitTransaction(); 1135 return flags; 1136} 1137 1138void Layer::commitTransaction() { 1139 mDrawingState = mCurrentState; 1140} 1141 1142uint32_t Layer::getTransactionFlags(uint32_t flags) { 1143 return android_atomic_and(~flags, &mTransactionFlags) & flags; 1144} 1145 1146uint32_t Layer::setTransactionFlags(uint32_t flags) { 1147 return android_atomic_or(flags, &mTransactionFlags); 1148} 1149 1150bool Layer::setPosition(float x, float y) { 1151 if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y) 1152 return false; 1153 mCurrentState.sequence++; 1154 mCurrentState.transform.set(x, y); 1155 mCurrentState.modified = true; 1156 setTransactionFlags(eTransactionNeeded); 1157 return true; 1158} 1159bool Layer::setLayer(uint32_t z) { 1160 if (mCurrentState.z == z) 1161 return false; 1162 mCurrentState.sequence++; 1163 mCurrentState.z = z; 1164 mCurrentState.modified = true; 1165 setTransactionFlags(eTransactionNeeded); 1166 return true; 1167} 1168bool Layer::setSize(uint32_t w, uint32_t h) { 1169 if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) 1170 return false; 1171 mCurrentState.requested.w = w; 1172 mCurrentState.requested.h = h; 1173 mCurrentState.modified = true; 1174 setTransactionFlags(eTransactionNeeded); 1175 return true; 1176} 1177bool Layer::setAlpha(uint8_t alpha) { 1178 if (mCurrentState.alpha == alpha) 1179 return false; 1180 mCurrentState.sequence++; 1181 mCurrentState.alpha = alpha; 1182 mCurrentState.modified = true; 1183 setTransactionFlags(eTransactionNeeded); 1184 return true; 1185} 1186bool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) { 1187 mCurrentState.sequence++; 1188 mCurrentState.transform.set( 1189 matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy); 1190 mCurrentState.modified = true; 1191 setTransactionFlags(eTransactionNeeded); 1192 return true; 1193} 1194bool Layer::setTransparentRegionHint(const Region& transparent) { 1195 mCurrentState.requestedTransparentRegion = transparent; 1196 mCurrentState.modified = true; 1197 setTransactionFlags(eTransactionNeeded); 1198 return true; 1199} 1200bool Layer::setFlags(uint8_t flags, uint8_t mask) { 1201 const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 1202 if (mCurrentState.flags == newFlags) 1203 return false; 1204 mCurrentState.sequence++; 1205 mCurrentState.flags = newFlags; 1206 mCurrentState.mask = mask; 1207 mCurrentState.modified = true; 1208 setTransactionFlags(eTransactionNeeded); 1209 return true; 1210} 1211bool Layer::setCrop(const Rect& crop) { 1212 if (mCurrentState.requested.crop == crop) 1213 return false; 1214 mCurrentState.sequence++; 1215 mCurrentState.requested.crop = crop; 1216 mCurrentState.modified = true; 1217 setTransactionFlags(eTransactionNeeded); 1218 return true; 1219} 1220 1221bool Layer::setLayerStack(uint32_t layerStack) { 1222 if (mCurrentState.layerStack == layerStack) 1223 return false; 1224 mCurrentState.sequence++; 1225 mCurrentState.layerStack = layerStack; 1226 mCurrentState.modified = true; 1227 setTransactionFlags(eTransactionNeeded); 1228 return true; 1229} 1230 1231void Layer::deferTransactionUntil(const sp<IBinder>& handle, 1232 uint64_t frameNumber) { 1233 mCurrentState.handle = handle; 1234 mCurrentState.frameNumber = frameNumber; 1235 // We don't set eTransactionNeeded, because just receiving a deferral 1236 // request without any other state updates shouldn't actually induce a delay 1237 mCurrentState.modified = true; 1238 pushPendingState(); 1239 mCurrentState.modified = false; 1240} 1241 1242void Layer::useSurfaceDamage() { 1243 if (mFlinger->mForceFullDamage) { 1244 surfaceDamageRegion = Region::INVALID_REGION; 1245 } else { 1246 surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage(); 1247 } 1248} 1249 1250void Layer::useEmptyDamage() { 1251 surfaceDamageRegion.clear(); 1252} 1253 1254// ---------------------------------------------------------------------------- 1255// pageflip handling... 1256// ---------------------------------------------------------------------------- 1257 1258bool Layer::shouldPresentNow(const DispSync& dispSync) const { 1259 if (mSidebandStreamChanged || mSingleBufferMode) { 1260 return true; 1261 } 1262 1263 Mutex::Autolock lock(mQueueItemLock); 1264 if (mQueueItems.empty()) { 1265 return false; 1266 } 1267 auto timestamp = mQueueItems[0].mTimestamp; 1268 nsecs_t expectedPresent = 1269 mSurfaceFlingerConsumer->computeExpectedPresent(dispSync); 1270 1271 // Ignore timestamps more than a second in the future 1272 bool isPlausible = timestamp < (expectedPresent + s2ns(1)); 1273 ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible " 1274 "relative to expectedPresent %" PRId64, mName.string(), timestamp, 1275 expectedPresent); 1276 1277 bool isDue = timestamp < expectedPresent; 1278 return isDue || !isPlausible; 1279} 1280 1281bool Layer::onPreComposition() { 1282 mRefreshPending = false; 1283 return mQueuedFrames > 0 || mSidebandStreamChanged || mSingleBufferMode; 1284} 1285 1286void Layer::onPostComposition() { 1287 if (mFrameLatencyNeeded) { 1288 nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp(); 1289 mFrameTracker.setDesiredPresentTime(desiredPresentTime); 1290 1291 sp<Fence> frameReadyFence = mSurfaceFlingerConsumer->getCurrentFence(); 1292 if (frameReadyFence->isValid()) { 1293 mFrameTracker.setFrameReadyFence(frameReadyFence); 1294 } else { 1295 // There was no fence for this frame, so assume that it was ready 1296 // to be presented at the desired present time. 1297 mFrameTracker.setFrameReadyTime(desiredPresentTime); 1298 } 1299 1300 const HWComposer& hwc = mFlinger->getHwComposer(); 1301 sp<Fence> presentFence = hwc.getDisplayFence(HWC_DISPLAY_PRIMARY); 1302 if (presentFence->isValid()) { 1303 mFrameTracker.setActualPresentFence(presentFence); 1304 } else { 1305 // The HWC doesn't support present fences, so use the refresh 1306 // timestamp instead. 1307 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY); 1308 mFrameTracker.setActualPresentTime(presentTime); 1309 } 1310 1311 mFrameTracker.advanceFrame(); 1312 mFrameLatencyNeeded = false; 1313 } 1314} 1315 1316bool Layer::isVisible() const { 1317 const Layer::State& s(mDrawingState); 1318 return !(s.flags & layer_state_t::eLayerHidden) && s.alpha 1319 && (mActiveBuffer != NULL || mSidebandStream != NULL); 1320} 1321 1322Region Layer::latchBuffer(bool& recomputeVisibleRegions) 1323{ 1324 ATRACE_CALL(); 1325 1326 if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) { 1327 // mSidebandStreamChanged was true 1328 mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream(); 1329 if (mSidebandStream != NULL) { 1330 setTransactionFlags(eTransactionNeeded); 1331 mFlinger->setTransactionFlags(eTraversalNeeded); 1332 } 1333 recomputeVisibleRegions = true; 1334 1335 const State& s(getDrawingState()); 1336 return s.transform.transform(Region(Rect(s.active.w, s.active.h))); 1337 } 1338 1339 Region outDirtyRegion; 1340 if (mQueuedFrames > 0 || mSingleBufferMode) { 1341 1342 // if we've already called updateTexImage() without going through 1343 // a composition step, we have to skip this layer at this point 1344 // because we cannot call updateTeximage() without a corresponding 1345 // compositionComplete() call. 1346 // we'll trigger an update in onPreComposition(). 1347 if (mRefreshPending) { 1348 return outDirtyRegion; 1349 } 1350 1351 // Capture the old state of the layer for comparisons later 1352 const State& s(getDrawingState()); 1353 const bool oldOpacity = isOpaque(s); 1354 sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer; 1355 1356 struct Reject : public SurfaceFlingerConsumer::BufferRejecter { 1357 Layer::State& front; 1358 Layer::State& current; 1359 bool& recomputeVisibleRegions; 1360 bool stickyTransformSet; 1361 Reject(Layer::State& front, Layer::State& current, 1362 bool& recomputeVisibleRegions, bool stickySet) 1363 : front(front), current(current), 1364 recomputeVisibleRegions(recomputeVisibleRegions), 1365 stickyTransformSet(stickySet) { 1366 } 1367 1368 virtual bool reject(const sp<GraphicBuffer>& buf, 1369 const BufferItem& item) { 1370 if (buf == NULL) { 1371 return false; 1372 } 1373 1374 uint32_t bufWidth = buf->getWidth(); 1375 uint32_t bufHeight = buf->getHeight(); 1376 1377 // check that we received a buffer of the right size 1378 // (Take the buffer's orientation into account) 1379 if (item.mTransform & Transform::ROT_90) { 1380 swap(bufWidth, bufHeight); 1381 } 1382 1383 bool isFixedSize = item.mScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE; 1384 if (front.active != front.requested) { 1385 1386 if (isFixedSize || 1387 (bufWidth == front.requested.w && 1388 bufHeight == front.requested.h)) 1389 { 1390 // Here we pretend the transaction happened by updating the 1391 // current and drawing states. Drawing state is only accessed 1392 // in this thread, no need to have it locked 1393 front.active = front.requested; 1394 1395 // We also need to update the current state so that 1396 // we don't end-up overwriting the drawing state with 1397 // this stale current state during the next transaction 1398 // 1399 // NOTE: We don't need to hold the transaction lock here 1400 // because State::active is only accessed from this thread. 1401 current.active = front.active; 1402 1403 // recompute visible region 1404 recomputeVisibleRegions = true; 1405 } 1406 1407 ALOGD_IF(DEBUG_RESIZE, 1408 "latchBuffer/reject: buffer (%ux%u, tr=%02x), scalingMode=%d\n" 1409 " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 1410 " requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n", 1411 bufWidth, bufHeight, item.mTransform, item.mScalingMode, 1412 front.active.w, front.active.h, 1413 front.active.crop.left, 1414 front.active.crop.top, 1415 front.active.crop.right, 1416 front.active.crop.bottom, 1417 front.active.crop.getWidth(), 1418 front.active.crop.getHeight(), 1419 front.requested.w, front.requested.h, 1420 front.requested.crop.left, 1421 front.requested.crop.top, 1422 front.requested.crop.right, 1423 front.requested.crop.bottom, 1424 front.requested.crop.getWidth(), 1425 front.requested.crop.getHeight()); 1426 } 1427 1428 if (!isFixedSize && !stickyTransformSet) { 1429 if (front.active.w != bufWidth || 1430 front.active.h != bufHeight) { 1431 // reject this buffer 1432 ALOGE("rejecting buffer: bufWidth=%d, bufHeight=%d, front.active.{w=%d, h=%d}", 1433 bufWidth, bufHeight, front.active.w, front.active.h); 1434 return true; 1435 } 1436 } 1437 1438 // if the transparent region has changed (this test is 1439 // conservative, but that's fine, worst case we're doing 1440 // a bit of extra work), we latch the new one and we 1441 // trigger a visible-region recompute. 1442 if (!front.activeTransparentRegion.isTriviallyEqual( 1443 front.requestedTransparentRegion)) { 1444 front.activeTransparentRegion = front.requestedTransparentRegion; 1445 1446 // We also need to update the current state so that 1447 // we don't end-up overwriting the drawing state with 1448 // this stale current state during the next transaction 1449 // 1450 // NOTE: We don't need to hold the transaction lock here 1451 // because State::active is only accessed from this thread. 1452 current.activeTransparentRegion = front.activeTransparentRegion; 1453 1454 // recompute visible region 1455 recomputeVisibleRegions = true; 1456 } 1457 1458 return false; 1459 } 1460 }; 1461 1462 Reject r(mDrawingState, getCurrentState(), recomputeVisibleRegions, 1463 getProducerStickyTransform() != 0); 1464 1465 uint64_t maxFrameNumber = 0; 1466 uint64_t headFrameNumber = 0; 1467 { 1468 Mutex::Autolock lock(mQueueItemLock); 1469 maxFrameNumber = mLastFrameNumberReceived; 1470 if (!mQueueItems.empty()) { 1471 headFrameNumber = mQueueItems[0].mFrameNumber; 1472 } 1473 } 1474 1475 bool availableFramesEmpty = true; 1476 { 1477 Mutex::Autolock lock(mAvailableFrameMutex); 1478 availableFramesEmpty = mAvailableFrames.empty(); 1479 } 1480 if (!availableFramesEmpty) { 1481 Mutex::Autolock lock(mAvailableFrameMutex); 1482 bool matchingFramesFound = false; 1483 bool allTransactionsApplied = true; 1484 for (auto& frame : mAvailableFrames) { 1485 if (headFrameNumber != frame->getFrameNumber()) { 1486 break; 1487 } 1488 matchingFramesFound = true; 1489 allTransactionsApplied &= frame->transactionIsApplied(); 1490 } 1491 if (matchingFramesFound && !allTransactionsApplied) { 1492 mFlinger->signalLayerUpdate(); 1493 return outDirtyRegion; 1494 } 1495 } 1496 1497 // This boolean is used to make sure that SurfaceFlinger's shadow copy 1498 // of the buffer queue isn't modified when the buffer queue is returning 1499 // BufferItem's that weren't actually queued. This can happen in single 1500 // buffer mode. 1501 bool queuedBuffer = false; 1502 status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r, 1503 mFlinger->mPrimaryDispSync, &mSingleBufferMode, &queuedBuffer, 1504 maxFrameNumber); 1505 if (updateResult == BufferQueue::PRESENT_LATER) { 1506 // Producer doesn't want buffer to be displayed yet. Signal a 1507 // layer update so we check again at the next opportunity. 1508 mFlinger->signalLayerUpdate(); 1509 return outDirtyRegion; 1510 } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) { 1511 // If the buffer has been rejected, remove it from the shadow queue 1512 // and return early 1513 if (queuedBuffer) { 1514 Mutex::Autolock lock(mQueueItemLock); 1515 mQueueItems.removeAt(0); 1516 android_atomic_dec(&mQueuedFrames); 1517 } 1518 return outDirtyRegion; 1519 } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) { 1520 // This can occur if something goes wrong when trying to create the 1521 // EGLImage for this buffer. If this happens, the buffer has already 1522 // been released, so we need to clean up the queue and bug out 1523 // early. 1524 if (queuedBuffer) { 1525 Mutex::Autolock lock(mQueueItemLock); 1526 mQueueItems.clear(); 1527 android_atomic_and(0, &mQueuedFrames); 1528 } 1529 1530 // Once we have hit this state, the shadow queue may no longer 1531 // correctly reflect the incoming BufferQueue's contents, so even if 1532 // updateTexImage starts working, the only safe course of action is 1533 // to continue to ignore updates. 1534 mUpdateTexImageFailed = true; 1535 1536 return outDirtyRegion; 1537 } 1538 1539 if (queuedBuffer) { 1540 // Autolock scope 1541 auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber(); 1542 1543 Mutex::Autolock lock(mQueueItemLock); 1544 1545 // Remove any stale buffers that have been dropped during 1546 // updateTexImage 1547 while (mQueueItems[0].mFrameNumber != currentFrameNumber) { 1548 mQueueItems.removeAt(0); 1549 android_atomic_dec(&mQueuedFrames); 1550 } 1551 1552 mQueueItems.removeAt(0); 1553 } 1554 1555 1556 // Decrement the queued-frames count. Signal another event if we 1557 // have more frames pending. 1558 if ((queuedBuffer && android_atomic_dec(&mQueuedFrames) > 1) 1559 || mSingleBufferMode) { 1560 mFlinger->signalLayerUpdate(); 1561 } 1562 1563 if (!availableFramesEmpty) { 1564 Mutex::Autolock lock(mAvailableFrameMutex); 1565 auto frameNumber = mSurfaceFlingerConsumer->getFrameNumber(); 1566 while (!mAvailableFrames.empty() && 1567 frameNumber == mAvailableFrames.front()->getFrameNumber()) { 1568 mAvailableFrames.pop_front(); 1569 } 1570 } 1571 1572 if (updateResult != NO_ERROR) { 1573 // something happened! 1574 recomputeVisibleRegions = true; 1575 return outDirtyRegion; 1576 } 1577 1578 // update the active buffer 1579 mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer(); 1580 if (mActiveBuffer == NULL) { 1581 // this can only happen if the very first buffer was rejected. 1582 return outDirtyRegion; 1583 } 1584 1585 mRefreshPending = true; 1586 mFrameLatencyNeeded = true; 1587 if (oldActiveBuffer == NULL) { 1588 // the first time we receive a buffer, we need to trigger a 1589 // geometry invalidation. 1590 recomputeVisibleRegions = true; 1591 } 1592 1593 Rect crop(mSurfaceFlingerConsumer->getCurrentCrop()); 1594 const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform()); 1595 const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode()); 1596 if ((crop != mCurrentCrop) || 1597 (transform != mCurrentTransform) || 1598 (scalingMode != mCurrentScalingMode)) 1599 { 1600 mCurrentCrop = crop; 1601 mCurrentTransform = transform; 1602 mCurrentScalingMode = scalingMode; 1603 recomputeVisibleRegions = true; 1604 } 1605 1606 if (oldActiveBuffer != NULL) { 1607 uint32_t bufWidth = mActiveBuffer->getWidth(); 1608 uint32_t bufHeight = mActiveBuffer->getHeight(); 1609 if (bufWidth != uint32_t(oldActiveBuffer->width) || 1610 bufHeight != uint32_t(oldActiveBuffer->height)) { 1611 recomputeVisibleRegions = true; 1612 } 1613 } 1614 1615 mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format); 1616 if (oldOpacity != isOpaque(s)) { 1617 recomputeVisibleRegions = true; 1618 } 1619 1620 // FIXME: postedRegion should be dirty & bounds 1621 Region dirtyRegion(Rect(s.active.w, s.active.h)); 1622 1623 // transform the dirty region to window-manager space 1624 outDirtyRegion = (s.transform.transform(dirtyRegion)); 1625 } 1626 return outDirtyRegion; 1627} 1628 1629uint32_t Layer::getEffectiveUsage(uint32_t usage) const 1630{ 1631 // TODO: should we do something special if mSecure is set? 1632 if (mProtectedByApp) { 1633 // need a hardware-protected path to external video sink 1634 usage |= GraphicBuffer::USAGE_PROTECTED; 1635 } 1636 if (mPotentialCursor) { 1637 usage |= GraphicBuffer::USAGE_CURSOR; 1638 } 1639 usage |= GraphicBuffer::USAGE_HW_COMPOSER; 1640 return usage; 1641} 1642 1643void Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const { 1644 uint32_t orientation = 0; 1645 if (!mFlinger->mDebugDisableTransformHint) { 1646 // The transform hint is used to improve performance, but we can 1647 // only have a single transform hint, it cannot 1648 // apply to all displays. 1649 const Transform& planeTransform(hw->getTransform()); 1650 orientation = planeTransform.getOrientation(); 1651 if (orientation & Transform::ROT_INVALID) { 1652 orientation = 0; 1653 } 1654 } 1655 mSurfaceFlingerConsumer->setTransformHint(orientation); 1656} 1657 1658// ---------------------------------------------------------------------------- 1659// debugging 1660// ---------------------------------------------------------------------------- 1661 1662void Layer::dump(String8& result, Colorizer& colorizer) const 1663{ 1664 const Layer::State& s(getDrawingState()); 1665 1666 colorizer.colorize(result, Colorizer::GREEN); 1667 result.appendFormat( 1668 "+ %s %p (%s)\n", 1669 getTypeId(), this, getName().string()); 1670 colorizer.reset(result); 1671 1672 s.activeTransparentRegion.dump(result, "transparentRegion"); 1673 visibleRegion.dump(result, "visibleRegion"); 1674 surfaceDamageRegion.dump(result, "surfaceDamageRegion"); 1675 sp<Client> client(mClientRef.promote()); 1676 1677 result.appendFormat( " " 1678 "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), crop=(%4d,%4d,%4d,%4d), " 1679 "isOpaque=%1d, invalidate=%1d, " 1680 "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n" 1681 " client=%p\n", 1682 s.layerStack, s.z, s.transform.tx(), s.transform.ty(), s.active.w, s.active.h, 1683 s.active.crop.left, s.active.crop.top, 1684 s.active.crop.right, s.active.crop.bottom, 1685 isOpaque(s), contentDirty, 1686 s.alpha, s.flags, 1687 s.transform[0][0], s.transform[0][1], 1688 s.transform[1][0], s.transform[1][1], 1689 client.get()); 1690 1691 sp<const GraphicBuffer> buf0(mActiveBuffer); 1692 uint32_t w0=0, h0=0, s0=0, f0=0; 1693 if (buf0 != 0) { 1694 w0 = buf0->getWidth(); 1695 h0 = buf0->getHeight(); 1696 s0 = buf0->getStride(); 1697 f0 = buf0->format; 1698 } 1699 result.appendFormat( 1700 " " 1701 "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X]," 1702 " queued-frames=%d, mRefreshPending=%d\n", 1703 mFormat, w0, h0, s0,f0, 1704 mQueuedFrames, mRefreshPending); 1705 1706 if (mSurfaceFlingerConsumer != 0) { 1707 mSurfaceFlingerConsumer->dump(result, " "); 1708 } 1709} 1710 1711void Layer::dumpFrameStats(String8& result) const { 1712 mFrameTracker.dumpStats(result); 1713} 1714 1715void Layer::clearFrameStats() { 1716 mFrameTracker.clearStats(); 1717} 1718 1719void Layer::logFrameStats() { 1720 mFrameTracker.logAndResetStats(mName); 1721} 1722 1723void Layer::getFrameStats(FrameStats* outStats) const { 1724 mFrameTracker.getStats(outStats); 1725} 1726 1727// --------------------------------------------------------------------------- 1728 1729Layer::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger, 1730 const sp<Layer>& layer) 1731 : mFlinger(flinger), mLayer(layer) { 1732} 1733 1734Layer::LayerCleaner::~LayerCleaner() { 1735 // destroy client resources 1736 mFlinger->onLayerDestroyed(mLayer); 1737} 1738 1739// --------------------------------------------------------------------------- 1740}; // namespace android 1741 1742#if defined(__gl_h_) 1743#error "don't include gl/gl.h in this file" 1744#endif 1745 1746#if defined(__gl2_h_) 1747#error "don't include gl2/gl2.h in this file" 1748#endif 1749