Layer.cpp revision 3fee6ca1d93c1d4b822d2dcd36c61f9722dd88b9
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/Surface.h>
42
43#include "clz.h"
44#include "Colorizer.h"
45#include "DisplayDevice.h"
46#include "Layer.h"
47#include "MonitoredProducer.h"
48#include "SurfaceFlinger.h"
49
50#include "DisplayHardware/HWComposer.h"
51
52#include "RenderEngine/RenderEngine.h"
53
54#define DEBUG_RESIZE    0
55
56namespace android {
57
58// ---------------------------------------------------------------------------
59
60int32_t Layer::sSequence = 1;
61
62Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client,
63        const String8& name, uint32_t w, uint32_t h, uint32_t flags)
64    :   contentDirty(false),
65        sequence(uint32_t(android_atomic_inc(&sSequence))),
66        mFlinger(flinger),
67        mTextureName(-1U),
68        mPremultipliedAlpha(true),
69        mName("unnamed"),
70        mFormat(PIXEL_FORMAT_NONE),
71        mTransactionFlags(0),
72        mPendingStateMutex(),
73        mPendingStates(),
74        mQueuedFrames(0),
75        mSidebandStreamChanged(false),
76        mCurrentTransform(0),
77        mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
78        mOverrideScalingMode(-1),
79        mCurrentOpacity(true),
80        mCurrentFrameNumber(0),
81        mRefreshPending(false),
82        mFrameLatencyNeeded(false),
83        mFiltering(false),
84        mNeedsFiltering(false),
85        mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2),
86#ifndef USE_HWC2
87        mIsGlesComposition(false),
88#endif
89        mProtectedByApp(false),
90        mHasSurface(false),
91        mClientRef(client),
92        mPotentialCursor(false),
93        mQueueItemLock(),
94        mQueueItemCondition(),
95        mQueueItems(),
96        mLastFrameNumberReceived(0),
97        mUpdateTexImageFailed(false),
98        mAutoRefresh(false),
99        mFreezePositionUpdates(false)
100{
101#ifdef USE_HWC2
102    ALOGV("Creating Layer %s", name.string());
103#endif
104
105    mCurrentCrop.makeInvalid();
106    mFlinger->getRenderEngine().genTextures(1, &mTextureName);
107    mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName);
108
109    uint32_t layerFlags = 0;
110    if (flags & ISurfaceComposerClient::eHidden)
111        layerFlags |= layer_state_t::eLayerHidden;
112    if (flags & ISurfaceComposerClient::eOpaque)
113        layerFlags |= layer_state_t::eLayerOpaque;
114    if (flags & ISurfaceComposerClient::eSecure)
115        layerFlags |= layer_state_t::eLayerSecure;
116
117    if (flags & ISurfaceComposerClient::eNonPremultiplied)
118        mPremultipliedAlpha = false;
119
120    mName = name;
121
122    mCurrentState.active.w = w;
123    mCurrentState.active.h = h;
124    mCurrentState.active.transform.set(0, 0);
125    mCurrentState.crop.makeInvalid();
126    mCurrentState.finalCrop.makeInvalid();
127    mCurrentState.z = 0;
128#ifdef USE_HWC2
129    mCurrentState.alpha = 1.0f;
130#else
131    mCurrentState.alpha = 0xFF;
132#endif
133    mCurrentState.layerStack = 0;
134    mCurrentState.flags = layerFlags;
135    mCurrentState.sequence = 0;
136    mCurrentState.requested = mCurrentState.active;
137
138    // drawing state & current state are identical
139    mDrawingState = mCurrentState;
140
141#ifdef USE_HWC2
142    const auto& hwc = flinger->getHwComposer();
143    const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY);
144    nsecs_t displayPeriod = activeConfig->getVsyncPeriod();
145#else
146    nsecs_t displayPeriod =
147            flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
148#endif
149    mFrameTracker.setDisplayRefreshPeriod(displayPeriod);
150}
151
152void Layer::onFirstRef() {
153    // Creates a custom BufferQueue for SurfaceFlingerConsumer to use
154    sp<IGraphicBufferProducer> producer;
155    sp<IGraphicBufferConsumer> consumer;
156    BufferQueue::createBufferQueue(&producer, &consumer);
157    mProducer = new MonitoredProducer(producer, mFlinger);
158    mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName);
159    mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
160    mSurfaceFlingerConsumer->setContentsChangedListener(this);
161    mSurfaceFlingerConsumer->setName(mName);
162
163#ifdef TARGET_DISABLE_TRIPLE_BUFFERING
164#warning "disabling triple buffering"
165#else
166    mProducer->setMaxDequeuedBufferCount(2);
167#endif
168
169    const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice());
170    updateTransformHint(hw);
171}
172
173Layer::~Layer() {
174  sp<Client> c(mClientRef.promote());
175    if (c != 0) {
176        c->detachLayer(this);
177    }
178
179    for (auto& point : mRemoteSyncPoints) {
180        point->setTransactionApplied();
181    }
182    for (auto& point : mLocalSyncPoints) {
183        point->setFrameAvailable();
184    }
185    mFlinger->deleteTextureAsync(mTextureName);
186    mFrameTracker.logAndResetStats(mName);
187}
188
189// ---------------------------------------------------------------------------
190// callbacks
191// ---------------------------------------------------------------------------
192
193#ifdef USE_HWC2
194void Layer::onLayerDisplayed(const sp<Fence>& releaseFence) {
195    if (mHwcLayers.empty()) {
196        return;
197    }
198    mSurfaceFlingerConsumer->setReleaseFence(releaseFence);
199}
200#else
201void Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */,
202        HWComposer::HWCLayerInterface* layer) {
203    if (layer) {
204        layer->onDisplayed();
205        mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence());
206    }
207}
208#endif
209
210void Layer::onFrameAvailable(const BufferItem& item) {
211    // Add this buffer from our internal queue tracker
212    { // Autolock scope
213        Mutex::Autolock lock(mQueueItemLock);
214
215        // Reset the frame number tracker when we receive the first buffer after
216        // a frame number reset
217        if (item.mFrameNumber == 1) {
218            mLastFrameNumberReceived = 0;
219        }
220
221        // Ensure that callbacks are handled in order
222        while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
223            status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
224                    ms2ns(500));
225            if (result != NO_ERROR) {
226                ALOGE("[%s] Timed out waiting on callback", mName.string());
227            }
228        }
229
230        mQueueItems.push_back(item);
231        android_atomic_inc(&mQueuedFrames);
232
233        // Wake up any pending callbacks
234        mLastFrameNumberReceived = item.mFrameNumber;
235        mQueueItemCondition.broadcast();
236    }
237
238    mFlinger->signalLayerUpdate();
239}
240
241void Layer::onFrameReplaced(const BufferItem& item) {
242    { // Autolock scope
243        Mutex::Autolock lock(mQueueItemLock);
244
245        // Ensure that callbacks are handled in order
246        while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
247            status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
248                    ms2ns(500));
249            if (result != NO_ERROR) {
250                ALOGE("[%s] Timed out waiting on callback", mName.string());
251            }
252        }
253
254        if (mQueueItems.empty()) {
255            ALOGE("Can't replace a frame on an empty queue");
256            return;
257        }
258        mQueueItems.editItemAt(mQueueItems.size() - 1) = item;
259
260        // Wake up any pending callbacks
261        mLastFrameNumberReceived = item.mFrameNumber;
262        mQueueItemCondition.broadcast();
263    }
264}
265
266void Layer::onSidebandStreamChanged() {
267    if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) {
268        // mSidebandStreamChanged was false
269        mFlinger->signalLayerUpdate();
270    }
271}
272
273// called with SurfaceFlinger::mStateLock from the drawing thread after
274// the layer has been remove from the current state list (and just before
275// it's removed from the drawing state list)
276void Layer::onRemoved() {
277    mSurfaceFlingerConsumer->abandon();
278}
279
280// ---------------------------------------------------------------------------
281// set-up
282// ---------------------------------------------------------------------------
283
284const String8& Layer::getName() const {
285    return mName;
286}
287
288status_t Layer::setBuffers( uint32_t w, uint32_t h,
289                            PixelFormat format, uint32_t flags)
290{
291    uint32_t const maxSurfaceDims = min(
292            mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims());
293
294    // never allow a surface larger than what our underlying GL implementation
295    // can handle.
296    if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) {
297        ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h));
298        return BAD_VALUE;
299    }
300
301    mFormat = format;
302
303    mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false;
304    mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false;
305    mCurrentOpacity = getOpacityForFormat(format);
306
307    mSurfaceFlingerConsumer->setDefaultBufferSize(w, h);
308    mSurfaceFlingerConsumer->setDefaultBufferFormat(format);
309    mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
310
311    return NO_ERROR;
312}
313
314/*
315 * The layer handle is just a BBinder object passed to the client
316 * (remote process) -- we don't keep any reference on our side such that
317 * the dtor is called when the remote side let go of its reference.
318 *
319 * LayerCleaner ensures that mFlinger->onLayerDestroyed() is called for
320 * this layer when the handle is destroyed.
321 */
322class Layer::Handle : public BBinder, public LayerCleaner {
323    public:
324        Handle(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer)
325            : LayerCleaner(flinger, layer), owner(layer) {}
326
327        wp<Layer> owner;
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::computeBounds() const {
377    const Layer::State& s(getDrawingState());
378    return computeBounds(s.activeTransparentRegion);
379}
380
381Rect Layer::computeBounds(const Region& activeTransparentRegion) const {
382    const Layer::State& s(getDrawingState());
383    Rect win(s.active.w, s.active.h);
384
385    if (!s.crop.isEmpty()) {
386        win.intersect(s.crop, &win);
387    }
388    // subtract the transparent region and snap to the bounds
389    return reduce(win, activeTransparentRegion);
390}
391
392FloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const {
393    // the content crop is the area of the content that gets scaled to the
394    // layer's size.
395    FloatRect crop(getContentCrop());
396
397    // the crop is the area of the window that gets cropped, but not
398    // scaled in any ways.
399    const State& s(getDrawingState());
400
401    // apply the projection's clipping to the window crop in
402    // layerstack space, and convert-back to layer space.
403    // if there are no window scaling involved, this operation will map to full
404    // pixels in the buffer.
405    // FIXME: the 3 lines below can produce slightly incorrect clipping when we have
406    // a viewport clipping and a window transform. we should use floating point to fix this.
407
408    Rect activeCrop(s.active.w, s.active.h);
409    if (!s.crop.isEmpty()) {
410        activeCrop = s.crop;
411    }
412
413    activeCrop = s.active.transform.transform(activeCrop);
414    if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
415        activeCrop.clear();
416    }
417    if (!s.finalCrop.isEmpty()) {
418        if(!activeCrop.intersect(s.finalCrop, &activeCrop)) {
419            activeCrop.clear();
420        }
421    }
422    activeCrop = s.active.transform.inverse().transform(activeCrop);
423
424    // This needs to be here as transform.transform(Rect) computes the
425    // transformed rect and then takes the bounding box of the result before
426    // returning. This means
427    // transform.inverse().transform(transform.transform(Rect)) != Rect
428    // in which case we need to make sure the final rect is clipped to the
429    // display bounds.
430    if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
431        activeCrop.clear();
432    }
433
434    // subtract the transparent region and snap to the bounds
435    activeCrop = reduce(activeCrop, s.activeTransparentRegion);
436
437    // Transform the window crop to match the buffer coordinate system,
438    // which means using the inverse of the current transform set on the
439    // SurfaceFlingerConsumer.
440    uint32_t invTransform = mCurrentTransform;
441    if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
442        /*
443         * the code below applies the primary display's inverse transform to the
444         * buffer
445         */
446        uint32_t invTransformOrient =
447                DisplayDevice::getPrimaryDisplayOrientationTransform();
448        // calculate the inverse transform
449        if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) {
450            invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
451                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
452        }
453        // and apply to the current transform
454        invTransform = (Transform(invTransformOrient) * Transform(invTransform))
455                .getOrientation();
456    }
457
458    int winWidth = s.active.w;
459    int winHeight = s.active.h;
460    if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
461        // If the activeCrop has been rotate the ends are rotated but not
462        // the space itself so when transforming ends back we can't rely on
463        // a modification of the axes of rotation. To account for this we
464        // need to reorient the inverse rotation in terms of the current
465        // axes of rotation.
466        bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
467        bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
468        if (is_h_flipped == is_v_flipped) {
469            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
470                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
471        }
472        winWidth = s.active.h;
473        winHeight = s.active.w;
474    }
475    const Rect winCrop = activeCrop.transform(
476            invTransform, s.active.w, s.active.h);
477
478    // below, crop is intersected with winCrop expressed in crop's coordinate space
479    float xScale = crop.getWidth()  / float(winWidth);
480    float yScale = crop.getHeight() / float(winHeight);
481
482    float insetL = winCrop.left                 * xScale;
483    float insetT = winCrop.top                  * yScale;
484    float insetR = (winWidth - winCrop.right )  * xScale;
485    float insetB = (winHeight - winCrop.bottom) * yScale;
486
487    crop.left   += insetL;
488    crop.top    += insetT;
489    crop.right  -= insetR;
490    crop.bottom -= insetB;
491
492    return crop;
493}
494
495#ifdef USE_HWC2
496void Layer::setGeometry(const sp<const DisplayDevice>& displayDevice)
497#else
498void Layer::setGeometry(
499    const sp<const DisplayDevice>& hw,
500        HWComposer::HWCLayerInterface& layer)
501#endif
502{
503#ifdef USE_HWC2
504    const auto hwcId = displayDevice->getHwcDisplayId();
505    auto& hwcInfo = mHwcLayers[hwcId];
506#else
507    layer.setDefaultState();
508#endif
509
510    // enable this layer
511#ifdef USE_HWC2
512    hwcInfo.forceClientComposition = false;
513
514    if (isSecure() && !displayDevice->isSecure()) {
515        hwcInfo.forceClientComposition = true;
516    }
517
518    auto& hwcLayer = hwcInfo.layer;
519#else
520    layer.setSkip(false);
521
522    if (isSecure() && !hw->isSecure()) {
523        layer.setSkip(true);
524    }
525#endif
526
527    // this gives us only the "orientation" component of the transform
528    const State& s(getDrawingState());
529#ifdef USE_HWC2
530    if (!isOpaque(s) || s.alpha != 1.0f) {
531        auto blendMode = mPremultipliedAlpha ?
532                HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage;
533        auto error = hwcLayer->setBlendMode(blendMode);
534        ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set blend mode %s:"
535                " %s (%d)", mName.string(), to_string(blendMode).c_str(),
536                to_string(error).c_str(), static_cast<int32_t>(error));
537    }
538#else
539    if (!isOpaque(s) || s.alpha != 0xFF) {
540        layer.setBlending(mPremultipliedAlpha ?
541                HWC_BLENDING_PREMULT :
542                HWC_BLENDING_COVERAGE);
543    }
544#endif
545
546    // apply the layer's transform, followed by the display's global transform
547    // here we're guaranteed that the layer's transform preserves rects
548    Region activeTransparentRegion(s.activeTransparentRegion);
549    if (!s.crop.isEmpty()) {
550        Rect activeCrop(s.crop);
551        activeCrop = s.active.transform.transform(activeCrop);
552#ifdef USE_HWC2
553        if(!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) {
554#else
555        if(!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
556#endif
557            activeCrop.clear();
558        }
559        activeCrop = s.active.transform.inverse().transform(activeCrop);
560        // This needs to be here as transform.transform(Rect) computes the
561        // transformed rect and then takes the bounding box of the result before
562        // returning. This means
563        // transform.inverse().transform(transform.transform(Rect)) != Rect
564        // in which case we need to make sure the final rect is clipped to the
565        // display bounds.
566        if(!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
567            activeCrop.clear();
568        }
569        // mark regions outside the crop as transparent
570        activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top));
571        activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom,
572                s.active.w, s.active.h));
573        activeTransparentRegion.orSelf(Rect(0, activeCrop.top,
574                activeCrop.left, activeCrop.bottom));
575        activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top,
576                s.active.w, activeCrop.bottom));
577    }
578    Rect frame(s.active.transform.transform(computeBounds(activeTransparentRegion)));
579    if (!s.finalCrop.isEmpty()) {
580        if(!frame.intersect(s.finalCrop, &frame)) {
581            frame.clear();
582        }
583    }
584#ifdef USE_HWC2
585    if (!frame.intersect(displayDevice->getViewport(), &frame)) {
586        frame.clear();
587    }
588    const Transform& tr(displayDevice->getTransform());
589    Rect transformedFrame = tr.transform(frame);
590    auto error = hwcLayer->setDisplayFrame(transformedFrame);
591    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set display frame "
592            "[%d, %d, %d, %d]: %s (%d)", mName.string(), transformedFrame.left,
593            transformedFrame.top, transformedFrame.right,
594            transformedFrame.bottom, to_string(error).c_str(),
595            static_cast<int32_t>(error));
596
597    FloatRect sourceCrop = computeCrop(displayDevice);
598    error = hwcLayer->setSourceCrop(sourceCrop);
599    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set source crop "
600            "[%.3f, %.3f, %.3f, %.3f]: %s (%d)", mName.string(),
601            sourceCrop.left, sourceCrop.top, sourceCrop.right,
602            sourceCrop.bottom, to_string(error).c_str(),
603            static_cast<int32_t>(error));
604
605    error = hwcLayer->setPlaneAlpha(s.alpha);
606    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set plane alpha %.3f: "
607            "%s (%d)", mName.string(), s.alpha, to_string(error).c_str(),
608            static_cast<int32_t>(error));
609
610    error = hwcLayer->setZOrder(s.z);
611    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)",
612            mName.string(), s.z, to_string(error).c_str(),
613            static_cast<int32_t>(error));
614#else
615    if (!frame.intersect(hw->getViewport(), &frame)) {
616        frame.clear();
617    }
618    const Transform& tr(hw->getTransform());
619    layer.setFrame(tr.transform(frame));
620    layer.setCrop(computeCrop(hw));
621    layer.setPlaneAlpha(s.alpha);
622#endif
623
624    /*
625     * Transformations are applied in this order:
626     * 1) buffer orientation/flip/mirror
627     * 2) state transformation (window manager)
628     * 3) layer orientation (screen orientation)
629     * (NOTE: the matrices are multiplied in reverse order)
630     */
631
632    const Transform bufferOrientation(mCurrentTransform);
633    Transform transform(tr * s.active.transform * bufferOrientation);
634
635    if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
636        /*
637         * the code below applies the primary display's inverse transform to the
638         * buffer
639         */
640        uint32_t invTransform =
641                DisplayDevice::getPrimaryDisplayOrientationTransform();
642        // calculate the inverse transform
643        if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
644            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
645                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
646        }
647        // and apply to the current transform
648        transform = Transform(invTransform) * transform;
649    }
650
651    // this gives us only the "orientation" component of the transform
652    const uint32_t orientation = transform.getOrientation();
653#ifdef USE_HWC2
654    if (orientation & Transform::ROT_INVALID) {
655        // we can only handle simple transformation
656        hwcInfo.forceClientComposition = true;
657    } else {
658        auto transform = static_cast<HWC2::Transform>(orientation);
659        auto error = hwcLayer->setTransform(transform);
660        ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set transform %s: "
661                "%s (%d)", mName.string(), to_string(transform).c_str(),
662                to_string(error).c_str(), static_cast<int32_t>(error));
663    }
664#else
665    if (orientation & Transform::ROT_INVALID) {
666        // we can only handle simple transformation
667        layer.setSkip(true);
668    } else {
669        layer.setTransform(orientation);
670    }
671#endif
672}
673
674#ifdef USE_HWC2
675void Layer::forceClientComposition(int32_t hwcId) {
676    if (mHwcLayers.count(hwcId) == 0) {
677        ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId);
678        return;
679    }
680
681    mHwcLayers[hwcId].forceClientComposition = true;
682}
683#endif
684
685#ifdef USE_HWC2
686void Layer::setPerFrameData(const sp<const DisplayDevice>& displayDevice) {
687    // Apply this display's projection's viewport to the visible region
688    // before giving it to the HWC HAL.
689    const Transform& tr = displayDevice->getTransform();
690    const auto& viewport = displayDevice->getViewport();
691    Region visible = tr.transform(visibleRegion.intersect(viewport));
692    auto hwcId = displayDevice->getHwcDisplayId();
693    auto& hwcLayer = mHwcLayers[hwcId].layer;
694    auto error = hwcLayer->setVisibleRegion(visible);
695    if (error != HWC2::Error::None) {
696        ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(),
697                to_string(error).c_str(), static_cast<int32_t>(error));
698        visible.dump(LOG_TAG);
699    }
700
701    error = hwcLayer->setSurfaceDamage(surfaceDamageRegion);
702    if (error != HWC2::Error::None) {
703        ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(),
704                to_string(error).c_str(), static_cast<int32_t>(error));
705        surfaceDamageRegion.dump(LOG_TAG);
706    }
707
708    // Sideband layers
709    if (mSidebandStream.get()) {
710        setCompositionType(hwcId, HWC2::Composition::Sideband);
711        ALOGV("[%s] Requesting Sideband composition", mName.string());
712        error = hwcLayer->setSidebandStream(mSidebandStream->handle());
713        if (error != HWC2::Error::None) {
714            ALOGE("[%s] Failed to set sideband stream %p: %s (%d)",
715                    mName.string(), mSidebandStream->handle(),
716                    to_string(error).c_str(), static_cast<int32_t>(error));
717        }
718        return;
719    }
720
721    // Client or SolidColor layers
722    if (mActiveBuffer == nullptr || mActiveBuffer->handle == nullptr ||
723            mHwcLayers[hwcId].forceClientComposition) {
724        // TODO: This also includes solid color layers, but no API exists to
725        // setup a solid color layer yet
726        ALOGV("[%s] Requesting Client composition", mName.string());
727        setCompositionType(hwcId, HWC2::Composition::Client);
728        error = hwcLayer->setBuffer(nullptr, Fence::NO_FENCE);
729        if (error != HWC2::Error::None) {
730            ALOGE("[%s] Failed to set null buffer: %s (%d)", mName.string(),
731                    to_string(error).c_str(), static_cast<int32_t>(error));
732        }
733        return;
734    }
735
736    // Device or Cursor layers
737    if (mPotentialCursor) {
738        ALOGV("[%s] Requesting Cursor composition", mName.string());
739        setCompositionType(hwcId, HWC2::Composition::Cursor);
740    } else {
741        ALOGV("[%s] Requesting Device composition", mName.string());
742        setCompositionType(hwcId, HWC2::Composition::Device);
743    }
744
745    auto acquireFence = mSurfaceFlingerConsumer->getCurrentFence();
746    error = hwcLayer->setBuffer(mActiveBuffer->handle, acquireFence);
747    if (error != HWC2::Error::None) {
748        ALOGE("[%s] Failed to set buffer %p: %s (%d)", mName.string(),
749                mActiveBuffer->handle, to_string(error).c_str(),
750                static_cast<int32_t>(error));
751    }
752}
753#else
754void Layer::setPerFrameData(const sp<const DisplayDevice>& hw,
755        HWComposer::HWCLayerInterface& layer) {
756    // we have to set the visible region on every frame because
757    // we currently free it during onLayerDisplayed(), which is called
758    // after HWComposer::commit() -- every frame.
759    // Apply this display's projection's viewport to the visible region
760    // before giving it to the HWC HAL.
761    const Transform& tr = hw->getTransform();
762    Region visible = tr.transform(visibleRegion.intersect(hw->getViewport()));
763    layer.setVisibleRegionScreen(visible);
764    layer.setSurfaceDamage(surfaceDamageRegion);
765    mIsGlesComposition = (layer.getCompositionType() == HWC_FRAMEBUFFER);
766
767    if (mSidebandStream.get()) {
768        layer.setSidebandStream(mSidebandStream);
769    } else {
770        // NOTE: buffer can be NULL if the client never drew into this
771        // layer yet, or if we ran out of memory
772        layer.setBuffer(mActiveBuffer);
773    }
774}
775#endif
776
777#ifdef USE_HWC2
778void Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) {
779    auto hwcId = displayDevice->getHwcDisplayId();
780    if (mHwcLayers.count(hwcId) == 0 ||
781            getCompositionType(hwcId) != HWC2::Composition::Cursor) {
782        return;
783    }
784
785    // This gives us only the "orientation" component of the transform
786    const State& s(getCurrentState());
787
788    // Apply the layer's transform, followed by the display's global transform
789    // Here we're guaranteed that the layer's transform preserves rects
790    Rect win(s.active.w, s.active.h);
791    if (!s.crop.isEmpty()) {
792        win.intersect(s.crop, &win);
793    }
794    // Subtract the transparent region and snap to the bounds
795    Rect bounds = reduce(win, s.activeTransparentRegion);
796    Rect frame(s.active.transform.transform(bounds));
797    frame.intersect(displayDevice->getViewport(), &frame);
798    if (!s.finalCrop.isEmpty()) {
799        frame.intersect(s.finalCrop, &frame);
800    }
801    auto& displayTransform(displayDevice->getTransform());
802    auto position = displayTransform.transform(frame);
803
804    auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left,
805            position.top);
806    ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set cursor position "
807            "to (%d, %d): %s (%d)", mName.string(), position.left,
808            position.top, to_string(error).c_str(),
809            static_cast<int32_t>(error));
810}
811#else
812void Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */,
813        HWComposer::HWCLayerInterface& layer) {
814    int fenceFd = -1;
815
816    // TODO: there is a possible optimization here: we only need to set the
817    // acquire fence the first time a new buffer is acquired on EACH display.
818
819    if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_CURSOR_OVERLAY) {
820        sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence();
821        if (fence->isValid()) {
822            fenceFd = fence->dup();
823            if (fenceFd == -1) {
824                ALOGW("failed to dup layer fence, skipping sync: %d", errno);
825            }
826        }
827    }
828    layer.setAcquireFenceFd(fenceFd);
829}
830
831Rect Layer::getPosition(
832    const sp<const DisplayDevice>& hw)
833{
834    // this gives us only the "orientation" component of the transform
835    const State& s(getCurrentState());
836
837    // apply the layer's transform, followed by the display's global transform
838    // here we're guaranteed that the layer's transform preserves rects
839    Rect win(s.active.w, s.active.h);
840    if (!s.crop.isEmpty()) {
841        win.intersect(s.crop, &win);
842    }
843    // subtract the transparent region and snap to the bounds
844    Rect bounds = reduce(win, s.activeTransparentRegion);
845    Rect frame(s.active.transform.transform(bounds));
846    frame.intersect(hw->getViewport(), &frame);
847    if (!s.finalCrop.isEmpty()) {
848        frame.intersect(s.finalCrop, &frame);
849    }
850    const Transform& tr(hw->getTransform());
851    return Rect(tr.transform(frame));
852}
853#endif
854
855// ---------------------------------------------------------------------------
856// drawing...
857// ---------------------------------------------------------------------------
858
859void Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const {
860    onDraw(hw, clip, false);
861}
862
863void Layer::draw(const sp<const DisplayDevice>& hw,
864        bool useIdentityTransform) const {
865    onDraw(hw, Region(hw->bounds()), useIdentityTransform);
866}
867
868void Layer::draw(const sp<const DisplayDevice>& hw) const {
869    onDraw(hw, Region(hw->bounds()), false);
870}
871
872void Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip,
873        bool useIdentityTransform) const
874{
875    ATRACE_CALL();
876
877    if (CC_UNLIKELY(mActiveBuffer == 0)) {
878        // the texture has not been created yet, this Layer has
879        // in fact never been drawn into. This happens frequently with
880        // SurfaceView because the WindowManager can't know when the client
881        // has drawn the first time.
882
883        // If there is nothing under us, we paint the screen in black, otherwise
884        // we just skip this update.
885
886        // figure out if there is something below us
887        Region under;
888        const SurfaceFlinger::LayerVector& drawingLayers(
889                mFlinger->mDrawingState.layersSortedByZ);
890        const size_t count = drawingLayers.size();
891        for (size_t i=0 ; i<count ; ++i) {
892            const sp<Layer>& layer(drawingLayers[i]);
893            if (layer.get() == static_cast<Layer const*>(this))
894                break;
895            under.orSelf( hw->getTransform().transform(layer->visibleRegion) );
896        }
897        // if not everything below us is covered, we plug the holes!
898        Region holes(clip.subtract(under));
899        if (!holes.isEmpty()) {
900            clearWithOpenGL(hw, holes, 0, 0, 0, 1);
901        }
902        return;
903    }
904
905    // Bind the current buffer to the GL texture, and wait for it to be
906    // ready for us to draw into.
907    status_t err = mSurfaceFlingerConsumer->bindTextureImage();
908    if (err != NO_ERROR) {
909        ALOGW("onDraw: bindTextureImage failed (err=%d)", err);
910        // Go ahead and draw the buffer anyway; no matter what we do the screen
911        // is probably going to have something visibly wrong.
912    }
913
914    bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure());
915
916    RenderEngine& engine(mFlinger->getRenderEngine());
917
918    if (!blackOutLayer) {
919        // TODO: we could be more subtle with isFixedSize()
920        const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize();
921
922        // Query the texture matrix given our current filtering mode.
923        float textureMatrix[16];
924        mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering);
925        mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix);
926
927        if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
928
929            /*
930             * the code below applies the primary display's inverse transform to
931             * the texture transform
932             */
933
934            // create a 4x4 transform matrix from the display transform flags
935            const mat4 flipH(-1,0,0,0,  0,1,0,0, 0,0,1,0, 1,0,0,1);
936            const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1);
937            const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1);
938
939            mat4 tr;
940            uint32_t transform =
941                    DisplayDevice::getPrimaryDisplayOrientationTransform();
942            if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90)
943                tr = tr * rot90;
944            if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H)
945                tr = tr * flipH;
946            if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V)
947                tr = tr * flipV;
948
949            // calculate the inverse
950            tr = inverse(tr);
951
952            // and finally apply it to the original texture matrix
953            const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr);
954            memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix));
955        }
956
957        // Set things up for texturing.
958        mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight());
959        mTexture.setFiltering(useFiltering);
960        mTexture.setMatrix(textureMatrix);
961
962        engine.setupLayerTexturing(mTexture);
963    } else {
964        engine.setupLayerBlackedOut();
965    }
966    drawWithOpenGL(hw, clip, useIdentityTransform);
967    engine.disableTexturing();
968}
969
970
971void Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw,
972        const Region& /* clip */, float red, float green, float blue,
973        float alpha) const
974{
975    RenderEngine& engine(mFlinger->getRenderEngine());
976    computeGeometry(hw, mMesh, false);
977    engine.setupFillWithColor(red, green, blue, alpha);
978    engine.drawMesh(mMesh);
979}
980
981void Layer::clearWithOpenGL(
982        const sp<const DisplayDevice>& hw, const Region& clip) const {
983    clearWithOpenGL(hw, clip, 0,0,0,0);
984}
985
986void Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw,
987        const Region& /* clip */, bool useIdentityTransform) const {
988    const State& s(getDrawingState());
989
990    computeGeometry(hw, mMesh, useIdentityTransform);
991
992    /*
993     * NOTE: the way we compute the texture coordinates here produces
994     * different results than when we take the HWC path -- in the later case
995     * the "source crop" is rounded to texel boundaries.
996     * This can produce significantly different results when the texture
997     * is scaled by a large amount.
998     *
999     * The GL code below is more logical (imho), and the difference with
1000     * HWC is due to a limitation of the HWC API to integers -- a question
1001     * is suspend is whether we should ignore this problem or revert to
1002     * GL composition when a buffer scaling is applied (maybe with some
1003     * minimal value)? Or, we could make GL behave like HWC -- but this feel
1004     * like more of a hack.
1005     */
1006    Rect win(computeBounds());
1007
1008    if (!s.finalCrop.isEmpty()) {
1009        win = s.active.transform.transform(win);
1010        if (!win.intersect(s.finalCrop, &win)) {
1011            win.clear();
1012        }
1013        win = s.active.transform.inverse().transform(win);
1014        if (!win.intersect(computeBounds(), &win)) {
1015            win.clear();
1016        }
1017    }
1018
1019    float left   = float(win.left)   / float(s.active.w);
1020    float top    = float(win.top)    / float(s.active.h);
1021    float right  = float(win.right)  / float(s.active.w);
1022    float bottom = float(win.bottom) / float(s.active.h);
1023
1024    // TODO: we probably want to generate the texture coords with the mesh
1025    // here we assume that we only have 4 vertices
1026    Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>());
1027    texCoords[0] = vec2(left, 1.0f - top);
1028    texCoords[1] = vec2(left, 1.0f - bottom);
1029    texCoords[2] = vec2(right, 1.0f - bottom);
1030    texCoords[3] = vec2(right, 1.0f - top);
1031
1032    RenderEngine& engine(mFlinger->getRenderEngine());
1033    engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), s.alpha);
1034    engine.drawMesh(mMesh);
1035    engine.disableBlending();
1036}
1037
1038#ifdef USE_HWC2
1039void Layer::setCompositionType(int32_t hwcId, HWC2::Composition type,
1040        bool callIntoHwc) {
1041    if (mHwcLayers.count(hwcId) == 0) {
1042        ALOGE("setCompositionType called without a valid HWC layer");
1043        return;
1044    }
1045    auto& hwcInfo = mHwcLayers[hwcId];
1046    auto& hwcLayer = hwcInfo.layer;
1047    ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(),
1048            to_string(type).c_str(), static_cast<int>(callIntoHwc));
1049    if (hwcInfo.compositionType != type) {
1050        ALOGV("    actually setting");
1051        hwcInfo.compositionType = type;
1052        if (callIntoHwc) {
1053            auto error = hwcLayer->setCompositionType(type);
1054            ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set "
1055                    "composition type %s: %s (%d)", mName.string(),
1056                    to_string(type).c_str(), to_string(error).c_str(),
1057                    static_cast<int32_t>(error));
1058        }
1059    }
1060}
1061
1062HWC2::Composition Layer::getCompositionType(int32_t hwcId) const {
1063    if (mHwcLayers.count(hwcId) == 0) {
1064        ALOGE("getCompositionType called without a valid HWC layer");
1065        return HWC2::Composition::Invalid;
1066    }
1067    return mHwcLayers.at(hwcId).compositionType;
1068}
1069
1070void Layer::setClearClientTarget(int32_t hwcId, bool clear) {
1071    if (mHwcLayers.count(hwcId) == 0) {
1072        ALOGE("setClearClientTarget called without a valid HWC layer");
1073        return;
1074    }
1075    mHwcLayers[hwcId].clearClientTarget = clear;
1076}
1077
1078bool Layer::getClearClientTarget(int32_t hwcId) const {
1079    if (mHwcLayers.count(hwcId) == 0) {
1080        ALOGE("getClearClientTarget called without a valid HWC layer");
1081        return false;
1082    }
1083    return mHwcLayers.at(hwcId).clearClientTarget;
1084}
1085#endif
1086
1087uint32_t Layer::getProducerStickyTransform() const {
1088    int producerStickyTransform = 0;
1089    int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform);
1090    if (ret != OK) {
1091        ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__,
1092                strerror(-ret), ret);
1093        return 0;
1094    }
1095    return static_cast<uint32_t>(producerStickyTransform);
1096}
1097
1098uint64_t Layer::getHeadFrameNumber() const {
1099    Mutex::Autolock lock(mQueueItemLock);
1100    if (!mQueueItems.empty()) {
1101        return mQueueItems[0].mFrameNumber;
1102    } else {
1103        return mCurrentFrameNumber;
1104    }
1105}
1106
1107bool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) {
1108    if (point->getFrameNumber() <= mCurrentFrameNumber) {
1109        // Don't bother with a SyncPoint, since we've already latched the
1110        // relevant frame
1111        return false;
1112    }
1113
1114    Mutex::Autolock lock(mLocalSyncPointMutex);
1115    mLocalSyncPoints.push_back(point);
1116    return true;
1117}
1118
1119void Layer::setFiltering(bool filtering) {
1120    mFiltering = filtering;
1121}
1122
1123bool Layer::getFiltering() const {
1124    return mFiltering;
1125}
1126
1127// As documented in libhardware header, formats in the range
1128// 0x100 - 0x1FF are specific to the HAL implementation, and
1129// are known to have no alpha channel
1130// TODO: move definition for device-specific range into
1131// hardware.h, instead of using hard-coded values here.
1132#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF)
1133
1134bool Layer::getOpacityForFormat(uint32_t format) {
1135    if (HARDWARE_IS_DEVICE_FORMAT(format)) {
1136        return true;
1137    }
1138    switch (format) {
1139        case HAL_PIXEL_FORMAT_RGBA_8888:
1140        case HAL_PIXEL_FORMAT_BGRA_8888:
1141            return false;
1142    }
1143    // in all other case, we have no blending (also for unknown formats)
1144    return true;
1145}
1146
1147// ----------------------------------------------------------------------------
1148// local state
1149// ----------------------------------------------------------------------------
1150
1151static void boundPoint(vec2* point, const Rect& crop) {
1152    if (point->x < crop.left) {
1153        point->x = crop.left;
1154    }
1155    if (point->x > crop.right) {
1156        point->x = crop.right;
1157    }
1158    if (point->y < crop.top) {
1159        point->y = crop.top;
1160    }
1161    if (point->y > crop.bottom) {
1162        point->y = crop.bottom;
1163    }
1164}
1165
1166void Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh,
1167        bool useIdentityTransform) const
1168{
1169    const Layer::State& s(getDrawingState());
1170    const Transform tr(hw->getTransform());
1171    const uint32_t hw_h = hw->getHeight();
1172    Rect win(s.active.w, s.active.h);
1173    if (!s.crop.isEmpty()) {
1174        win.intersect(s.crop, &win);
1175    }
1176    // subtract the transparent region and snap to the bounds
1177    win = reduce(win, s.activeTransparentRegion);
1178
1179    vec2 lt = vec2(win.left, win.top);
1180    vec2 lb = vec2(win.left, win.bottom);
1181    vec2 rb = vec2(win.right, win.bottom);
1182    vec2 rt = vec2(win.right, win.top);
1183
1184    if (!useIdentityTransform) {
1185        lt = s.active.transform.transform(lt);
1186        lb = s.active.transform.transform(lb);
1187        rb = s.active.transform.transform(rb);
1188        rt = s.active.transform.transform(rt);
1189    }
1190
1191    if (!s.finalCrop.isEmpty()) {
1192        boundPoint(&lt, s.finalCrop);
1193        boundPoint(&lb, s.finalCrop);
1194        boundPoint(&rb, s.finalCrop);
1195        boundPoint(&rt, s.finalCrop);
1196    }
1197
1198    Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>());
1199    position[0] = tr.transform(lt);
1200    position[1] = tr.transform(lb);
1201    position[2] = tr.transform(rb);
1202    position[3] = tr.transform(rt);
1203    for (size_t i=0 ; i<4 ; i++) {
1204        position[i].y = hw_h - position[i].y;
1205    }
1206}
1207
1208bool Layer::isOpaque(const Layer::State& s) const
1209{
1210    // if we don't have a buffer yet, we're translucent regardless of the
1211    // layer's opaque flag.
1212    if (mActiveBuffer == 0) {
1213        return false;
1214    }
1215
1216    // if the layer has the opaque flag, then we're always opaque,
1217    // otherwise we use the current buffer's format.
1218    return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity;
1219}
1220
1221bool Layer::isSecure() const
1222{
1223    const Layer::State& s(mDrawingState);
1224    return (s.flags & layer_state_t::eLayerSecure);
1225}
1226
1227bool Layer::isProtected() const
1228{
1229    const sp<GraphicBuffer>& activeBuffer(mActiveBuffer);
1230    return (activeBuffer != 0) &&
1231            (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED);
1232}
1233
1234bool Layer::isFixedSize() const {
1235    return getEffectiveScalingMode() != NATIVE_WINDOW_SCALING_MODE_FREEZE;
1236}
1237
1238bool Layer::isCropped() const {
1239    return !mCurrentCrop.isEmpty();
1240}
1241
1242bool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const {
1243    return mNeedsFiltering || hw->needsFiltering();
1244}
1245
1246void Layer::setVisibleRegion(const Region& visibleRegion) {
1247    // always called from main thread
1248    this->visibleRegion = visibleRegion;
1249}
1250
1251void Layer::setCoveredRegion(const Region& coveredRegion) {
1252    // always called from main thread
1253    this->coveredRegion = coveredRegion;
1254}
1255
1256void Layer::setVisibleNonTransparentRegion(const Region&
1257        setVisibleNonTransparentRegion) {
1258    // always called from main thread
1259    this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
1260}
1261
1262// ----------------------------------------------------------------------------
1263// transaction
1264// ----------------------------------------------------------------------------
1265
1266void Layer::pushPendingState() {
1267    if (!mCurrentState.modified) {
1268        return;
1269    }
1270
1271    // If this transaction is waiting on the receipt of a frame, generate a sync
1272    // point and send it to the remote layer.
1273    if (mCurrentState.handle != nullptr) {
1274        sp<Handle> handle = static_cast<Handle*>(mCurrentState.handle.get());
1275        sp<Layer> handleLayer = handle->owner.promote();
1276        if (handleLayer == nullptr) {
1277            ALOGE("[%s] Unable to promote Layer handle", mName.string());
1278            // If we can't promote the layer we are intended to wait on,
1279            // then it is expired or otherwise invalid. Allow this transaction
1280            // to be applied as per normal (no synchronization).
1281            mCurrentState.handle = nullptr;
1282        } else {
1283            auto syncPoint = std::make_shared<SyncPoint>(
1284                    mCurrentState.frameNumber);
1285            if (handleLayer->addSyncPoint(syncPoint)) {
1286                mRemoteSyncPoints.push_back(std::move(syncPoint));
1287            } else {
1288                // We already missed the frame we're supposed to synchronize
1289                // on, so go ahead and apply the state update
1290                mCurrentState.handle = nullptr;
1291            }
1292        }
1293
1294        // Wake us up to check if the frame has been received
1295        setTransactionFlags(eTransactionNeeded);
1296    }
1297    mPendingStates.push_back(mCurrentState);
1298}
1299
1300void Layer::popPendingState(State* stateToCommit) {
1301    auto oldFlags = stateToCommit->flags;
1302    *stateToCommit = mPendingStates[0];
1303    stateToCommit->flags = (oldFlags & ~stateToCommit->mask) |
1304            (stateToCommit->flags & stateToCommit->mask);
1305
1306    mPendingStates.removeAt(0);
1307}
1308
1309bool Layer::applyPendingStates(State* stateToCommit) {
1310    bool stateUpdateAvailable = false;
1311    while (!mPendingStates.empty()) {
1312        if (mPendingStates[0].handle != nullptr) {
1313            if (mRemoteSyncPoints.empty()) {
1314                // If we don't have a sync point for this, apply it anyway. It
1315                // will be visually wrong, but it should keep us from getting
1316                // into too much trouble.
1317                ALOGE("[%s] No local sync point found", mName.string());
1318                popPendingState(stateToCommit);
1319                stateUpdateAvailable = true;
1320                continue;
1321            }
1322
1323            if (mRemoteSyncPoints.front()->getFrameNumber() !=
1324                    mPendingStates[0].frameNumber) {
1325                ALOGE("[%s] Unexpected sync point frame number found",
1326                        mName.string());
1327
1328                // Signal our end of the sync point and then dispose of it
1329                mRemoteSyncPoints.front()->setTransactionApplied();
1330                mRemoteSyncPoints.pop_front();
1331                continue;
1332            }
1333
1334            if (mRemoteSyncPoints.front()->frameIsAvailable()) {
1335                // Apply the state update
1336                popPendingState(stateToCommit);
1337                stateUpdateAvailable = true;
1338
1339                // Signal our end of the sync point and then dispose of it
1340                mRemoteSyncPoints.front()->setTransactionApplied();
1341                mRemoteSyncPoints.pop_front();
1342            } else {
1343                break;
1344            }
1345        } else {
1346            popPendingState(stateToCommit);
1347            stateUpdateAvailable = true;
1348        }
1349    }
1350
1351    // If we still have pending updates, wake SurfaceFlinger back up and point
1352    // it at this layer so we can process them
1353    if (!mPendingStates.empty()) {
1354        setTransactionFlags(eTransactionNeeded);
1355        mFlinger->setTransactionFlags(eTraversalNeeded);
1356    }
1357
1358    mCurrentState.modified = false;
1359    return stateUpdateAvailable;
1360}
1361
1362void Layer::notifyAvailableFrames() {
1363    auto headFrameNumber = getHeadFrameNumber();
1364    Mutex::Autolock lock(mLocalSyncPointMutex);
1365    for (auto& point : mLocalSyncPoints) {
1366        if (headFrameNumber >= point->getFrameNumber()) {
1367            point->setFrameAvailable();
1368        }
1369    }
1370}
1371
1372uint32_t Layer::doTransaction(uint32_t flags) {
1373    ATRACE_CALL();
1374
1375    pushPendingState();
1376    Layer::State c = getCurrentState();
1377    if (!applyPendingStates(&c)) {
1378        return 0;
1379    }
1380
1381    const Layer::State& s(getDrawingState());
1382
1383    const bool sizeChanged = (c.requested.w != s.requested.w) ||
1384                             (c.requested.h != s.requested.h);
1385
1386    if (sizeChanged) {
1387        // the size changed, we need to ask our client to request a new buffer
1388        ALOGD_IF(DEBUG_RESIZE,
1389                "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n"
1390                "  current={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1391                "            requested={ wh={%4u,%4u} }}\n"
1392                "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1393                "            requested={ wh={%4u,%4u} }}\n",
1394                this, getName().string(), mCurrentTransform,
1395                getEffectiveScalingMode(),
1396                c.active.w, c.active.h,
1397                c.crop.left,
1398                c.crop.top,
1399                c.crop.right,
1400                c.crop.bottom,
1401                c.crop.getWidth(),
1402                c.crop.getHeight(),
1403                c.requested.w, c.requested.h,
1404                s.active.w, s.active.h,
1405                s.crop.left,
1406                s.crop.top,
1407                s.crop.right,
1408                s.crop.bottom,
1409                s.crop.getWidth(),
1410                s.crop.getHeight(),
1411                s.requested.w, s.requested.h);
1412
1413        // record the new size, form this point on, when the client request
1414        // a buffer, it'll get the new size.
1415        mSurfaceFlingerConsumer->setDefaultBufferSize(
1416                c.requested.w, c.requested.h);
1417    }
1418
1419    const bool resizePending = (c.requested.w != c.active.w) ||
1420            (c.requested.h != c.active.h);
1421    if (!isFixedSize()) {
1422        if (resizePending && mSidebandStream == NULL) {
1423            // don't let Layer::doTransaction update the drawing state
1424            // if we have a pending resize, unless we are in fixed-size mode.
1425            // the drawing state will be updated only once we receive a buffer
1426            // with the correct size.
1427            //
1428            // in particular, we want to make sure the clip (which is part
1429            // of the geometry state) is latched together with the size but is
1430            // latched immediately when no resizing is involved.
1431            //
1432            // If a sideband stream is attached, however, we want to skip this
1433            // optimization so that transactions aren't missed when a buffer
1434            // never arrives
1435
1436            flags |= eDontUpdateGeometryState;
1437        }
1438    }
1439
1440    // always set active to requested, unless we're asked not to
1441    // this is used by Layer, which special cases resizes.
1442    if (flags & eDontUpdateGeometryState)  {
1443    } else {
1444        Layer::State& editCurrentState(getCurrentState());
1445        if (mFreezePositionUpdates) {
1446            float tx = c.active.transform.tx();
1447            float ty = c.active.transform.ty();
1448            c.active = c.requested;
1449            c.active.transform.set(tx, ty);
1450            editCurrentState.active = c.active;
1451        } else {
1452            editCurrentState.active = editCurrentState.requested;
1453            c.active = c.requested;
1454        }
1455    }
1456
1457    if (s.active != c.active) {
1458        // invalidate and recompute the visible regions if needed
1459        flags |= Layer::eVisibleRegion;
1460    }
1461
1462    if (c.sequence != s.sequence) {
1463        // invalidate and recompute the visible regions if needed
1464        flags |= eVisibleRegion;
1465        this->contentDirty = true;
1466
1467        // we may use linear filtering, if the matrix scales us
1468        const uint8_t type = c.active.transform.getType();
1469        mNeedsFiltering = (!c.active.transform.preserveRects() ||
1470                (type >= Transform::SCALE));
1471    }
1472
1473    // If the layer is hidden, signal and clear out all local sync points so
1474    // that transactions for layers depending on this layer's frames becoming
1475    // visible are not blocked
1476    if (c.flags & layer_state_t::eLayerHidden) {
1477        Mutex::Autolock lock(mLocalSyncPointMutex);
1478        for (auto& point : mLocalSyncPoints) {
1479            point->setFrameAvailable();
1480        }
1481        mLocalSyncPoints.clear();
1482    }
1483
1484    // Commit the transaction
1485    commitTransaction(c);
1486    return flags;
1487}
1488
1489void Layer::commitTransaction(const State& stateToCommit) {
1490    mDrawingState = stateToCommit;
1491}
1492
1493uint32_t Layer::getTransactionFlags(uint32_t flags) {
1494    return android_atomic_and(~flags, &mTransactionFlags) & flags;
1495}
1496
1497uint32_t Layer::setTransactionFlags(uint32_t flags) {
1498    return android_atomic_or(flags, &mTransactionFlags);
1499}
1500
1501bool Layer::setPosition(float x, float y, bool immediate) {
1502    if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y)
1503        return false;
1504    mCurrentState.sequence++;
1505
1506    // We update the requested and active position simultaneously because
1507    // we want to apply the position portion of the transform matrix immediately,
1508    // but still delay scaling when resizing a SCALING_MODE_FREEZE layer.
1509    mCurrentState.requested.transform.set(x, y);
1510    if (immediate && !mFreezePositionUpdates) {
1511        mCurrentState.active.transform.set(x, y);
1512    }
1513    mFreezePositionUpdates = mFreezePositionUpdates || !immediate;
1514
1515    mCurrentState.modified = true;
1516    setTransactionFlags(eTransactionNeeded);
1517    return true;
1518}
1519
1520bool Layer::setLayer(uint32_t z) {
1521    if (mCurrentState.z == z)
1522        return false;
1523    mCurrentState.sequence++;
1524    mCurrentState.z = z;
1525    mCurrentState.modified = true;
1526    setTransactionFlags(eTransactionNeeded);
1527    return true;
1528}
1529bool Layer::setSize(uint32_t w, uint32_t h) {
1530    if (mCurrentState.requested.w == w && mCurrentState.requested.h == h)
1531        return false;
1532    mCurrentState.requested.w = w;
1533    mCurrentState.requested.h = h;
1534    mCurrentState.modified = true;
1535    setTransactionFlags(eTransactionNeeded);
1536    return true;
1537}
1538#ifdef USE_HWC2
1539bool Layer::setAlpha(float alpha) {
1540#else
1541bool Layer::setAlpha(uint8_t alpha) {
1542#endif
1543    if (mCurrentState.alpha == alpha)
1544        return false;
1545    mCurrentState.sequence++;
1546    mCurrentState.alpha = alpha;
1547    mCurrentState.modified = true;
1548    setTransactionFlags(eTransactionNeeded);
1549    return true;
1550}
1551bool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) {
1552    mCurrentState.sequence++;
1553    mCurrentState.requested.transform.set(
1554            matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy);
1555    mCurrentState.modified = true;
1556    setTransactionFlags(eTransactionNeeded);
1557    return true;
1558}
1559bool Layer::setTransparentRegionHint(const Region& transparent) {
1560    mCurrentState.requestedTransparentRegion = transparent;
1561    mCurrentState.modified = true;
1562    setTransactionFlags(eTransactionNeeded);
1563    return true;
1564}
1565bool Layer::setFlags(uint8_t flags, uint8_t mask) {
1566    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
1567    if (mCurrentState.flags == newFlags)
1568        return false;
1569    mCurrentState.sequence++;
1570    mCurrentState.flags = newFlags;
1571    mCurrentState.mask = mask;
1572    mCurrentState.modified = true;
1573    setTransactionFlags(eTransactionNeeded);
1574    return true;
1575}
1576bool Layer::setCrop(const Rect& crop) {
1577    if (mCurrentState.crop == crop)
1578        return false;
1579    mCurrentState.sequence++;
1580    mCurrentState.crop = crop;
1581    mCurrentState.modified = true;
1582    setTransactionFlags(eTransactionNeeded);
1583    return true;
1584}
1585bool Layer::setFinalCrop(const Rect& crop) {
1586    if (mCurrentState.finalCrop == crop)
1587        return false;
1588    mCurrentState.sequence++;
1589    mCurrentState.finalCrop = crop;
1590    mCurrentState.modified = true;
1591    setTransactionFlags(eTransactionNeeded);
1592    return true;
1593}
1594
1595bool Layer::setOverrideScalingMode(int32_t scalingMode) {
1596    if (scalingMode == mOverrideScalingMode)
1597        return false;
1598    mOverrideScalingMode = scalingMode;
1599    setTransactionFlags(eTransactionNeeded);
1600    return true;
1601}
1602
1603uint32_t Layer::getEffectiveScalingMode() const {
1604    if (mOverrideScalingMode >= 0) {
1605      return mOverrideScalingMode;
1606    }
1607    return mCurrentScalingMode;
1608}
1609
1610bool Layer::setLayerStack(uint32_t layerStack) {
1611    if (mCurrentState.layerStack == layerStack)
1612        return false;
1613    mCurrentState.sequence++;
1614    mCurrentState.layerStack = layerStack;
1615    mCurrentState.modified = true;
1616    setTransactionFlags(eTransactionNeeded);
1617    return true;
1618}
1619
1620void Layer::deferTransactionUntil(const sp<IBinder>& handle,
1621        uint64_t frameNumber) {
1622    mCurrentState.handle = handle;
1623    mCurrentState.frameNumber = frameNumber;
1624    // We don't set eTransactionNeeded, because just receiving a deferral
1625    // request without any other state updates shouldn't actually induce a delay
1626    mCurrentState.modified = true;
1627    pushPendingState();
1628    mCurrentState.handle = nullptr;
1629    mCurrentState.frameNumber = 0;
1630    mCurrentState.modified = false;
1631}
1632
1633void Layer::useSurfaceDamage() {
1634    if (mFlinger->mForceFullDamage) {
1635        surfaceDamageRegion = Region::INVALID_REGION;
1636    } else {
1637        surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage();
1638    }
1639}
1640
1641void Layer::useEmptyDamage() {
1642    surfaceDamageRegion.clear();
1643}
1644
1645// ----------------------------------------------------------------------------
1646// pageflip handling...
1647// ----------------------------------------------------------------------------
1648
1649bool Layer::shouldPresentNow(const DispSync& dispSync) const {
1650    if (mSidebandStreamChanged || mAutoRefresh) {
1651        return true;
1652    }
1653
1654    Mutex::Autolock lock(mQueueItemLock);
1655    if (mQueueItems.empty()) {
1656        return false;
1657    }
1658    auto timestamp = mQueueItems[0].mTimestamp;
1659    nsecs_t expectedPresent =
1660            mSurfaceFlingerConsumer->computeExpectedPresent(dispSync);
1661
1662    // Ignore timestamps more than a second in the future
1663    bool isPlausible = timestamp < (expectedPresent + s2ns(1));
1664    ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible "
1665            "relative to expectedPresent %" PRId64, mName.string(), timestamp,
1666            expectedPresent);
1667
1668    bool isDue = timestamp < expectedPresent;
1669    return isDue || !isPlausible;
1670}
1671
1672bool Layer::onPreComposition() {
1673    mRefreshPending = false;
1674    return mQueuedFrames > 0 || mSidebandStreamChanged || mAutoRefresh;
1675}
1676
1677bool Layer::onPostComposition() {
1678    bool frameLatencyNeeded = mFrameLatencyNeeded;
1679    if (mFrameLatencyNeeded) {
1680        nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp();
1681        mFrameTracker.setDesiredPresentTime(desiredPresentTime);
1682
1683        sp<Fence> frameReadyFence = mSurfaceFlingerConsumer->getCurrentFence();
1684        if (frameReadyFence->isValid()) {
1685            mFrameTracker.setFrameReadyFence(frameReadyFence);
1686        } else {
1687            // There was no fence for this frame, so assume that it was ready
1688            // to be presented at the desired present time.
1689            mFrameTracker.setFrameReadyTime(desiredPresentTime);
1690        }
1691
1692        const HWComposer& hwc = mFlinger->getHwComposer();
1693#ifdef USE_HWC2
1694        sp<Fence> presentFence = hwc.getRetireFence(HWC_DISPLAY_PRIMARY);
1695#else
1696        sp<Fence> presentFence = hwc.getDisplayFence(HWC_DISPLAY_PRIMARY);
1697#endif
1698        if (presentFence->isValid()) {
1699            mFrameTracker.setActualPresentFence(presentFence);
1700        } else {
1701            // The HWC doesn't support present fences, so use the refresh
1702            // timestamp instead.
1703            nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1704            mFrameTracker.setActualPresentTime(presentTime);
1705        }
1706
1707        mFrameTracker.advanceFrame();
1708        mFrameLatencyNeeded = false;
1709    }
1710    return frameLatencyNeeded;
1711}
1712
1713#ifdef USE_HWC2
1714void Layer::releasePendingBuffer() {
1715    mSurfaceFlingerConsumer->releasePendingBuffer();
1716}
1717#endif
1718
1719bool Layer::isVisible() const {
1720    const Layer::State& s(mDrawingState);
1721#ifdef USE_HWC2
1722    return !(s.flags & layer_state_t::eLayerHidden) && s.alpha > 0.0f
1723            && (mActiveBuffer != NULL || mSidebandStream != NULL);
1724#else
1725    return !(s.flags & layer_state_t::eLayerHidden) && s.alpha
1726            && (mActiveBuffer != NULL || mSidebandStream != NULL);
1727#endif
1728}
1729
1730Region Layer::latchBuffer(bool& recomputeVisibleRegions)
1731{
1732    ATRACE_CALL();
1733
1734    if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) {
1735        // mSidebandStreamChanged was true
1736        mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream();
1737        if (mSidebandStream != NULL) {
1738            setTransactionFlags(eTransactionNeeded);
1739            mFlinger->setTransactionFlags(eTraversalNeeded);
1740        }
1741        recomputeVisibleRegions = true;
1742
1743        const State& s(getDrawingState());
1744        return s.active.transform.transform(Region(Rect(s.active.w, s.active.h)));
1745    }
1746
1747    Region outDirtyRegion;
1748    if (mQueuedFrames > 0 || mAutoRefresh) {
1749
1750        // if we've already called updateTexImage() without going through
1751        // a composition step, we have to skip this layer at this point
1752        // because we cannot call updateTeximage() without a corresponding
1753        // compositionComplete() call.
1754        // we'll trigger an update in onPreComposition().
1755        if (mRefreshPending) {
1756            return outDirtyRegion;
1757        }
1758
1759        // Capture the old state of the layer for comparisons later
1760        const State& s(getDrawingState());
1761        const bool oldOpacity = isOpaque(s);
1762        sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer;
1763
1764        struct Reject : public SurfaceFlingerConsumer::BufferRejecter {
1765            Layer::State& front;
1766            Layer::State& current;
1767            bool& recomputeVisibleRegions;
1768            bool stickyTransformSet;
1769            const char* name;
1770            int32_t overrideScalingMode;
1771
1772            Reject(Layer::State& front, Layer::State& current,
1773                    bool& recomputeVisibleRegions, bool stickySet,
1774                    const char* name,
1775                    int32_t overrideScalingMode)
1776                : front(front), current(current),
1777                  recomputeVisibleRegions(recomputeVisibleRegions),
1778                  stickyTransformSet(stickySet),
1779                  name(name),
1780                  overrideScalingMode(overrideScalingMode) {
1781            }
1782
1783            virtual bool reject(const sp<GraphicBuffer>& buf,
1784                    const BufferItem& item) {
1785                if (buf == NULL) {
1786                    return false;
1787                }
1788
1789                uint32_t bufWidth  = buf->getWidth();
1790                uint32_t bufHeight = buf->getHeight();
1791
1792                // check that we received a buffer of the right size
1793                // (Take the buffer's orientation into account)
1794                if (item.mTransform & Transform::ROT_90) {
1795                    swap(bufWidth, bufHeight);
1796                }
1797
1798                int actualScalingMode = overrideScalingMode >= 0 ?
1799                        overrideScalingMode : item.mScalingMode;
1800                bool isFixedSize = actualScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE;
1801                if (front.active != front.requested) {
1802
1803                    if (isFixedSize ||
1804                            (bufWidth == front.requested.w &&
1805                             bufHeight == front.requested.h))
1806                    {
1807                        // Here we pretend the transaction happened by updating the
1808                        // current and drawing states. Drawing state is only accessed
1809                        // in this thread, no need to have it locked
1810                        front.active = front.requested;
1811
1812                        // We also need to update the current state so that
1813                        // we don't end-up overwriting the drawing state with
1814                        // this stale current state during the next transaction
1815                        //
1816                        // NOTE: We don't need to hold the transaction lock here
1817                        // because State::active is only accessed from this thread.
1818                        current.active = front.active;
1819                        current.modified = true;
1820
1821                        // recompute visible region
1822                        recomputeVisibleRegions = true;
1823                    }
1824
1825                    ALOGD_IF(DEBUG_RESIZE,
1826                            "[%s] latchBuffer/reject: buffer (%ux%u, tr=%02x), scalingMode=%d\n"
1827                            "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1828                            "            requested={ wh={%4u,%4u} }}\n",
1829                            name,
1830                            bufWidth, bufHeight, item.mTransform, item.mScalingMode,
1831                            front.active.w, front.active.h,
1832                            front.crop.left,
1833                            front.crop.top,
1834                            front.crop.right,
1835                            front.crop.bottom,
1836                            front.crop.getWidth(),
1837                            front.crop.getHeight(),
1838                            front.requested.w, front.requested.h);
1839                }
1840
1841                if (!isFixedSize && !stickyTransformSet) {
1842                    if (front.active.w != bufWidth ||
1843                        front.active.h != bufHeight) {
1844                        // reject this buffer
1845                        ALOGE("[%s] rejecting buffer: "
1846                                "bufWidth=%d, bufHeight=%d, front.active.{w=%d, h=%d}",
1847                                name, bufWidth, bufHeight, front.active.w, front.active.h);
1848                        return true;
1849                    }
1850                }
1851
1852                // if the transparent region has changed (this test is
1853                // conservative, but that's fine, worst case we're doing
1854                // a bit of extra work), we latch the new one and we
1855                // trigger a visible-region recompute.
1856                if (!front.activeTransparentRegion.isTriviallyEqual(
1857                        front.requestedTransparentRegion)) {
1858                    front.activeTransparentRegion = front.requestedTransparentRegion;
1859
1860                    // We also need to update the current state so that
1861                    // we don't end-up overwriting the drawing state with
1862                    // this stale current state during the next transaction
1863                    //
1864                    // NOTE: We don't need to hold the transaction lock here
1865                    // because State::active is only accessed from this thread.
1866                    current.activeTransparentRegion = front.activeTransparentRegion;
1867
1868                    // recompute visible region
1869                    recomputeVisibleRegions = true;
1870                }
1871
1872                return false;
1873            }
1874        };
1875
1876        Reject r(mDrawingState, getCurrentState(), recomputeVisibleRegions,
1877                getProducerStickyTransform() != 0, mName.string(),
1878                mOverrideScalingMode);
1879
1880
1881        // Check all of our local sync points to ensure that all transactions
1882        // which need to have been applied prior to the frame which is about to
1883        // be latched have signaled
1884
1885        auto headFrameNumber = getHeadFrameNumber();
1886        bool matchingFramesFound = false;
1887        bool allTransactionsApplied = true;
1888        {
1889            Mutex::Autolock lock(mLocalSyncPointMutex);
1890            for (auto& point : mLocalSyncPoints) {
1891                if (point->getFrameNumber() > headFrameNumber) {
1892                    break;
1893                }
1894
1895                matchingFramesFound = true;
1896
1897                if (!point->frameIsAvailable()) {
1898                    // We haven't notified the remote layer that the frame for
1899                    // this point is available yet. Notify it now, and then
1900                    // abort this attempt to latch.
1901                    point->setFrameAvailable();
1902                    allTransactionsApplied = false;
1903                    break;
1904                }
1905
1906                allTransactionsApplied &= point->transactionIsApplied();
1907            }
1908        }
1909
1910        if (matchingFramesFound && !allTransactionsApplied) {
1911            mFlinger->signalLayerUpdate();
1912            return outDirtyRegion;
1913        }
1914
1915        // This boolean is used to make sure that SurfaceFlinger's shadow copy
1916        // of the buffer queue isn't modified when the buffer queue is returning
1917        // BufferItem's that weren't actually queued. This can happen in shared
1918        // buffer mode.
1919        bool queuedBuffer = false;
1920        status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r,
1921                mFlinger->mPrimaryDispSync, &mAutoRefresh, &queuedBuffer,
1922                mLastFrameNumberReceived);
1923        if (updateResult == BufferQueue::PRESENT_LATER) {
1924            // Producer doesn't want buffer to be displayed yet.  Signal a
1925            // layer update so we check again at the next opportunity.
1926            mFlinger->signalLayerUpdate();
1927            return outDirtyRegion;
1928        } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) {
1929            // If the buffer has been rejected, remove it from the shadow queue
1930            // and return early
1931            if (queuedBuffer) {
1932                Mutex::Autolock lock(mQueueItemLock);
1933                mQueueItems.removeAt(0);
1934                android_atomic_dec(&mQueuedFrames);
1935            }
1936            return outDirtyRegion;
1937        } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) {
1938            // This can occur if something goes wrong when trying to create the
1939            // EGLImage for this buffer. If this happens, the buffer has already
1940            // been released, so we need to clean up the queue and bug out
1941            // early.
1942            if (queuedBuffer) {
1943                Mutex::Autolock lock(mQueueItemLock);
1944                mQueueItems.clear();
1945                android_atomic_and(0, &mQueuedFrames);
1946            }
1947
1948            // Once we have hit this state, the shadow queue may no longer
1949            // correctly reflect the incoming BufferQueue's contents, so even if
1950            // updateTexImage starts working, the only safe course of action is
1951            // to continue to ignore updates.
1952            mUpdateTexImageFailed = true;
1953
1954            return outDirtyRegion;
1955        }
1956
1957        if (queuedBuffer) {
1958            // Autolock scope
1959            auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
1960
1961            Mutex::Autolock lock(mQueueItemLock);
1962
1963            // Remove any stale buffers that have been dropped during
1964            // updateTexImage
1965            while (mQueueItems[0].mFrameNumber != currentFrameNumber) {
1966                mQueueItems.removeAt(0);
1967                android_atomic_dec(&mQueuedFrames);
1968            }
1969
1970            mQueueItems.removeAt(0);
1971        }
1972
1973
1974        // Decrement the queued-frames count.  Signal another event if we
1975        // have more frames pending.
1976        if ((queuedBuffer && android_atomic_dec(&mQueuedFrames) > 1)
1977                || mAutoRefresh) {
1978            mFlinger->signalLayerUpdate();
1979        }
1980
1981        if (updateResult != NO_ERROR) {
1982            // something happened!
1983            recomputeVisibleRegions = true;
1984            return outDirtyRegion;
1985        }
1986
1987        // update the active buffer
1988        mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer();
1989        if (mActiveBuffer == NULL) {
1990            // this can only happen if the very first buffer was rejected.
1991            return outDirtyRegion;
1992        }
1993
1994        mRefreshPending = true;
1995        mFrameLatencyNeeded = true;
1996        if (oldActiveBuffer == NULL) {
1997             // the first time we receive a buffer, we need to trigger a
1998             // geometry invalidation.
1999            recomputeVisibleRegions = true;
2000         }
2001
2002        Rect crop(mSurfaceFlingerConsumer->getCurrentCrop());
2003        const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform());
2004        const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode());
2005        if ((crop != mCurrentCrop) ||
2006            (transform != mCurrentTransform) ||
2007            (scalingMode != mCurrentScalingMode))
2008        {
2009            mCurrentCrop = crop;
2010            mCurrentTransform = transform;
2011            mCurrentScalingMode = scalingMode;
2012            recomputeVisibleRegions = true;
2013        }
2014
2015        if (oldActiveBuffer != NULL) {
2016            uint32_t bufWidth  = mActiveBuffer->getWidth();
2017            uint32_t bufHeight = mActiveBuffer->getHeight();
2018            if (bufWidth != uint32_t(oldActiveBuffer->width) ||
2019                bufHeight != uint32_t(oldActiveBuffer->height)) {
2020                recomputeVisibleRegions = true;
2021                mFreezePositionUpdates = false;
2022            }
2023        }
2024
2025        mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format);
2026        if (oldOpacity != isOpaque(s)) {
2027            recomputeVisibleRegions = true;
2028        }
2029
2030        mCurrentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
2031
2032        // Remove any sync points corresponding to the buffer which was just
2033        // latched
2034        {
2035            Mutex::Autolock lock(mLocalSyncPointMutex);
2036            auto point = mLocalSyncPoints.begin();
2037            while (point != mLocalSyncPoints.end()) {
2038                if (!(*point)->frameIsAvailable() ||
2039                        !(*point)->transactionIsApplied()) {
2040                    // This sync point must have been added since we started
2041                    // latching. Don't drop it yet.
2042                    ++point;
2043                    continue;
2044                }
2045
2046                if ((*point)->getFrameNumber() <= mCurrentFrameNumber) {
2047                    point = mLocalSyncPoints.erase(point);
2048                } else {
2049                    ++point;
2050                }
2051            }
2052        }
2053
2054        // FIXME: postedRegion should be dirty & bounds
2055        Region dirtyRegion(Rect(s.active.w, s.active.h));
2056
2057        // transform the dirty region to window-manager space
2058        outDirtyRegion = (s.active.transform.transform(dirtyRegion));
2059    }
2060    return outDirtyRegion;
2061}
2062
2063uint32_t Layer::getEffectiveUsage(uint32_t usage) const
2064{
2065    // TODO: should we do something special if mSecure is set?
2066    if (mProtectedByApp) {
2067        // need a hardware-protected path to external video sink
2068        usage |= GraphicBuffer::USAGE_PROTECTED;
2069    }
2070    if (mPotentialCursor) {
2071        usage |= GraphicBuffer::USAGE_CURSOR;
2072    }
2073    usage |= GraphicBuffer::USAGE_HW_COMPOSER;
2074    return usage;
2075}
2076
2077void Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const {
2078    uint32_t orientation = 0;
2079    if (!mFlinger->mDebugDisableTransformHint) {
2080        // The transform hint is used to improve performance, but we can
2081        // only have a single transform hint, it cannot
2082        // apply to all displays.
2083        const Transform& planeTransform(hw->getTransform());
2084        orientation = planeTransform.getOrientation();
2085        if (orientation & Transform::ROT_INVALID) {
2086            orientation = 0;
2087        }
2088    }
2089    mSurfaceFlingerConsumer->setTransformHint(orientation);
2090}
2091
2092// ----------------------------------------------------------------------------
2093// debugging
2094// ----------------------------------------------------------------------------
2095
2096void Layer::dump(String8& result, Colorizer& colorizer) const
2097{
2098    const Layer::State& s(getDrawingState());
2099
2100    colorizer.colorize(result, Colorizer::GREEN);
2101    result.appendFormat(
2102            "+ %s %p (%s)\n",
2103            getTypeId(), this, getName().string());
2104    colorizer.reset(result);
2105
2106    s.activeTransparentRegion.dump(result, "transparentRegion");
2107    visibleRegion.dump(result, "visibleRegion");
2108    surfaceDamageRegion.dump(result, "surfaceDamageRegion");
2109    sp<Client> client(mClientRef.promote());
2110
2111    result.appendFormat(            "      "
2112            "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), "
2113            "crop=(%4d,%4d,%4d,%4d), finalCrop=(%4d,%4d,%4d,%4d), "
2114            "isOpaque=%1d, invalidate=%1d, "
2115#ifdef USE_HWC2
2116            "alpha=%.3f, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
2117#else
2118            "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
2119#endif
2120            "      client=%p\n",
2121            s.layerStack, s.z, s.active.transform.tx(), s.active.transform.ty(), s.active.w, s.active.h,
2122            s.crop.left, s.crop.top,
2123            s.crop.right, s.crop.bottom,
2124            s.finalCrop.left, s.finalCrop.top,
2125            s.finalCrop.right, s.finalCrop.bottom,
2126            isOpaque(s), contentDirty,
2127            s.alpha, s.flags,
2128            s.active.transform[0][0], s.active.transform[0][1],
2129            s.active.transform[1][0], s.active.transform[1][1],
2130            client.get());
2131
2132    sp<const GraphicBuffer> buf0(mActiveBuffer);
2133    uint32_t w0=0, h0=0, s0=0, f0=0;
2134    if (buf0 != 0) {
2135        w0 = buf0->getWidth();
2136        h0 = buf0->getHeight();
2137        s0 = buf0->getStride();
2138        f0 = buf0->format;
2139    }
2140    result.appendFormat(
2141            "      "
2142            "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X],"
2143            " queued-frames=%d, mRefreshPending=%d\n",
2144            mFormat, w0, h0, s0,f0,
2145            mQueuedFrames, mRefreshPending);
2146
2147    if (mSurfaceFlingerConsumer != 0) {
2148        mSurfaceFlingerConsumer->dump(result, "            ");
2149    }
2150}
2151
2152void Layer::dumpFrameStats(String8& result) const {
2153    mFrameTracker.dumpStats(result);
2154}
2155
2156void Layer::clearFrameStats() {
2157    mFrameTracker.clearStats();
2158}
2159
2160void Layer::logFrameStats() {
2161    mFrameTracker.logAndResetStats(mName);
2162}
2163
2164void Layer::getFrameStats(FrameStats* outStats) const {
2165    mFrameTracker.getStats(outStats);
2166}
2167
2168void Layer::getFenceData(String8* outName, uint64_t* outFrameNumber,
2169        bool* outIsGlesComposition, nsecs_t* outPostedTime,
2170        sp<Fence>* outAcquireFence, sp<Fence>* outPrevReleaseFence) const {
2171    *outName = mName;
2172    *outFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
2173
2174#ifdef USE_HWC2
2175    *outIsGlesComposition = mHwcLayers.count(HWC_DISPLAY_PRIMARY) ?
2176            mHwcLayers.at(HWC_DISPLAY_PRIMARY).compositionType ==
2177            HWC2::Composition::Client : true;
2178#else
2179    *outIsGlesComposition = mIsGlesComposition;
2180#endif
2181    *outPostedTime = mSurfaceFlingerConsumer->getTimestamp();
2182    *outAcquireFence = mSurfaceFlingerConsumer->getCurrentFence();
2183    *outPrevReleaseFence = mSurfaceFlingerConsumer->getPrevReleaseFence();
2184}
2185
2186std::vector<OccupancyTracker::Segment> Layer::getOccupancyHistory(
2187        bool forceFlush) {
2188    std::vector<OccupancyTracker::Segment> history;
2189    status_t result = mSurfaceFlingerConsumer->getOccupancyHistory(forceFlush,
2190            &history);
2191    if (result != NO_ERROR) {
2192        ALOGW("[%s] Failed to obtain occupancy history (%d)", mName.string(),
2193                result);
2194        return {};
2195    }
2196    return history;
2197}
2198
2199// ---------------------------------------------------------------------------
2200
2201Layer::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger,
2202        const sp<Layer>& layer)
2203    : mFlinger(flinger), mLayer(layer) {
2204}
2205
2206Layer::LayerCleaner::~LayerCleaner() {
2207    // destroy client resources
2208    mFlinger->onLayerDestroyed(mLayer);
2209}
2210
2211// ---------------------------------------------------------------------------
2212}; // namespace android
2213
2214#if defined(__gl_h_)
2215#error "don't include gl/gl.h in this file"
2216#endif
2217
2218#if defined(__gl2_h_)
2219#error "don't include gl2/gl2.h in this file"
2220#endif
2221