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