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