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