Layer.cpp revision 82364e3cea0bf88fa8147766433329b3dd5148b8
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
1677void Layer::onPostComposition() {
1678    if (mFrameLatencyNeeded) {
1679        nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp();
1680        mFrameTracker.setDesiredPresentTime(desiredPresentTime);
1681
1682        sp<Fence> frameReadyFence = mSurfaceFlingerConsumer->getCurrentFence();
1683        if (frameReadyFence->isValid()) {
1684            mFrameTracker.setFrameReadyFence(frameReadyFence);
1685        } else {
1686            // There was no fence for this frame, so assume that it was ready
1687            // to be presented at the desired present time.
1688            mFrameTracker.setFrameReadyTime(desiredPresentTime);
1689        }
1690
1691        const HWComposer& hwc = mFlinger->getHwComposer();
1692#ifdef USE_HWC2
1693        sp<Fence> presentFence = hwc.getRetireFence(HWC_DISPLAY_PRIMARY);
1694#else
1695        sp<Fence> presentFence = hwc.getDisplayFence(HWC_DISPLAY_PRIMARY);
1696#endif
1697        if (presentFence->isValid()) {
1698            mFrameTracker.setActualPresentFence(presentFence);
1699        } else {
1700            // The HWC doesn't support present fences, so use the refresh
1701            // timestamp instead.
1702            nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1703            mFrameTracker.setActualPresentTime(presentTime);
1704        }
1705
1706        mFrameTracker.advanceFrame();
1707        mFrameLatencyNeeded = false;
1708    }
1709}
1710
1711#ifdef USE_HWC2
1712void Layer::releasePendingBuffer() {
1713    mSurfaceFlingerConsumer->releasePendingBuffer();
1714}
1715#endif
1716
1717bool Layer::isVisible() const {
1718    const Layer::State& s(mDrawingState);
1719#ifdef USE_HWC2
1720    return !(s.flags & layer_state_t::eLayerHidden) && s.alpha > 0.0f
1721            && (mActiveBuffer != NULL || mSidebandStream != NULL);
1722#else
1723    return !(s.flags & layer_state_t::eLayerHidden) && s.alpha
1724            && (mActiveBuffer != NULL || mSidebandStream != NULL);
1725#endif
1726}
1727
1728Region Layer::latchBuffer(bool& recomputeVisibleRegions)
1729{
1730    ATRACE_CALL();
1731
1732    if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) {
1733        // mSidebandStreamChanged was true
1734        mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream();
1735        if (mSidebandStream != NULL) {
1736            setTransactionFlags(eTransactionNeeded);
1737            mFlinger->setTransactionFlags(eTraversalNeeded);
1738        }
1739        recomputeVisibleRegions = true;
1740
1741        const State& s(getDrawingState());
1742        return s.active.transform.transform(Region(Rect(s.active.w, s.active.h)));
1743    }
1744
1745    Region outDirtyRegion;
1746    if (mQueuedFrames > 0 || mAutoRefresh) {
1747
1748        // if we've already called updateTexImage() without going through
1749        // a composition step, we have to skip this layer at this point
1750        // because we cannot call updateTeximage() without a corresponding
1751        // compositionComplete() call.
1752        // we'll trigger an update in onPreComposition().
1753        if (mRefreshPending) {
1754            return outDirtyRegion;
1755        }
1756
1757        // Capture the old state of the layer for comparisons later
1758        const State& s(getDrawingState());
1759        const bool oldOpacity = isOpaque(s);
1760        sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer;
1761
1762        struct Reject : public SurfaceFlingerConsumer::BufferRejecter {
1763            Layer::State& front;
1764            Layer::State& current;
1765            bool& recomputeVisibleRegions;
1766            bool stickyTransformSet;
1767            const char* name;
1768            int32_t overrideScalingMode;
1769
1770            Reject(Layer::State& front, Layer::State& current,
1771                    bool& recomputeVisibleRegions, bool stickySet,
1772                    const char* name,
1773                    int32_t overrideScalingMode)
1774                : front(front), current(current),
1775                  recomputeVisibleRegions(recomputeVisibleRegions),
1776                  stickyTransformSet(stickySet),
1777                  name(name),
1778                  overrideScalingMode(overrideScalingMode) {
1779            }
1780
1781            virtual bool reject(const sp<GraphicBuffer>& buf,
1782                    const BufferItem& item) {
1783                if (buf == NULL) {
1784                    return false;
1785                }
1786
1787                uint32_t bufWidth  = buf->getWidth();
1788                uint32_t bufHeight = buf->getHeight();
1789
1790                // check that we received a buffer of the right size
1791                // (Take the buffer's orientation into account)
1792                if (item.mTransform & Transform::ROT_90) {
1793                    swap(bufWidth, bufHeight);
1794                }
1795
1796                int actualScalingMode = overrideScalingMode >= 0 ?
1797                        overrideScalingMode : item.mScalingMode;
1798                bool isFixedSize = actualScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE;
1799                if (front.active != front.requested) {
1800
1801                    if (isFixedSize ||
1802                            (bufWidth == front.requested.w &&
1803                             bufHeight == front.requested.h))
1804                    {
1805                        // Here we pretend the transaction happened by updating the
1806                        // current and drawing states. Drawing state is only accessed
1807                        // in this thread, no need to have it locked
1808                        front.active = front.requested;
1809
1810                        // We also need to update the current state so that
1811                        // we don't end-up overwriting the drawing state with
1812                        // this stale current state during the next transaction
1813                        //
1814                        // NOTE: We don't need to hold the transaction lock here
1815                        // because State::active is only accessed from this thread.
1816                        current.active = front.active;
1817                        current.modified = true;
1818
1819                        // recompute visible region
1820                        recomputeVisibleRegions = true;
1821                    }
1822
1823                    ALOGD_IF(DEBUG_RESIZE,
1824                            "[%s] latchBuffer/reject: buffer (%ux%u, tr=%02x), scalingMode=%d\n"
1825                            "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1826                            "            requested={ wh={%4u,%4u} }}\n",
1827                            name,
1828                            bufWidth, bufHeight, item.mTransform, item.mScalingMode,
1829                            front.active.w, front.active.h,
1830                            front.crop.left,
1831                            front.crop.top,
1832                            front.crop.right,
1833                            front.crop.bottom,
1834                            front.crop.getWidth(),
1835                            front.crop.getHeight(),
1836                            front.requested.w, front.requested.h);
1837                }
1838
1839                if (!isFixedSize && !stickyTransformSet) {
1840                    if (front.active.w != bufWidth ||
1841                        front.active.h != bufHeight) {
1842                        // reject this buffer
1843                        ALOGE("[%s] rejecting buffer: "
1844                                "bufWidth=%d, bufHeight=%d, front.active.{w=%d, h=%d}",
1845                                name, bufWidth, bufHeight, front.active.w, front.active.h);
1846                        return true;
1847                    }
1848                }
1849
1850                // if the transparent region has changed (this test is
1851                // conservative, but that's fine, worst case we're doing
1852                // a bit of extra work), we latch the new one and we
1853                // trigger a visible-region recompute.
1854                if (!front.activeTransparentRegion.isTriviallyEqual(
1855                        front.requestedTransparentRegion)) {
1856                    front.activeTransparentRegion = front.requestedTransparentRegion;
1857
1858                    // We also need to update the current state so that
1859                    // we don't end-up overwriting the drawing state with
1860                    // this stale current state during the next transaction
1861                    //
1862                    // NOTE: We don't need to hold the transaction lock here
1863                    // because State::active is only accessed from this thread.
1864                    current.activeTransparentRegion = front.activeTransparentRegion;
1865
1866                    // recompute visible region
1867                    recomputeVisibleRegions = true;
1868                }
1869
1870                return false;
1871            }
1872        };
1873
1874        Reject r(mDrawingState, getCurrentState(), recomputeVisibleRegions,
1875                getProducerStickyTransform() != 0, mName.string(),
1876                mOverrideScalingMode);
1877
1878
1879        // Check all of our local sync points to ensure that all transactions
1880        // which need to have been applied prior to the frame which is about to
1881        // be latched have signaled
1882
1883        auto headFrameNumber = getHeadFrameNumber();
1884        bool matchingFramesFound = false;
1885        bool allTransactionsApplied = true;
1886        {
1887            Mutex::Autolock lock(mLocalSyncPointMutex);
1888            for (auto& point : mLocalSyncPoints) {
1889                if (point->getFrameNumber() > headFrameNumber) {
1890                    break;
1891                }
1892
1893                matchingFramesFound = true;
1894
1895                if (!point->frameIsAvailable()) {
1896                    // We haven't notified the remote layer that the frame for
1897                    // this point is available yet. Notify it now, and then
1898                    // abort this attempt to latch.
1899                    point->setFrameAvailable();
1900                    allTransactionsApplied = false;
1901                    break;
1902                }
1903
1904                allTransactionsApplied &= point->transactionIsApplied();
1905            }
1906        }
1907
1908        if (matchingFramesFound && !allTransactionsApplied) {
1909            mFlinger->signalLayerUpdate();
1910            return outDirtyRegion;
1911        }
1912
1913        // This boolean is used to make sure that SurfaceFlinger's shadow copy
1914        // of the buffer queue isn't modified when the buffer queue is returning
1915        // BufferItem's that weren't actually queued. This can happen in shared
1916        // buffer mode.
1917        bool queuedBuffer = false;
1918        status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r,
1919                mFlinger->mPrimaryDispSync, &mAutoRefresh, &queuedBuffer,
1920                mLastFrameNumberReceived);
1921        if (updateResult == BufferQueue::PRESENT_LATER) {
1922            // Producer doesn't want buffer to be displayed yet.  Signal a
1923            // layer update so we check again at the next opportunity.
1924            mFlinger->signalLayerUpdate();
1925            return outDirtyRegion;
1926        } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) {
1927            // If the buffer has been rejected, remove it from the shadow queue
1928            // and return early
1929            if (queuedBuffer) {
1930                Mutex::Autolock lock(mQueueItemLock);
1931                mQueueItems.removeAt(0);
1932                android_atomic_dec(&mQueuedFrames);
1933            }
1934            return outDirtyRegion;
1935        } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) {
1936            // This can occur if something goes wrong when trying to create the
1937            // EGLImage for this buffer. If this happens, the buffer has already
1938            // been released, so we need to clean up the queue and bug out
1939            // early.
1940            if (queuedBuffer) {
1941                Mutex::Autolock lock(mQueueItemLock);
1942                mQueueItems.clear();
1943                android_atomic_and(0, &mQueuedFrames);
1944            }
1945
1946            // Once we have hit this state, the shadow queue may no longer
1947            // correctly reflect the incoming BufferQueue's contents, so even if
1948            // updateTexImage starts working, the only safe course of action is
1949            // to continue to ignore updates.
1950            mUpdateTexImageFailed = true;
1951
1952            return outDirtyRegion;
1953        }
1954
1955        if (queuedBuffer) {
1956            // Autolock scope
1957            auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
1958
1959            Mutex::Autolock lock(mQueueItemLock);
1960
1961            // Remove any stale buffers that have been dropped during
1962            // updateTexImage
1963            while (mQueueItems[0].mFrameNumber != currentFrameNumber) {
1964                mQueueItems.removeAt(0);
1965                android_atomic_dec(&mQueuedFrames);
1966            }
1967
1968            mQueueItems.removeAt(0);
1969        }
1970
1971
1972        // Decrement the queued-frames count.  Signal another event if we
1973        // have more frames pending.
1974        if ((queuedBuffer && android_atomic_dec(&mQueuedFrames) > 1)
1975                || mAutoRefresh) {
1976            mFlinger->signalLayerUpdate();
1977        }
1978
1979        if (updateResult != NO_ERROR) {
1980            // something happened!
1981            recomputeVisibleRegions = true;
1982            return outDirtyRegion;
1983        }
1984
1985        // update the active buffer
1986        mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer();
1987        if (mActiveBuffer == NULL) {
1988            // this can only happen if the very first buffer was rejected.
1989            return outDirtyRegion;
1990        }
1991
1992        mRefreshPending = true;
1993        mFrameLatencyNeeded = true;
1994        if (oldActiveBuffer == NULL) {
1995             // the first time we receive a buffer, we need to trigger a
1996             // geometry invalidation.
1997            recomputeVisibleRegions = true;
1998         }
1999
2000        Rect crop(mSurfaceFlingerConsumer->getCurrentCrop());
2001        const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform());
2002        const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode());
2003        if ((crop != mCurrentCrop) ||
2004            (transform != mCurrentTransform) ||
2005            (scalingMode != mCurrentScalingMode))
2006        {
2007            mCurrentCrop = crop;
2008            mCurrentTransform = transform;
2009            mCurrentScalingMode = scalingMode;
2010            recomputeVisibleRegions = true;
2011        }
2012
2013        if (oldActiveBuffer != NULL) {
2014            uint32_t bufWidth  = mActiveBuffer->getWidth();
2015            uint32_t bufHeight = mActiveBuffer->getHeight();
2016            if (bufWidth != uint32_t(oldActiveBuffer->width) ||
2017                bufHeight != uint32_t(oldActiveBuffer->height)) {
2018                recomputeVisibleRegions = true;
2019                mFreezePositionUpdates = false;
2020            }
2021        }
2022
2023        mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format);
2024        if (oldOpacity != isOpaque(s)) {
2025            recomputeVisibleRegions = true;
2026        }
2027
2028        mCurrentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
2029
2030        // Remove any sync points corresponding to the buffer which was just
2031        // latched
2032        {
2033            Mutex::Autolock lock(mLocalSyncPointMutex);
2034            auto point = mLocalSyncPoints.begin();
2035            while (point != mLocalSyncPoints.end()) {
2036                if (!(*point)->frameIsAvailable() ||
2037                        !(*point)->transactionIsApplied()) {
2038                    // This sync point must have been added since we started
2039                    // latching. Don't drop it yet.
2040                    ++point;
2041                    continue;
2042                }
2043
2044                if ((*point)->getFrameNumber() <= mCurrentFrameNumber) {
2045                    point = mLocalSyncPoints.erase(point);
2046                } else {
2047                    ++point;
2048                }
2049            }
2050        }
2051
2052        // FIXME: postedRegion should be dirty & bounds
2053        Region dirtyRegion(Rect(s.active.w, s.active.h));
2054
2055        // transform the dirty region to window-manager space
2056        outDirtyRegion = (s.active.transform.transform(dirtyRegion));
2057    }
2058    return outDirtyRegion;
2059}
2060
2061uint32_t Layer::getEffectiveUsage(uint32_t usage) const
2062{
2063    // TODO: should we do something special if mSecure is set?
2064    if (mProtectedByApp) {
2065        // need a hardware-protected path to external video sink
2066        usage |= GraphicBuffer::USAGE_PROTECTED;
2067    }
2068    if (mPotentialCursor) {
2069        usage |= GraphicBuffer::USAGE_CURSOR;
2070    }
2071    usage |= GraphicBuffer::USAGE_HW_COMPOSER;
2072    return usage;
2073}
2074
2075void Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const {
2076    uint32_t orientation = 0;
2077    if (!mFlinger->mDebugDisableTransformHint) {
2078        // The transform hint is used to improve performance, but we can
2079        // only have a single transform hint, it cannot
2080        // apply to all displays.
2081        const Transform& planeTransform(hw->getTransform());
2082        orientation = planeTransform.getOrientation();
2083        if (orientation & Transform::ROT_INVALID) {
2084            orientation = 0;
2085        }
2086    }
2087    mSurfaceFlingerConsumer->setTransformHint(orientation);
2088}
2089
2090// ----------------------------------------------------------------------------
2091// debugging
2092// ----------------------------------------------------------------------------
2093
2094void Layer::dump(String8& result, Colorizer& colorizer) const
2095{
2096    const Layer::State& s(getDrawingState());
2097
2098    colorizer.colorize(result, Colorizer::GREEN);
2099    result.appendFormat(
2100            "+ %s %p (%s)\n",
2101            getTypeId(), this, getName().string());
2102    colorizer.reset(result);
2103
2104    s.activeTransparentRegion.dump(result, "transparentRegion");
2105    visibleRegion.dump(result, "visibleRegion");
2106    surfaceDamageRegion.dump(result, "surfaceDamageRegion");
2107    sp<Client> client(mClientRef.promote());
2108
2109    result.appendFormat(            "      "
2110            "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), "
2111            "crop=(%4d,%4d,%4d,%4d), finalCrop=(%4d,%4d,%4d,%4d), "
2112            "isOpaque=%1d, invalidate=%1d, "
2113#ifdef USE_HWC2
2114            "alpha=%.3f, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
2115#else
2116            "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
2117#endif
2118            "      client=%p\n",
2119            s.layerStack, s.z, s.active.transform.tx(), s.active.transform.ty(), s.active.w, s.active.h,
2120            s.crop.left, s.crop.top,
2121            s.crop.right, s.crop.bottom,
2122            s.finalCrop.left, s.finalCrop.top,
2123            s.finalCrop.right, s.finalCrop.bottom,
2124            isOpaque(s), contentDirty,
2125            s.alpha, s.flags,
2126            s.active.transform[0][0], s.active.transform[0][1],
2127            s.active.transform[1][0], s.active.transform[1][1],
2128            client.get());
2129
2130    sp<const GraphicBuffer> buf0(mActiveBuffer);
2131    uint32_t w0=0, h0=0, s0=0, f0=0;
2132    if (buf0 != 0) {
2133        w0 = buf0->getWidth();
2134        h0 = buf0->getHeight();
2135        s0 = buf0->getStride();
2136        f0 = buf0->format;
2137    }
2138    result.appendFormat(
2139            "      "
2140            "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X],"
2141            " queued-frames=%d, mRefreshPending=%d\n",
2142            mFormat, w0, h0, s0,f0,
2143            mQueuedFrames, mRefreshPending);
2144
2145    if (mSurfaceFlingerConsumer != 0) {
2146        mSurfaceFlingerConsumer->dump(result, "            ");
2147    }
2148}
2149
2150void Layer::dumpFrameStats(String8& result) const {
2151    mFrameTracker.dumpStats(result);
2152}
2153
2154void Layer::clearFrameStats() {
2155    mFrameTracker.clearStats();
2156}
2157
2158void Layer::logFrameStats() {
2159    mFrameTracker.logAndResetStats(mName);
2160}
2161
2162void Layer::getFrameStats(FrameStats* outStats) const {
2163    mFrameTracker.getStats(outStats);
2164}
2165
2166void Layer::getFenceData(String8* outName, uint64_t* outFrameNumber,
2167        bool* outIsGlesComposition, nsecs_t* outPostedTime,
2168        sp<Fence>* outAcquireFence, sp<Fence>* outPrevReleaseFence) const {
2169    *outName = mName;
2170    *outFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
2171
2172#ifdef USE_HWC2
2173    *outIsGlesComposition = mHwcLayers.count(HWC_DISPLAY_PRIMARY) ?
2174            mHwcLayers.at(HWC_DISPLAY_PRIMARY).compositionType ==
2175            HWC2::Composition::Client : true;
2176#else
2177    *outIsGlesComposition = mIsGlesComposition;
2178#endif
2179    *outPostedTime = mSurfaceFlingerConsumer->getTimestamp();
2180    *outAcquireFence = mSurfaceFlingerConsumer->getCurrentFence();
2181    *outPrevReleaseFence = mSurfaceFlingerConsumer->getPrevReleaseFence();
2182}
2183// ---------------------------------------------------------------------------
2184
2185Layer::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger,
2186        const sp<Layer>& layer)
2187    : mFlinger(flinger), mLayer(layer) {
2188}
2189
2190Layer::LayerCleaner::~LayerCleaner() {
2191    // destroy client resources
2192    mFlinger->onLayerDestroyed(mLayer);
2193}
2194
2195// ---------------------------------------------------------------------------
2196}; // namespace android
2197
2198#if defined(__gl_h_)
2199#error "don't include gl/gl.h in this file"
2200#endif
2201
2202#if defined(__gl2_h_)
2203#error "don't include gl2/gl2.h in this file"
2204#endif
2205