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 */ 16068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang#pragma once 171d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 181d04428c3cff3503212ec3e76775ca5ba20abc18chaviw#include <layerproto/LayerProtoHeader.h> 191d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 201d04428c3cff3503212ec3e76775ca5ba20abc18chaviw#include <math/vec4.h> 211d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 227794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw#include <memory> 231d04428c3cff3503212ec3e76775ca5ba20abc18chaviw#include <unordered_map> 241d04428c3cff3503212ec3e76775ca5ba20abc18chaviw#include <vector> 251d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 261d04428c3cff3503212ec3e76775ca5ba20abc18chaviwnamespace android { 271d04428c3cff3503212ec3e76775ca5ba20abc18chaviwnamespace surfaceflinger { 281d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 291d04428c3cff3503212ec3e76775ca5ba20abc18chaviwclass LayerProtoParser { 301d04428c3cff3503212ec3e76775ca5ba20abc18chaviwpublic: 311d04428c3cff3503212ec3e76775ca5ba20abc18chaviw class ActiveBuffer { 321d04428c3cff3503212ec3e76775ca5ba20abc18chaviw public: 331d04428c3cff3503212ec3e76775ca5ba20abc18chaviw uint32_t width; 341d04428c3cff3503212ec3e76775ca5ba20abc18chaviw uint32_t height; 351d04428c3cff3503212ec3e76775ca5ba20abc18chaviw uint32_t stride; 361d04428c3cff3503212ec3e76775ca5ba20abc18chaviw int32_t format; 371d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 385bf9d6835d2103a0d7181852939189316e446195chaviw std::string to_string() const; 391d04428c3cff3503212ec3e76775ca5ba20abc18chaviw }; 401d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 411d04428c3cff3503212ec3e76775ca5ba20abc18chaviw class Transform { 421d04428c3cff3503212ec3e76775ca5ba20abc18chaviw public: 431d04428c3cff3503212ec3e76775ca5ba20abc18chaviw float dsdx; 441d04428c3cff3503212ec3e76775ca5ba20abc18chaviw float dtdx; 451d04428c3cff3503212ec3e76775ca5ba20abc18chaviw float dsdy; 461d04428c3cff3503212ec3e76775ca5ba20abc18chaviw float dtdy; 471d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 485bf9d6835d2103a0d7181852939189316e446195chaviw std::string to_string() const; 491d04428c3cff3503212ec3e76775ca5ba20abc18chaviw }; 501d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 511d04428c3cff3503212ec3e76775ca5ba20abc18chaviw class Rect { 521d04428c3cff3503212ec3e76775ca5ba20abc18chaviw public: 531d04428c3cff3503212ec3e76775ca5ba20abc18chaviw int32_t left; 541d04428c3cff3503212ec3e76775ca5ba20abc18chaviw int32_t top; 551d04428c3cff3503212ec3e76775ca5ba20abc18chaviw int32_t right; 561d04428c3cff3503212ec3e76775ca5ba20abc18chaviw int32_t bottom; 571d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 585bf9d6835d2103a0d7181852939189316e446195chaviw std::string to_string() const; 591d04428c3cff3503212ec3e76775ca5ba20abc18chaviw }; 601d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 61068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang class FloatRect { 62068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang public: 63068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang float left; 64068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang float top; 65068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang float right; 66068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang float bottom; 67068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang 68068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang std::string to_string() const; 69068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang }; 70068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang 711d04428c3cff3503212ec3e76775ca5ba20abc18chaviw class Region { 721d04428c3cff3503212ec3e76775ca5ba20abc18chaviw public: 731d04428c3cff3503212ec3e76775ca5ba20abc18chaviw uint64_t id; 741d04428c3cff3503212ec3e76775ca5ba20abc18chaviw std::vector<Rect> rects; 751d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 765bf9d6835d2103a0d7181852939189316e446195chaviw std::string to_string(const char* what) const; 771d04428c3cff3503212ec3e76775ca5ba20abc18chaviw }; 781d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 791d04428c3cff3503212ec3e76775ca5ba20abc18chaviw class Layer { 801d04428c3cff3503212ec3e76775ca5ba20abc18chaviw public: 811d04428c3cff3503212ec3e76775ca5ba20abc18chaviw int32_t id; 821d04428c3cff3503212ec3e76775ca5ba20abc18chaviw std::string name; 837794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw std::vector<std::unique_ptr<Layer>> children; 847794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw std::vector<Layer*> relatives; 851d04428c3cff3503212ec3e76775ca5ba20abc18chaviw std::string type; 861d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoParser::Region transparentRegion; 871d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoParser::Region visibleRegion; 881d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoParser::Region damageRegion; 891d04428c3cff3503212ec3e76775ca5ba20abc18chaviw uint32_t layerStack; 901d04428c3cff3503212ec3e76775ca5ba20abc18chaviw int32_t z; 911d04428c3cff3503212ec3e76775ca5ba20abc18chaviw float2 position; 921d04428c3cff3503212ec3e76775ca5ba20abc18chaviw float2 requestedPosition; 931d04428c3cff3503212ec3e76775ca5ba20abc18chaviw int2 size; 941d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoParser::Rect crop; 951d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoParser::Rect finalCrop; 961d04428c3cff3503212ec3e76775ca5ba20abc18chaviw bool isOpaque; 971d04428c3cff3503212ec3e76775ca5ba20abc18chaviw bool invalidate; 981d04428c3cff3503212ec3e76775ca5ba20abc18chaviw std::string dataspace; 991d04428c3cff3503212ec3e76775ca5ba20abc18chaviw std::string pixelFormat; 1001d04428c3cff3503212ec3e76775ca5ba20abc18chaviw half4 color; 1011d04428c3cff3503212ec3e76775ca5ba20abc18chaviw half4 requestedColor; 1021d04428c3cff3503212ec3e76775ca5ba20abc18chaviw uint32_t flags; 1031d04428c3cff3503212ec3e76775ca5ba20abc18chaviw Transform transform; 1041d04428c3cff3503212ec3e76775ca5ba20abc18chaviw Transform requestedTransform; 1051d04428c3cff3503212ec3e76775ca5ba20abc18chaviw Layer* parent = 0; 1061d04428c3cff3503212ec3e76775ca5ba20abc18chaviw Layer* zOrderRelativeOf = 0; 1071d04428c3cff3503212ec3e76775ca5ba20abc18chaviw LayerProtoParser::ActiveBuffer activeBuffer; 1081d04428c3cff3503212ec3e76775ca5ba20abc18chaviw int32_t queuedFrames; 1091d04428c3cff3503212ec3e76775ca5ba20abc18chaviw bool refreshPending; 110068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang LayerProtoParser::Rect hwcFrame; 111068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang LayerProtoParser::FloatRect hwcCrop; 112068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang int32_t hwcTransform; 113ccd348460ca25890a8fb709e82e6f780e3ce878erongliu int32_t windowType; 114ccd348460ca25890a8fb709e82e6f780e3ce878erongliu int32_t appId; 1157c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang int32_t hwcCompositionType; 1167c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang bool isProtected; 1171d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 1185bf9d6835d2103a0d7181852939189316e446195chaviw std::string to_string() const; 1191d04428c3cff3503212ec3e76775ca5ba20abc18chaviw }; 1201d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 121068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang class LayerGlobal { 122068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang public: 123068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang int2 resolution; 1247c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang std::string colorMode; 1257c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang std::string colorTransform; 1267c64f17bd0d70aec63b475c3de850dcf3abaff33Yiwei Zhang int32_t globalTransform; 127068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang }; 128068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang 129068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang static const LayerGlobal generateLayerGlobalInfo(const LayersProto& layersProto); 1307794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw static std::vector<std::unique_ptr<Layer>> generateLayerTree(const LayersProto& layersProto); 1317794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw static std::string layersToString(std::vector<std::unique_ptr<LayerProtoParser::Layer>> layers); 1321d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 1331d04428c3cff3503212ec3e76775ca5ba20abc18chaviwprivate: 1341d04428c3cff3503212ec3e76775ca5ba20abc18chaviw static std::unordered_map<int32_t, Layer*> generateMap(const LayersProto& layersProto); 1351d04428c3cff3503212ec3e76775ca5ba20abc18chaviw static LayerProtoParser::Layer* generateLayer(const LayerProto& layerProto); 1361d04428c3cff3503212ec3e76775ca5ba20abc18chaviw static LayerProtoParser::Region generateRegion(const RegionProto& regionProto); 1371d04428c3cff3503212ec3e76775ca5ba20abc18chaviw static LayerProtoParser::Rect generateRect(const RectProto& rectProto); 138068e31b929b40a1bc9be742c04cbdf5b04f3ce97Yiwei Zhang static LayerProtoParser::FloatRect generateFloatRect(const FloatRectProto& rectProto); 1391d04428c3cff3503212ec3e76775ca5ba20abc18chaviw static LayerProtoParser::Transform generateTransform(const TransformProto& transformProto); 1401d04428c3cff3503212ec3e76775ca5ba20abc18chaviw static LayerProtoParser::ActiveBuffer generateActiveBuffer( 1411d04428c3cff3503212ec3e76775ca5ba20abc18chaviw const ActiveBufferProto& activeBufferProto); 1421d04428c3cff3503212ec3e76775ca5ba20abc18chaviw static void updateChildrenAndRelative(const LayerProto& layerProto, 1431d04428c3cff3503212ec3e76775ca5ba20abc18chaviw std::unordered_map<int32_t, Layer*>& layerMap); 1441d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 1457794ec15e59fd6dd389ba05379ff81287c6ab52fchaviw static std::string layerToString(LayerProtoParser::Layer* layer); 1461d04428c3cff3503212ec3e76775ca5ba20abc18chaviw}; 1471d04428c3cff3503212ec3e76775ca5ba20abc18chaviw 1481d04428c3cff3503212ec3e76775ca5ba20abc18chaviw} // namespace surfaceflinger 1491d04428c3cff3503212ec3e76775ca5ba20abc18chaviw} // namespace android 150