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(<, 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