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