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