1 /*
2 * Copyright 2021 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 "Layer.h"
18
19 #include <android-base/unique_fd.h>
20 #include <sync/sync.h>
21
22 #include <atomic>
23
24 namespace android {
25 namespace {
26
27 std::atomic<hwc2_layer_t> sNextId{1};
28
29 } // namespace
30
Layer()31 Layer::Layer() : mId(sNextId++) {}
32
setBuffer(buffer_handle_t buffer,int32_t fence)33 HWC2::Error Layer::setBuffer(buffer_handle_t buffer, int32_t fence) {
34 DEBUG_LOG("%s: layer:%" PRIu64 " buffer:%p fence:%" PRIu32, __FUNCTION__, mId,
35 buffer, fence);
36 mBuffer.setBuffer(buffer);
37 mBuffer.setFence(base::unique_fd(fence));
38 return HWC2::Error::None;
39 }
40
waitAndGetBuffer()41 buffer_handle_t Layer::waitAndGetBuffer() {
42 DEBUG_LOG("%s layer:%" PRIu64, __FUNCTION__, mId);
43
44 base::unique_fd fence = mBuffer.getFence();
45 if (fence.ok()) {
46 int err = sync_wait(fence.get(), 3000);
47 if (err < 0 && errno == ETIME) {
48 ALOGE("%s waited on fence %" PRId32 " for 3000 ms", __FUNCTION__,
49 fence.get());
50 }
51 }
52
53 return mBuffer.getBuffer();
54 }
55
setCursorPosition(int32_t,int32_t)56 HWC2::Error Layer::setCursorPosition(int32_t /*x*/, int32_t /*y*/) {
57 DEBUG_LOG("%s layer:%" PRIu64, __FUNCTION__, mId);
58
59 if (mCompositionType != HWC2::Composition::Cursor) {
60 ALOGE("%s: CompositionType not Cursor type", __FUNCTION__);
61 return HWC2::Error::BadLayer;
62 }
63
64 return HWC2::Error::None;
65 }
66
setSurfaceDamage(hwc_region_t)67 HWC2::Error Layer::setSurfaceDamage(hwc_region_t /*damage*/) {
68 DEBUG_LOG("%s layer:%" PRIu64, __FUNCTION__, mId);
69
70 return HWC2::Error::None;
71 }
72
setBlendMode(int32_t m)73 HWC2::Error Layer::setBlendMode(int32_t m) {
74 const auto blendMode = static_cast<HWC2::BlendMode>(m);
75 const auto blendModeString = to_string(blendMode);
76 DEBUG_LOG("%s layer:%" PRIu64 " blend mode:%s", __FUNCTION__, mId,
77 blendModeString.c_str());
78
79 mBlendMode = blendMode;
80 return HWC2::Error::None;
81 }
82
getBlendMode() const83 HWC2::BlendMode Layer::getBlendMode() const {
84 const auto blendMode = mBlendMode;
85 const auto blendModeString = to_string(blendMode);
86 DEBUG_LOG("%s layer:%" PRIu64 " blend mode:%s", __FUNCTION__, mId,
87 blendModeString.c_str());
88
89 return blendMode;
90 }
91
setColor(hwc_color_t color)92 HWC2::Error Layer::setColor(hwc_color_t color) {
93 DEBUG_LOG("%s layer:%" PRIu64 " color-r:%d color-g:%d color-b:%d color-a:%d)",
94 __FUNCTION__, mId, color.r, color.g, color.b, color.a);
95
96 mColor = color;
97 return HWC2::Error::None;
98 }
99
getColor() const100 hwc_color_t Layer::getColor() const {
101 auto color = mColor;
102 DEBUG_LOG("%s layer:%" PRIu64 " color-r:%d color-g:%d color-b:%d color-a:%d)",
103 __FUNCTION__, mId, color.r, color.g, color.b, color.a);
104
105 return color;
106 }
107
setCompositionTypeEnum(HWC2::Composition compositionType)108 HWC2::Error Layer::setCompositionTypeEnum(HWC2::Composition compositionType) {
109 const auto compositionTypeString = to_string(compositionType);
110 DEBUG_LOG("%s layer:%" PRIu64 " composition type:%s", __FUNCTION__, mId,
111 compositionTypeString.c_str());
112
113 mCompositionType = compositionType;
114 return HWC2::Error::None;
115 }
116
setCompositionType(int32_t type)117 HWC2::Error Layer::setCompositionType(int32_t type) {
118 const auto compositionType = static_cast<HWC2::Composition>(type);
119 return setCompositionTypeEnum(compositionType);
120 }
121
getCompositionType() const122 HWC2::Composition Layer::getCompositionType() const {
123 const auto compositionType = mCompositionType;
124 const auto compositionTypeString = to_string(compositionType);
125 DEBUG_LOG("%s layer:%" PRIu64 " composition type:%s", __FUNCTION__, mId,
126 compositionTypeString.c_str());
127
128 return compositionType;
129 }
130
setDataspace(int32_t)131 HWC2::Error Layer::setDataspace(int32_t) {
132 DEBUG_LOG("%s layer:%" PRIu64, __FUNCTION__, mId);
133
134 return HWC2::Error::None;
135 }
136
setDisplayFrame(hwc_rect_t frame)137 HWC2::Error Layer::setDisplayFrame(hwc_rect_t frame) {
138 DEBUG_LOG("%s layer:%" PRIu64
139 " display frame rect-left:%d rect-top:%d rect-right:%d rect-bot:%d",
140 __FUNCTION__, mId, frame.left, frame.top, frame.right,
141 frame.bottom);
142
143 mDisplayFrame = frame;
144 return HWC2::Error::None;
145 }
146
getDisplayFrame() const147 hwc_rect_t Layer::getDisplayFrame() const {
148 auto frame = mDisplayFrame;
149 DEBUG_LOG("%s layer:%" PRIu64
150 " display frame rect-left:%d rect-top:%d rect-right:%d rect-bot:%d",
151 __FUNCTION__, mId, frame.left, frame.top, frame.right,
152 frame.bottom);
153
154 return frame;
155 }
156
setPlaneAlpha(float alpha)157 HWC2::Error Layer::setPlaneAlpha(float alpha) {
158 DEBUG_LOG("%s layer:%" PRIu64 "alpha:%f", __FUNCTION__, mId, alpha);
159
160 mPlaneAlpha = alpha;
161 return HWC2::Error::None;
162 }
163
getPlaneAlpha() const164 float Layer::getPlaneAlpha() const {
165 auto alpha = mPlaneAlpha;
166 DEBUG_LOG("%s layer:%" PRIu64 "alpha:%f", __FUNCTION__, mId, alpha);
167
168 return alpha;
169 }
170
setSidebandStream(const native_handle_t * stream)171 HWC2::Error Layer::setSidebandStream(const native_handle_t* stream) {
172 DEBUG_LOG("%s layer:%" PRIu64, __FUNCTION__, mId);
173
174 mSidebandStream = stream;
175 return HWC2::Error::None;
176 }
177
setSourceCrop(hwc_frect_t crop)178 HWC2::Error Layer::setSourceCrop(hwc_frect_t crop) {
179 DEBUG_LOG("%s layer:%" PRIu64
180 "crop rect-left:%f rect-top:%f rect-right:%f rect-bot:%f",
181 __FUNCTION__, mId, crop.left, crop.top, crop.right, crop.bottom);
182
183 mSourceCrop = crop;
184 return HWC2::Error::None;
185 }
186
getSourceCrop() const187 hwc_frect_t Layer::getSourceCrop() const {
188 hwc_frect_t crop = mSourceCrop;
189 DEBUG_LOG("%s layer:%" PRIu64
190 "crop rect-left:%f rect-top:%f rect-right:%f rect-bot:%f",
191 __FUNCTION__, mId, crop.left, crop.top, crop.right, crop.bottom);
192
193 return crop;
194 }
195
getSourceCropInt() const196 hwc_rect_t Layer::getSourceCropInt() const {
197 hwc_rect_t crop = {};
198 crop.left = static_cast<int>(mSourceCrop.left);
199 crop.top = static_cast<int>(mSourceCrop.top);
200 crop.right = static_cast<int>(mSourceCrop.right);
201 crop.bottom = static_cast<int>(mSourceCrop.bottom);
202 DEBUG_LOG("%s layer:%" PRIu64
203 "crop rect-left:%d rect-top:%d rect-right:%d rect-bot:%d",
204 __FUNCTION__, mId, crop.left, crop.top, crop.right, crop.bottom);
205
206 return crop;
207 }
208
setTransform(int32_t transform)209 HWC2::Error Layer::setTransform(int32_t transform) {
210 const auto transformType = static_cast<HWC2::Transform>(transform);
211 const auto transformTypeString = to_string(transformType);
212 DEBUG_LOG("%s layer:%" PRIu64 " transform:%s", __FUNCTION__, mId,
213 transformTypeString.c_str());
214
215 mTransform = transformType;
216 return HWC2::Error::None;
217 }
218
getTransform() const219 hwc_transform_t Layer::getTransform() const {
220 const auto transform = mTransform;
221 const auto transformString = to_string(transform);
222 DEBUG_LOG("%s layer:%" PRIu64 " transform:%s", __FUNCTION__, mId,
223 transformString.c_str());
224
225 return static_cast<hwc_transform_t>(transform);
226 }
227
setVisibleRegion(hwc_region_t visible)228 HWC2::Error Layer::setVisibleRegion(hwc_region_t visible) {
229 DEBUG_LOG("%s layer:%" PRIu64, __FUNCTION__, mId);
230
231 mVisibleRegion.resize(visible.numRects);
232 std::copy_n(visible.rects, visible.numRects, mVisibleRegion.data());
233 return HWC2::Error::None;
234 }
235
getNumVisibleRegions() const236 std::size_t Layer::getNumVisibleRegions() const {
237 std::size_t num = mVisibleRegion.size();
238 DEBUG_LOG("%s layer:%" PRIu64 " number of visible regions: %zu", __FUNCTION__,
239 mId, num);
240
241 return num;
242 }
243
setZ(uint32_t z)244 HWC2::Error Layer::setZ(uint32_t z) {
245 DEBUG_LOG("%s layer:%" PRIu64 " z:%d", __FUNCTION__, mId, z);
246
247 mZ = z;
248 return HWC2::Error::None;
249 }
250
getZ() const251 uint32_t Layer::getZ() const {
252 uint32_t z = mZ;
253 DEBUG_LOG("%s layer:%" PRIu64 " z:%d", __FUNCTION__, mId, z);
254
255 return z;
256 }
257
258 } // namespace android
259