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