/*
* 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:
explicit 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:
explicit 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:
explicit 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:
explicit 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:
explicit 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:
explicit 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:
explicit 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:
explicit 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:
explicit 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 */