• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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