1 /*
2 * Copyright 2022 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 #include <cmath>
24
25 namespace aidl::android::hardware::graphics::composer3::impl {
26 namespace {
27
28 std::atomic<int64_t> sNextId{1};
29
30 } // namespace
31
Layer()32 Layer::Layer() : mId(sNextId++) {}
33
setCursorPosition(const common::Point & position)34 HWC3::Error Layer::setCursorPosition(const common::Point& position) {
35 DEBUG_LOG("%s: layer:%" PRId64, __FUNCTION__, mId);
36
37 if (mCompositionType != Composition::CURSOR) {
38 ALOGE("%s: CompositionType not Cursor type", __FUNCTION__);
39 return HWC3::Error::BadLayer;
40 }
41
42 mCursorPosition = position;
43 return HWC3::Error::None;
44 }
45
getCursorPosition() const46 common::Point Layer::getCursorPosition() const {
47 DEBUG_LOG("%s: layer:%" PRId64, __FUNCTION__, mId);
48
49 return mCursorPosition;
50 }
51
setBuffer(buffer_handle_t buffer,const ndk::ScopedFileDescriptor & fence)52 HWC3::Error Layer::setBuffer(buffer_handle_t buffer,
53 const ndk::ScopedFileDescriptor& fence) {
54 DEBUG_LOG("%s: layer:%" PRId64, __FUNCTION__, mId);
55
56 if (buffer == nullptr) {
57 ALOGE("%s: missing handle", __FUNCTION__);
58 return HWC3::Error::BadParameter;
59 }
60
61 mBuffer.set(buffer, fence);
62 return HWC3::Error::None;
63 }
64
getBuffer()65 FencedBuffer& Layer::getBuffer() {
66 DEBUG_LOG("%s: layer:%" PRId64, __FUNCTION__, mId);
67
68 return mBuffer;
69 }
70
waitAndGetBuffer()71 buffer_handle_t Layer::waitAndGetBuffer() {
72 DEBUG_LOG("%s: layer:%" PRId64, __FUNCTION__, mId);
73
74 ::android::base::unique_fd fence = mBuffer.getFence();
75 if (fence.ok()) {
76 int err = sync_wait(fence.get(), 3000);
77 if (err < 0 && errno == ETIME) {
78 ALOGE("%s waited on fence %" PRId32 " for 3000 ms", __FUNCTION__,
79 fence.get());
80 }
81 }
82
83 return mBuffer.getBuffer();
84 }
85
setSurfaceDamage(const std::vector<std::optional<common::Rect>> &)86 HWC3::Error Layer::setSurfaceDamage(
87 const std::vector<std::optional<common::Rect>>& /*damage*/) {
88 DEBUG_LOG("%s: layer:%" PRId64, __FUNCTION__, mId);
89
90 return HWC3::Error::None;
91 }
92
setBlendMode(common::BlendMode blendMode)93 HWC3::Error Layer::setBlendMode(common::BlendMode blendMode) {
94 const auto blendModeString = toString(blendMode);
95 DEBUG_LOG("%s: layer:%" PRId64 " blend mode:%s", __FUNCTION__, mId,
96 blendModeString.c_str());
97
98 mBlendMode = blendMode;
99 return HWC3::Error::None;
100 }
101
getBlendMode() const102 common::BlendMode Layer::getBlendMode() const {
103 const auto blendMode = mBlendMode;
104 const auto blendModeString = toString(blendMode);
105 DEBUG_LOG("%s: layer:%" PRId64 " blend mode:%s", __FUNCTION__, mId,
106 blendModeString.c_str());
107
108 return blendMode;
109 }
110
setColor(Color color)111 HWC3::Error Layer::setColor(Color color) {
112 DEBUG_LOG("%s: layer:%" PRId64
113 " color-r:%d color-g:%d color-b:%d color-a:%d)",
114 __FUNCTION__, mId, color.r, color.g, color.b, color.a);
115
116 mColor = color;
117 return HWC3::Error::None;
118 }
119
getColor() const120 Color Layer::getColor() const {
121 auto color = mColor;
122 DEBUG_LOG("%s: layer:%" PRId64
123 " color-r:%d color-g:%d color-b:%d color-a:%d)",
124 __FUNCTION__, mId, color.r, color.g, color.b, color.a);
125
126 return color;
127 }
128
setCompositionType(Composition compositionType)129 HWC3::Error Layer::setCompositionType(Composition compositionType) {
130 const auto compositionTypeString = toString(compositionType);
131 DEBUG_LOG("%s: layer:%" PRId64 " composition type:%s", __FUNCTION__, mId,
132 compositionTypeString.c_str());
133
134 mCompositionType = compositionType;
135 return HWC3::Error::None;
136 }
137
getCompositionType() const138 Composition Layer::getCompositionType() const {
139 const auto compositionTypeString = toString(mCompositionType);
140 DEBUG_LOG("%s: layer:%" PRId64 " composition type:%s", __FUNCTION__, mId,
141 compositionTypeString.c_str());
142
143 return mCompositionType;
144 }
145
setDataspace(common::Dataspace dataspace)146 HWC3::Error Layer::setDataspace(common::Dataspace dataspace) {
147 const auto dataspaceString = toString(dataspace);
148 DEBUG_LOG("%s: layer:%" PRId64 " dataspace:%s", __FUNCTION__, mId,
149 dataspaceString.c_str());
150
151 mDataspace = dataspace;
152 return HWC3::Error::None;
153 }
154
getDataspace() const155 common::Dataspace Layer::getDataspace() const {
156 const auto dataspaceString = toString(mDataspace);
157 DEBUG_LOG("%s: layer:%" PRId64 " dataspace:%s", __FUNCTION__, mId,
158 dataspaceString.c_str());
159
160 return mDataspace;
161 }
162
setDisplayFrame(common::Rect frame)163 HWC3::Error Layer::setDisplayFrame(common::Rect frame) {
164 DEBUG_LOG("%s: layer:%" PRId64
165 " display frame rect-left:%d rect-top:%d rect-right:%d rect-bot:%d",
166 __FUNCTION__, mId, frame.left, frame.top, frame.right,
167 frame.bottom);
168
169 mDisplayFrame = frame;
170 return HWC3::Error::None;
171 }
172
getDisplayFrame() const173 common::Rect Layer::getDisplayFrame() const {
174 auto frame = mDisplayFrame;
175 DEBUG_LOG("%s: layer:%" PRId64
176 " display frame rect-left:%d rect-top:%d rect-right:%d rect-bot:%d",
177 __FUNCTION__, mId, frame.left, frame.top, frame.right,
178 frame.bottom);
179
180 return frame;
181 }
182
setPlaneAlpha(float alpha)183 HWC3::Error Layer::setPlaneAlpha(float alpha) {
184 DEBUG_LOG("%s: layer:%" PRId64 "alpha:%f", __FUNCTION__, mId, alpha);
185
186 mPlaneAlpha = alpha;
187 return HWC3::Error::None;
188 }
189
getPlaneAlpha() const190 float Layer::getPlaneAlpha() const {
191 auto alpha = mPlaneAlpha;
192 DEBUG_LOG("%s: layer:%" PRId64 "alpha:%f", __FUNCTION__, mId, alpha);
193
194 return alpha;
195 }
196
setSidebandStream(buffer_handle_t)197 HWC3::Error Layer::setSidebandStream(buffer_handle_t /*stream*/) {
198 DEBUG_LOG("%s: layer:%" PRId64, __FUNCTION__, mId);
199
200 return HWC3::Error::None;
201 }
202
setSourceCrop(common::FRect crop)203 HWC3::Error Layer::setSourceCrop(common::FRect crop) {
204 DEBUG_LOG("%s: layer:%" PRId64
205 "crop rect-left:%f rect-top:%f rect-right:%f rect-bot:%f",
206 __FUNCTION__, mId, crop.left, crop.top, crop.right, crop.bottom);
207
208 mSourceCrop = crop;
209 return HWC3::Error::None;
210 }
211
getSourceCrop() const212 common::FRect Layer::getSourceCrop() const {
213 common::FRect crop = mSourceCrop;
214 DEBUG_LOG("%s: layer:%" PRId64
215 "crop rect-left:%f rect-top:%f rect-right:%f rect-bot:%f",
216 __FUNCTION__, mId, crop.left, crop.top, crop.right, crop.bottom);
217
218 return crop;
219 }
220
getSourceCropInt() const221 common::Rect Layer::getSourceCropInt() const {
222 common::Rect crop = {};
223 crop.left = static_cast<int>(mSourceCrop.left);
224 crop.top = static_cast<int>(mSourceCrop.top);
225 crop.right = static_cast<int>(mSourceCrop.right);
226 crop.bottom = static_cast<int>(mSourceCrop.bottom);
227 DEBUG_LOG("%s: layer:%" PRId64
228 "crop rect-left:%d rect-top:%d rect-right:%d rect-bot:%d",
229 __FUNCTION__, mId, crop.left, crop.top, crop.right, crop.bottom);
230
231 return crop;
232 }
233
setTransform(common::Transform transform)234 HWC3::Error Layer::setTransform(common::Transform transform) {
235 const auto transformString = toString(transform);
236 DEBUG_LOG("%s: layer:%" PRId64 " transform:%s", __FUNCTION__, mId,
237 transformString.c_str());
238
239 mTransform = transform;
240 return HWC3::Error::None;
241 }
242
getTransform() const243 common::Transform Layer::getTransform() const {
244 const auto transformString = toString(mTransform);
245 DEBUG_LOG("%s: layer:%" PRId64 " transform:%s", __FUNCTION__, mId,
246 transformString.c_str());
247
248 return mTransform;
249 }
250
setVisibleRegion(const std::vector<std::optional<common::Rect>> & visible)251 HWC3::Error Layer::setVisibleRegion(
252 const std::vector<std::optional<common::Rect>>& visible) {
253 DEBUG_LOG("%s: layer:%" PRId64, __FUNCTION__, mId);
254
255 mVisibleRegion.clear();
256 mVisibleRegion.reserve(visible.size());
257 for (const auto& rectOption : visible) {
258 if (rectOption) {
259 mVisibleRegion.push_back(*rectOption);
260 }
261 }
262
263 return HWC3::Error::None;
264 }
265
getNumVisibleRegions() const266 std::size_t Layer::getNumVisibleRegions() const {
267 const std::size_t num = mVisibleRegion.size();
268 DEBUG_LOG("%s: layer:%" PRId64 " number of visible regions: %zu",
269 __FUNCTION__, mId, num);
270
271 return num;
272 }
273
setZOrder(int32_t z)274 HWC3::Error Layer::setZOrder(int32_t z) {
275 DEBUG_LOG("%s: layer:%" PRId64 " z:%d", __FUNCTION__, mId, z);
276
277 mZOrder = z;
278 return HWC3::Error::None;
279 }
280
getZOrder() const281 int32_t Layer::getZOrder() const {
282 DEBUG_LOG("%s: layer:%" PRId64 " z:%d", __FUNCTION__, mId, mZOrder);
283
284 return mZOrder;
285 }
286
setPerFrameMetadata(const std::vector<std::optional<PerFrameMetadata>> &)287 HWC3::Error Layer::setPerFrameMetadata(
288 const std::vector<std::optional<PerFrameMetadata>>& /*perFrameMetadata*/) {
289 DEBUG_LOG("%s: layer:%" PRId64, __FUNCTION__, mId);
290
291 return HWC3::Error::None;
292 }
293
setColorTransform(const std::vector<float> & colorTransform)294 HWC3::Error Layer::setColorTransform(const std::vector<float>& colorTransform) {
295 DEBUG_LOG("%s: layer:%" PRId64, __FUNCTION__, mId);
296
297 if (colorTransform.size() < 16) {
298 return HWC3::Error::BadParameter;
299 }
300
301 mColorTransform.emplace();
302 std::copy_n(colorTransform.data(), 16, mColorTransform->data());
303 return HWC3::Error::None;
304 }
305
getColorTransform() const306 const std::optional<std::array<float, 16>>& Layer::getColorTransform() const {
307 DEBUG_LOG("%s: layer:%" PRId64, __FUNCTION__, mId);
308
309 return mColorTransform;
310 }
311
setBrightness(float brightness)312 HWC3::Error Layer::setBrightness(float brightness) {
313 DEBUG_LOG("%s: layer:%" PRId64 " brightness:%f", __FUNCTION__, mId,
314 brightness);
315
316 if (std::isnan(brightness) || brightness < 0.0f || brightness > 1.0f) {
317 ALOGE("%s: layer:%" PRId64 " brightness:%f", __FUNCTION__, mId, brightness);
318 return HWC3::Error::BadParameter;
319 }
320
321 mBrightness = brightness;
322 return HWC3::Error::None;
323 }
324
getBrightness() const325 float Layer::getBrightness() const {
326 DEBUG_LOG("%s: layer:%" PRId64, __FUNCTION__, mId);
327
328 return mBrightness;
329 }
330
setPerFrameMetadataBlobs(const std::vector<std::optional<PerFrameMetadataBlob>> &)331 HWC3::Error Layer::setPerFrameMetadataBlobs(
332 const std::vector<
333 std::optional<PerFrameMetadataBlob>>& /*perFrameMetadata*/) {
334 DEBUG_LOG("%s: layer:%" PRId64, __FUNCTION__, mId);
335
336 return HWC3::Error::None;
337 }
338
339 } // namespace aidl::android::hardware::graphics::composer3::impl
340