| /* |
| * Copyright (C) 2016 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef _HWC2_TEST_PROPERTIES_H |
| #define _HWC2_TEST_PROPERTIES_H |
| |
| #include <array> |
| #include <vector> |
| |
| #include <ui/GraphicTypes.h> |
| #include <ui/Region.h> |
| |
| #define HWC2_INCLUDE_STRINGIFICATION |
| #define HWC2_USE_CPP11 |
| #include <hardware/hwcomposer2.h> |
| #undef HWC2_INCLUDE_STRINGIFICATION |
| #undef HWC2_USE_CPP11 |
| |
| enum class Hwc2TestCoverage { |
| Default = 0, |
| Basic, |
| Complete, |
| }; |
| |
| enum class Hwc2TestPropertyName { |
| BlendMode = 1, |
| BufferArea, |
| Color, |
| Composition, |
| CursorPosition, |
| Dataspace, |
| DisplayFrame, |
| PlaneAlpha, |
| SourceCrop, |
| SurfaceDamage, |
| Transform, |
| }; |
| |
| typedef struct { |
| int32_t width; |
| int32_t height; |
| } Area; |
| |
| |
| typedef struct { |
| uint32_t width; |
| uint32_t height; |
| } UnsignedArea; |
| |
| |
| class Hwc2TestContainer { |
| public: |
| virtual ~Hwc2TestContainer() = default; |
| |
| /* Resets the container */ |
| virtual void reset() = 0; |
| |
| /* Attempts to advance to the next valid value. Returns true if one can be |
| * found */ |
| virtual bool advance() = 0; |
| |
| virtual std::string dump() const = 0; |
| |
| /* Returns true if the container supports the given composition type */ |
| virtual bool isSupported(hwc2_composition_t composition) = 0; |
| }; |
| |
| |
| template <class T> |
| class Hwc2TestProperty : public Hwc2TestContainer { |
| public: |
| Hwc2TestProperty(Hwc2TestCoverage coverage, |
| const std::vector<T>& completeList, const std::vector<T>& basicList, |
| const std::vector<T>& defaultList, |
| const std::array<bool, 6>& compositionSupport) |
| : Hwc2TestProperty((coverage == Hwc2TestCoverage::Complete)? completeList: |
| (coverage == Hwc2TestCoverage::Basic)? basicList : defaultList, |
| compositionSupport) { } |
| |
| Hwc2TestProperty(const std::vector<T>& list, |
| const std::array<bool, 6>& compositionSupport) |
| : mList(list), |
| mCompositionSupport(compositionSupport) { } |
| |
| void reset() override |
| { |
| mListIdx = 0; |
| } |
| |
| bool advance() override |
| { |
| if (mListIdx + 1 < mList.size()) { |
| mListIdx++; |
| updateDependents(); |
| return true; |
| } |
| reset(); |
| updateDependents(); |
| return false; |
| } |
| |
| T get() const |
| { |
| return mList.at(mListIdx); |
| } |
| |
| virtual bool isSupported(hwc2_composition_t composition) |
| { |
| return mCompositionSupport.at(composition); |
| } |
| |
| protected: |
| /* If a derived class has dependents, override this function */ |
| virtual void updateDependents() { } |
| |
| const std::vector<T>& mList; |
| size_t mListIdx = 0; |
| |
| const std::array<bool, 6>& mCompositionSupport; |
| }; |
| |
| class Hwc2TestBuffer; |
| class Hwc2TestSourceCrop; |
| class Hwc2TestSurfaceDamage; |
| |
| class Hwc2TestBufferArea : public Hwc2TestProperty<Area> { |
| public: |
| Hwc2TestBufferArea(Hwc2TestCoverage coverage, const Area& displayArea); |
| |
| std::string dump() const override; |
| |
| void setDependent(Hwc2TestBuffer* buffer); |
| void setDependent(Hwc2TestSourceCrop* sourceCrop); |
| void setDependent(Hwc2TestSurfaceDamage* surfaceDamage); |
| |
| protected: |
| void update(); |
| void updateDependents() override; |
| |
| const std::vector<float>& mScalars; |
| static const std::vector<float> mDefaultScalars; |
| static const std::vector<float> mBasicScalars; |
| static const std::vector<float> mCompleteScalars; |
| |
| Area mDisplayArea; |
| |
| Hwc2TestBuffer* mBuffer = nullptr; |
| Hwc2TestSourceCrop* mSourceCrop = nullptr; |
| Hwc2TestSurfaceDamage* mSurfaceDamage = nullptr; |
| |
| std::vector<Area> mBufferAreas; |
| |
| static const std::array<bool, 6> mCompositionSupport; |
| }; |
| |
| |
| class Hwc2TestColor; |
| |
| class Hwc2TestBlendMode : public Hwc2TestProperty<hwc2_blend_mode_t> { |
| public: |
| Hwc2TestBlendMode(Hwc2TestCoverage coverage); |
| |
| std::string dump() const override; |
| |
| void setDependent(Hwc2TestColor* color); |
| |
| protected: |
| void updateDependents() override; |
| |
| Hwc2TestColor* mColor = nullptr; |
| |
| static const std::vector<hwc2_blend_mode_t> mDefaultBlendModes; |
| static const std::vector<hwc2_blend_mode_t> mBasicBlendModes; |
| static const std::vector<hwc2_blend_mode_t> mCompleteBlendModes; |
| |
| static const std::array<bool, 6> mCompositionSupport; |
| }; |
| |
| |
| class Hwc2TestColor : public Hwc2TestProperty<hwc_color_t> { |
| public: |
| Hwc2TestColor(Hwc2TestCoverage coverage, |
| hwc2_blend_mode_t blendMode = HWC2_BLEND_MODE_NONE); |
| |
| std::string dump() const override; |
| |
| void updateBlendMode(hwc2_blend_mode_t blendMode); |
| |
| protected: |
| void update(); |
| |
| std::vector<hwc_color_t> mBaseColors; |
| static const std::vector<hwc_color_t> mDefaultBaseColors; |
| static const std::vector<hwc_color_t> mBasicBaseColors; |
| static const std::vector<hwc_color_t> mCompleteBaseColors; |
| |
| hwc2_blend_mode_t mBlendMode; |
| |
| std::vector<hwc_color_t> mColors; |
| |
| static const std::array<bool, 6> mCompositionSupport; |
| }; |
| |
| |
| class Hwc2TestComposition : public Hwc2TestProperty<hwc2_composition_t> { |
| public: |
| Hwc2TestComposition(Hwc2TestCoverage coverage); |
| |
| std::string dump() const override; |
| |
| protected: |
| static const std::vector<hwc2_composition_t> mDefaultCompositions; |
| static const std::vector<hwc2_composition_t> mBasicCompositions; |
| static const std::vector<hwc2_composition_t> mCompleteCompositions; |
| |
| static const std::array<bool, 6> mCompositionSupport; |
| }; |
| |
| |
| class Hwc2TestDataspace : public Hwc2TestProperty<android::ui::Dataspace> { |
| public: |
| Hwc2TestDataspace(Hwc2TestCoverage coverage); |
| |
| std::string dump() const override; |
| |
| protected: |
| static const std::vector<android::ui::Dataspace> defaultDataspaces; |
| static const std::vector<android::ui::Dataspace> basicDataspaces; |
| static const std::vector<android::ui::Dataspace> completeDataspaces; |
| |
| static const std::array<bool, 6> mCompositionSupport; |
| }; |
| |
| class Hwc2TestVirtualBuffer; |
| |
| class Hwc2TestDisplayDimension : public Hwc2TestProperty<UnsignedArea> { |
| public: |
| Hwc2TestDisplayDimension(Hwc2TestCoverage coverage); |
| |
| std::string dump() const; |
| |
| void setDependent(Hwc2TestVirtualBuffer* buffer); |
| |
| private: |
| void updateDependents(); |
| |
| std::set<Hwc2TestVirtualBuffer*> mBuffers; |
| |
| static const std::vector<UnsignedArea> mDefaultDisplayDimensions; |
| static const std::vector<UnsignedArea> mBasicDisplayDimensions; |
| static const std::vector<UnsignedArea> mCompleteDisplayDimensions; |
| |
| static const std::array<bool, 6> mCompositionSupport; |
| }; |
| |
| |
| class Hwc2TestDisplayFrame : public Hwc2TestProperty<hwc_rect_t> { |
| public: |
| Hwc2TestDisplayFrame(Hwc2TestCoverage coverage, const Area& displayArea); |
| |
| std::string dump() const override; |
| |
| protected: |
| void update(); |
| |
| const std::vector<hwc_frect_t>& mFrectScalars; |
| const static std::vector<hwc_frect_t> mDefaultFrectScalars; |
| const static std::vector<hwc_frect_t> mBasicFrectScalars; |
| const static std::vector<hwc_frect_t> mCompleteFrectScalars; |
| |
| Area mDisplayArea; |
| |
| std::vector<hwc_rect_t> mDisplayFrames; |
| |
| static const std::array<bool, 6> mCompositionSupport; |
| }; |
| |
| |
| class Hwc2TestPlaneAlpha : public Hwc2TestProperty<float> { |
| public: |
| Hwc2TestPlaneAlpha(Hwc2TestCoverage coverage); |
| |
| std::string dump() const override; |
| |
| protected: |
| static const std::vector<float> mDefaultPlaneAlphas; |
| static const std::vector<float> mBasicPlaneAlphas; |
| static const std::vector<float> mCompletePlaneAlphas; |
| |
| static const std::array<bool, 6> mCompositionSupport; |
| }; |
| |
| |
| class Hwc2TestSourceCrop : public Hwc2TestProperty<hwc_frect_t> { |
| public: |
| Hwc2TestSourceCrop(Hwc2TestCoverage coverage, const Area& bufferArea = {0, 0}); |
| |
| std::string dump() const override; |
| |
| void updateBufferArea(const Area& bufferArea); |
| |
| protected: |
| void update(); |
| |
| const std::vector<hwc_frect_t>& mFrectScalars; |
| const static std::vector<hwc_frect_t> mDefaultFrectScalars; |
| const static std::vector<hwc_frect_t> mBasicFrectScalars; |
| const static std::vector<hwc_frect_t> mCompleteFrectScalars; |
| |
| Area mBufferArea; |
| |
| std::vector<hwc_frect_t> mSourceCrops; |
| |
| static const std::array<bool, 6> mCompositionSupport; |
| }; |
| |
| |
| class Hwc2TestSurfaceDamage : public Hwc2TestProperty<hwc_region_t> { |
| public: |
| Hwc2TestSurfaceDamage(Hwc2TestCoverage coverage); |
| ~Hwc2TestSurfaceDamage(); |
| |
| std::string dump() const override; |
| |
| void updateBufferArea(const Area& bufferArea); |
| |
| protected: |
| void update(); |
| void freeSurfaceDamages(); |
| |
| const std::vector<std::vector<hwc_frect_t>> &mRegionScalars; |
| const static std::vector<std::vector<hwc_frect_t>> mDefaultRegionScalars; |
| const static std::vector<std::vector<hwc_frect_t>> mBasicRegionScalars; |
| const static std::vector<std::vector<hwc_frect_t>> mCompleteRegionScalars; |
| |
| Area mBufferArea = {0, 0}; |
| |
| std::vector<hwc_region_t> mSurfaceDamages; |
| |
| static const std::array<bool, 6> mCompositionSupport; |
| }; |
| |
| |
| class Hwc2TestTransform : public Hwc2TestProperty<hwc_transform_t> { |
| public: |
| Hwc2TestTransform(Hwc2TestCoverage coverage); |
| |
| std::string dump() const override; |
| |
| protected: |
| static const std::vector<hwc_transform_t> mDefaultTransforms; |
| static const std::vector<hwc_transform_t> mBasicTransforms; |
| static const std::vector<hwc_transform_t> mCompleteTransforms; |
| |
| static const std::array<bool, 6> mCompositionSupport; |
| }; |
| |
| |
| class Hwc2TestVisibleRegion { |
| public: |
| ~Hwc2TestVisibleRegion(); |
| |
| std::string dump() const; |
| |
| void set(const android::Region& visibleRegion); |
| hwc_region_t get() const; |
| void release(); |
| |
| protected: |
| hwc_region_t mVisibleRegion = {0, nullptr}; |
| }; |
| |
| #endif /* ifndef _HWC2_TEST_PROPERTIES_H */ |