blob: 7483abde457a062f4f2ced531538df1e883d53bb [file] [log] [blame]
chaviw1d044282017-09-27 12:19:28 -07001/*
2 * Copyright (C) 2017 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
chaviw5bf9d682017-10-25 16:31:08 -070017#include <android-base/stringprintf.h>
chaviw1d044282017-09-27 12:19:28 -070018#include <layerproto/LayerProtoParser.h>
chaviw5bf9d682017-10-25 16:31:08 -070019#include <ui/DebugUtils.h>
20
21using android::base::StringAppendF;
22using android::base::StringPrintf;
chaviw1d044282017-09-27 12:19:28 -070023
24namespace android {
25namespace surfaceflinger {
chaviw5bf9d682017-10-25 16:31:08 -070026
chaviw1d044282017-09-27 12:19:28 -070027bool sortLayers(const LayerProtoParser::Layer* lhs, const LayerProtoParser::Layer* rhs) {
28 uint32_t ls = lhs->layerStack;
29 uint32_t rs = rhs->layerStack;
30 if (ls != rs) return ls < rs;
31
Robert Carr83f8e4d2017-11-15 14:37:37 -080032 int32_t lz = lhs->z;
33 int32_t rz = rhs->z;
34 if (lz != rz) {
35 return (lz > rz) ? 1 : -1;
36 }
chaviw1d044282017-09-27 12:19:28 -070037
38 return lhs->id < rhs->id;
39}
40
Yiwei Zhang7124ad32018-02-21 13:02:45 -080041const LayerProtoParser::LayerGlobal LayerProtoParser::generateLayerGlobalInfo(
42 const LayersProto& layersProto) {
43 return {{layersProto.resolution().w(), layersProto.resolution().h()}};
44}
45
46void LayerProtoParser::destroyLayerTree(
47 const std::vector<const LayerProtoParser::Layer*>& layerTree) {
48 for (auto layer : layerTree) {
49 destroyLayerTree(layer->children);
50 delete layer;
51 }
52}
53
chaviw1d044282017-09-27 12:19:28 -070054std::vector<const LayerProtoParser::Layer*> LayerProtoParser::generateLayerTree(
55 const LayersProto& layersProto) {
56 auto layerMap = generateMap(layersProto);
57
58 std::vector<const Layer*> layers;
59 std::for_each(layerMap.begin(), layerMap.end(),
60 [&](const std::pair<const int32_t, Layer*>& ref) {
61 if (ref.second->parent == nullptr) {
62 // only save top level layers
63 layers.push_back(ref.second);
64 }
65 });
66
67 std::sort(layers.begin(), layers.end(), sortLayers);
68 return layers;
69}
70
71std::unordered_map<int32_t, LayerProtoParser::Layer*> LayerProtoParser::generateMap(
72 const LayersProto& layersProto) {
73 std::unordered_map<int32_t, Layer*> layerMap;
74
75 for (int i = 0; i < layersProto.layers_size(); i++) {
76 const LayerProto& layerProto = layersProto.layers(i);
77 layerMap[layerProto.id()] = generateLayer(layerProto);
78 }
79
80 for (int i = 0; i < layersProto.layers_size(); i++) {
81 const LayerProto& layerProto = layersProto.layers(i);
82 updateChildrenAndRelative(layerProto, layerMap);
83 }
84
85 return layerMap;
86}
87
88LayerProtoParser::Layer* LayerProtoParser::generateLayer(const LayerProto& layerProto) {
89 Layer* layer = new Layer();
90 layer->id = layerProto.id();
91 layer->name = layerProto.name();
92 layer->type = layerProto.type();
93 layer->transparentRegion = generateRegion(layerProto.transparent_region());
94 layer->visibleRegion = generateRegion(layerProto.visible_region());
95 layer->damageRegion = generateRegion(layerProto.damage_region());
96 layer->layerStack = layerProto.layer_stack();
97 layer->z = layerProto.z();
98 layer->position = {layerProto.position().x(), layerProto.position().y()};
99 layer->requestedPosition = {layerProto.requested_position().x(),
100 layerProto.requested_position().y()};
101 layer->size = {layerProto.size().w(), layerProto.size().h()};
102 layer->crop = generateRect(layerProto.crop());
103 layer->finalCrop = generateRect(layerProto.final_crop());
104 layer->isOpaque = layerProto.is_opaque();
105 layer->invalidate = layerProto.invalidate();
106 layer->dataspace = layerProto.dataspace();
107 layer->pixelFormat = layerProto.pixel_format();
108 layer->color = {layerProto.color().r(), layerProto.color().g(), layerProto.color().b(),
109 layerProto.color().a()};
110 layer->requestedColor = {layerProto.requested_color().r(), layerProto.requested_color().g(),
111 layerProto.requested_color().b(), layerProto.requested_color().a()};
112 layer->flags = layerProto.flags();
113 layer->transform = generateTransform(layerProto.transform());
114 layer->requestedTransform = generateTransform(layerProto.requested_transform());
115 layer->activeBuffer = generateActiveBuffer(layerProto.active_buffer());
116 layer->queuedFrames = layerProto.queued_frames();
117 layer->refreshPending = layerProto.refresh_pending();
Yiwei Zhang7124ad32018-02-21 13:02:45 -0800118 layer->hwcFrame = generateRect(layerProto.hwc_frame());
119 layer->hwcCrop = generateFloatRect(layerProto.hwc_crop());
120 layer->hwcTransform = layerProto.hwc_transform();
chaviw1d044282017-09-27 12:19:28 -0700121
122 return layer;
123}
124
125LayerProtoParser::Region LayerProtoParser::generateRegion(const RegionProto& regionProto) {
126 LayerProtoParser::Region region;
127 region.id = regionProto.id();
128 for (int i = 0; i < regionProto.rect_size(); i++) {
129 const RectProto& rectProto = regionProto.rect(i);
130 region.rects.push_back(generateRect(rectProto));
131 }
132
133 return region;
134}
135
136LayerProtoParser::Rect LayerProtoParser::generateRect(const RectProto& rectProto) {
137 LayerProtoParser::Rect rect;
138 rect.left = rectProto.left();
139 rect.top = rectProto.top();
140 rect.right = rectProto.right();
141 rect.bottom = rectProto.bottom();
142
143 return rect;
144}
145
Yiwei Zhang7124ad32018-02-21 13:02:45 -0800146LayerProtoParser::FloatRect LayerProtoParser::generateFloatRect(const FloatRectProto& rectProto) {
147 LayerProtoParser::FloatRect rect;
148 rect.left = rectProto.left();
149 rect.top = rectProto.top();
150 rect.right = rectProto.right();
151 rect.bottom = rectProto.bottom();
152
153 return rect;
154}
155
chaviw1d044282017-09-27 12:19:28 -0700156LayerProtoParser::Transform LayerProtoParser::generateTransform(
157 const TransformProto& transformProto) {
158 LayerProtoParser::Transform transform;
159 transform.dsdx = transformProto.dsdx();
160 transform.dtdx = transformProto.dtdx();
161 transform.dsdy = transformProto.dsdy();
162 transform.dtdy = transformProto.dtdy();
163
164 return transform;
165}
166
167LayerProtoParser::ActiveBuffer LayerProtoParser::generateActiveBuffer(
168 const ActiveBufferProto& activeBufferProto) {
169 LayerProtoParser::ActiveBuffer activeBuffer;
170 activeBuffer.width = activeBufferProto.width();
171 activeBuffer.height = activeBufferProto.height();
172 activeBuffer.stride = activeBufferProto.stride();
173 activeBuffer.format = activeBufferProto.format();
174
175 return activeBuffer;
176}
177
178void LayerProtoParser::updateChildrenAndRelative(const LayerProto& layerProto,
179 std::unordered_map<int32_t, Layer*>& layerMap) {
180 auto currLayer = layerMap[layerProto.id()];
181
182 for (int i = 0; i < layerProto.children_size(); i++) {
183 if (layerMap.count(layerProto.children(i)) > 0) {
184 auto childLayer = layerMap[layerProto.children(i)];
185 currLayer->children.push_back(childLayer);
186 }
187 }
188
189 for (int i = 0; i < layerProto.relatives_size(); i++) {
190 if (layerMap.count(layerProto.relatives(i)) > 0) {
191 auto relativeLayer = layerMap[layerProto.relatives(i)];
192 currLayer->relatives.push_back(relativeLayer);
193 }
194 }
195
196 if (layerProto.has_parent()) {
197 if (layerMap.count(layerProto.parent()) > 0) {
198 auto parentLayer = layerMap[layerProto.parent()];
199 currLayer->parent = parentLayer;
200 }
201 }
202
203 if (layerProto.has_z_order_relative_of()) {
204 if (layerMap.count(layerProto.z_order_relative_of()) > 0) {
205 auto relativeLayer = layerMap[layerProto.z_order_relative_of()];
206 currLayer->zOrderRelativeOf = relativeLayer;
207 }
208 }
209}
210
211std::string LayerProtoParser::layersToString(
212 const std::vector<const LayerProtoParser::Layer*> layers) {
213 std::string result;
214 for (const LayerProtoParser::Layer* layer : layers) {
215 if (layer->zOrderRelativeOf != nullptr) {
216 continue;
217 }
218 result.append(layerToString(layer).c_str());
219 }
220
221 return result;
222}
223
224std::string LayerProtoParser::layerToString(const LayerProtoParser::Layer* layer) {
225 std::string result;
226
227 std::vector<const Layer*> traverse(layer->relatives);
228 for (const LayerProtoParser::Layer* child : layer->children) {
229 if (child->zOrderRelativeOf != nullptr) {
230 continue;
231 }
232
233 traverse.push_back(child);
234 }
235
236 std::sort(traverse.begin(), traverse.end(), sortLayers);
237
238 size_t i = 0;
239 for (; i < traverse.size(); i++) {
240 const auto& relative = traverse[i];
241 if (relative->z >= 0) {
242 break;
243 }
244 result.append(layerToString(relative).c_str());
245 }
246 result.append(layer->to_string().c_str());
247 result.append("\n");
248 for (; i < traverse.size(); i++) {
249 const auto& relative = traverse[i];
250 result.append(layerToString(relative).c_str());
251 }
252
253 return result;
254}
255
chaviw5bf9d682017-10-25 16:31:08 -0700256std::string LayerProtoParser::ActiveBuffer::to_string() const {
257 return StringPrintf("[%4ux%4u:%4u,%s]", width, height, stride,
258 decodePixelFormat(format).c_str());
259}
260
261std::string LayerProtoParser::Transform::to_string() const {
262 return StringPrintf("[%.2f, %.2f][%.2f, %.2f]", static_cast<double>(dsdx),
263 static_cast<double>(dtdx), static_cast<double>(dsdy),
264 static_cast<double>(dtdy));
265}
266
267std::string LayerProtoParser::Rect::to_string() const {
268 return StringPrintf("[%3d, %3d, %3d, %3d]", left, top, right, bottom);
269}
270
Yiwei Zhang7124ad32018-02-21 13:02:45 -0800271std::string LayerProtoParser::FloatRect::to_string() const {
272 return StringPrintf("[%.2f, %.2f, %.2f, %.2f]", left, top, right, bottom);
273}
274
chaviw5bf9d682017-10-25 16:31:08 -0700275std::string LayerProtoParser::Region::to_string(const char* what) const {
276 std::string result =
277 StringPrintf(" Region %s (this=%lx count=%d)\n", what, static_cast<unsigned long>(id),
278 static_cast<int>(rects.size()));
279
280 for (auto& rect : rects) {
281 StringAppendF(&result, " %s\n", rect.to_string().c_str());
282 }
283
284 return result;
285}
286
287std::string LayerProtoParser::Layer::to_string() const {
288 std::string result;
289 StringAppendF(&result, "+ %s (%s)\n", type.c_str(), name.c_str());
290 result.append(transparentRegion.to_string("TransparentRegion").c_str());
291 result.append(visibleRegion.to_string("VisibleRegion").c_str());
292 result.append(damageRegion.to_string("SurfaceDamageRegion").c_str());
293
294 StringAppendF(&result, " layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), ", layerStack,
295 z, static_cast<double>(position.x), static_cast<double>(position.y), size.x,
296 size.y);
297
298 StringAppendF(&result, "crop=%s, finalCrop=%s, ", crop.to_string().c_str(),
299 finalCrop.to_string().c_str());
300 StringAppendF(&result, "isOpaque=%1d, invalidate=%1d, ", isOpaque, invalidate);
301 StringAppendF(&result, "dataspace=%s, ", dataspace.c_str());
302 StringAppendF(&result, "pixelformat=%s, ", pixelFormat.c_str());
303 StringAppendF(&result, "color=(%.3f,%.3f,%.3f,%.3f), flags=0x%08x, ",
304 static_cast<double>(color.r), static_cast<double>(color.g),
305 static_cast<double>(color.b), static_cast<double>(color.a), flags);
306 StringAppendF(&result, "tr=%s", transform.to_string().c_str());
307 result.append("\n");
308 StringAppendF(&result, " parent=%s\n", parent == nullptr ? "none" : parent->name.c_str());
309 StringAppendF(&result, " zOrderRelativeOf=%s\n",
310 zOrderRelativeOf == nullptr ? "none" : zOrderRelativeOf->name.c_str());
311 StringAppendF(&result, " activeBuffer=%s,", activeBuffer.to_string().c_str());
312 StringAppendF(&result, " queued-frames=%d, mRefreshPending=%d", queuedFrames, refreshPending);
313
314 return result;
315}
316
chaviw1d044282017-09-27 12:19:28 -0700317} // namespace surfaceflinger
318} // namespace android