LayerProtoParser.h revision ccd348460ca25890a8fb709e82e6f780e3ce878e
11d04428c3cff3503212ec3e76775ca5ba20abc18chaviw/* 21d04428c3cff3503212ec3e76775ca5ba20abc18chaviw * Copyright (C) 2017 The Android Open Source Project 31d04428c3cff3503212ec3e76775ca5ba20abc18chaviw * 41d04428c3cff3503212ec3e76775ca5ba20abc18chaviw * Licensed under the Apache License, Version 2.0 (the "License"); 51d04428c3cff3503212ec3e76775ca5ba20abc18chaviw * you may not use this file except in compliance with the License. 61d04428c3cff3503212ec3e76775ca5ba20abc18chaviw * You may obtain a copy of the License at 71d04428c3cff3503212ec3e76775ca5ba20abc18chaviw * 81d04428c3cff3503212ec3e76775ca5ba20abc18chaviw * http://www.apache.org/licenses/LICENSE-2.0 91d04428c3cff3503212ec3e76775ca5ba20abc18chaviw * 101d04428c3cff3503212ec3e76775ca5ba20abc18chaviw * Unless required by applicable law or agreed to in writing, software 111d04428c3cff3503212ec3e76775ca5ba20abc18chaviw * distributed under the License is distributed on an "AS IS" BASIS, 121d04428c3cff3503212ec3e76775ca5ba20abc18chaviw * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d04428c3cff3503212ec3e76775ca5ba20abc18chaviw * See the License for the specific language governing permissions and 141d04428c3cff3503212ec3e76775ca5ba20abc18chaviw * limitations under the License. 151d04428c3cff3503212ec3e76775ca5ba20abc18chaviw */ 161d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 171d04428c3cff3503212ec3e76775ca5ba20abc18chaviw#include <layerproto/LayerProtoHeader.h> 181d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 191d04428c3cff3503212ec3e76775ca5ba20abc18chaviw#include <math/vec4.h> 201d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 217794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw#include <memory> 221d04428c3cff3503212ec3e76775ca5ba20abc18chaviw#include <unordered_map> 231d04428c3cff3503212ec3e76775ca5ba20abc18chaviw#include <vector> 241d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 251d04428c3cff3503212ec3e76775ca5ba20abc18chaviwnamespace android { 261d04428c3cff3503212ec3e76775ca5ba20abc18chaviwnamespace surfaceflinger { 271d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 281d04428c3cff3503212ec3e76775ca5ba20abc18chaviwclass LayerProtoParser { 291d04428c3cff3503212ec3e76775ca5ba20abc18chaviwpublic: 301d04428c3cff3503212ec3e76775ca5ba20abc18chaviw class ActiveBuffer { 311d04428c3cff3503212ec3e76775ca5ba20abc18chaviw public: 321d04428c3cff3503212ec3e76775ca5ba20abc18chaviw uint32_t width; 331d04428c3cff3503212ec3e76775ca5ba20abc18chaviw uint32_t height; 341d04428c3cff3503212ec3e76775ca5ba20abc18chaviw uint32_t stride; 351d04428c3cff3503212ec3e76775ca5ba20abc18chaviw int32_t format; 361d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 375bf9d6835d2103a0d7181852939189316e446195chaviw std::string to_string() const; 381d04428c3cff3503212ec3e76775ca5ba20abc18chaviw }; 391d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 401d04428c3cff3503212ec3e76775ca5ba20abc18chaviw class Transform { 411d04428c3cff3503212ec3e76775ca5ba20abc18chaviw public: 421d04428c3cff3503212ec3e76775ca5ba20abc18chaviw float dsdx; 431d04428c3cff3503212ec3e76775ca5ba20abc18chaviw float dtdx; 441d04428c3cff3503212ec3e76775ca5ba20abc18chaviw float dsdy; 451d04428c3cff3503212ec3e76775ca5ba20abc18chaviw float dtdy; 461d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 475bf9d6835d2103a0d7181852939189316e446195chaviw std::string to_string() const; 481d04428c3cff3503212ec3e76775ca5ba20abc18chaviw }; 491d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 501d04428c3cff3503212ec3e76775ca5ba20abc18chaviw class Rect { 511d04428c3cff3503212ec3e76775ca5ba20abc18chaviw public: 521d04428c3cff3503212ec3e76775ca5ba20abc18chaviw int32_t left; 531d04428c3cff3503212ec3e76775ca5ba20abc18chaviw int32_t top; 541d04428c3cff3503212ec3e76775ca5ba20abc18chaviw int32_t right; 551d04428c3cff3503212ec3e76775ca5ba20abc18chaviw int32_t bottom; 561d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 575bf9d6835d2103a0d7181852939189316e446195chaviw std::string to_string() const; 581d04428c3cff3503212ec3e76775ca5ba20abc18chaviw }; 591d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 601d04428c3cff3503212ec3e76775ca5ba20abc18chaviw class Region { 611d04428c3cff3503212ec3e76775ca5ba20abc18chaviw public: 621d04428c3cff3503212ec3e76775ca5ba20abc18chaviw uint64_t id; 631d04428c3cff3503212ec3e76775ca5ba20abc18chaviw std::vector<Rect> rects; 641d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 655bf9d6835d2103a0d7181852939189316e446195chaviw std::string to_string(const char* what) const; 661d04428c3cff3503212ec3e76775ca5ba20abc18chaviw }; 671d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 681d04428c3cff3503212ec3e76775ca5ba20abc18chaviw class Layer { 691d04428c3cff3503212ec3e76775ca5ba20abc18chaviw public: 701d04428c3cff3503212ec3e76775ca5ba20abc18chaviw int32_t id; 711d04428c3cff3503212ec3e76775ca5ba20abc18chaviw std::string name; 727794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw std::vector<std::unique_ptr<Layer>> children; 737794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw std::vector<Layer*> relatives; 741d04428c3cff3503212ec3e76775ca5ba20abc18chaviw std::string type; 751d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoParser::Region transparentRegion; 761d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoParser::Region visibleRegion; 771d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoParser::Region damageRegion; 781d04428c3cff3503212ec3e76775ca5ba20abc18chaviw uint32_t layerStack; 791d04428c3cff3503212ec3e76775ca5ba20abc18chaviw int32_t z; 801d04428c3cff3503212ec3e76775ca5ba20abc18chaviw float2 position; 811d04428c3cff3503212ec3e76775ca5ba20abc18chaviw float2 requestedPosition; 821d04428c3cff3503212ec3e76775ca5ba20abc18chaviw int2 size; 831d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoParser::Rect crop; 841d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoParser::Rect finalCrop; 851d04428c3cff3503212ec3e76775ca5ba20abc18chaviw bool isOpaque; 861d04428c3cff3503212ec3e76775ca5ba20abc18chaviw bool invalidate; 871d04428c3cff3503212ec3e76775ca5ba20abc18chaviw std::string dataspace; 881d04428c3cff3503212ec3e76775ca5ba20abc18chaviw std::string pixelFormat; 891d04428c3cff3503212ec3e76775ca5ba20abc18chaviw half4 color; 901d04428c3cff3503212ec3e76775ca5ba20abc18chaviw half4 requestedColor; 911d04428c3cff3503212ec3e76775ca5ba20abc18chaviw uint32_t flags; 921d04428c3cff3503212ec3e76775ca5ba20abc18chaviw Transform transform; 931d04428c3cff3503212ec3e76775ca5ba20abc18chaviw Transform requestedTransform; 941d04428c3cff3503212ec3e76775ca5ba20abc18chaviw Layer* parent = 0; 951d04428c3cff3503212ec3e76775ca5ba20abc18chaviw Layer* zOrderRelativeOf = 0; 961d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoParser::ActiveBuffer activeBuffer; 971d04428c3cff3503212ec3e76775ca5ba20abc18chaviw int32_t queuedFrames; 981d04428c3cff3503212ec3e76775ca5ba20abc18chaviw bool refreshPending; 99ccd348460ca25890a8fb709e82e6f780e3ce878erongliu int32_t windowType; 100ccd348460ca25890a8fb709e82e6f780e3ce878erongliu int32_t appId; 1011d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 1025bf9d6835d2103a0d7181852939189316e446195chaviw std::string to_string() const; 1031d04428c3cff3503212ec3e76775ca5ba20abc18chaviw }; 1041d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 1057794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw static std::vector<std::unique_ptr<Layer>> generateLayerTree(const LayersProto& layersProto); 1067794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw static std::string layersToString(std::vector<std::unique_ptr<LayerProtoParser::Layer>> layers); 1071d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 1081d04428c3cff3503212ec3e76775ca5ba20abc18chaviwprivate: 1091d04428c3cff3503212ec3e76775ca5ba20abc18chaviw static std::unordered_map<int32_t, Layer*> generateMap(const LayersProto& layersProto); 1101d04428c3cff3503212ec3e76775ca5ba20abc18chaviw static LayerProtoParser::Layer* generateLayer(const LayerProto& layerProto); 1111d04428c3cff3503212ec3e76775ca5ba20abc18chaviw static LayerProtoParser::Region generateRegion(const RegionProto& regionProto); 1121d04428c3cff3503212ec3e76775ca5ba20abc18chaviw static LayerProtoParser::Rect generateRect(const RectProto& rectProto); 1131d04428c3cff3503212ec3e76775ca5ba20abc18chaviw static LayerProtoParser::Transform generateTransform(const TransformProto& transformProto); 1141d04428c3cff3503212ec3e76775ca5ba20abc18chaviw static LayerProtoParser::ActiveBuffer generateActiveBuffer( 1151d04428c3cff3503212ec3e76775ca5ba20abc18chaviw const ActiveBufferProto& activeBufferProto); 1161d04428c3cff3503212ec3e76775ca5ba20abc18chaviw static void updateChildrenAndRelative(const LayerProto& layerProto, 1171d04428c3cff3503212ec3e76775ca5ba20abc18chaviw std::unordered_map<int32_t, Layer*>& layerMap); 1181d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 1197794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw static std::string layerToString(LayerProtoParser::Layer* layer); 1201d04428c3cff3503212ec3e76775ca5ba20abc18chaviw}; 1211d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 1221d04428c3cff3503212ec3e76775ca5ba20abc18chaviw} // namespace surfaceflinger 1231d04428c3cff3503212ec3e76775ca5ba20abc18chaviw} // namespace android 124