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 53 namespace android { 54 55 // --------------------------------------------------------------------------- 56 57 int32_t Layer::sSequence = 1; 58 59 Layer::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 mDebug(false), 68 mFormat(PIXEL_FORMAT_NONE), 69 mTransactionFlags(0), 70 mQueuedFrames(0), 71 mSidebandStreamChanged(false), 72 mCurrentTransform(0), 73 mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), 74 mCurrentOpacity(true), 75 mRefreshPending(false), 76 mFrameLatencyNeeded(false), 77 mFiltering(false), 78 mNeedsFiltering(false), 79 mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2), 80 mSecure(false), 81 mProtectedByApp(false), 82 mHasSurface(false), 83 mClientRef(client), 84 mPotentialCursor(false) 85 { 86 mCurrentCrop.makeInvalid(); 87 mFlinger->getRenderEngine().genTextures(1, &mTextureName); 88 mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName); 89 90 uint32_t layerFlags = 0; 91 if (flags & ISurfaceComposerClient::eHidden) 92 layerFlags |= layer_state_t::eLayerHidden; 93 if (flags & ISurfaceComposerClient::eOpaque) 94 layerFlags |= layer_state_t::eLayerOpaque; 95 96 if (flags & ISurfaceComposerClient::eNonPremultiplied) 97 mPremultipliedAlpha = false; 98 99 mName = name; 100 101 mCurrentState.active.w = w; 102 mCurrentState.active.h = h; 103 mCurrentState.active.crop.makeInvalid(); 104 mCurrentState.z = 0; 105 mCurrentState.alpha = 0xFF; 106 mCurrentState.layerStack = 0; 107 mCurrentState.flags = layerFlags; 108 mCurrentState.sequence = 0; 109 mCurrentState.transform.set(0, 0); 110 mCurrentState.requested = mCurrentState.active; 111 112 // drawing state & current state are identical 113 mDrawingState = mCurrentState; 114 115 nsecs_t displayPeriod = 116 flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY); 117 mFrameTracker.setDisplayRefreshPeriod(displayPeriod); 118 } 119 120 void Layer::onFirstRef() { 121 // Creates a custom BufferQueue for SurfaceFlingerConsumer to use 122 sp<IGraphicBufferProducer> producer; 123 sp<IGraphicBufferConsumer> consumer; 124 BufferQueue::createBufferQueue(&producer, &consumer); 125 mProducer = new MonitoredProducer(producer, mFlinger); 126 mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName); 127 mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); 128 mSurfaceFlingerConsumer->setContentsChangedListener(this); 129 mSurfaceFlingerConsumer->setName(mName); 130 131 #ifdef TARGET_DISABLE_TRIPLE_BUFFERING 132 #warning "disabling triple buffering" 133 mSurfaceFlingerConsumer->setDefaultMaxBufferCount(2); 134 #else 135 mSurfaceFlingerConsumer->setDefaultMaxBufferCount(3); 136 #endif 137 138 const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice()); 139 updateTransformHint(hw); 140 } 141 142 Layer::~Layer() { 143 sp<Client> c(mClientRef.promote()); 144 if (c != 0) { 145 c->detachLayer(this); 146 } 147 mFlinger->deleteTextureAsync(mTextureName); 148 mFrameTracker.logAndResetStats(mName); 149 } 150 151 // --------------------------------------------------------------------------- 152 // callbacks 153 // --------------------------------------------------------------------------- 154 155 void Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */, 156 HWComposer::HWCLayerInterface* layer) { 157 if (layer) { 158 layer->onDisplayed(); 159 mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence()); 160 } 161 } 162 163 void Layer::onFrameAvailable(const BufferItem& item) { 164 // Add this buffer from our internal queue tracker 165 { // Autolock scope 166 Mutex::Autolock lock(mQueueItemLock); 167 mQueueItems.push_back(item); 168 } 169 170 android_atomic_inc(&mQueuedFrames); 171 mFlinger->signalLayerUpdate(); 172 } 173 174 void Layer::onFrameReplaced(const BufferItem& item) { 175 Mutex::Autolock lock(mQueueItemLock); 176 if (mQueueItems.empty()) { 177 ALOGE("Can't replace a frame on an empty queue"); 178 return; 179 } 180 mQueueItems.editItemAt(0) = item; 181 } 182 183 void Layer::onSidebandStreamChanged() { 184 if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) { 185 // mSidebandStreamChanged was false 186 mFlinger->signalLayerUpdate(); 187 } 188 } 189 190 // called with SurfaceFlinger::mStateLock from the drawing thread after 191 // the layer has been remove from the current state list (and just before 192 // it's removed from the drawing state list) 193 void Layer::onRemoved() { 194 mSurfaceFlingerConsumer->abandon(); 195 } 196 197 // --------------------------------------------------------------------------- 198 // set-up 199 // --------------------------------------------------------------------------- 200 201 const String8& Layer::getName() const { 202 return mName; 203 } 204 205 status_t Layer::setBuffers( uint32_t w, uint32_t h, 206 PixelFormat format, uint32_t flags) 207 { 208 uint32_t const maxSurfaceDims = min( 209 mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims()); 210 211 // never allow a surface larger than what our underlying GL implementation 212 // can handle. 213 if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) { 214 ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h)); 215 return BAD_VALUE; 216 } 217 218 mFormat = format; 219 220 mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false; 221 mSecure = (flags & ISurfaceComposerClient::eSecure) ? true : false; 222 mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false; 223 mCurrentOpacity = getOpacityForFormat(format); 224 225 mSurfaceFlingerConsumer->setDefaultBufferSize(w, h); 226 mSurfaceFlingerConsumer->setDefaultBufferFormat(format); 227 mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); 228 229 return NO_ERROR; 230 } 231 232 sp<IBinder> Layer::getHandle() { 233 Mutex::Autolock _l(mLock); 234 235 LOG_ALWAYS_FATAL_IF(mHasSurface, 236 "Layer::getHandle() has already been called"); 237 238 mHasSurface = true; 239 240 /* 241 * The layer handle is just a BBinder object passed to the client 242 * (remote process) -- we don't keep any reference on our side such that 243 * the dtor is called when the remote side let go of its reference. 244 * 245 * LayerCleaner ensures that mFlinger->onLayerDestroyed() is called for 246 * this layer when the handle is destroyed. 247 */ 248 249 class Handle : public BBinder, public LayerCleaner { 250 wp<const Layer> mOwner; 251 public: 252 Handle(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer) 253 : LayerCleaner(flinger, layer), mOwner(layer) { 254 } 255 }; 256 257 return new Handle(mFlinger, this); 258 } 259 260 sp<IGraphicBufferProducer> Layer::getProducer() const { 261 return mProducer; 262 } 263 264 // --------------------------------------------------------------------------- 265 // h/w composer set-up 266 // --------------------------------------------------------------------------- 267 268 Rect Layer::getContentCrop() const { 269 // this is the crop rectangle that applies to the buffer 270 // itself (as opposed to the window) 271 Rect crop; 272 if (!mCurrentCrop.isEmpty()) { 273 // if the buffer crop is defined, we use that 274 crop = mCurrentCrop; 275 } else if (mActiveBuffer != NULL) { 276 // otherwise we use the whole buffer 277 crop = mActiveBuffer->getBounds(); 278 } else { 279 // if we don't have a buffer yet, we use an empty/invalid crop 280 crop.makeInvalid(); 281 } 282 return crop; 283 } 284 285 static Rect reduce(const Rect& win, const Region& exclude) { 286 if (CC_LIKELY(exclude.isEmpty())) { 287 return win; 288 } 289 if (exclude.isRect()) { 290 return win.reduce(exclude.getBounds()); 291 } 292 return Region(win).subtract(exclude).getBounds(); 293 } 294 295 Rect Layer::computeBounds() const { 296 const Layer::State& s(getDrawingState()); 297 return computeBounds(s.activeTransparentRegion); 298 } 299 300 Rect Layer::computeBounds(const Region& activeTransparentRegion) const { 301 const Layer::State& s(getDrawingState()); 302 Rect win(s.active.w, s.active.h); 303 if (!s.active.crop.isEmpty()) { 304 win.intersect(s.active.crop, &win); 305 } 306 // subtract the transparent region and snap to the bounds 307 return reduce(win, activeTransparentRegion); 308 } 309 310 FloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const { 311 // the content crop is the area of the content that gets scaled to the 312 // layer's size. 313 FloatRect crop(getContentCrop()); 314 315 // the active.crop is the area of the window that gets cropped, but not 316 // scaled in any ways. 317 const State& s(getDrawingState()); 318 319 // apply the projection's clipping to the window crop in 320 // layerstack space, and convert-back to layer space. 321 // if there are no window scaling involved, this operation will map to full 322 // pixels in the buffer. 323 // FIXME: the 3 lines below can produce slightly incorrect clipping when we have 324 // a viewport clipping and a window transform. we should use floating point to fix this. 325 326 Rect activeCrop(s.active.w, s.active.h); 327 if (!s.active.crop.isEmpty()) { 328 activeCrop = s.active.crop; 329 } 330 331 activeCrop = s.transform.transform(activeCrop); 332 activeCrop.intersect(hw->getViewport(), &activeCrop); 333 activeCrop = s.transform.inverse().transform(activeCrop); 334 335 // This needs to be here as transform.transform(Rect) computes the 336 // transformed rect and then takes the bounding box of the result before 337 // returning. This means 338 // transform.inverse().transform(transform.transform(Rect)) != Rect 339 // in which case we need to make sure the final rect is clipped to the 340 // display bounds. 341 activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop); 342 343 // subtract the transparent region and snap to the bounds 344 activeCrop = reduce(activeCrop, s.activeTransparentRegion); 345 346 if (!activeCrop.isEmpty()) { 347 // Transform the window crop to match the buffer coordinate system, 348 // which means using the inverse of the current transform set on the 349 // SurfaceFlingerConsumer. 350 uint32_t invTransform = mCurrentTransform; 351 if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { 352 /* 353 * the code below applies the display's inverse transform to the buffer 354 */ 355 uint32_t invTransformOrient = hw->getOrientationTransform(); 356 // calculate the inverse transform 357 if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) { 358 invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 359 NATIVE_WINDOW_TRANSFORM_FLIP_H; 360 // If the transform has been rotated the axis of flip has been swapped 361 // so we need to swap which flip operations we are performing 362 bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0; 363 bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0; 364 if (is_h_flipped != is_v_flipped) { 365 invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 366 NATIVE_WINDOW_TRANSFORM_FLIP_H; 367 } 368 } 369 // and apply to the current transform 370 invTransform = (Transform(invTransform) * Transform(invTransformOrient)).getOrientation(); 371 } 372 373 int winWidth = s.active.w; 374 int winHeight = s.active.h; 375 if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 376 // If the activeCrop has been rotate the ends are rotated but not 377 // the space itself so when transforming ends back we can't rely on 378 // a modification of the axes of rotation. To account for this we 379 // need to reorient the inverse rotation in terms of the current 380 // axes of rotation. 381 bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0; 382 bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0; 383 if (is_h_flipped == is_v_flipped) { 384 invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 385 NATIVE_WINDOW_TRANSFORM_FLIP_H; 386 } 387 winWidth = s.active.h; 388 winHeight = s.active.w; 389 } 390 const Rect winCrop = activeCrop.transform( 391 invTransform, s.active.w, s.active.h); 392 393 // below, crop is intersected with winCrop expressed in crop's coordinate space 394 float xScale = crop.getWidth() / float(winWidth); 395 float yScale = crop.getHeight() / float(winHeight); 396 397 float insetL = winCrop.left * xScale; 398 float insetT = winCrop.top * yScale; 399 float insetR = (winWidth - winCrop.right ) * xScale; 400 float insetB = (winHeight - winCrop.bottom) * yScale; 401 402 crop.left += insetL; 403 crop.top += insetT; 404 crop.right -= insetR; 405 crop.bottom -= insetB; 406 } 407 return crop; 408 } 409 410 void Layer::setGeometry( 411 const sp<const DisplayDevice>& hw, 412 HWComposer::HWCLayerInterface& layer) 413 { 414 layer.setDefaultState(); 415 416 // enable this layer 417 layer.setSkip(false); 418 419 if (isSecure() && !hw->isSecure()) { 420 layer.setSkip(true); 421 } 422 423 // this gives us only the "orientation" component of the transform 424 const State& s(getDrawingState()); 425 if (!isOpaque(s) || s.alpha != 0xFF) { 426 layer.setBlending(mPremultipliedAlpha ? 427 HWC_BLENDING_PREMULT : 428 HWC_BLENDING_COVERAGE); 429 } 430 431 // apply the layer's transform, followed by the display's global transform 432 // here we're guaranteed that the layer's transform preserves rects 433 Region activeTransparentRegion(s.activeTransparentRegion); 434 if (!s.active.crop.isEmpty()) { 435 Rect activeCrop(s.active.crop); 436 activeCrop = s.transform.transform(activeCrop); 437 activeCrop.intersect(hw->getViewport(), &activeCrop); 438 activeCrop = s.transform.inverse().transform(activeCrop); 439 // This needs to be here as transform.transform(Rect) computes the 440 // transformed rect and then takes the bounding box of the result before 441 // returning. This means 442 // transform.inverse().transform(transform.transform(Rect)) != Rect 443 // in which case we need to make sure the final rect is clipped to the 444 // display bounds. 445 activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop); 446 // mark regions outside the crop as transparent 447 activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top)); 448 activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, 449 s.active.w, s.active.h)); 450 activeTransparentRegion.orSelf(Rect(0, activeCrop.top, 451 activeCrop.left, activeCrop.bottom)); 452 activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top, 453 s.active.w, activeCrop.bottom)); 454 } 455 Rect frame(s.transform.transform(computeBounds(activeTransparentRegion))); 456 frame.intersect(hw->getViewport(), &frame); 457 const Transform& tr(hw->getTransform()); 458 layer.setFrame(tr.transform(frame)); 459 layer.setCrop(computeCrop(hw)); 460 layer.setPlaneAlpha(s.alpha); 461 462 /* 463 * Transformations are applied in this order: 464 * 1) buffer orientation/flip/mirror 465 * 2) state transformation (window manager) 466 * 3) layer orientation (screen orientation) 467 * (NOTE: the matrices are multiplied in reverse order) 468 */ 469 470 const Transform bufferOrientation(mCurrentTransform); 471 Transform transform(tr * s.transform * bufferOrientation); 472 473 if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { 474 /* 475 * the code below applies the display's inverse transform to the buffer 476 */ 477 uint32_t invTransform = hw->getOrientationTransform(); 478 uint32_t t_orientation = transform.getOrientation(); 479 // calculate the inverse transform 480 if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 481 invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 482 NATIVE_WINDOW_TRANSFORM_FLIP_H; 483 // If the transform has been rotated the axis of flip has been swapped 484 // so we need to swap which flip operations we are performing 485 bool is_h_flipped = (t_orientation & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0; 486 bool is_v_flipped = (t_orientation & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0; 487 if (is_h_flipped != is_v_flipped) { 488 t_orientation ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 489 NATIVE_WINDOW_TRANSFORM_FLIP_H; 490 } 491 } 492 // and apply to the current transform 493 transform = Transform(t_orientation) * Transform(invTransform); 494 } 495 496 // this gives us only the "orientation" component of the transform 497 const uint32_t orientation = transform.getOrientation(); 498 if (orientation & Transform::ROT_INVALID) { 499 // we can only handle simple transformation 500 layer.setSkip(true); 501 } else { 502 layer.setTransform(orientation); 503 } 504 } 505 506 void Layer::setPerFrameData(const sp<const DisplayDevice>& hw, 507 HWComposer::HWCLayerInterface& layer) { 508 // we have to set the visible region on every frame because 509 // we currently free it during onLayerDisplayed(), which is called 510 // after HWComposer::commit() -- every frame. 511 // Apply this display's projection's viewport to the visible region 512 // before giving it to the HWC HAL. 513 const Transform& tr = hw->getTransform(); 514 Region visible = tr.transform(visibleRegion.intersect(hw->getViewport())); 515 layer.setVisibleRegionScreen(visible); 516 517 if (mSidebandStream.get()) { 518 layer.setSidebandStream(mSidebandStream); 519 } else { 520 // NOTE: buffer can be NULL if the client never drew into this 521 // layer yet, or if we ran out of memory 522 layer.setBuffer(mActiveBuffer); 523 } 524 } 525 526 void Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */, 527 HWComposer::HWCLayerInterface& layer) { 528 int fenceFd = -1; 529 530 // TODO: there is a possible optimization here: we only need to set the 531 // acquire fence the first time a new buffer is acquired on EACH display. 532 533 if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_CURSOR_OVERLAY) { 534 sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence(); 535 if (fence->isValid()) { 536 fenceFd = fence->dup(); 537 if (fenceFd == -1) { 538 ALOGW("failed to dup layer fence, skipping sync: %d", errno); 539 } 540 } 541 } 542 layer.setAcquireFenceFd(fenceFd); 543 } 544 545 Rect Layer::getPosition( 546 const sp<const DisplayDevice>& hw) 547 { 548 // this gives us only the "orientation" component of the transform 549 const State& s(getCurrentState()); 550 551 // apply the layer's transform, followed by the display's global transform 552 // here we're guaranteed that the layer's transform preserves rects 553 Rect win(s.active.w, s.active.h); 554 if (!s.active.crop.isEmpty()) { 555 win.intersect(s.active.crop, &win); 556 } 557 // subtract the transparent region and snap to the bounds 558 Rect bounds = reduce(win, s.activeTransparentRegion); 559 Rect frame(s.transform.transform(bounds)); 560 frame.intersect(hw->getViewport(), &frame); 561 const Transform& tr(hw->getTransform()); 562 return Rect(tr.transform(frame)); 563 } 564 565 // --------------------------------------------------------------------------- 566 // drawing... 567 // --------------------------------------------------------------------------- 568 569 void Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const { 570 onDraw(hw, clip, false); 571 } 572 573 void Layer::draw(const sp<const DisplayDevice>& hw, 574 bool useIdentityTransform) const { 575 onDraw(hw, Region(hw->bounds()), useIdentityTransform); 576 } 577 578 void Layer::draw(const sp<const DisplayDevice>& hw) const { 579 onDraw(hw, Region(hw->bounds()), false); 580 } 581 582 void Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip, 583 bool useIdentityTransform) const 584 { 585 ATRACE_CALL(); 586 587 if (CC_UNLIKELY(mActiveBuffer == 0)) { 588 // the texture has not been created yet, this Layer has 589 // in fact never been drawn into. This happens frequently with 590 // SurfaceView because the WindowManager can't know when the client 591 // has drawn the first time. 592 593 // If there is nothing under us, we paint the screen in black, otherwise 594 // we just skip this update. 595 596 // figure out if there is something below us 597 Region under; 598 const SurfaceFlinger::LayerVector& drawingLayers( 599 mFlinger->mDrawingState.layersSortedByZ); 600 const size_t count = drawingLayers.size(); 601 for (size_t i=0 ; i<count ; ++i) { 602 const sp<Layer>& layer(drawingLayers[i]); 603 if (layer.get() == static_cast<Layer const*>(this)) 604 break; 605 under.orSelf( hw->getTransform().transform(layer->visibleRegion) ); 606 } 607 // if not everything below us is covered, we plug the holes! 608 Region holes(clip.subtract(under)); 609 if (!holes.isEmpty()) { 610 clearWithOpenGL(hw, holes, 0, 0, 0, 1); 611 } 612 return; 613 } 614 615 // Bind the current buffer to the GL texture, and wait for it to be 616 // ready for us to draw into. 617 status_t err = mSurfaceFlingerConsumer->bindTextureImage(); 618 if (err != NO_ERROR) { 619 ALOGW("onDraw: bindTextureImage failed (err=%d)", err); 620 // Go ahead and draw the buffer anyway; no matter what we do the screen 621 // is probably going to have something visibly wrong. 622 } 623 624 bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure()); 625 626 RenderEngine& engine(mFlinger->getRenderEngine()); 627 628 if (!blackOutLayer) { 629 // TODO: we could be more subtle with isFixedSize() 630 const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize(); 631 632 // Query the texture matrix given our current filtering mode. 633 float textureMatrix[16]; 634 mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering); 635 mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix); 636 637 if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { 638 639 /* 640 * the code below applies the display's inverse transform to the texture transform 641 */ 642 643 // create a 4x4 transform matrix from the display transform flags 644 const mat4 flipH(-1,0,0,0, 0,1,0,0, 0,0,1,0, 1,0,0,1); 645 const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1); 646 const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1); 647 648 mat4 tr; 649 uint32_t transform = hw->getOrientationTransform(); 650 if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90) 651 tr = tr * rot90; 652 if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H) 653 tr = tr * flipH; 654 if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V) 655 tr = tr * flipV; 656 657 // calculate the inverse 658 tr = inverse(tr); 659 660 // and finally apply it to the original texture matrix 661 const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr); 662 memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix)); 663 } 664 665 // Set things up for texturing. 666 mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight()); 667 mTexture.setFiltering(useFiltering); 668 mTexture.setMatrix(textureMatrix); 669 670 engine.setupLayerTexturing(mTexture); 671 } else { 672 engine.setupLayerBlackedOut(); 673 } 674 drawWithOpenGL(hw, clip, useIdentityTransform); 675 engine.disableTexturing(); 676 } 677 678 679 void Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw, 680 const Region& /* clip */, float red, float green, float blue, 681 float alpha) const 682 { 683 RenderEngine& engine(mFlinger->getRenderEngine()); 684 computeGeometry(hw, mMesh, false); 685 engine.setupFillWithColor(red, green, blue, alpha); 686 engine.drawMesh(mMesh); 687 } 688 689 void Layer::clearWithOpenGL( 690 const sp<const DisplayDevice>& hw, const Region& clip) const { 691 clearWithOpenGL(hw, clip, 0,0,0,0); 692 } 693 694 void Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw, 695 const Region& /* clip */, bool useIdentityTransform) const { 696 const uint32_t fbHeight = hw->getHeight(); 697 const State& s(getDrawingState()); 698 699 computeGeometry(hw, mMesh, useIdentityTransform); 700 701 /* 702 * NOTE: the way we compute the texture coordinates here produces 703 * different results than when we take the HWC path -- in the later case 704 * the "source crop" is rounded to texel boundaries. 705 * This can produce significantly different results when the texture 706 * is scaled by a large amount. 707 * 708 * The GL code below is more logical (imho), and the difference with 709 * HWC is due to a limitation of the HWC API to integers -- a question 710 * is suspend is whether we should ignore this problem or revert to 711 * GL composition when a buffer scaling is applied (maybe with some 712 * minimal value)? Or, we could make GL behave like HWC -- but this feel 713 * like more of a hack. 714 */ 715 const Rect win(computeBounds()); 716 717 float left = float(win.left) / float(s.active.w); 718 float top = float(win.top) / float(s.active.h); 719 float right = float(win.right) / float(s.active.w); 720 float bottom = float(win.bottom) / float(s.active.h); 721 722 // TODO: we probably want to generate the texture coords with the mesh 723 // here we assume that we only have 4 vertices 724 Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>()); 725 texCoords[0] = vec2(left, 1.0f - top); 726 texCoords[1] = vec2(left, 1.0f - bottom); 727 texCoords[2] = vec2(right, 1.0f - bottom); 728 texCoords[3] = vec2(right, 1.0f - top); 729 730 RenderEngine& engine(mFlinger->getRenderEngine()); 731 engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), s.alpha); 732 engine.drawMesh(mMesh); 733 engine.disableBlending(); 734 } 735 736 uint32_t Layer::getProducerStickyTransform() const { 737 int producerStickyTransform = 0; 738 int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform); 739 if (ret != OK) { 740 ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__, 741 strerror(-ret), ret); 742 return 0; 743 } 744 return static_cast<uint32_t>(producerStickyTransform); 745 } 746 747 void Layer::setFiltering(bool filtering) { 748 mFiltering = filtering; 749 } 750 751 bool Layer::getFiltering() const { 752 return mFiltering; 753 } 754 755 // As documented in libhardware header, formats in the range 756 // 0x100 - 0x1FF are specific to the HAL implementation, and 757 // are known to have no alpha channel 758 // TODO: move definition for device-specific range into 759 // hardware.h, instead of using hard-coded values here. 760 #define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF) 761 762 bool Layer::getOpacityForFormat(uint32_t format) { 763 if (HARDWARE_IS_DEVICE_FORMAT(format)) { 764 return true; 765 } 766 switch (format) { 767 case HAL_PIXEL_FORMAT_RGBA_8888: 768 case HAL_PIXEL_FORMAT_BGRA_8888: 769 case HAL_PIXEL_FORMAT_sRGB_A_8888: 770 return false; 771 } 772 // in all other case, we have no blending (also for unknown formats) 773 return true; 774 } 775 776 // ---------------------------------------------------------------------------- 777 // local state 778 // ---------------------------------------------------------------------------- 779 780 void Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh, 781 bool useIdentityTransform) const 782 { 783 const Layer::State& s(getDrawingState()); 784 const Transform tr(useIdentityTransform ? 785 hw->getTransform() : hw->getTransform() * s.transform); 786 const uint32_t hw_h = hw->getHeight(); 787 Rect win(s.active.w, s.active.h); 788 if (!s.active.crop.isEmpty()) { 789 win.intersect(s.active.crop, &win); 790 } 791 // subtract the transparent region and snap to the bounds 792 win = reduce(win, s.activeTransparentRegion); 793 794 Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>()); 795 position[0] = tr.transform(win.left, win.top); 796 position[1] = tr.transform(win.left, win.bottom); 797 position[2] = tr.transform(win.right, win.bottom); 798 position[3] = tr.transform(win.right, win.top); 799 for (size_t i=0 ; i<4 ; i++) { 800 position[i].y = hw_h - position[i].y; 801 } 802 } 803 804 bool Layer::isOpaque(const Layer::State& s) const 805 { 806 // if we don't have a buffer yet, we're translucent regardless of the 807 // layer's opaque flag. 808 if (mActiveBuffer == 0) { 809 return false; 810 } 811 812 // if the layer has the opaque flag, then we're always opaque, 813 // otherwise we use the current buffer's format. 814 return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity; 815 } 816 817 bool Layer::isProtected() const 818 { 819 const sp<GraphicBuffer>& activeBuffer(mActiveBuffer); 820 return (activeBuffer != 0) && 821 (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED); 822 } 823 824 bool Layer::isFixedSize() const { 825 return mCurrentScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE; 826 } 827 828 bool Layer::isCropped() const { 829 return !mCurrentCrop.isEmpty(); 830 } 831 832 bool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const { 833 return mNeedsFiltering || hw->needsFiltering(); 834 } 835 836 void Layer::setVisibleRegion(const Region& visibleRegion) { 837 // always called from main thread 838 this->visibleRegion = visibleRegion; 839 } 840 841 void Layer::setCoveredRegion(const Region& coveredRegion) { 842 // always called from main thread 843 this->coveredRegion = coveredRegion; 844 } 845 846 void Layer::setVisibleNonTransparentRegion(const Region& 847 setVisibleNonTransparentRegion) { 848 // always called from main thread 849 this->visibleNonTransparentRegion = setVisibleNonTransparentRegion; 850 } 851 852 // ---------------------------------------------------------------------------- 853 // transaction 854 // ---------------------------------------------------------------------------- 855 856 uint32_t Layer::doTransaction(uint32_t flags) { 857 ATRACE_CALL(); 858 859 const Layer::State& s(getDrawingState()); 860 const Layer::State& c(getCurrentState()); 861 862 const bool sizeChanged = (c.requested.w != s.requested.w) || 863 (c.requested.h != s.requested.h); 864 865 if (sizeChanged) { 866 // the size changed, we need to ask our client to request a new buffer 867 ALOGD_IF(DEBUG_RESIZE, 868 "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n" 869 " current={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 870 " requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n" 871 " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 872 " requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n", 873 this, getName().string(), mCurrentTransform, mCurrentScalingMode, 874 c.active.w, c.active.h, 875 c.active.crop.left, 876 c.active.crop.top, 877 c.active.crop.right, 878 c.active.crop.bottom, 879 c.active.crop.getWidth(), 880 c.active.crop.getHeight(), 881 c.requested.w, c.requested.h, 882 c.requested.crop.left, 883 c.requested.crop.top, 884 c.requested.crop.right, 885 c.requested.crop.bottom, 886 c.requested.crop.getWidth(), 887 c.requested.crop.getHeight(), 888 s.active.w, s.active.h, 889 s.active.crop.left, 890 s.active.crop.top, 891 s.active.crop.right, 892 s.active.crop.bottom, 893 s.active.crop.getWidth(), 894 s.active.crop.getHeight(), 895 s.requested.w, s.requested.h, 896 s.requested.crop.left, 897 s.requested.crop.top, 898 s.requested.crop.right, 899 s.requested.crop.bottom, 900 s.requested.crop.getWidth(), 901 s.requested.crop.getHeight()); 902 903 // record the new size, form this point on, when the client request 904 // a buffer, it'll get the new size. 905 mSurfaceFlingerConsumer->setDefaultBufferSize( 906 c.requested.w, c.requested.h); 907 } 908 909 if (!isFixedSize()) { 910 911 const bool resizePending = (c.requested.w != c.active.w) || 912 (c.requested.h != c.active.h); 913 914 if (resizePending) { 915 // don't let Layer::doTransaction update the drawing state 916 // if we have a pending resize, unless we are in fixed-size mode. 917 // the drawing state will be updated only once we receive a buffer 918 // with the correct size. 919 // 920 // in particular, we want to make sure the clip (which is part 921 // of the geometry state) is latched together with the size but is 922 // latched immediately when no resizing is involved. 923 924 flags |= eDontUpdateGeometryState; 925 } 926 } 927 928 // always set active to requested, unless we're asked not to 929 // this is used by Layer, which special cases resizes. 930 if (flags & eDontUpdateGeometryState) { 931 } else { 932 Layer::State& editCurrentState(getCurrentState()); 933 editCurrentState.active = c.requested; 934 } 935 936 if (s.active != c.active) { 937 // invalidate and recompute the visible regions if needed 938 flags |= Layer::eVisibleRegion; 939 } 940 941 if (c.sequence != s.sequence) { 942 // invalidate and recompute the visible regions if needed 943 flags |= eVisibleRegion; 944 this->contentDirty = true; 945 946 // we may use linear filtering, if the matrix scales us 947 const uint8_t type = c.transform.getType(); 948 mNeedsFiltering = (!c.transform.preserveRects() || 949 (type >= Transform::SCALE)); 950 } 951 952 // Commit the transaction 953 commitTransaction(); 954 return flags; 955 } 956 957 void Layer::commitTransaction() { 958 mDrawingState = mCurrentState; 959 } 960 961 uint32_t Layer::getTransactionFlags(uint32_t flags) { 962 return android_atomic_and(~flags, &mTransactionFlags) & flags; 963 } 964 965 uint32_t Layer::setTransactionFlags(uint32_t flags) { 966 return android_atomic_or(flags, &mTransactionFlags); 967 } 968 969 bool Layer::setPosition(float x, float y) { 970 if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y) 971 return false; 972 mCurrentState.sequence++; 973 mCurrentState.transform.set(x, y); 974 setTransactionFlags(eTransactionNeeded); 975 return true; 976 } 977 bool Layer::setLayer(uint32_t z) { 978 if (mCurrentState.z == z) 979 return false; 980 mCurrentState.sequence++; 981 mCurrentState.z = z; 982 setTransactionFlags(eTransactionNeeded); 983 return true; 984 } 985 bool Layer::setSize(uint32_t w, uint32_t h) { 986 if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) 987 return false; 988 mCurrentState.requested.w = w; 989 mCurrentState.requested.h = h; 990 setTransactionFlags(eTransactionNeeded); 991 return true; 992 } 993 bool Layer::setAlpha(uint8_t alpha) { 994 if (mCurrentState.alpha == alpha) 995 return false; 996 mCurrentState.sequence++; 997 mCurrentState.alpha = alpha; 998 setTransactionFlags(eTransactionNeeded); 999 return true; 1000 } 1001 bool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) { 1002 mCurrentState.sequence++; 1003 mCurrentState.transform.set( 1004 matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy); 1005 setTransactionFlags(eTransactionNeeded); 1006 return true; 1007 } 1008 bool Layer::setTransparentRegionHint(const Region& transparent) { 1009 mCurrentState.requestedTransparentRegion = transparent; 1010 setTransactionFlags(eTransactionNeeded); 1011 return true; 1012 } 1013 bool Layer::setFlags(uint8_t flags, uint8_t mask) { 1014 const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 1015 if (mCurrentState.flags == newFlags) 1016 return false; 1017 mCurrentState.sequence++; 1018 mCurrentState.flags = newFlags; 1019 setTransactionFlags(eTransactionNeeded); 1020 return true; 1021 } 1022 bool Layer::setCrop(const Rect& crop) { 1023 if (mCurrentState.requested.crop == crop) 1024 return false; 1025 mCurrentState.sequence++; 1026 mCurrentState.requested.crop = crop; 1027 setTransactionFlags(eTransactionNeeded); 1028 return true; 1029 } 1030 1031 bool Layer::setLayerStack(uint32_t layerStack) { 1032 if (mCurrentState.layerStack == layerStack) 1033 return false; 1034 mCurrentState.sequence++; 1035 mCurrentState.layerStack = layerStack; 1036 setTransactionFlags(eTransactionNeeded); 1037 return true; 1038 } 1039 1040 // ---------------------------------------------------------------------------- 1041 // pageflip handling... 1042 // ---------------------------------------------------------------------------- 1043 1044 bool Layer::shouldPresentNow(const DispSync& dispSync) const { 1045 Mutex::Autolock lock(mQueueItemLock); 1046 nsecs_t expectedPresent = 1047 mSurfaceFlingerConsumer->computeExpectedPresent(dispSync); 1048 return mQueueItems.empty() ? 1049 false : mQueueItems[0].mTimestamp < expectedPresent; 1050 } 1051 1052 bool Layer::onPreComposition() { 1053 mRefreshPending = false; 1054 return mQueuedFrames > 0 || mSidebandStreamChanged; 1055 } 1056 1057 void Layer::onPostComposition() { 1058 if (mFrameLatencyNeeded) { 1059 nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp(); 1060 mFrameTracker.setDesiredPresentTime(desiredPresentTime); 1061 1062 sp<Fence> frameReadyFence = mSurfaceFlingerConsumer->getCurrentFence(); 1063 if (frameReadyFence->isValid()) { 1064 mFrameTracker.setFrameReadyFence(frameReadyFence); 1065 } else { 1066 // There was no fence for this frame, so assume that it was ready 1067 // to be presented at the desired present time. 1068 mFrameTracker.setFrameReadyTime(desiredPresentTime); 1069 } 1070 1071 const HWComposer& hwc = mFlinger->getHwComposer(); 1072 sp<Fence> presentFence = hwc.getDisplayFence(HWC_DISPLAY_PRIMARY); 1073 if (presentFence->isValid()) { 1074 mFrameTracker.setActualPresentFence(presentFence); 1075 } else { 1076 // The HWC doesn't support present fences, so use the refresh 1077 // timestamp instead. 1078 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY); 1079 mFrameTracker.setActualPresentTime(presentTime); 1080 } 1081 1082 mFrameTracker.advanceFrame(); 1083 mFrameLatencyNeeded = false; 1084 } 1085 } 1086 1087 bool Layer::isVisible() const { 1088 const Layer::State& s(mDrawingState); 1089 return !(s.flags & layer_state_t::eLayerHidden) && s.alpha 1090 && (mActiveBuffer != NULL || mSidebandStream != NULL); 1091 } 1092 1093 Region Layer::latchBuffer(bool& recomputeVisibleRegions) 1094 { 1095 ATRACE_CALL(); 1096 1097 if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) { 1098 // mSidebandStreamChanged was true 1099 mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream(); 1100 recomputeVisibleRegions = true; 1101 1102 const State& s(getDrawingState()); 1103 return s.transform.transform(Region(Rect(s.active.w, s.active.h))); 1104 } 1105 1106 Region outDirtyRegion; 1107 if (mQueuedFrames > 0) { 1108 1109 // if we've already called updateTexImage() without going through 1110 // a composition step, we have to skip this layer at this point 1111 // because we cannot call updateTeximage() without a corresponding 1112 // compositionComplete() call. 1113 // we'll trigger an update in onPreComposition(). 1114 if (mRefreshPending) { 1115 return outDirtyRegion; 1116 } 1117 1118 // Capture the old state of the layer for comparisons later 1119 const State& s(getDrawingState()); 1120 const bool oldOpacity = isOpaque(s); 1121 sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer; 1122 1123 struct Reject : public SurfaceFlingerConsumer::BufferRejecter { 1124 Layer::State& front; 1125 Layer::State& current; 1126 bool& recomputeVisibleRegions; 1127 bool stickyTransformSet; 1128 Reject(Layer::State& front, Layer::State& current, 1129 bool& recomputeVisibleRegions, bool stickySet) 1130 : front(front), current(current), 1131 recomputeVisibleRegions(recomputeVisibleRegions), 1132 stickyTransformSet(stickySet) { 1133 } 1134 1135 virtual bool reject(const sp<GraphicBuffer>& buf, 1136 const IGraphicBufferConsumer::BufferItem& item) { 1137 if (buf == NULL) { 1138 return false; 1139 } 1140 1141 uint32_t bufWidth = buf->getWidth(); 1142 uint32_t bufHeight = buf->getHeight(); 1143 1144 // check that we received a buffer of the right size 1145 // (Take the buffer's orientation into account) 1146 if (item.mTransform & Transform::ROT_90) { 1147 swap(bufWidth, bufHeight); 1148 } 1149 1150 bool isFixedSize = item.mScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE; 1151 if (front.active != front.requested) { 1152 1153 if (isFixedSize || 1154 (bufWidth == front.requested.w && 1155 bufHeight == front.requested.h)) 1156 { 1157 // Here we pretend the transaction happened by updating the 1158 // current and drawing states. Drawing state is only accessed 1159 // in this thread, no need to have it locked 1160 front.active = front.requested; 1161 1162 // We also need to update the current state so that 1163 // we don't end-up overwriting the drawing state with 1164 // this stale current state during the next transaction 1165 // 1166 // NOTE: We don't need to hold the transaction lock here 1167 // because State::active is only accessed from this thread. 1168 current.active = front.active; 1169 1170 // recompute visible region 1171 recomputeVisibleRegions = true; 1172 } 1173 1174 ALOGD_IF(DEBUG_RESIZE, 1175 "latchBuffer/reject: buffer (%ux%u, tr=%02x), scalingMode=%d\n" 1176 " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 1177 " requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n", 1178 bufWidth, bufHeight, item.mTransform, item.mScalingMode, 1179 front.active.w, front.active.h, 1180 front.active.crop.left, 1181 front.active.crop.top, 1182 front.active.crop.right, 1183 front.active.crop.bottom, 1184 front.active.crop.getWidth(), 1185 front.active.crop.getHeight(), 1186 front.requested.w, front.requested.h, 1187 front.requested.crop.left, 1188 front.requested.crop.top, 1189 front.requested.crop.right, 1190 front.requested.crop.bottom, 1191 front.requested.crop.getWidth(), 1192 front.requested.crop.getHeight()); 1193 } 1194 1195 if (!isFixedSize && !stickyTransformSet) { 1196 if (front.active.w != bufWidth || 1197 front.active.h != bufHeight) { 1198 // reject this buffer 1199 ALOGE("rejecting buffer: bufWidth=%d, bufHeight=%d, front.active.{w=%d, h=%d}", 1200 bufWidth, bufHeight, front.active.w, front.active.h); 1201 return true; 1202 } 1203 } 1204 1205 // if the transparent region has changed (this test is 1206 // conservative, but that's fine, worst case we're doing 1207 // a bit of extra work), we latch the new one and we 1208 // trigger a visible-region recompute. 1209 if (!front.activeTransparentRegion.isTriviallyEqual( 1210 front.requestedTransparentRegion)) { 1211 front.activeTransparentRegion = front.requestedTransparentRegion; 1212 1213 // We also need to update the current state so that 1214 // we don't end-up overwriting the drawing state with 1215 // this stale current state during the next transaction 1216 // 1217 // NOTE: We don't need to hold the transaction lock here 1218 // because State::active is only accessed from this thread. 1219 current.activeTransparentRegion = front.activeTransparentRegion; 1220 1221 // recompute visible region 1222 recomputeVisibleRegions = true; 1223 } 1224 1225 return false; 1226 } 1227 }; 1228 1229 Reject r(mDrawingState, getCurrentState(), recomputeVisibleRegions, 1230 getProducerStickyTransform() != 0); 1231 1232 status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r, 1233 mFlinger->mPrimaryDispSync); 1234 if (updateResult == BufferQueue::PRESENT_LATER) { 1235 // Producer doesn't want buffer to be displayed yet. Signal a 1236 // layer update so we check again at the next opportunity. 1237 mFlinger->signalLayerUpdate(); 1238 return outDirtyRegion; 1239 } 1240 1241 // Remove this buffer from our internal queue tracker 1242 { // Autolock scope 1243 Mutex::Autolock lock(mQueueItemLock); 1244 mQueueItems.removeAt(0); 1245 } 1246 1247 // Decrement the queued-frames count. Signal another event if we 1248 // have more frames pending. 1249 if (android_atomic_dec(&mQueuedFrames) > 1) { 1250 mFlinger->signalLayerUpdate(); 1251 } 1252 1253 if (updateResult != NO_ERROR) { 1254 // something happened! 1255 recomputeVisibleRegions = true; 1256 return outDirtyRegion; 1257 } 1258 1259 // update the active buffer 1260 mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer(); 1261 if (mActiveBuffer == NULL) { 1262 // this can only happen if the very first buffer was rejected. 1263 return outDirtyRegion; 1264 } 1265 1266 mRefreshPending = true; 1267 mFrameLatencyNeeded = true; 1268 if (oldActiveBuffer == NULL) { 1269 // the first time we receive a buffer, we need to trigger a 1270 // geometry invalidation. 1271 recomputeVisibleRegions = true; 1272 } 1273 1274 Rect crop(mSurfaceFlingerConsumer->getCurrentCrop()); 1275 const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform()); 1276 const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode()); 1277 if ((crop != mCurrentCrop) || 1278 (transform != mCurrentTransform) || 1279 (scalingMode != mCurrentScalingMode)) 1280 { 1281 mCurrentCrop = crop; 1282 mCurrentTransform = transform; 1283 mCurrentScalingMode = scalingMode; 1284 recomputeVisibleRegions = true; 1285 } 1286 1287 if (oldActiveBuffer != NULL) { 1288 uint32_t bufWidth = mActiveBuffer->getWidth(); 1289 uint32_t bufHeight = mActiveBuffer->getHeight(); 1290 if (bufWidth != uint32_t(oldActiveBuffer->width) || 1291 bufHeight != uint32_t(oldActiveBuffer->height)) { 1292 recomputeVisibleRegions = true; 1293 } 1294 } 1295 1296 mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format); 1297 if (oldOpacity != isOpaque(s)) { 1298 recomputeVisibleRegions = true; 1299 } 1300 1301 // FIXME: postedRegion should be dirty & bounds 1302 Region dirtyRegion(Rect(s.active.w, s.active.h)); 1303 1304 // transform the dirty region to window-manager space 1305 outDirtyRegion = (s.transform.transform(dirtyRegion)); 1306 } 1307 return outDirtyRegion; 1308 } 1309 1310 uint32_t Layer::getEffectiveUsage(uint32_t usage) const 1311 { 1312 // TODO: should we do something special if mSecure is set? 1313 if (mProtectedByApp) { 1314 // need a hardware-protected path to external video sink 1315 usage |= GraphicBuffer::USAGE_PROTECTED; 1316 } 1317 if (mPotentialCursor) { 1318 usage |= GraphicBuffer::USAGE_CURSOR; 1319 } 1320 usage |= GraphicBuffer::USAGE_HW_COMPOSER; 1321 return usage; 1322 } 1323 1324 void Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const { 1325 uint32_t orientation = 0; 1326 if (!mFlinger->mDebugDisableTransformHint) { 1327 // The transform hint is used to improve performance, but we can 1328 // only have a single transform hint, it cannot 1329 // apply to all displays. 1330 const Transform& planeTransform(hw->getTransform()); 1331 orientation = planeTransform.getOrientation(); 1332 if (orientation & Transform::ROT_INVALID) { 1333 orientation = 0; 1334 } 1335 } 1336 mSurfaceFlingerConsumer->setTransformHint(orientation); 1337 } 1338 1339 // ---------------------------------------------------------------------------- 1340 // debugging 1341 // ---------------------------------------------------------------------------- 1342 1343 void Layer::dump(String8& result, Colorizer& colorizer) const 1344 { 1345 const Layer::State& s(getDrawingState()); 1346 1347 colorizer.colorize(result, Colorizer::GREEN); 1348 result.appendFormat( 1349 "+ %s %p (%s)\n", 1350 getTypeId(), this, getName().string()); 1351 colorizer.reset(result); 1352 1353 s.activeTransparentRegion.dump(result, "transparentRegion"); 1354 visibleRegion.dump(result, "visibleRegion"); 1355 sp<Client> client(mClientRef.promote()); 1356 1357 result.appendFormat( " " 1358 "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), crop=(%4d,%4d,%4d,%4d), " 1359 "isOpaque=%1d, invalidate=%1d, " 1360 "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n" 1361 " client=%p\n", 1362 s.layerStack, s.z, s.transform.tx(), s.transform.ty(), s.active.w, s.active.h, 1363 s.active.crop.left, s.active.crop.top, 1364 s.active.crop.right, s.active.crop.bottom, 1365 isOpaque(s), contentDirty, 1366 s.alpha, s.flags, 1367 s.transform[0][0], s.transform[0][1], 1368 s.transform[1][0], s.transform[1][1], 1369 client.get()); 1370 1371 sp<const GraphicBuffer> buf0(mActiveBuffer); 1372 uint32_t w0=0, h0=0, s0=0, f0=0; 1373 if (buf0 != 0) { 1374 w0 = buf0->getWidth(); 1375 h0 = buf0->getHeight(); 1376 s0 = buf0->getStride(); 1377 f0 = buf0->format; 1378 } 1379 result.appendFormat( 1380 " " 1381 "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X]," 1382 " queued-frames=%d, mRefreshPending=%d\n", 1383 mFormat, w0, h0, s0,f0, 1384 mQueuedFrames, mRefreshPending); 1385 1386 if (mSurfaceFlingerConsumer != 0) { 1387 mSurfaceFlingerConsumer->dump(result, " "); 1388 } 1389 } 1390 1391 void Layer::dumpFrameStats(String8& result) const { 1392 mFrameTracker.dumpStats(result); 1393 } 1394 1395 void Layer::clearFrameStats() { 1396 mFrameTracker.clearStats(); 1397 } 1398 1399 void Layer::logFrameStats() { 1400 mFrameTracker.logAndResetStats(mName); 1401 } 1402 1403 void Layer::getFrameStats(FrameStats* outStats) const { 1404 mFrameTracker.getStats(outStats); 1405 } 1406 1407 // --------------------------------------------------------------------------- 1408 1409 Layer::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger, 1410 const sp<Layer>& layer) 1411 : mFlinger(flinger), mLayer(layer) { 1412 } 1413 1414 Layer::LayerCleaner::~LayerCleaner() { 1415 // destroy client resources 1416 mFlinger->onLayerDestroyed(mLayer); 1417 } 1418 1419 // --------------------------------------------------------------------------- 1420 }; // namespace android 1421 1422 #if defined(__gl_h_) 1423 #error "don't include gl/gl.h in this file" 1424 #endif 1425 1426 #if defined(__gl2_h_) 1427 #error "don't include gl2/gl2.h in this file" 1428 #endif 1429