blob: 8a221837ac8cfb0881257ba2a141f990866bc6bc [file] [log] [blame]
Fabien Sanglard7b1563a2016-10-13 12:05:28 -07001/*
2 * Copyright (C) 2011 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#include "LayerRejecter.h"
18
Mathias Agopiana9347642017-02-13 16:42:28 -080019#include <gui/BufferItem.h>
Mathias Agopian6a3c05b2017-04-27 20:06:55 -070020#include <system/window.h>
Mathias Agopiana9347642017-02-13 16:42:28 -080021
Fabien Sanglard7b1563a2016-10-13 12:05:28 -070022#define DEBUG_RESIZE 0
23
24namespace android {
25
chaviw214c89d2019-09-04 16:03:53 -070026LayerRejecter::LayerRejecter(Layer::State& front, Layer::State& current,
27 bool& recomputeVisibleRegions, bool stickySet, const char* name,
28 int32_t overrideScalingMode, bool transformToDisplayInverse)
29 : mFront(front),
30 mCurrent(current),
31 mRecomputeVisibleRegions(recomputeVisibleRegions),
32 mStickyTransformSet(stickySet),
33 mName(name),
34 mOverrideScalingMode(overrideScalingMode),
35 mTransformToDisplayInverse(transformToDisplayInverse) {}
Fabien Sanglard7b1563a2016-10-13 12:05:28 -070036
37bool LayerRejecter::reject(const sp<GraphicBuffer>& buf, const BufferItem& item) {
Peiyong Lin566a3b42018-01-09 18:22:43 -080038 if (buf == nullptr) {
Fabien Sanglard7b1563a2016-10-13 12:05:28 -070039 return false;
40 }
41
42 uint32_t bufWidth = buf->getWidth();
43 uint32_t bufHeight = buf->getHeight();
44
45 // check that we received a buffer of the right size
46 // (Take the buffer's orientation into account)
Peiyong Linefefaac2018-08-17 12:27:51 -070047 if (item.mTransform & ui::Transform::ROT_90) {
Peiyong Lin3db42342018-08-16 09:15:59 -070048 std::swap(bufWidth, bufHeight);
Fabien Sanglard7b1563a2016-10-13 12:05:28 -070049 }
50
Robert Carr35f0dda2018-05-03 15:47:23 -070051 if (mTransformToDisplayInverse) {
52 uint32_t invTransform = DisplayDevice::getPrimaryDisplayOrientationTransform();
Peiyong Linefefaac2018-08-17 12:27:51 -070053 if (invTransform & ui::Transform::ROT_90) {
Peiyong Lin3db42342018-08-16 09:15:59 -070054 std::swap(bufWidth, bufHeight);
Robert Carr35f0dda2018-05-03 15:47:23 -070055 }
56 }
57
Fabien Sanglard7b1563a2016-10-13 12:05:28 -070058 int actualScalingMode = mOverrideScalingMode >= 0 ? mOverrideScalingMode : item.mScalingMode;
59 bool isFixedSize = actualScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE;
Marissa Wallf58c14b2018-07-24 10:50:43 -070060 if (mFront.active_legacy != mFront.requested_legacy) {
61 if (isFixedSize ||
62 (bufWidth == mFront.requested_legacy.w && bufHeight == mFront.requested_legacy.h)) {
Fabien Sanglard7b1563a2016-10-13 12:05:28 -070063 // Here we pretend the transaction happened by updating the
64 // current and drawing states. Drawing state is only accessed
65 // in this thread, no need to have it locked
Marissa Wallf58c14b2018-07-24 10:50:43 -070066 mFront.active_legacy = mFront.requested_legacy;
Fabien Sanglard7b1563a2016-10-13 12:05:28 -070067
68 // We also need to update the current state so that
69 // we don't end-up overwriting the drawing state with
70 // this stale current state during the next transaction
71 //
72 // NOTE: We don't need to hold the transaction lock here
Marissa Wallf58c14b2018-07-24 10:50:43 -070073 // because State::active_legacy is only accessed from this thread.
74 mCurrent.active_legacy = mFront.active_legacy;
Fabien Sanglard7b1563a2016-10-13 12:05:28 -070075 mCurrent.modified = true;
76
77 // recompute visible region
78 mRecomputeVisibleRegions = true;
Robert Carr7bf247e2017-05-18 14:02:49 -070079
Marissa Wallf58c14b2018-07-24 10:50:43 -070080 if (mFront.crop_legacy != mFront.requestedCrop_legacy) {
81 mFront.crop_legacy = mFront.requestedCrop_legacy;
82 mCurrent.crop_legacy = mFront.requestedCrop_legacy;
Robert Carr7bf247e2017-05-18 14:02:49 -070083 mRecomputeVisibleRegions = true;
84 }
Fabien Sanglard7b1563a2016-10-13 12:05:28 -070085 }
86
87 ALOGD_IF(DEBUG_RESIZE,
88 "[%s] latchBuffer/reject: buffer (%ux%u, tr=%02x), scalingMode=%d\n"
Marissa Wall61c58622018-07-18 10:12:20 -070089 " drawing={ active_legacy ={ wh={%4u,%4u} crop_legacy={%4d,%4d,%4d,%4d} "
90 "(%4d,%4d) "
Fabien Sanglard7b1563a2016-10-13 12:05:28 -070091 "}\n"
Marissa Wallf58c14b2018-07-24 10:50:43 -070092 " requested_legacy={ wh={%4u,%4u} }}\n",
93 mName, bufWidth, bufHeight, item.mTransform, item.mScalingMode,
94 mFront.active_legacy.w, mFront.active_legacy.h, mFront.crop_legacy.left,
95 mFront.crop_legacy.top, mFront.crop_legacy.right, mFront.crop_legacy.bottom,
96 mFront.crop_legacy.getWidth(), mFront.crop_legacy.getHeight(),
97 mFront.requested_legacy.w, mFront.requested_legacy.h);
Fabien Sanglard7b1563a2016-10-13 12:05:28 -070098 }
99
100 if (!isFixedSize && !mStickyTransformSet) {
Marissa Wallf58c14b2018-07-24 10:50:43 -0700101 if (mFront.active_legacy.w != bufWidth || mFront.active_legacy.h != bufHeight) {
Fabien Sanglard7b1563a2016-10-13 12:05:28 -0700102 // reject this buffer
103 ALOGE("[%s] rejecting buffer: "
Marissa Wallf58c14b2018-07-24 10:50:43 -0700104 "bufWidth=%d, bufHeight=%d, front.active_legacy.{w=%d, h=%d}",
105 mName, bufWidth, bufHeight, mFront.active_legacy.w, mFront.active_legacy.h);
Fabien Sanglard7b1563a2016-10-13 12:05:28 -0700106 return true;
107 }
108 }
109
110 // if the transparent region has changed (this test is
111 // conservative, but that's fine, worst case we're doing
112 // a bit of extra work), we latch the new one and we
113 // trigger a visible-region recompute.
Robert Carr7bf247e2017-05-18 14:02:49 -0700114 //
115 // We latch the transparent region here, instead of above where we latch
116 // the rest of the geometry because it is only content but not necessarily
117 // resize dependent.
Marissa Wallf58c14b2018-07-24 10:50:43 -0700118 if (!mFront.activeTransparentRegion_legacy.isTriviallyEqual(
119 mFront.requestedTransparentRegion_legacy)) {
120 mFront.activeTransparentRegion_legacy = mFront.requestedTransparentRegion_legacy;
Fabien Sanglard7b1563a2016-10-13 12:05:28 -0700121
122 // We also need to update the current state so that
123 // we don't end-up overwriting the drawing state with
124 // this stale current state during the next transaction
125 //
126 // NOTE: We don't need to hold the transaction lock here
Marissa Wallf58c14b2018-07-24 10:50:43 -0700127 // because State::active_legacy is only accessed from this thread.
128 mCurrent.activeTransparentRegion_legacy = mFront.activeTransparentRegion_legacy;
Fabien Sanglard7b1563a2016-10-13 12:05:28 -0700129
130 // recompute visible region
131 mRecomputeVisibleRegions = true;
132 }
133
Fabien Sanglard7b1563a2016-10-13 12:05:28 -0700134 return false;
135}
136
Mathias Agopiana9347642017-02-13 16:42:28 -0800137} // namespace android