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