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