12251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#ifndef ANDROID_LIBVRFLINGER_HWCTYPES_H
22251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#define ANDROID_LIBVRFLINGER_HWCTYPES_H
32251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
42251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// General HWC type support. Hardware composer type support is a bit of a mess
52251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// between HWC1, HWC2 C/C++11, and HIDL types. Particularly bothersome is the
62251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// use of enum classes, which make analogous types between versions much
72251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// harder to deal with in a uniform way.
82251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka//
92251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// These utilities help address some of these pains by providing a type-safe,
102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// flexible interface to translate between different type spaces.
112251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#define HWC2_INCLUDE_STRINGIFICATION
132251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#define HWC2_USE_CPP11
142251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <hardware/hwcomposer2.h>
152251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#undef HWC2_INCLUDE_STRINGIFICATION
162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#undef HWC2_USE_CPP11
172251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <string>
192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <type_traits>
202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakanamespace HWC {
222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
232251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Value types derived from HWC HAL types. Some of these are stand-alone,
242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// while others are also wrapped in translator classes below.
252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing ColorMode = int32_t;  // android_color_mode_t;
262251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing Config = hwc2_config_t;
272251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing ColorTransform =
282251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    std::underlying_type<android_color_transform_t>::type;          // int32_t;
292251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing Dataspace = std::underlying_type<android_dataspace_t>::type;  // int32_t;
302251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing DisplayId = hwc2_display_t;
312251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing DisplayRequest = std::underlying_type<HWC2::DisplayRequest>::type;
322251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing Hdr = std::underlying_type<android_hdr_t>::type;  // int32_t;
332251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing Layer = hwc2_layer_t;
342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing PixelFormat =
352251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    std::underlying_type<android_pixel_format_t>::type;  // int32_t;
362251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
372251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Type traits and casting utilities.
382251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
392251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// SFINAE utility to evaluate type expressions.
402251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatemplate <typename...>
412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing TestTypeExpression = void;
422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Traits type to determine the underlying type of an enum, integer,
442251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// or wrapper class.
452251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatemplate <typename T, typename = typename std::is_enum<T>::type,
462251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka          typename = typename std::is_integral<T>::type, typename = void>
472251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct UnderlyingType {
482251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  using Type = T;
492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
502251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Partial specialization that matches enum types. Captures the underlying type
512251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// of the enum in member type Type.
522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatemplate <typename T>
532251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct UnderlyingType<T, std::true_type, std::false_type> {
542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  using Type = typename std::underlying_type<T>::type;
552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Partial specialization that matches integral types. Captures the type of the
572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// integer in member type Type.
582251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatemplate <typename T>
592251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct UnderlyingType<T, std::false_type, std::true_type> {
602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  using Type = T;
612251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Partial specialization that matches the wrapper types below. Captures
632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// wrapper member type ValueType in member type Type.
642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatemplate <typename T>
652251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct UnderlyingType<T, std::false_type, std::false_type,
662251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                      TestTypeExpression<typename T::ValueType>> {
672251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  using Type = typename T::ValueType;
682251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
692251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Enable if T is an enum with underlying type U.
712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatemplate <typename T, typename U, typename ReturnType = void>
722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing EnableIfMatchingEnum = typename std::enable_if<
732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    std::is_enum<T>::value &&
742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        std::is_same<U, typename UnderlyingType<T>::Type>::value,
752251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    ReturnType>::type;
762251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Enable if T and U are the same size/alignment and have the same underlying
782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// type. Handles enum, integral, and wrapper classes below.
792251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatemplate <typename T, typename U, typename Return = void>
802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing EnableIfSafeCast = typename std::enable_if<
812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    sizeof(T) == sizeof(U) && alignof(T) == alignof(U) &&
822251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        std::is_same<typename UnderlyingType<T>::Type,
832251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                     typename UnderlyingType<U>::Type>::value,
842251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Return>::type;
852251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
862251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Safely cast between std::vectors of matching enum/integer/wraper types.
872251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Normally this is not possible with pendantic compiler type checks. However,
882251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// given the same size, alignment, and underlying type this is safe due to
892251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// allocator requirements and array-like element access guarantees.
902251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatemplate <typename T, typename U>
912251d822dac2a96aad4184a6fdc2690f0a58af7cCorey TabakaEnableIfSafeCast<T, U, std::vector<T>*> VectorCast(std::vector<U>* in) {
922251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return reinterpret_cast<std::vector<T>*>(in);
932251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
942251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
952251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Translator classes that wrap specific HWC types to make translating
962251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// between different types (especially enum class) in code cleaner.
972251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
982251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Base type for the enum wrappers below. This type provides type definitions
992251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// and implicit conversion logic common to each wrapper type.
1002251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatemplate <typename EnumType>
1012251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct Wrapper {
1022251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  // Alias type of this instantiantion of Wrapper. Useful for inheriting
1032251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  // constructors in subclasses via "using Base::Base;" statements.
1042251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  using Base = Wrapper<EnumType>;
1052251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1062251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  // The enum type wrapped by this instantiation of Wrapper.
1072251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  using BaseType = EnumType;
1082251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1092251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  // The underlying type of the base enum type.
1102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  using ValueType = typename UnderlyingType<BaseType>::Type;
1112251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  // A default constructor is not defined here. Subclasses should define one
1132251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  // as appropriate to define the correct inital value for the enum type.
1142251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1152251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  // Default copy constructor.
1162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  Wrapper(const Wrapper&) = default;
1172251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  // Implicit conversion from ValueType.
1192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  Wrapper(ValueType value) : value(value) {}
1202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  // Implicit conversion from BaseType.
1222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  Wrapper(BaseType value) : value(static_cast<ValueType>(value)) {}
1232251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  // Implicit conversion from an enum type of the same underlying type.
1252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  template <typename T, typename = EnableIfMatchingEnum<T, ValueType>>
1262251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  Wrapper(const T& value) : value(static_cast<ValueType>(value)) {}
1272251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1282251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  // Implicit conversion to BaseType.
1292251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  operator BaseType() const { return static_cast<BaseType>(value); }
1302251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1312251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  // Implicit conversion to ValueType.
1322251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  operator ValueType() const { return value; }
1332251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  template <typename T, typename = EnableIfMatchingEnum<T, ValueType>>
1352251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  T cast() const {
1362251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return static_cast<T>(value);
1372251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
1382251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1392251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  // Converts to string using HWC2 stringification of BaseType.
1402251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  std::string to_string() const {
1412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return HWC2::to_string(static_cast<BaseType>(value));
1422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
1432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1442251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  bool operator!=(const Wrapper& other) const { return value != other.value; }
1452251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  bool operator!=(ValueType other_value) const { return value != other_value; }
1462251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  bool operator!=(BaseType other_value) const {
1472251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return static_cast<BaseType>(value) != other_value;
1482251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
1492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  bool operator==(const Wrapper& other) const { return value == other.value; }
1502251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  bool operator==(ValueType other_value) const { return value == other_value; }
1512251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  bool operator==(BaseType other_value) const {
1522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return static_cast<BaseType>(value) == other_value;
1532251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
1542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  ValueType value;
1562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
1572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1582251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct Attribute final : public Wrapper<HWC2::Attribute> {
1592251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  enum : ValueType {
1602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Invalid = HWC2_ATTRIBUTE_INVALID,
1612251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Width = HWC2_ATTRIBUTE_WIDTH,
1622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Height = HWC2_ATTRIBUTE_HEIGHT,
1632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    VsyncPeriod = HWC2_ATTRIBUTE_VSYNC_PERIOD,
1642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    DpiX = HWC2_ATTRIBUTE_DPI_X,
1652251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    DpiY = HWC2_ATTRIBUTE_DPI_Y,
1662251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  };
1672251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1682251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  Attribute() : Base(Invalid) {}
1692251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  using Base::Base;
1702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
1712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct BlendMode final : public Wrapper<HWC2::BlendMode> {
1732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  enum : ValueType {
1742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Invalid = HWC2_BLEND_MODE_INVALID,
1752251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    None = HWC2_BLEND_MODE_NONE,
1762251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Premultiplied = HWC2_BLEND_MODE_PREMULTIPLIED,
1772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Coverage = HWC2_BLEND_MODE_COVERAGE,
1782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  };
1792251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  BlendMode() : Base(Invalid) {}
1812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  using Base::Base;
1822251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
1832251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1842251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct Composition final : public Wrapper<HWC2::Composition> {
1852251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  enum : ValueType {
1862251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Invalid = HWC2_COMPOSITION_INVALID,
1872251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Client = HWC2_COMPOSITION_CLIENT,
1882251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Device = HWC2_COMPOSITION_DEVICE,
1892251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    SolidColor = HWC2_COMPOSITION_SOLID_COLOR,
1902251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Cursor = HWC2_COMPOSITION_CURSOR,
1912251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Sideband = HWC2_COMPOSITION_SIDEBAND,
1922251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  };
1932251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1942251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  Composition() : Base(Invalid) {}
1952251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  using Base::Base;
1962251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
1972251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1982251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct DisplayType final : public Wrapper<HWC2::DisplayType> {
1992251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  enum : ValueType {
2002251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Invalid = HWC2_DISPLAY_TYPE_INVALID,
2012251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Physical = HWC2_DISPLAY_TYPE_PHYSICAL,
2022251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Virtual = HWC2_DISPLAY_TYPE_VIRTUAL,
2032251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  };
2042251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2052251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  DisplayType() : Base(Invalid) {}
2062251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  using Base::Base;
2072251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
2082251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2092251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct Error final : public Wrapper<HWC2::Error> {
2102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  enum : ValueType {
2112251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    None = HWC2_ERROR_NONE,
2122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    BadConfig = HWC2_ERROR_BAD_CONFIG,
2132251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    BadDisplay = HWC2_ERROR_BAD_DISPLAY,
2142251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    BadLayer = HWC2_ERROR_BAD_LAYER,
2152251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    BadParameter = HWC2_ERROR_BAD_PARAMETER,
2162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    HasChanges = HWC2_ERROR_HAS_CHANGES,
2172251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    NoResources = HWC2_ERROR_NO_RESOURCES,
2182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    NotValidated = HWC2_ERROR_NOT_VALIDATED,
2192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Unsupported = HWC2_ERROR_UNSUPPORTED,
2202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  };
2212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  Error() : Base(None) {}
2232251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  using Base::Base;
2242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
2252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2262251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct LayerRequest final : public Wrapper<HWC2::LayerRequest> {
2272251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  enum : ValueType {
2282251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    ClearClientTarget = HWC2_LAYER_REQUEST_CLEAR_CLIENT_TARGET,
2292251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  };
2302251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2312251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  LayerRequest() : Base(0) {}
2322251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  using Base::Base;
2332251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
2342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2352251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct PowerMode final : public Wrapper<HWC2::PowerMode> {
2362251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  enum : ValueType {
2372251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Off = HWC2_POWER_MODE_OFF,
2382251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    DozeSuspend = HWC2_POWER_MODE_DOZE_SUSPEND,
2392251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Doze = HWC2_POWER_MODE_DOZE,
2402251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    On = HWC2_POWER_MODE_ON,
2412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  };
2422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  PowerMode() : Base(Off) {}
2442251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  using Base::Base;
2452251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
2462251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2472251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct Transform final : public Wrapper<HWC2::Transform> {
2482251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  enum : ValueType {
2492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    None = 0,
2502251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    FlipH = HWC_TRANSFORM_FLIP_H,
2512251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    FlipV = HWC_TRANSFORM_FLIP_V,
2522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Rotate90 = HWC_TRANSFORM_ROT_90,
2532251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Rotate180 = HWC_TRANSFORM_ROT_180,
2542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Rotate270 = HWC_TRANSFORM_ROT_270,
2552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    FlipHRotate90 = HWC_TRANSFORM_FLIP_H_ROT_90,
2562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    FlipVRotate90 = HWC_TRANSFORM_FLIP_V_ROT_90,
2572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  };
2582251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2592251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  Transform() : Base(None) {}
2602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  using Base::Base;
2612251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
2622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct Vsync final : public Wrapper<HWC2::Vsync> {
2642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  enum : ValueType {
2652251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Invalid = HWC2_VSYNC_INVALID,
2662251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Enable = HWC2_VSYNC_ENABLE,
2672251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    Disable = HWC2_VSYNC_DISABLE,
2682251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  };
2692251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  Vsync() : Base(Invalid) {}
2712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  using Base::Base;
2722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
2732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Utility color type.
2752251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct Color final {
2762251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  Color(const Color&) = default;
2772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  Color(uint8_t r, uint8_t g, uint8_t b, uint8_t a) : r(r), g(g), b(b), a(a) {}
2782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  Color(hwc_color_t color) : r(color.r), g(color.g), b(color.b), a(color.a) {}
2792251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  operator hwc_color_t() const { return {r, g, b, a}; }
2812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2822251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  uint8_t r __attribute__((aligned(1)));
2832251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  uint8_t g __attribute__((aligned(1)));
2842251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  uint8_t b __attribute__((aligned(1)));
2852251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  uint8_t a __attribute__((aligned(1)));
2862251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
2872251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2882251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Utility rectangle type.
2892251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct Rect final {
2902251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  // TODO(eieio): Implicit conversion to/from Android rect types.
2912251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2922251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  int32_t left __attribute__((aligned(4)));
2932251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  int32_t top __attribute__((aligned(4)));
2942251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  int32_t right __attribute__((aligned(4)));
2952251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  int32_t bottom __attribute__((aligned(4)));
2962251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
2972251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2982251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}  // namespace HWC
2992251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
3002251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#endif  // ANDROID_LIBVRFLINGER_HWCTYPES_H
301