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