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 <math.h>
23 #include <stdint.h>
24 #include <stdlib.h>
25 #include <sys/types.h>
26 #include <algorithm>
27 
28 #include <cutils/compiler.h>
29 #include <cutils/native_handle.h>
30 #include <cutils/properties.h>
31 
32 #include <utils/Errors.h>
33 #include <utils/Log.h>
34 #include <utils/NativeHandle.h>
35 #include <utils/StopWatch.h>
36 #include <utils/Trace.h>
37 
38 #include <ui/DebugUtils.h>
39 #include <ui/GraphicBuffer.h>
40 #include <ui/PixelFormat.h>
41 
42 #include <gui/BufferItem.h>
43 #include <gui/LayerDebugInfo.h>
44 #include <gui/Surface.h>
45 
46 #include "BufferLayer.h"
47 #include "Colorizer.h"
48 #include "DisplayDevice.h"
49 #include "Layer.h"
50 #include "LayerRejecter.h"
51 #include "MonitoredProducer.h"
52 #include "SurfaceFlinger.h"
53 #include "clz.h"
54 
55 #include "DisplayHardware/HWComposer.h"
56 
57 #include "RenderEngine/RenderEngine.h"
58 
59 #include <mutex>
60 #include "LayerProtoHelper.h"
61 
62 #define DEBUG_RESIZE 0
63 
64 namespace android {
65 
LayerBE()66 LayerBE::LayerBE()
67       : mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2) {
68 }
69 
70 
71 int32_t Layer::sSequence = 1;
72 
Layer(SurfaceFlinger * flinger,const sp<Client> & client,const String8 & name,uint32_t w,uint32_t h,uint32_t flags)73 Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& name, uint32_t w,
74              uint32_t h, uint32_t flags)
75       : contentDirty(false),
76         sequence(uint32_t(android_atomic_inc(&sSequence))),
77         mFlinger(flinger),
78         mPremultipliedAlpha(true),
79         mName(name),
80         mTransactionFlags(0),
81         mPendingStateMutex(),
82         mPendingStates(),
83         mQueuedFrames(0),
84         mSidebandStreamChanged(false),
85         mActiveBufferSlot(BufferQueue::INVALID_BUFFER_SLOT),
86         mCurrentTransform(0),
87         mOverrideScalingMode(-1),
88         mCurrentOpacity(true),
89         mCurrentFrameNumber(0),
90         mFrameLatencyNeeded(false),
91         mFiltering(false),
92         mNeedsFiltering(false),
93         mProtectedByApp(false),
94         mClientRef(client),
95         mPotentialCursor(false),
96         mQueueItemLock(),
97         mQueueItemCondition(),
98         mQueueItems(),
99         mLastFrameNumberReceived(0),
100         mAutoRefresh(false),
101         mFreezeGeometryUpdates(false),
102         mCurrentChildren(LayerVector::StateSet::Current),
103         mDrawingChildren(LayerVector::StateSet::Drawing) {
104     mCurrentCrop.makeInvalid();
105 
106     uint32_t layerFlags = 0;
107     if (flags & ISurfaceComposerClient::eHidden) layerFlags |= layer_state_t::eLayerHidden;
108     if (flags & ISurfaceComposerClient::eOpaque) layerFlags |= layer_state_t::eLayerOpaque;
109     if (flags & ISurfaceComposerClient::eSecure) layerFlags |= layer_state_t::eLayerSecure;
110 
111     mName = name;
112     mTransactionName = String8("TX - ") + mName;
113 
114     mCurrentState.active.w = w;
115     mCurrentState.active.h = h;
116     mCurrentState.flags = layerFlags;
117     mCurrentState.active.transform.set(0, 0);
118     mCurrentState.crop.makeInvalid();
119     mCurrentState.finalCrop.makeInvalid();
120     mCurrentState.requestedFinalCrop = mCurrentState.finalCrop;
121     mCurrentState.requestedCrop = mCurrentState.crop;
122     mCurrentState.z = 0;
123     mCurrentState.color.a = 1.0f;
124     mCurrentState.layerStack = 0;
125     mCurrentState.sequence = 0;
126     mCurrentState.requested = mCurrentState.active;
127     mCurrentState.appId = 0;
128     mCurrentState.type = 0;
129 
130     // drawing state & current state are identical
131     mDrawingState = mCurrentState;
132 
133     const auto& hwc = flinger->getHwComposer();
134     const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY);
135     nsecs_t displayPeriod = activeConfig->getVsyncPeriod();
136     mFrameTracker.setDisplayRefreshPeriod(displayPeriod);
137 
138     CompositorTiming compositorTiming;
139     flinger->getCompositorTiming(&compositorTiming);
140     mFrameEventHistory.initializeCompositorTiming(compositorTiming);
141 }
142 
onFirstRef()143 void Layer::onFirstRef() {}
144 
~Layer()145 Layer::~Layer() {
146     sp<Client> c(mClientRef.promote());
147     if (c != 0) {
148         c->detachLayer(this);
149     }
150 
151     for (auto& point : mRemoteSyncPoints) {
152         point->setTransactionApplied();
153     }
154     for (auto& point : mLocalSyncPoints) {
155         point->setFrameAvailable();
156     }
157     mFrameTracker.logAndResetStats(mName);
158 }
159 
160 // ---------------------------------------------------------------------------
161 // callbacks
162 // ---------------------------------------------------------------------------
163 
164 /*
165  * onLayerDisplayed is only meaningful for BufferLayer, but, is called through
166  * Layer.  So, the implementation is done in BufferLayer.  When called on a
167  * ColorLayer object, it's essentially a NOP.
168  */
onLayerDisplayed(const sp<Fence> &)169 void Layer::onLayerDisplayed(const sp<Fence>& /*releaseFence*/) {}
170 
onRemovedFromCurrentState()171 void Layer::onRemovedFromCurrentState() {
172     // the layer is removed from SF mCurrentState to mLayersPendingRemoval
173 
174     mPendingRemoval = true;
175 
176     if (mCurrentState.zOrderRelativeOf != nullptr) {
177         sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
178         if (strongRelative != nullptr) {
179             strongRelative->removeZOrderRelative(this);
180             mFlinger->setTransactionFlags(eTraversalNeeded);
181         }
182         mCurrentState.zOrderRelativeOf = nullptr;
183     }
184 
185     for (const auto& child : mCurrentChildren) {
186         child->onRemovedFromCurrentState();
187     }
188 }
189 
onRemoved()190 void Layer::onRemoved() {
191     // the layer is removed from SF mLayersPendingRemoval
192     abandon();
193 
194     destroyAllHwcLayers();
195 
196     for (const auto& child : mCurrentChildren) {
197         child->onRemoved();
198     }
199 }
200 
201 // ---------------------------------------------------------------------------
202 // set-up
203 // ---------------------------------------------------------------------------
204 
getName() const205 const String8& Layer::getName() const {
206     return mName;
207 }
208 
getPremultipledAlpha() const209 bool Layer::getPremultipledAlpha() const {
210     return mPremultipliedAlpha;
211 }
212 
getHandle()213 sp<IBinder> Layer::getHandle() {
214     Mutex::Autolock _l(mLock);
215     return new Handle(mFlinger, this);
216 }
217 
218 // ---------------------------------------------------------------------------
219 // h/w composer set-up
220 // ---------------------------------------------------------------------------
221 
createHwcLayer(HWComposer * hwc,int32_t hwcId)222 bool Layer::createHwcLayer(HWComposer* hwc, int32_t hwcId) {
223     LOG_ALWAYS_FATAL_IF(getBE().mHwcLayers.count(hwcId) != 0,
224                         "Already have a layer for hwcId %d", hwcId);
225     HWC2::Layer* layer = hwc->createLayer(hwcId);
226     if (!layer) {
227         return false;
228     }
229     LayerBE::HWCInfo& hwcInfo = getBE().mHwcLayers[hwcId];
230     hwcInfo.hwc = hwc;
231     hwcInfo.layer = layer;
232     layer->setLayerDestroyedListener(
233             [this, hwcId](HWC2::Layer* /*layer*/) { getBE().mHwcLayers.erase(hwcId); });
234     return true;
235 }
236 
destroyHwcLayer(int32_t hwcId)237 bool Layer::destroyHwcLayer(int32_t hwcId) {
238     if (getBE().mHwcLayers.count(hwcId) == 0) {
239         return false;
240     }
241     auto& hwcInfo = getBE().mHwcLayers[hwcId];
242     LOG_ALWAYS_FATAL_IF(hwcInfo.layer == nullptr, "Attempt to destroy null layer");
243     LOG_ALWAYS_FATAL_IF(hwcInfo.hwc == nullptr, "Missing HWComposer");
244     hwcInfo.hwc->destroyLayer(hwcId, hwcInfo.layer);
245     // The layer destroyed listener should have cleared the entry from
246     // mHwcLayers. Verify that.
247     LOG_ALWAYS_FATAL_IF(getBE().mHwcLayers.count(hwcId) != 0,
248                         "Stale layer entry in getBE().mHwcLayers");
249     return true;
250 }
251 
destroyAllHwcLayers()252 void Layer::destroyAllHwcLayers() {
253     size_t numLayers = getBE().mHwcLayers.size();
254     for (size_t i = 0; i < numLayers; ++i) {
255         LOG_ALWAYS_FATAL_IF(getBE().mHwcLayers.empty(), "destroyAllHwcLayers failed");
256         destroyHwcLayer(getBE().mHwcLayers.begin()->first);
257     }
258     LOG_ALWAYS_FATAL_IF(!getBE().mHwcLayers.empty(),
259                         "All hardware composer layers should have been destroyed");
260 }
261 
getContentCrop() const262 Rect Layer::getContentCrop() const {
263     // this is the crop rectangle that applies to the buffer
264     // itself (as opposed to the window)
265     Rect crop;
266     if (!mCurrentCrop.isEmpty()) {
267         // if the buffer crop is defined, we use that
268         crop = mCurrentCrop;
269     } else if (getBE().compositionInfo.mBuffer != nullptr) {
270         // otherwise we use the whole buffer
271         crop = getBE().compositionInfo.mBuffer->getBounds();
272     } else {
273         // if we don't have a buffer yet, we use an empty/invalid crop
274         crop.makeInvalid();
275     }
276     return crop;
277 }
278 
reduce(const Rect & win,const Region & exclude)279 static Rect reduce(const Rect& win, const Region& exclude) {
280     if (CC_LIKELY(exclude.isEmpty())) {
281         return win;
282     }
283     if (exclude.isRect()) {
284         return win.reduce(exclude.getBounds());
285     }
286     return Region(win).subtract(exclude).getBounds();
287 }
288 
reduce(const FloatRect & win,const Region & exclude)289 static FloatRect reduce(const FloatRect& win, const Region& exclude) {
290     if (CC_LIKELY(exclude.isEmpty())) {
291         return win;
292     }
293     // Convert through Rect (by rounding) for lack of FloatRegion
294     return Region(Rect{win}).subtract(exclude).getBounds().toFloatRect();
295 }
296 
computeScreenBounds(bool reduceTransparentRegion) const297 Rect Layer::computeScreenBounds(bool reduceTransparentRegion) const {
298     const Layer::State& s(getDrawingState());
299     Rect win(s.active.w, s.active.h);
300 
301     if (!s.crop.isEmpty()) {
302         win.intersect(s.crop, &win);
303     }
304 
305     Transform t = getTransform();
306     win = t.transform(win);
307 
308     if (!s.finalCrop.isEmpty()) {
309         win.intersect(s.finalCrop, &win);
310     }
311 
312     const sp<Layer>& p = mDrawingParent.promote();
313     // Now we need to calculate the parent bounds, so we can clip ourselves to those.
314     // When calculating the parent bounds for purposes of clipping,
315     // we don't need to constrain the parent to its transparent region.
316     // The transparent region is an optimization based on the
317     // buffer contents of the layer, but does not affect the space allocated to
318     // it by policy, and thus children should be allowed to extend into the
319     // parent's transparent region. In fact one of the main uses, is to reduce
320     // buffer allocation size in cases where a child window sits behind a main window
321     // (by marking the hole in the parent window as a transparent region)
322     if (p != nullptr) {
323         Rect bounds = p->computeScreenBounds(false);
324         bounds.intersect(win, &win);
325     }
326 
327     if (reduceTransparentRegion) {
328         auto const screenTransparentRegion = t.transform(s.activeTransparentRegion);
329         win = reduce(win, screenTransparentRegion);
330     }
331 
332     return win;
333 }
334 
computeBounds() const335 FloatRect Layer::computeBounds() const {
336     const Layer::State& s(getDrawingState());
337     return computeBounds(s.activeTransparentRegion);
338 }
339 
computeBounds(const Region & activeTransparentRegion) const340 FloatRect Layer::computeBounds(const Region& activeTransparentRegion) const {
341     const Layer::State& s(getDrawingState());
342     Rect win(s.active.w, s.active.h);
343 
344     if (!s.crop.isEmpty()) {
345         win.intersect(s.crop, &win);
346     }
347 
348     Rect bounds = win;
349     const auto& p = mDrawingParent.promote();
350     if (p != nullptr) {
351         // Look in computeScreenBounds recursive call for explanation of
352         // why we pass false here.
353         bounds = p->computeScreenBounds(false /* reduceTransparentRegion */);
354     }
355 
356     Transform t = getTransform();
357 
358     FloatRect floatWin = win.toFloatRect();
359     if (p != nullptr) {
360         floatWin = t.transform(floatWin);
361         floatWin = floatWin.intersect(bounds.toFloatRect());
362         floatWin = t.inverse().transform(floatWin);
363     }
364 
365     // subtract the transparent region and snap to the bounds
366     return reduce(floatWin, activeTransparentRegion);
367 }
368 
computeInitialCrop(const sp<const DisplayDevice> & hw) const369 Rect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const {
370     // the crop is the area of the window that gets cropped, but not
371     // scaled in any ways.
372     const State& s(getDrawingState());
373 
374     // apply the projection's clipping to the window crop in
375     // layerstack space, and convert-back to layer space.
376     // if there are no window scaling involved, this operation will map to full
377     // pixels in the buffer.
378     // FIXME: the 3 lines below can produce slightly incorrect clipping when we have
379     // a viewport clipping and a window transform. we should use floating point to fix this.
380 
381     Rect activeCrop(s.active.w, s.active.h);
382     if (!s.crop.isEmpty()) {
383         activeCrop.intersect(s.crop, &activeCrop);
384     }
385 
386     Transform t = getTransform();
387     activeCrop = t.transform(activeCrop);
388     if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
389         activeCrop.clear();
390     }
391     if (!s.finalCrop.isEmpty()) {
392         if (!activeCrop.intersect(s.finalCrop, &activeCrop)) {
393             activeCrop.clear();
394         }
395     }
396 
397     const auto& p = mDrawingParent.promote();
398     if (p != nullptr) {
399         auto parentCrop = p->computeInitialCrop(hw);
400         activeCrop.intersect(parentCrop, &activeCrop);
401     }
402 
403     return activeCrop;
404 }
405 
computeCrop(const sp<const DisplayDevice> & hw) const406 FloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const {
407     // the content crop is the area of the content that gets scaled to the
408     // layer's size. This is in buffer space.
409     FloatRect crop = getContentCrop().toFloatRect();
410 
411     // In addition there is a WM-specified crop we pull from our drawing state.
412     const State& s(getDrawingState());
413 
414     // Screen space to make reduction to parent crop clearer.
415     Rect activeCrop = computeInitialCrop(hw);
416     Transform t = getTransform();
417     // Back to layer space to work with the content crop.
418     activeCrop = t.inverse().transform(activeCrop);
419 
420     // This needs to be here as transform.transform(Rect) computes the
421     // transformed rect and then takes the bounding box of the result before
422     // returning. This means
423     // transform.inverse().transform(transform.transform(Rect)) != Rect
424     // in which case we need to make sure the final rect is clipped to the
425     // display bounds.
426     if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
427         activeCrop.clear();
428     }
429 
430     // subtract the transparent region and snap to the bounds
431     activeCrop = reduce(activeCrop, s.activeTransparentRegion);
432 
433     // Transform the window crop to match the buffer coordinate system,
434     // which means using the inverse of the current transform set on the
435     // SurfaceFlingerConsumer.
436     uint32_t invTransform = mCurrentTransform;
437     if (getTransformToDisplayInverse()) {
438         /*
439          * the code below applies the primary display's inverse transform to the
440          * buffer
441          */
442         uint32_t invTransformOrient = DisplayDevice::getPrimaryDisplayOrientationTransform();
443         // calculate the inverse transform
444         if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) {
445             invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H;
446         }
447         // and apply to the current transform
448         invTransform = (Transform(invTransformOrient) * Transform(invTransform)).getOrientation();
449     }
450 
451     int winWidth = s.active.w;
452     int winHeight = s.active.h;
453     if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
454         // If the activeCrop has been rotate the ends are rotated but not
455         // the space itself so when transforming ends back we can't rely on
456         // a modification of the axes of rotation. To account for this we
457         // need to reorient the inverse rotation in terms of the current
458         // axes of rotation.
459         bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
460         bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
461         if (is_h_flipped == is_v_flipped) {
462             invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H;
463         }
464         winWidth = s.active.h;
465         winHeight = s.active.w;
466     }
467     const Rect winCrop = activeCrop.transform(invTransform, s.active.w, s.active.h);
468 
469     // below, crop is intersected with winCrop expressed in crop's coordinate space
470     float xScale = crop.getWidth() / float(winWidth);
471     float yScale = crop.getHeight() / float(winHeight);
472 
473     float insetL = winCrop.left * xScale;
474     float insetT = winCrop.top * yScale;
475     float insetR = (winWidth - winCrop.right) * xScale;
476     float insetB = (winHeight - winCrop.bottom) * yScale;
477 
478     crop.left += insetL;
479     crop.top += insetT;
480     crop.right -= insetR;
481     crop.bottom -= insetB;
482 
483     return crop;
484 }
485 
setGeometry(const sp<const DisplayDevice> & displayDevice,uint32_t z)486 void Layer::setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z)
487 {
488     const auto hwcId = displayDevice->getHwcDisplayId();
489     auto& hwcInfo = getBE().mHwcLayers[hwcId];
490 
491     // enable this layer
492     hwcInfo.forceClientComposition = false;
493 
494     if (isSecure() && !displayDevice->isSecure()) {
495         hwcInfo.forceClientComposition = true;
496     }
497 
498     auto& hwcLayer = hwcInfo.layer;
499 
500     // this gives us only the "orientation" component of the transform
501     const State& s(getDrawingState());
502     auto blendMode = HWC2::BlendMode::None;
503     if (!isOpaque(s) || getAlpha() != 1.0f) {
504         blendMode =
505                 mPremultipliedAlpha ? HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage;
506     }
507     auto error = hwcLayer->setBlendMode(blendMode);
508     ALOGE_IF(error != HWC2::Error::None,
509              "[%s] Failed to set blend mode %s:"
510              " %s (%d)",
511              mName.string(), to_string(blendMode).c_str(), to_string(error).c_str(),
512              static_cast<int32_t>(error));
513 
514     // apply the layer's transform, followed by the display's global transform
515     // here we're guaranteed that the layer's transform preserves rects
516     Region activeTransparentRegion(s.activeTransparentRegion);
517     Transform t = getTransform();
518     if (!s.crop.isEmpty()) {
519         Rect activeCrop(s.crop);
520         activeCrop = t.transform(activeCrop);
521         if (!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) {
522             activeCrop.clear();
523         }
524         activeCrop = t.inverse().transform(activeCrop, true);
525         // This needs to be here as transform.transform(Rect) computes the
526         // transformed rect and then takes the bounding box of the result before
527         // returning. This means
528         // transform.inverse().transform(transform.transform(Rect)) != Rect
529         // in which case we need to make sure the final rect is clipped to the
530         // display bounds.
531         if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
532             activeCrop.clear();
533         }
534         // mark regions outside the crop as transparent
535         activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top));
536         activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, s.active.w, s.active.h));
537         activeTransparentRegion.orSelf(Rect(0, activeCrop.top, activeCrop.left, activeCrop.bottom));
538         activeTransparentRegion.orSelf(
539                 Rect(activeCrop.right, activeCrop.top, s.active.w, activeCrop.bottom));
540     }
541 
542     // computeBounds returns a FloatRect to provide more accuracy during the
543     // transformation. We then round upon constructing 'frame'.
544     Rect frame{t.transform(computeBounds(activeTransparentRegion))};
545     if (!s.finalCrop.isEmpty()) {
546         if (!frame.intersect(s.finalCrop, &frame)) {
547             frame.clear();
548         }
549     }
550     if (!frame.intersect(displayDevice->getViewport(), &frame)) {
551         frame.clear();
552     }
553     const Transform& tr(displayDevice->getTransform());
554     Rect transformedFrame = tr.transform(frame);
555     error = hwcLayer->setDisplayFrame(transformedFrame);
556     if (error != HWC2::Error::None) {
557         ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", mName.string(),
558               transformedFrame.left, transformedFrame.top, transformedFrame.right,
559               transformedFrame.bottom, to_string(error).c_str(), static_cast<int32_t>(error));
560     } else {
561         hwcInfo.displayFrame = transformedFrame;
562     }
563 
564     FloatRect sourceCrop = computeCrop(displayDevice);
565     error = hwcLayer->setSourceCrop(sourceCrop);
566     if (error != HWC2::Error::None) {
567         ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: "
568               "%s (%d)",
569               mName.string(), sourceCrop.left, sourceCrop.top, sourceCrop.right, sourceCrop.bottom,
570               to_string(error).c_str(), static_cast<int32_t>(error));
571     } else {
572         hwcInfo.sourceCrop = sourceCrop;
573     }
574 
575     float alpha = static_cast<float>(getAlpha());
576     error = hwcLayer->setPlaneAlpha(alpha);
577     ALOGE_IF(error != HWC2::Error::None,
578              "[%s] Failed to set plane alpha %.3f: "
579              "%s (%d)",
580              mName.string(), alpha, to_string(error).c_str(), static_cast<int32_t>(error));
581 
582     error = hwcLayer->setZOrder(z);
583     ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)", mName.string(), z,
584              to_string(error).c_str(), static_cast<int32_t>(error));
585 
586     int type = s.type;
587     int appId = s.appId;
588     sp<Layer> parent = mDrawingParent.promote();
589     if (parent.get()) {
590         auto& parentState = parent->getDrawingState();
591         if (parentState.type >= 0 || parentState.appId >= 0) {
592             type = parentState.type;
593             appId = parentState.appId;
594         }
595     }
596 
597     error = hwcLayer->setInfo(type, appId);
598     ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)", mName.string(),
599              static_cast<int32_t>(error));
600 
601     /*
602      * Transformations are applied in this order:
603      * 1) buffer orientation/flip/mirror
604      * 2) state transformation (window manager)
605      * 3) layer orientation (screen orientation)
606      * (NOTE: the matrices are multiplied in reverse order)
607      */
608 
609     const Transform bufferOrientation(mCurrentTransform);
610     Transform transform(tr * t * bufferOrientation);
611 
612     if (getTransformToDisplayInverse()) {
613         /*
614          * the code below applies the primary display's inverse transform to the
615          * buffer
616          */
617         uint32_t invTransform = DisplayDevice::getPrimaryDisplayOrientationTransform();
618         // calculate the inverse transform
619         if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
620             invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H;
621         }
622 
623         /*
624          * Here we cancel out the orientation component of the WM transform.
625          * The scaling and translate components are already included in our bounds
626          * computation so it's enough to just omit it in the composition.
627          * See comment in onDraw with ref to b/36727915 for why.
628          */
629         transform = Transform(invTransform) * tr * bufferOrientation;
630     }
631 
632     // this gives us only the "orientation" component of the transform
633     const uint32_t orientation = transform.getOrientation();
634     if (orientation & Transform::ROT_INVALID) {
635         // we can only handle simple transformation
636         hwcInfo.forceClientComposition = true;
637     } else {
638         auto transform = static_cast<HWC2::Transform>(orientation);
639         hwcInfo.transform = transform;
640         auto error = hwcLayer->setTransform(transform);
641         ALOGE_IF(error != HWC2::Error::None,
642                  "[%s] Failed to set transform %s: "
643                  "%s (%d)",
644                  mName.string(), to_string(transform).c_str(), to_string(error).c_str(),
645                  static_cast<int32_t>(error));
646     }
647 }
648 
forceClientComposition(int32_t hwcId)649 void Layer::forceClientComposition(int32_t hwcId) {
650     if (getBE().mHwcLayers.count(hwcId) == 0) {
651         ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId);
652         return;
653     }
654 
655     getBE().mHwcLayers[hwcId].forceClientComposition = true;
656 }
657 
getForceClientComposition(int32_t hwcId)658 bool Layer::getForceClientComposition(int32_t hwcId) {
659     if (getBE().mHwcLayers.count(hwcId) == 0) {
660         ALOGE("getForceClientComposition: no HWC layer found (%d)", hwcId);
661         return false;
662     }
663 
664     return getBE().mHwcLayers[hwcId].forceClientComposition;
665 }
666 
updateCursorPosition(const sp<const DisplayDevice> & displayDevice)667 void Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) {
668     auto hwcId = displayDevice->getHwcDisplayId();
669     if (getBE().mHwcLayers.count(hwcId) == 0 ||
670         getCompositionType(hwcId) != HWC2::Composition::Cursor) {
671         return;
672     }
673 
674     // This gives us only the "orientation" component of the transform
675     const State& s(getCurrentState());
676 
677     // Apply the layer's transform, followed by the display's global transform
678     // Here we're guaranteed that the layer's transform preserves rects
679     Rect win(s.active.w, s.active.h);
680     if (!s.crop.isEmpty()) {
681         win.intersect(s.crop, &win);
682     }
683     // Subtract the transparent region and snap to the bounds
684     Rect bounds = reduce(win, s.activeTransparentRegion);
685     Rect frame(getTransform().transform(bounds));
686     frame.intersect(displayDevice->getViewport(), &frame);
687     if (!s.finalCrop.isEmpty()) {
688         frame.intersect(s.finalCrop, &frame);
689     }
690     auto& displayTransform(displayDevice->getTransform());
691     auto position = displayTransform.transform(frame);
692 
693     auto error = getBE().mHwcLayers[hwcId].layer->setCursorPosition(position.left,
694                                                                               position.top);
695     ALOGE_IF(error != HWC2::Error::None,
696              "[%s] Failed to set cursor position "
697              "to (%d, %d): %s (%d)",
698              mName.string(), position.left, position.top, to_string(error).c_str(),
699              static_cast<int32_t>(error));
700 }
701 
702 // ---------------------------------------------------------------------------
703 // drawing...
704 // ---------------------------------------------------------------------------
705 
draw(const RenderArea & renderArea,const Region & clip) const706 void Layer::draw(const RenderArea& renderArea, const Region& clip) const {
707     onDraw(renderArea, clip, false);
708 }
709 
draw(const RenderArea & renderArea,bool useIdentityTransform) const710 void Layer::draw(const RenderArea& renderArea, bool useIdentityTransform) const {
711     onDraw(renderArea, Region(renderArea.getBounds()), useIdentityTransform);
712 }
713 
draw(const RenderArea & renderArea) const714 void Layer::draw(const RenderArea& renderArea) const {
715     onDraw(renderArea, Region(renderArea.getBounds()), false);
716 }
717 
clearWithOpenGL(const RenderArea & renderArea,float red,float green,float blue,float alpha) const718 void Layer::clearWithOpenGL(const RenderArea& renderArea, float red, float green, float blue,
719                             float alpha) const {
720     auto& engine(mFlinger->getRenderEngine());
721     computeGeometry(renderArea, getBE().mMesh, false);
722     engine.setupFillWithColor(red, green, blue, alpha);
723     engine.drawMesh(getBE().mMesh);
724 }
725 
clearWithOpenGL(const RenderArea & renderArea) const726 void Layer::clearWithOpenGL(const RenderArea& renderArea) const {
727     clearWithOpenGL(renderArea, 0, 0, 0, 0);
728 }
729 
setCompositionType(int32_t hwcId,HWC2::Composition type,bool callIntoHwc)730 void Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, bool callIntoHwc) {
731     if (getBE().mHwcLayers.count(hwcId) == 0) {
732         ALOGE("setCompositionType called without a valid HWC layer");
733         return;
734     }
735     auto& hwcInfo = getBE().mHwcLayers[hwcId];
736     auto& hwcLayer = hwcInfo.layer;
737     ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(), to_string(type).c_str(),
738           static_cast<int>(callIntoHwc));
739     if (hwcInfo.compositionType != type) {
740         ALOGV("    actually setting");
741         hwcInfo.compositionType = type;
742         if (callIntoHwc) {
743             auto error = hwcLayer->setCompositionType(type);
744             ALOGE_IF(error != HWC2::Error::None,
745                      "[%s] Failed to set "
746                      "composition type %s: %s (%d)",
747                      mName.string(), to_string(type).c_str(), to_string(error).c_str(),
748                      static_cast<int32_t>(error));
749         }
750     }
751 }
752 
getCompositionType(int32_t hwcId) const753 HWC2::Composition Layer::getCompositionType(int32_t hwcId) const {
754     if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
755         // If we're querying the composition type for a display that does not
756         // have a HWC counterpart, then it will always be Client
757         return HWC2::Composition::Client;
758     }
759     if (getBE().mHwcLayers.count(hwcId) == 0) {
760         ALOGE("getCompositionType called with an invalid HWC layer");
761         return HWC2::Composition::Invalid;
762     }
763     return getBE().mHwcLayers.at(hwcId).compositionType;
764 }
765 
setClearClientTarget(int32_t hwcId,bool clear)766 void Layer::setClearClientTarget(int32_t hwcId, bool clear) {
767     if (getBE().mHwcLayers.count(hwcId) == 0) {
768         ALOGE("setClearClientTarget called without a valid HWC layer");
769         return;
770     }
771     getBE().mHwcLayers[hwcId].clearClientTarget = clear;
772 }
773 
getClearClientTarget(int32_t hwcId) const774 bool Layer::getClearClientTarget(int32_t hwcId) const {
775     if (getBE().mHwcLayers.count(hwcId) == 0) {
776         ALOGE("getClearClientTarget called without a valid HWC layer");
777         return false;
778     }
779     return getBE().mHwcLayers.at(hwcId).clearClientTarget;
780 }
781 
addSyncPoint(const std::shared_ptr<SyncPoint> & point)782 bool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) {
783     if (point->getFrameNumber() <= mCurrentFrameNumber) {
784         // Don't bother with a SyncPoint, since we've already latched the
785         // relevant frame
786         return false;
787     }
788 
789     Mutex::Autolock lock(mLocalSyncPointMutex);
790     mLocalSyncPoints.push_back(point);
791     return true;
792 }
793 
setFiltering(bool filtering)794 void Layer::setFiltering(bool filtering) {
795     mFiltering = filtering;
796 }
797 
getFiltering() const798 bool Layer::getFiltering() const {
799     return mFiltering;
800 }
801 
802 // ----------------------------------------------------------------------------
803 // local state
804 // ----------------------------------------------------------------------------
805 
boundPoint(vec2 * point,const Rect & crop)806 static void boundPoint(vec2* point, const Rect& crop) {
807     if (point->x < crop.left) {
808         point->x = crop.left;
809     }
810     if (point->x > crop.right) {
811         point->x = crop.right;
812     }
813     if (point->y < crop.top) {
814         point->y = crop.top;
815     }
816     if (point->y > crop.bottom) {
817         point->y = crop.bottom;
818     }
819 }
820 
computeGeometry(const RenderArea & renderArea,Mesh & mesh,bool useIdentityTransform) const821 void Layer::computeGeometry(const RenderArea& renderArea, Mesh& mesh,
822                             bool useIdentityTransform) const {
823     const Layer::State& s(getDrawingState());
824     const Transform renderAreaTransform(renderArea.getTransform());
825     const uint32_t height = renderArea.getHeight();
826     FloatRect win = computeBounds();
827 
828     vec2 lt = vec2(win.left, win.top);
829     vec2 lb = vec2(win.left, win.bottom);
830     vec2 rb = vec2(win.right, win.bottom);
831     vec2 rt = vec2(win.right, win.top);
832 
833     Transform layerTransform = getTransform();
834     if (!useIdentityTransform) {
835         lt = layerTransform.transform(lt);
836         lb = layerTransform.transform(lb);
837         rb = layerTransform.transform(rb);
838         rt = layerTransform.transform(rt);
839     }
840 
841     if (!s.finalCrop.isEmpty()) {
842         boundPoint(&lt, s.finalCrop);
843         boundPoint(&lb, s.finalCrop);
844         boundPoint(&rb, s.finalCrop);
845         boundPoint(&rt, s.finalCrop);
846     }
847 
848     Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>());
849     position[0] = renderAreaTransform.transform(lt);
850     position[1] = renderAreaTransform.transform(lb);
851     position[2] = renderAreaTransform.transform(rb);
852     position[3] = renderAreaTransform.transform(rt);
853     for (size_t i = 0; i < 4; i++) {
854         position[i].y = height - position[i].y;
855     }
856 }
857 
isSecure() const858 bool Layer::isSecure() const {
859     const Layer::State& s(mDrawingState);
860     return (s.flags & layer_state_t::eLayerSecure);
861 }
862 
setVisibleRegion(const Region & visibleRegion)863 void Layer::setVisibleRegion(const Region& visibleRegion) {
864     // always called from main thread
865     this->visibleRegion = visibleRegion;
866 }
867 
setCoveredRegion(const Region & coveredRegion)868 void Layer::setCoveredRegion(const Region& coveredRegion) {
869     // always called from main thread
870     this->coveredRegion = coveredRegion;
871 }
872 
setVisibleNonTransparentRegion(const Region & setVisibleNonTransparentRegion)873 void Layer::setVisibleNonTransparentRegion(const Region& setVisibleNonTransparentRegion) {
874     // always called from main thread
875     this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
876 }
877 
clearVisibilityRegions()878 void Layer::clearVisibilityRegions() {
879     visibleRegion.clear();
880     visibleNonTransparentRegion.clear();
881     coveredRegion.clear();
882 }
883 
884 // ----------------------------------------------------------------------------
885 // transaction
886 // ----------------------------------------------------------------------------
887 
pushPendingState()888 void Layer::pushPendingState() {
889     if (!mCurrentState.modified) {
890         return;
891     }
892 
893     // If this transaction is waiting on the receipt of a frame, generate a sync
894     // point and send it to the remote layer.
895     if (mCurrentState.barrierLayer != nullptr) {
896         sp<Layer> barrierLayer = mCurrentState.barrierLayer.promote();
897         if (barrierLayer == nullptr) {
898             ALOGE("[%s] Unable to promote barrier Layer.", mName.string());
899             // If we can't promote the layer we are intended to wait on,
900             // then it is expired or otherwise invalid. Allow this transaction
901             // to be applied as per normal (no synchronization).
902             mCurrentState.barrierLayer = nullptr;
903         } else {
904             auto syncPoint = std::make_shared<SyncPoint>(mCurrentState.frameNumber);
905             if (barrierLayer->addSyncPoint(syncPoint)) {
906                 mRemoteSyncPoints.push_back(std::move(syncPoint));
907             } else {
908                 // We already missed the frame we're supposed to synchronize
909                 // on, so go ahead and apply the state update
910                 mCurrentState.barrierLayer = nullptr;
911             }
912         }
913 
914         // Wake us up to check if the frame has been received
915         setTransactionFlags(eTransactionNeeded);
916         mFlinger->setTransactionFlags(eTraversalNeeded);
917     }
918     mPendingStates.push_back(mCurrentState);
919     ATRACE_INT(mTransactionName.string(), mPendingStates.size());
920 }
921 
popPendingState(State * stateToCommit)922 void Layer::popPendingState(State* stateToCommit) {
923     *stateToCommit = mPendingStates[0];
924 
925     mPendingStates.removeAt(0);
926     ATRACE_INT(mTransactionName.string(), mPendingStates.size());
927 }
928 
applyPendingStates(State * stateToCommit)929 bool Layer::applyPendingStates(State* stateToCommit) {
930     bool stateUpdateAvailable = false;
931     while (!mPendingStates.empty()) {
932         if (mPendingStates[0].barrierLayer != nullptr) {
933             if (mRemoteSyncPoints.empty()) {
934                 // If we don't have a sync point for this, apply it anyway. It
935                 // will be visually wrong, but it should keep us from getting
936                 // into too much trouble.
937                 ALOGE("[%s] No local sync point found", mName.string());
938                 popPendingState(stateToCommit);
939                 stateUpdateAvailable = true;
940                 continue;
941             }
942 
943             if (mRemoteSyncPoints.front()->getFrameNumber() != mPendingStates[0].frameNumber) {
944                 ALOGE("[%s] Unexpected sync point frame number found", mName.string());
945 
946                 // Signal our end of the sync point and then dispose of it
947                 mRemoteSyncPoints.front()->setTransactionApplied();
948                 mRemoteSyncPoints.pop_front();
949                 continue;
950             }
951 
952             if (mRemoteSyncPoints.front()->frameIsAvailable()) {
953                 // Apply the state update
954                 popPendingState(stateToCommit);
955                 stateUpdateAvailable = true;
956 
957                 // Signal our end of the sync point and then dispose of it
958                 mRemoteSyncPoints.front()->setTransactionApplied();
959                 mRemoteSyncPoints.pop_front();
960             } else {
961                 break;
962             }
963         } else {
964             popPendingState(stateToCommit);
965             stateUpdateAvailable = true;
966         }
967     }
968 
969     // If we still have pending updates, wake SurfaceFlinger back up and point
970     // it at this layer so we can process them
971     if (!mPendingStates.empty()) {
972         setTransactionFlags(eTransactionNeeded);
973         mFlinger->setTransactionFlags(eTraversalNeeded);
974     }
975 
976     mCurrentState.modified = false;
977     return stateUpdateAvailable;
978 }
979 
doTransaction(uint32_t flags)980 uint32_t Layer::doTransaction(uint32_t flags) {
981     ATRACE_CALL();
982 
983     pushPendingState();
984     Layer::State c = getCurrentState();
985     if (!applyPendingStates(&c)) {
986         return 0;
987     }
988 
989     const Layer::State& s(getDrawingState());
990 
991     const bool sizeChanged = (c.requested.w != s.requested.w) || (c.requested.h != s.requested.h);
992 
993     if (sizeChanged) {
994         // the size changed, we need to ask our client to request a new buffer
995         ALOGD_IF(DEBUG_RESIZE,
996                  "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n"
997                  "  current={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
998                  "            requested={ wh={%4u,%4u} }}\n"
999                  "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1000                  "            requested={ wh={%4u,%4u} }}\n",
1001                  this, getName().string(), mCurrentTransform,
1002                  getEffectiveScalingMode(), c.active.w, c.active.h, c.crop.left, c.crop.top,
1003                  c.crop.right, c.crop.bottom, c.crop.getWidth(), c.crop.getHeight(), c.requested.w,
1004                  c.requested.h, s.active.w, s.active.h, s.crop.left, s.crop.top, s.crop.right,
1005                  s.crop.bottom, s.crop.getWidth(), s.crop.getHeight(), s.requested.w,
1006                  s.requested.h);
1007 
1008         // record the new size, form this point on, when the client request
1009         // a buffer, it'll get the new size.
1010         setDefaultBufferSize(c.requested.w, c.requested.h);
1011     }
1012 
1013     // Don't let Layer::doTransaction update the drawing state
1014     // if we have a pending resize, unless we are in fixed-size mode.
1015     // the drawing state will be updated only once we receive a buffer
1016     // with the correct size.
1017     //
1018     // In particular, we want to make sure the clip (which is part
1019     // of the geometry state) is latched together with the size but is
1020     // latched immediately when no resizing is involved.
1021     //
1022     // If a sideband stream is attached, however, we want to skip this
1023     // optimization so that transactions aren't missed when a buffer
1024     // never arrives
1025     //
1026     // In the case that we don't have a buffer we ignore other factors
1027     // and avoid entering the resizePending state. At a high level the
1028     // resizePending state is to avoid applying the state of the new buffer
1029     // to the old buffer. However in the state where we don't have an old buffer
1030     // there is no such concern but we may still be being used as a parent layer.
1031     const bool resizePending = ((c.requested.w != c.active.w) || (c.requested.h != c.active.h)) &&
1032             (getBE().compositionInfo.mBuffer != nullptr);
1033     if (!isFixedSize()) {
1034         if (resizePending && getBE().compositionInfo.hwc.sidebandStream == nullptr) {
1035             flags |= eDontUpdateGeometryState;
1036         }
1037     }
1038 
1039     // Here we apply various requested geometry states, depending on our
1040     // latching configuration. See Layer.h for a detailed discussion of
1041     // how geometry latching is controlled.
1042     if (!(flags & eDontUpdateGeometryState)) {
1043         Layer::State& editCurrentState(getCurrentState());
1044 
1045         // If mFreezeGeometryUpdates is true we are in the setGeometryAppliesWithResize
1046         // mode, which causes attributes which normally latch regardless of scaling mode,
1047         // to be delayed. We copy the requested state to the active state making sure
1048         // to respect these rules (again see Layer.h for a detailed discussion).
1049         //
1050         // There is an awkward asymmetry in the handling of the crop states in the position
1051         // states, as can be seen below. Largely this arises from position and transform
1052         // being stored in the same data structure while having different latching rules.
1053         // b/38182305
1054         //
1055         // Careful that "c" and editCurrentState may not begin as equivalent due to
1056         // applyPendingStates in the presence of deferred transactions.
1057         if (mFreezeGeometryUpdates) {
1058             float tx = c.active.transform.tx();
1059             float ty = c.active.transform.ty();
1060             c.active = c.requested;
1061             c.active.transform.set(tx, ty);
1062             editCurrentState.active = c.active;
1063         } else {
1064             editCurrentState.active = editCurrentState.requested;
1065             c.active = c.requested;
1066         }
1067     }
1068 
1069     if (s.active != c.active) {
1070         // invalidate and recompute the visible regions if needed
1071         flags |= Layer::eVisibleRegion;
1072     }
1073 
1074     if (c.sequence != s.sequence) {
1075         // invalidate and recompute the visible regions if needed
1076         flags |= eVisibleRegion;
1077         this->contentDirty = true;
1078 
1079         // we may use linear filtering, if the matrix scales us
1080         const uint8_t type = c.active.transform.getType();
1081         mNeedsFiltering = (!c.active.transform.preserveRects() || (type >= Transform::SCALE));
1082     }
1083 
1084     // If the layer is hidden, signal and clear out all local sync points so
1085     // that transactions for layers depending on this layer's frames becoming
1086     // visible are not blocked
1087     if (c.flags & layer_state_t::eLayerHidden) {
1088         clearSyncPoints();
1089     }
1090 
1091     // Commit the transaction
1092     commitTransaction(c);
1093     return flags;
1094 }
1095 
commitTransaction(const State & stateToCommit)1096 void Layer::commitTransaction(const State& stateToCommit) {
1097     mDrawingState = stateToCommit;
1098 }
1099 
getTransactionFlags(uint32_t flags)1100 uint32_t Layer::getTransactionFlags(uint32_t flags) {
1101     return android_atomic_and(~flags, &mTransactionFlags) & flags;
1102 }
1103 
setTransactionFlags(uint32_t flags)1104 uint32_t Layer::setTransactionFlags(uint32_t flags) {
1105     return android_atomic_or(flags, &mTransactionFlags);
1106 }
1107 
setPosition(float x,float y,bool immediate)1108 bool Layer::setPosition(float x, float y, bool immediate) {
1109     if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y)
1110         return false;
1111     mCurrentState.sequence++;
1112 
1113     // We update the requested and active position simultaneously because
1114     // we want to apply the position portion of the transform matrix immediately,
1115     // but still delay scaling when resizing a SCALING_MODE_FREEZE layer.
1116     mCurrentState.requested.transform.set(x, y);
1117     if (immediate && !mFreezeGeometryUpdates) {
1118         // Here we directly update the active state
1119         // unlike other setters, because we store it within
1120         // the transform, but use different latching rules.
1121         // b/38182305
1122         mCurrentState.active.transform.set(x, y);
1123     }
1124     mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
1125 
1126     mCurrentState.modified = true;
1127     setTransactionFlags(eTransactionNeeded);
1128     return true;
1129 }
1130 
setChildLayer(const sp<Layer> & childLayer,int32_t z)1131 bool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) {
1132     ssize_t idx = mCurrentChildren.indexOf(childLayer);
1133     if (idx < 0) {
1134         return false;
1135     }
1136     if (childLayer->setLayer(z)) {
1137         mCurrentChildren.removeAt(idx);
1138         mCurrentChildren.add(childLayer);
1139         return true;
1140     }
1141     return false;
1142 }
1143 
setChildRelativeLayer(const sp<Layer> & childLayer,const sp<IBinder> & relativeToHandle,int32_t relativeZ)1144 bool Layer::setChildRelativeLayer(const sp<Layer>& childLayer,
1145         const sp<IBinder>& relativeToHandle, int32_t relativeZ) {
1146     ssize_t idx = mCurrentChildren.indexOf(childLayer);
1147     if (idx < 0) {
1148         return false;
1149     }
1150     if (childLayer->setRelativeLayer(relativeToHandle, relativeZ)) {
1151         mCurrentChildren.removeAt(idx);
1152         mCurrentChildren.add(childLayer);
1153         return true;
1154     }
1155     return false;
1156 }
1157 
setLayer(int32_t z)1158 bool Layer::setLayer(int32_t z) {
1159     if (mCurrentState.z == z && !usingRelativeZ(LayerVector::StateSet::Current)) return false;
1160     mCurrentState.sequence++;
1161     mCurrentState.z = z;
1162     mCurrentState.modified = true;
1163 
1164     // Discard all relative layering.
1165     if (mCurrentState.zOrderRelativeOf != nullptr) {
1166         sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
1167         if (strongRelative != nullptr) {
1168             strongRelative->removeZOrderRelative(this);
1169         }
1170         mCurrentState.zOrderRelativeOf = nullptr;
1171     }
1172     setTransactionFlags(eTransactionNeeded);
1173     return true;
1174 }
1175 
removeZOrderRelative(const wp<Layer> & relative)1176 void Layer::removeZOrderRelative(const wp<Layer>& relative) {
1177     mCurrentState.zOrderRelatives.remove(relative);
1178     mCurrentState.sequence++;
1179     mCurrentState.modified = true;
1180     setTransactionFlags(eTransactionNeeded);
1181 }
1182 
addZOrderRelative(const wp<Layer> & relative)1183 void Layer::addZOrderRelative(const wp<Layer>& relative) {
1184     mCurrentState.zOrderRelatives.add(relative);
1185     mCurrentState.modified = true;
1186     mCurrentState.sequence++;
1187     setTransactionFlags(eTransactionNeeded);
1188 }
1189 
setRelativeLayer(const sp<IBinder> & relativeToHandle,int32_t relativeZ)1190 bool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t relativeZ) {
1191     sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get());
1192     if (handle == nullptr) {
1193         return false;
1194     }
1195     sp<Layer> relative = handle->owner.promote();
1196     if (relative == nullptr) {
1197         return false;
1198     }
1199 
1200     if (mCurrentState.z == relativeZ && usingRelativeZ(LayerVector::StateSet::Current) &&
1201             mCurrentState.zOrderRelativeOf == relative) {
1202         return false;
1203     }
1204 
1205     mCurrentState.sequence++;
1206     mCurrentState.modified = true;
1207     mCurrentState.z = relativeZ;
1208 
1209     auto oldZOrderRelativeOf = mCurrentState.zOrderRelativeOf.promote();
1210     if (oldZOrderRelativeOf != nullptr) {
1211         oldZOrderRelativeOf->removeZOrderRelative(this);
1212     }
1213     mCurrentState.zOrderRelativeOf = relative;
1214     relative->addZOrderRelative(this);
1215 
1216     setTransactionFlags(eTransactionNeeded);
1217 
1218     return true;
1219 }
1220 
setSize(uint32_t w,uint32_t h)1221 bool Layer::setSize(uint32_t w, uint32_t h) {
1222     if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) return false;
1223     mCurrentState.requested.w = w;
1224     mCurrentState.requested.h = h;
1225     mCurrentState.modified = true;
1226     setTransactionFlags(eTransactionNeeded);
1227     return true;
1228 }
setAlpha(float alpha)1229 bool Layer::setAlpha(float alpha) {
1230     if (mCurrentState.color.a == alpha) return false;
1231     mCurrentState.sequence++;
1232     mCurrentState.color.a = alpha;
1233     mCurrentState.modified = true;
1234     setTransactionFlags(eTransactionNeeded);
1235     return true;
1236 }
1237 
setColor(const half3 & color)1238 bool Layer::setColor(const half3& color) {
1239     if (color.r == mCurrentState.color.r && color.g == mCurrentState.color.g &&
1240         color.b == mCurrentState.color.b)
1241         return false;
1242 
1243     mCurrentState.sequence++;
1244     mCurrentState.color.r = color.r;
1245     mCurrentState.color.g = color.g;
1246     mCurrentState.color.b = color.b;
1247     mCurrentState.modified = true;
1248     setTransactionFlags(eTransactionNeeded);
1249     return true;
1250 }
1251 
setMatrix(const layer_state_t::matrix22_t & matrix)1252 bool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) {
1253     mCurrentState.sequence++;
1254     mCurrentState.requested.transform.set(matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy);
1255     mCurrentState.modified = true;
1256     setTransactionFlags(eTransactionNeeded);
1257     return true;
1258 }
setTransparentRegionHint(const Region & transparent)1259 bool Layer::setTransparentRegionHint(const Region& transparent) {
1260     mCurrentState.requestedTransparentRegion = transparent;
1261     mCurrentState.modified = true;
1262     setTransactionFlags(eTransactionNeeded);
1263     return true;
1264 }
setFlags(uint8_t flags,uint8_t mask)1265 bool Layer::setFlags(uint8_t flags, uint8_t mask) {
1266     const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
1267     if (mCurrentState.flags == newFlags) return false;
1268     mCurrentState.sequence++;
1269     mCurrentState.flags = newFlags;
1270     mCurrentState.modified = true;
1271     setTransactionFlags(eTransactionNeeded);
1272     return true;
1273 }
1274 
setCrop(const Rect & crop,bool immediate)1275 bool Layer::setCrop(const Rect& crop, bool immediate) {
1276     if (mCurrentState.requestedCrop == crop) return false;
1277     mCurrentState.sequence++;
1278     mCurrentState.requestedCrop = crop;
1279     if (immediate && !mFreezeGeometryUpdates) {
1280         mCurrentState.crop = crop;
1281     }
1282     mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
1283 
1284     mCurrentState.modified = true;
1285     setTransactionFlags(eTransactionNeeded);
1286     return true;
1287 }
1288 
setFinalCrop(const Rect & crop,bool immediate)1289 bool Layer::setFinalCrop(const Rect& crop, bool immediate) {
1290     if (mCurrentState.requestedFinalCrop == crop) return false;
1291     mCurrentState.sequence++;
1292     mCurrentState.requestedFinalCrop = crop;
1293     if (immediate && !mFreezeGeometryUpdates) {
1294         mCurrentState.finalCrop = crop;
1295     }
1296     mFreezeGeometryUpdates = mFreezeGeometryUpdates || !immediate;
1297 
1298     mCurrentState.modified = true;
1299     setTransactionFlags(eTransactionNeeded);
1300     return true;
1301 }
1302 
setOverrideScalingMode(int32_t scalingMode)1303 bool Layer::setOverrideScalingMode(int32_t scalingMode) {
1304     if (scalingMode == mOverrideScalingMode) return false;
1305     mOverrideScalingMode = scalingMode;
1306     setTransactionFlags(eTransactionNeeded);
1307     return true;
1308 }
1309 
setInfo(int32_t type,int32_t appId)1310 void Layer::setInfo(int32_t type, int32_t appId) {
1311     mCurrentState.appId = appId;
1312     mCurrentState.type = type;
1313     mCurrentState.modified = true;
1314     setTransactionFlags(eTransactionNeeded);
1315 }
1316 
setLayerStack(uint32_t layerStack)1317 bool Layer::setLayerStack(uint32_t layerStack) {
1318     if (mCurrentState.layerStack == layerStack) return false;
1319     mCurrentState.sequence++;
1320     mCurrentState.layerStack = layerStack;
1321     mCurrentState.modified = true;
1322     setTransactionFlags(eTransactionNeeded);
1323     return true;
1324 }
1325 
getLayerStack() const1326 uint32_t Layer::getLayerStack() const {
1327     auto p = mDrawingParent.promote();
1328     if (p == nullptr) {
1329         return getDrawingState().layerStack;
1330     }
1331     return p->getLayerStack();
1332 }
1333 
deferTransactionUntil(const sp<Layer> & barrierLayer,uint64_t frameNumber)1334 void Layer::deferTransactionUntil(const sp<Layer>& barrierLayer, uint64_t frameNumber) {
1335     mCurrentState.barrierLayer = barrierLayer;
1336     mCurrentState.frameNumber = frameNumber;
1337     // We don't set eTransactionNeeded, because just receiving a deferral
1338     // request without any other state updates shouldn't actually induce a delay
1339     mCurrentState.modified = true;
1340     pushPendingState();
1341     mCurrentState.barrierLayer = nullptr;
1342     mCurrentState.frameNumber = 0;
1343     mCurrentState.modified = false;
1344 }
1345 
deferTransactionUntil(const sp<IBinder> & barrierHandle,uint64_t frameNumber)1346 void Layer::deferTransactionUntil(const sp<IBinder>& barrierHandle, uint64_t frameNumber) {
1347     sp<Handle> handle = static_cast<Handle*>(barrierHandle.get());
1348     deferTransactionUntil(handle->owner.promote(), frameNumber);
1349 }
1350 
1351 
1352 // ----------------------------------------------------------------------------
1353 // pageflip handling...
1354 // ----------------------------------------------------------------------------
1355 
isHiddenByPolicy() const1356 bool Layer::isHiddenByPolicy() const {
1357     const Layer::State& s(mDrawingState);
1358     const auto& parent = mDrawingParent.promote();
1359     if (parent != nullptr && parent->isHiddenByPolicy()) {
1360         return true;
1361     }
1362     return s.flags & layer_state_t::eLayerHidden;
1363 }
1364 
getEffectiveUsage(uint32_t usage) const1365 uint32_t Layer::getEffectiveUsage(uint32_t usage) const {
1366     // TODO: should we do something special if mSecure is set?
1367     if (mProtectedByApp) {
1368         // need a hardware-protected path to external video sink
1369         usage |= GraphicBuffer::USAGE_PROTECTED;
1370     }
1371     if (mPotentialCursor) {
1372         usage |= GraphicBuffer::USAGE_CURSOR;
1373     }
1374     usage |= GraphicBuffer::USAGE_HW_COMPOSER;
1375     return usage;
1376 }
1377 
updateTransformHint(const sp<const DisplayDevice> & hw) const1378 void Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const {
1379     uint32_t orientation = 0;
1380     if (!mFlinger->mDebugDisableTransformHint) {
1381         // The transform hint is used to improve performance, but we can
1382         // only have a single transform hint, it cannot
1383         // apply to all displays.
1384         const Transform& planeTransform(hw->getTransform());
1385         orientation = planeTransform.getOrientation();
1386         if (orientation & Transform::ROT_INVALID) {
1387             orientation = 0;
1388         }
1389     }
1390     setTransformHint(orientation);
1391 }
1392 
1393 // ----------------------------------------------------------------------------
1394 // debugging
1395 // ----------------------------------------------------------------------------
1396 
getLayerDebugInfo() const1397 LayerDebugInfo Layer::getLayerDebugInfo() const {
1398     LayerDebugInfo info;
1399     const Layer::State& ds = getDrawingState();
1400     info.mName = getName();
1401     sp<Layer> parent = getParent();
1402     info.mParentName = (parent == nullptr ? std::string("none") : parent->getName().string());
1403     info.mType = String8(getTypeId());
1404     info.mTransparentRegion = ds.activeTransparentRegion;
1405     info.mVisibleRegion = visibleRegion;
1406     info.mSurfaceDamageRegion = surfaceDamageRegion;
1407     info.mLayerStack = getLayerStack();
1408     info.mX = ds.active.transform.tx();
1409     info.mY = ds.active.transform.ty();
1410     info.mZ = ds.z;
1411     info.mWidth = ds.active.w;
1412     info.mHeight = ds.active.h;
1413     info.mCrop = ds.crop;
1414     info.mFinalCrop = ds.finalCrop;
1415     info.mColor = ds.color;
1416     info.mFlags = ds.flags;
1417     info.mPixelFormat = getPixelFormat();
1418     info.mDataSpace = static_cast<android_dataspace>(mCurrentDataSpace);
1419     info.mMatrix[0][0] = ds.active.transform[0][0];
1420     info.mMatrix[0][1] = ds.active.transform[0][1];
1421     info.mMatrix[1][0] = ds.active.transform[1][0];
1422     info.mMatrix[1][1] = ds.active.transform[1][1];
1423     {
1424         sp<const GraphicBuffer> buffer = getBE().compositionInfo.mBuffer;
1425         if (buffer != 0) {
1426             info.mActiveBufferWidth = buffer->getWidth();
1427             info.mActiveBufferHeight = buffer->getHeight();
1428             info.mActiveBufferStride = buffer->getStride();
1429             info.mActiveBufferFormat = buffer->format;
1430         } else {
1431             info.mActiveBufferWidth = 0;
1432             info.mActiveBufferHeight = 0;
1433             info.mActiveBufferStride = 0;
1434             info.mActiveBufferFormat = 0;
1435         }
1436     }
1437     info.mNumQueuedFrames = getQueuedFrameCount();
1438     info.mRefreshPending = isBufferLatched();
1439     info.mIsOpaque = isOpaque(ds);
1440     info.mContentDirty = contentDirty;
1441     return info;
1442 }
1443 
miniDumpHeader(String8 & result)1444 void Layer::miniDumpHeader(String8& result) {
1445     result.append("----------------------------------------");
1446     result.append("---------------------------------------\n");
1447     result.append(" Layer name\n");
1448     result.append("           Z | ");
1449     result.append(" Comp Type | ");
1450     result.append("  Disp Frame (LTRB) | ");
1451     result.append("         Source Crop (LTRB)\n");
1452     result.append("----------------------------------------");
1453     result.append("---------------------------------------\n");
1454 }
1455 
miniDump(String8 & result,int32_t hwcId) const1456 void Layer::miniDump(String8& result, int32_t hwcId) const {
1457     if (getBE().mHwcLayers.count(hwcId) == 0) {
1458         return;
1459     }
1460 
1461     String8 name;
1462     if (mName.length() > 77) {
1463         std::string shortened;
1464         shortened.append(mName.string(), 36);
1465         shortened.append("[...]");
1466         shortened.append(mName.string() + (mName.length() - 36), 36);
1467         name = shortened.c_str();
1468     } else {
1469         name = mName;
1470     }
1471 
1472     result.appendFormat(" %s\n", name.string());
1473 
1474     const Layer::State& layerState(getDrawingState());
1475     const LayerBE::HWCInfo& hwcInfo = getBE().mHwcLayers.at(hwcId);
1476     if (layerState.zOrderRelativeOf != nullptr || mDrawingParent != nullptr) {
1477         result.appendFormat("  rel %6d | ", layerState.z);
1478     } else {
1479         result.appendFormat("  %10d | ", layerState.z);
1480     }
1481     result.appendFormat("%10s | ", to_string(getCompositionType(hwcId)).c_str());
1482     const Rect& frame = hwcInfo.displayFrame;
1483     result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, frame.right, frame.bottom);
1484     const FloatRect& crop = hwcInfo.sourceCrop;
1485     result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, crop.right, crop.bottom);
1486 
1487     result.append("- - - - - - - - - - - - - - - - - - - - ");
1488     result.append("- - - - - - - - - - - - - - - - - - - -\n");
1489 }
1490 
dumpFrameStats(String8 & result) const1491 void Layer::dumpFrameStats(String8& result) const {
1492     mFrameTracker.dumpStats(result);
1493 }
1494 
clearFrameStats()1495 void Layer::clearFrameStats() {
1496     mFrameTracker.clearStats();
1497 }
1498 
logFrameStats()1499 void Layer::logFrameStats() {
1500     mFrameTracker.logAndResetStats(mName);
1501 }
1502 
getFrameStats(FrameStats * outStats) const1503 void Layer::getFrameStats(FrameStats* outStats) const {
1504     mFrameTracker.getStats(outStats);
1505 }
1506 
dumpFrameEvents(String8 & result)1507 void Layer::dumpFrameEvents(String8& result) {
1508     result.appendFormat("- Layer %s (%s, %p)\n", getName().string(), getTypeId(), this);
1509     Mutex::Autolock lock(mFrameEventHistoryMutex);
1510     mFrameEventHistory.checkFencesForCompletion();
1511     mFrameEventHistory.dump(result);
1512 }
1513 
onDisconnect()1514 void Layer::onDisconnect() {
1515     Mutex::Autolock lock(mFrameEventHistoryMutex);
1516     mFrameEventHistory.onDisconnect();
1517     mTimeStats.onDisconnect(getName().c_str());
1518 }
1519 
addAndGetFrameTimestamps(const NewFrameEventsEntry * newTimestamps,FrameEventHistoryDelta * outDelta)1520 void Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps,
1521                                      FrameEventHistoryDelta* outDelta) {
1522     if (newTimestamps) {
1523         mTimeStats.setPostTime(getName().c_str(), newTimestamps->frameNumber,
1524                                newTimestamps->postedTime);
1525     }
1526 
1527     Mutex::Autolock lock(mFrameEventHistoryMutex);
1528     if (newTimestamps) {
1529         // If there are any unsignaled fences in the aquire timeline at this
1530         // point, the previously queued frame hasn't been latched yet. Go ahead
1531         // and try to get the signal time here so the syscall is taken out of
1532         // the main thread's critical path.
1533         mAcquireTimeline.updateSignalTimes();
1534         // Push the new fence after updating since it's likely still pending.
1535         mAcquireTimeline.push(newTimestamps->acquireFence);
1536         mFrameEventHistory.addQueue(*newTimestamps);
1537     }
1538 
1539     if (outDelta) {
1540         mFrameEventHistory.getAndResetDelta(outDelta);
1541     }
1542 }
1543 
getChildrenCount() const1544 size_t Layer::getChildrenCount() const {
1545     size_t count = 0;
1546     for (const sp<Layer>& child : mCurrentChildren) {
1547         count += 1 + child->getChildrenCount();
1548     }
1549     return count;
1550 }
1551 
addChild(const sp<Layer> & layer)1552 void Layer::addChild(const sp<Layer>& layer) {
1553     mCurrentChildren.add(layer);
1554     layer->setParent(this);
1555 }
1556 
removeChild(const sp<Layer> & layer)1557 ssize_t Layer::removeChild(const sp<Layer>& layer) {
1558     layer->setParent(nullptr);
1559     return mCurrentChildren.remove(layer);
1560 }
1561 
reparentChildren(const sp<IBinder> & newParentHandle)1562 bool Layer::reparentChildren(const sp<IBinder>& newParentHandle) {
1563     sp<Handle> handle = nullptr;
1564     sp<Layer> newParent = nullptr;
1565     if (newParentHandle == nullptr) {
1566         return false;
1567     }
1568     handle = static_cast<Handle*>(newParentHandle.get());
1569     newParent = handle->owner.promote();
1570     if (newParent == nullptr) {
1571         ALOGE("Unable to promote Layer handle");
1572         return false;
1573     }
1574 
1575     for (const sp<Layer>& child : mCurrentChildren) {
1576         newParent->addChild(child);
1577 
1578         sp<Client> client(child->mClientRef.promote());
1579         if (client != nullptr) {
1580             client->updateParent(newParent);
1581         }
1582     }
1583     mCurrentChildren.clear();
1584 
1585     return true;
1586 }
1587 
setChildrenDrawingParent(const sp<Layer> & newParent)1588 void Layer::setChildrenDrawingParent(const sp<Layer>& newParent) {
1589     for (const sp<Layer>& child : mDrawingChildren) {
1590         child->mDrawingParent = newParent;
1591     }
1592 }
1593 
reparent(const sp<IBinder> & newParentHandle)1594 bool Layer::reparent(const sp<IBinder>& newParentHandle) {
1595     if (newParentHandle == nullptr) {
1596         return false;
1597     }
1598 
1599     auto handle = static_cast<Handle*>(newParentHandle.get());
1600     sp<Layer> newParent = handle->owner.promote();
1601     if (newParent == nullptr) {
1602         ALOGE("Unable to promote Layer handle");
1603         return false;
1604     }
1605 
1606     sp<Layer> parent = getParent();
1607     if (parent != nullptr) {
1608         parent->removeChild(this);
1609     }
1610     newParent->addChild(this);
1611 
1612     sp<Client> client(mClientRef.promote());
1613     sp<Client> newParentClient(newParent->mClientRef.promote());
1614 
1615     if (client != newParentClient) {
1616         client->updateParent(newParent);
1617     }
1618 
1619     return true;
1620 }
1621 
detachChildren()1622 bool Layer::detachChildren() {
1623     for (const sp<Layer>& child : mCurrentChildren) {
1624         sp<Client> parentClient = mClientRef.promote();
1625         sp<Client> client(child->mClientRef.promote());
1626         if (client != nullptr && parentClient != client) {
1627             client->detachLayer(child.get());
1628             child->detachChildren();
1629         }
1630     }
1631 
1632     return true;
1633 }
1634 
isLegacyDataSpace() const1635 bool Layer::isLegacyDataSpace() const {
1636     // return true when no higher bits are set
1637     return !(mCurrentDataSpace & (ui::Dataspace::STANDARD_MASK |
1638                 ui::Dataspace::TRANSFER_MASK | ui::Dataspace::RANGE_MASK));
1639 }
1640 
setParent(const sp<Layer> & layer)1641 void Layer::setParent(const sp<Layer>& layer) {
1642     mCurrentParent = layer;
1643 }
1644 
clearSyncPoints()1645 void Layer::clearSyncPoints() {
1646     for (const auto& child : mCurrentChildren) {
1647         child->clearSyncPoints();
1648     }
1649 
1650     Mutex::Autolock lock(mLocalSyncPointMutex);
1651     for (auto& point : mLocalSyncPoints) {
1652         point->setFrameAvailable();
1653     }
1654     mLocalSyncPoints.clear();
1655 }
1656 
getZ() const1657 int32_t Layer::getZ() const {
1658     return mDrawingState.z;
1659 }
1660 
usingRelativeZ(LayerVector::StateSet stateSet)1661 bool Layer::usingRelativeZ(LayerVector::StateSet stateSet) {
1662     const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
1663     const State& state = useDrawing ? mDrawingState : mCurrentState;
1664     return state.zOrderRelativeOf != nullptr;
1665 }
1666 
makeTraversalList(LayerVector::StateSet stateSet,bool * outSkipRelativeZUsers)1667 __attribute__((no_sanitize("unsigned-integer-overflow"))) LayerVector Layer::makeTraversalList(
1668         LayerVector::StateSet stateSet, bool* outSkipRelativeZUsers) {
1669     LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid,
1670                         "makeTraversalList received invalid stateSet");
1671     const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
1672     const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
1673     const State& state = useDrawing ? mDrawingState : mCurrentState;
1674 
1675     if (state.zOrderRelatives.size() == 0) {
1676         *outSkipRelativeZUsers = true;
1677         return children;
1678     }
1679 
1680     LayerVector traverse(stateSet);
1681     for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
1682         sp<Layer> strongRelative = weakRelative.promote();
1683         if (strongRelative != nullptr) {
1684             traverse.add(strongRelative);
1685         }
1686     }
1687 
1688     for (const sp<Layer>& child : children) {
1689         const State& childState = useDrawing ? child->mDrawingState : child->mCurrentState;
1690         if (childState.zOrderRelativeOf != nullptr) {
1691             continue;
1692         }
1693         traverse.add(child);
1694     }
1695 
1696     return traverse;
1697 }
1698 
1699 /**
1700  * Negatively signed relatives are before 'this' in Z-order.
1701  */
traverseInZOrder(LayerVector::StateSet stateSet,const LayerVector::Visitor & visitor)1702 void Layer::traverseInZOrder(LayerVector::StateSet stateSet, const LayerVector::Visitor& visitor) {
1703     // In the case we have other layers who are using a relative Z to us, makeTraversalList will
1704     // produce a new list for traversing, including our relatives, and not including our children
1705     // who are relatives of another surface. In the case that there are no relative Z,
1706     // makeTraversalList returns our children directly to avoid significant overhead.
1707     // However in this case we need to take the responsibility for filtering children which
1708     // are relatives of another surface here.
1709     bool skipRelativeZUsers = false;
1710     const LayerVector list = makeTraversalList(stateSet, &skipRelativeZUsers);
1711 
1712     size_t i = 0;
1713     for (; i < list.size(); i++) {
1714         const auto& relative = list[i];
1715         if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) {
1716             continue;
1717         }
1718 
1719         if (relative->getZ() >= 0) {
1720             break;
1721         }
1722         relative->traverseInZOrder(stateSet, visitor);
1723     }
1724 
1725     visitor(this);
1726     for (; i < list.size(); i++) {
1727         const auto& relative = list[i];
1728 
1729         if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) {
1730             continue;
1731         }
1732         relative->traverseInZOrder(stateSet, visitor);
1733     }
1734 }
1735 
1736 /**
1737  * Positively signed relatives are before 'this' in reverse Z-order.
1738  */
traverseInReverseZOrder(LayerVector::StateSet stateSet,const LayerVector::Visitor & visitor)1739 void Layer::traverseInReverseZOrder(LayerVector::StateSet stateSet,
1740                                     const LayerVector::Visitor& visitor) {
1741     // See traverseInZOrder for documentation.
1742     bool skipRelativeZUsers = false;
1743     LayerVector list = makeTraversalList(stateSet, &skipRelativeZUsers);
1744 
1745     int32_t i = 0;
1746     for (i = int32_t(list.size()) - 1; i >= 0; i--) {
1747         const auto& relative = list[i];
1748 
1749         if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) {
1750             continue;
1751         }
1752 
1753         if (relative->getZ() < 0) {
1754             break;
1755         }
1756         relative->traverseInReverseZOrder(stateSet, visitor);
1757     }
1758     visitor(this);
1759     for (; i >= 0; i--) {
1760         const auto& relative = list[i];
1761 
1762         if (skipRelativeZUsers && relative->usingRelativeZ(stateSet)) {
1763             continue;
1764         }
1765 
1766         relative->traverseInReverseZOrder(stateSet, visitor);
1767     }
1768 }
1769 
makeChildrenTraversalList(LayerVector::StateSet stateSet,const std::vector<Layer * > & layersInTree)1770 LayerVector Layer::makeChildrenTraversalList(LayerVector::StateSet stateSet,
1771                                              const std::vector<Layer*>& layersInTree) {
1772     LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid,
1773                         "makeTraversalList received invalid stateSet");
1774     const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
1775     const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
1776     const State& state = useDrawing ? mDrawingState : mCurrentState;
1777 
1778     LayerVector traverse(stateSet);
1779     for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
1780         sp<Layer> strongRelative = weakRelative.promote();
1781         // Only add relative layers that are also descendents of the top most parent of the tree.
1782         // If a relative layer is not a descendent, then it should be ignored.
1783         if (std::binary_search(layersInTree.begin(), layersInTree.end(), strongRelative.get())) {
1784             traverse.add(strongRelative);
1785         }
1786     }
1787 
1788     for (const sp<Layer>& child : children) {
1789         const State& childState = useDrawing ? child->mDrawingState : child->mCurrentState;
1790         // If a layer has a relativeOf layer, only ignore if the layer it's relative to is a
1791         // descendent of the top most parent of the tree. If it's not a descendent, then just add
1792         // the child here since it won't be added later as a relative.
1793         if (std::binary_search(layersInTree.begin(), layersInTree.end(),
1794                                childState.zOrderRelativeOf.promote().get())) {
1795             continue;
1796         }
1797         traverse.add(child);
1798     }
1799 
1800     return traverse;
1801 }
1802 
traverseChildrenInZOrderInner(const std::vector<Layer * > & layersInTree,LayerVector::StateSet stateSet,const LayerVector::Visitor & visitor)1803 void Layer::traverseChildrenInZOrderInner(const std::vector<Layer*>& layersInTree,
1804                                           LayerVector::StateSet stateSet,
1805                                           const LayerVector::Visitor& visitor) {
1806     const LayerVector list = makeChildrenTraversalList(stateSet, layersInTree);
1807 
1808     size_t i = 0;
1809     for (; i < list.size(); i++) {
1810         const auto& relative = list[i];
1811         if (relative->getZ() >= 0) {
1812             break;
1813         }
1814         relative->traverseChildrenInZOrderInner(layersInTree, stateSet, visitor);
1815     }
1816 
1817     visitor(this);
1818     for (; i < list.size(); i++) {
1819         const auto& relative = list[i];
1820         relative->traverseChildrenInZOrderInner(layersInTree, stateSet, visitor);
1821     }
1822 }
1823 
getLayersInTree(LayerVector::StateSet stateSet)1824 std::vector<Layer*> Layer::getLayersInTree(LayerVector::StateSet stateSet) {
1825     const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
1826     const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
1827 
1828     std::vector<Layer*> layersInTree = {this};
1829     for (size_t i = 0; i < children.size(); i++) {
1830         const auto& child = children[i];
1831         std::vector<Layer*> childLayers = child->getLayersInTree(stateSet);
1832         layersInTree.insert(layersInTree.end(), childLayers.cbegin(), childLayers.cend());
1833     }
1834 
1835     return layersInTree;
1836 }
1837 
traverseChildrenInZOrder(LayerVector::StateSet stateSet,const LayerVector::Visitor & visitor)1838 void Layer::traverseChildrenInZOrder(LayerVector::StateSet stateSet,
1839                                      const LayerVector::Visitor& visitor) {
1840     std::vector<Layer*> layersInTree = getLayersInTree(stateSet);
1841     std::sort(layersInTree.begin(), layersInTree.end());
1842     traverseChildrenInZOrderInner(layersInTree, stateSet, visitor);
1843 }
1844 
getTransform() const1845 Transform Layer::getTransform() const {
1846     Transform t;
1847     const auto& p = mDrawingParent.promote();
1848     if (p != nullptr) {
1849         t = p->getTransform();
1850 
1851         // If the parent is not using NATIVE_WINDOW_SCALING_MODE_FREEZE (e.g.
1852         // it isFixedSize) then there may be additional scaling not accounted
1853         // for in the transform. We need to mirror this scaling in child surfaces
1854         // or we will break the contract where WM can treat child surfaces as
1855         // pixels in the parent surface.
1856         if (p->isFixedSize() && p->getBE().compositionInfo.mBuffer != nullptr) {
1857             int bufferWidth;
1858             int bufferHeight;
1859             if ((p->mCurrentTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) == 0) {
1860                 bufferWidth = p->getBE().compositionInfo.mBuffer->getWidth();
1861                 bufferHeight = p->getBE().compositionInfo.mBuffer->getHeight();
1862             } else {
1863                 bufferHeight = p->getBE().compositionInfo.mBuffer->getWidth();
1864                 bufferWidth = p->getBE().compositionInfo.mBuffer->getHeight();
1865             }
1866             float sx = p->getDrawingState().active.w / static_cast<float>(bufferWidth);
1867             float sy = p->getDrawingState().active.h / static_cast<float>(bufferHeight);
1868             Transform extraParentScaling;
1869             extraParentScaling.set(sx, 0, 0, sy);
1870             t = t * extraParentScaling;
1871         }
1872     }
1873     return t * getDrawingState().active.transform;
1874 }
1875 
getAlpha() const1876 half Layer::getAlpha() const {
1877     const auto& p = mDrawingParent.promote();
1878 
1879     half parentAlpha = (p != nullptr) ? p->getAlpha() : 1.0_hf;
1880     return parentAlpha * getDrawingState().color.a;
1881 }
1882 
getColor() const1883 half4 Layer::getColor() const {
1884     const half4 color(getDrawingState().color);
1885     return half4(color.r, color.g, color.b, getAlpha());
1886 }
1887 
commitChildList()1888 void Layer::commitChildList() {
1889     for (size_t i = 0; i < mCurrentChildren.size(); i++) {
1890         const auto& child = mCurrentChildren[i];
1891         child->commitChildList();
1892     }
1893     mDrawingChildren = mCurrentChildren;
1894     mDrawingParent = mCurrentParent;
1895 }
1896 
writeToProto(LayerProto * layerInfo,LayerVector::StateSet stateSet)1897 void Layer::writeToProto(LayerProto* layerInfo, LayerVector::StateSet stateSet) {
1898     const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
1899     const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
1900     const State& state = useDrawing ? mDrawingState : mCurrentState;
1901 
1902     Transform requestedTransform = state.active.transform;
1903     Transform transform = getTransform();
1904 
1905     layerInfo->set_id(sequence);
1906     layerInfo->set_name(getName().c_str());
1907     layerInfo->set_type(String8(getTypeId()));
1908 
1909     for (const auto& child : children) {
1910         layerInfo->add_children(child->sequence);
1911     }
1912 
1913     for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
1914         sp<Layer> strongRelative = weakRelative.promote();
1915         if (strongRelative != nullptr) {
1916             layerInfo->add_relatives(strongRelative->sequence);
1917         }
1918     }
1919 
1920     LayerProtoHelper::writeToProto(state.activeTransparentRegion,
1921                                    layerInfo->mutable_transparent_region());
1922     LayerProtoHelper::writeToProto(visibleRegion, layerInfo->mutable_visible_region());
1923     LayerProtoHelper::writeToProto(surfaceDamageRegion, layerInfo->mutable_damage_region());
1924 
1925     layerInfo->set_layer_stack(getLayerStack());
1926     layerInfo->set_z(state.z);
1927 
1928     PositionProto* position = layerInfo->mutable_position();
1929     position->set_x(transform.tx());
1930     position->set_y(transform.ty());
1931 
1932     PositionProto* requestedPosition = layerInfo->mutable_requested_position();
1933     requestedPosition->set_x(requestedTransform.tx());
1934     requestedPosition->set_y(requestedTransform.ty());
1935 
1936     SizeProto* size = layerInfo->mutable_size();
1937     size->set_w(state.active.w);
1938     size->set_h(state.active.h);
1939 
1940     LayerProtoHelper::writeToProto(state.crop, layerInfo->mutable_crop());
1941     LayerProtoHelper::writeToProto(state.finalCrop, layerInfo->mutable_final_crop());
1942 
1943     layerInfo->set_is_opaque(isOpaque(state));
1944     layerInfo->set_invalidate(contentDirty);
1945 
1946     // XXX (b/79210409) mCurrentDataSpace is not protected
1947     layerInfo->set_dataspace(dataspaceDetails(static_cast<android_dataspace>(mCurrentDataSpace)));
1948 
1949     layerInfo->set_pixel_format(decodePixelFormat(getPixelFormat()));
1950     LayerProtoHelper::writeToProto(getColor(), layerInfo->mutable_color());
1951     LayerProtoHelper::writeToProto(state.color, layerInfo->mutable_requested_color());
1952     layerInfo->set_flags(state.flags);
1953 
1954     LayerProtoHelper::writeToProto(transform, layerInfo->mutable_transform());
1955     LayerProtoHelper::writeToProto(requestedTransform, layerInfo->mutable_requested_transform());
1956 
1957     auto parent = useDrawing ? mDrawingParent.promote() : mCurrentParent.promote();
1958     if (parent != nullptr) {
1959         layerInfo->set_parent(parent->sequence);
1960     }
1961 
1962     auto zOrderRelativeOf = state.zOrderRelativeOf.promote();
1963     if (zOrderRelativeOf != nullptr) {
1964         layerInfo->set_z_order_relative_of(zOrderRelativeOf->sequence);
1965     }
1966 
1967     // XXX getBE().compositionInfo.mBuffer is not protected
1968     auto buffer = getBE().compositionInfo.mBuffer;
1969     if (buffer != nullptr) {
1970         LayerProtoHelper::writeToProto(buffer, layerInfo->mutable_active_buffer());
1971     }
1972 
1973     layerInfo->set_queued_frames(getQueuedFrameCount());
1974     layerInfo->set_refresh_pending(isBufferLatched());
1975     layerInfo->set_window_type(state.type);
1976     layerInfo->set_app_id(state.appId);
1977 }
1978 
writeToProto(LayerProto * layerInfo,int32_t hwcId)1979 void Layer::writeToProto(LayerProto* layerInfo, int32_t hwcId) {
1980     writeToProto(layerInfo, LayerVector::StateSet::Drawing);
1981 
1982     const auto& hwcInfo = getBE().mHwcLayers.at(hwcId);
1983 
1984     const Rect& frame = hwcInfo.displayFrame;
1985     LayerProtoHelper::writeToProto(frame, layerInfo->mutable_hwc_frame());
1986 
1987     const FloatRect& crop = hwcInfo.sourceCrop;
1988     LayerProtoHelper::writeToProto(crop, layerInfo->mutable_hwc_crop());
1989 
1990     const int32_t transform = static_cast<int32_t>(hwcInfo.transform);
1991     layerInfo->set_hwc_transform(transform);
1992 
1993     const int32_t compositionType = static_cast<int32_t>(hwcInfo.compositionType);
1994     layerInfo->set_hwc_composition_type(compositionType);
1995 
1996     if (std::strcmp(getTypeId(), "BufferLayer") == 0 &&
1997         static_cast<BufferLayer*>(this)->isProtected()) {
1998         layerInfo->set_is_protected(true);
1999     } else {
2000         layerInfo->set_is_protected(false);
2001     }
2002 }
2003 
2004 // ---------------------------------------------------------------------------
2005 
2006 }; // namespace android
2007 
2008 #if defined(__gl_h_)
2009 #error "don't include gl/gl.h in this file"
2010 #endif
2011 
2012 #if defined(__gl2_h_)
2013 #error "don't include gl2/gl2.h in this file"
2014 #endif
2015