Hwc2TestProperties.h revision ee24278db26505369c0e917d2a83e7e9fda36e4c
1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef _HWC2_TEST_PROPERTIES_H
18#define _HWC2_TEST_PROPERTIES_H
19
20#include <array>
21#include <vector>
22
23#define HWC2_INCLUDE_STRINGIFICATION
24#define HWC2_USE_CPP11
25#include <hardware/hwcomposer2.h>
26#undef HWC2_INCLUDE_STRINGIFICATION
27#undef HWC2_USE_CPP11
28
29enum class Hwc2TestCoverage {
30    Default = 0,
31    Basic,
32    Complete,
33};
34
35typedef struct {
36    int32_t width;
37    int32_t height;
38} Area;
39
40
41class Hwc2TestContainer {
42public:
43    virtual ~Hwc2TestContainer() = default;
44
45    /* Resets the container */
46    virtual void reset() = 0;
47
48    /* Attempts to advance to the next valid value. Returns true if one can be
49     * found */
50    virtual bool advance() = 0;
51
52    virtual std::string dump() const = 0;
53};
54
55
56template <class T>
57class Hwc2TestProperty : public Hwc2TestContainer {
58public:
59    Hwc2TestProperty(Hwc2TestCoverage coverage,
60            const std::vector<T>& completeList, const std::vector<T>& basicList,
61            const std::vector<T>& defaultList)
62        : Hwc2TestProperty((coverage == Hwc2TestCoverage::Complete)? completeList:
63                (coverage == Hwc2TestCoverage::Basic)? basicList : defaultList) { }
64
65    Hwc2TestProperty(const std::vector<T>& list)
66        : mList(list) { }
67
68    void reset() override
69    {
70        mListIdx = 0;
71    }
72
73    bool advance() override
74    {
75        if (mListIdx + 1 < mList.size()) {
76            mListIdx++;
77            updateDependents();
78            return true;
79        }
80        reset();
81        updateDependents();
82        return false;
83    }
84
85    T get() const
86    {
87        return mList.at(mListIdx);
88    }
89
90protected:
91    /* If a derived class has dependents, override this function */
92    virtual void updateDependents() { }
93
94    const std::vector<T>& mList;
95    size_t mListIdx = 0;
96};
97
98
99class Hwc2TestSourceCrop;
100
101class Hwc2TestBufferArea : public Hwc2TestProperty<Area> {
102public:
103    Hwc2TestBufferArea(Hwc2TestCoverage coverage, const Area& displayArea);
104
105    std::string dump() const override;
106
107    void setDependent(Hwc2TestSourceCrop* sourceCrop);
108
109protected:
110    void update();
111    void updateDependents() override;
112
113    const std::vector<float>& mScalars;
114    static const std::vector<float> mDefaultScalars;
115    static const std::vector<float> mBasicScalars;
116    static const std::vector<float> mCompleteScalars;
117
118    Area mDisplayArea;
119
120    Hwc2TestSourceCrop* mSourceCrop = nullptr;
121
122    std::vector<Area> mBufferAreas;
123};
124
125
126class Hwc2TestColor;
127
128class Hwc2TestBlendMode : public Hwc2TestProperty<hwc2_blend_mode_t> {
129public:
130    Hwc2TestBlendMode(Hwc2TestCoverage coverage);
131
132    std::string dump() const override;
133
134    void setDependent(Hwc2TestColor* color);
135
136protected:
137    void updateDependents() override;
138
139    Hwc2TestColor* mColor = nullptr;
140
141    static const std::vector<hwc2_blend_mode_t> mDefaultBlendModes;
142    static const std::vector<hwc2_blend_mode_t> mBasicBlendModes;
143    static const std::vector<hwc2_blend_mode_t> mCompleteBlendModes;
144};
145
146
147class Hwc2TestColor : public Hwc2TestProperty<hwc_color_t> {
148public:
149    Hwc2TestColor(Hwc2TestCoverage coverage,
150            hwc2_blend_mode_t blendMode = HWC2_BLEND_MODE_NONE);
151
152    std::string dump() const override;
153
154    void updateBlendMode(hwc2_blend_mode_t blendMode);
155
156protected:
157    void update();
158
159    std::vector<hwc_color_t> mBaseColors;
160    static const std::vector<hwc_color_t> mDefaultBaseColors;
161    static const std::vector<hwc_color_t> mBasicBaseColors;
162    static const std::vector<hwc_color_t> mCompleteBaseColors;
163
164    hwc2_blend_mode_t mBlendMode;
165
166    std::vector<hwc_color_t> mColors;
167};
168
169
170class Hwc2TestComposition : public Hwc2TestProperty<hwc2_composition_t> {
171public:
172    Hwc2TestComposition(Hwc2TestCoverage coverage);
173
174    std::string dump() const override;
175
176protected:
177    static const std::vector<hwc2_composition_t> mDefaultCompositions;
178    static const std::vector<hwc2_composition_t> mBasicCompositions;
179    static const std::vector<hwc2_composition_t> mCompleteCompositions;
180};
181
182
183class Hwc2TestDataspace : public Hwc2TestProperty<android_dataspace_t> {
184public:
185    Hwc2TestDataspace(Hwc2TestCoverage coverage);
186
187    std::string dump() const override;
188
189protected:
190    static const std::vector<android_dataspace_t> defaultDataspaces;
191    static const std::vector<android_dataspace_t> basicDataspaces;
192    static const std::vector<android_dataspace_t> completeDataspaces;
193};
194
195
196class Hwc2TestDisplayFrame : public Hwc2TestProperty<hwc_rect_t> {
197public:
198    Hwc2TestDisplayFrame(Hwc2TestCoverage coverage, const Area& displayArea);
199
200    std::string dump() const override;
201
202protected:
203    void update();
204
205    const std::vector<hwc_frect_t>& mFrectScalars;
206    const static std::vector<hwc_frect_t> mDefaultFrectScalars;
207    const static std::vector<hwc_frect_t> mBasicFrectScalars;
208    const static std::vector<hwc_frect_t> mCompleteFrectScalars;
209
210    Area mDisplayArea;
211
212    std::vector<hwc_rect_t> mDisplayFrames;
213};
214
215
216class Hwc2TestPlaneAlpha : public Hwc2TestProperty<float> {
217public:
218    Hwc2TestPlaneAlpha(Hwc2TestCoverage coverage);
219
220    std::string dump() const override;
221
222protected:
223    static const std::vector<float> mDefaultPlaneAlphas;
224    static const std::vector<float> mBasicPlaneAlphas;
225    static const std::vector<float> mCompletePlaneAlphas;
226};
227
228
229class Hwc2TestSourceCrop : public Hwc2TestProperty<hwc_frect_t> {
230public:
231    Hwc2TestSourceCrop(Hwc2TestCoverage coverage, const Area& bufferArea = {0, 0});
232
233    std::string dump() const override;
234
235    void updateBufferArea(const Area& bufferArea);
236
237protected:
238    void update();
239
240    const std::vector<hwc_frect_t>& mFrectScalars;
241    const static std::vector<hwc_frect_t> mDefaultFrectScalars;
242    const static std::vector<hwc_frect_t> mBasicFrectScalars;
243    const static std::vector<hwc_frect_t> mCompleteFrectScalars;
244
245    Area mBufferArea;
246
247    std::vector<hwc_frect_t> mSourceCrops;
248};
249
250
251class Hwc2TestTransform : public Hwc2TestProperty<hwc_transform_t> {
252public:
253    Hwc2TestTransform(Hwc2TestCoverage coverage);
254
255    std::string dump() const override;
256
257protected:
258    static const std::vector<hwc_transform_t> mDefaultTransforms;
259    static const std::vector<hwc_transform_t> mBasicTransforms;
260    static const std::vector<hwc_transform_t> mCompleteTransforms;
261};
262
263#endif /* ifndef _HWC2_TEST_PROPERTIES_H */
264