1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2014 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_ATTRIBUTEMAP_H_ 8*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_ATTRIBUTEMAP_H_ 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #include "common/FastVector.h" 11*8975f5c5SAndroid Build Coastguard Worker #include "common/PackedEnums.h" 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include <EGL/egl.h> 14*8975f5c5SAndroid Build Coastguard Worker 15*8975f5c5SAndroid Build Coastguard Worker #include <functional> 16*8975f5c5SAndroid Build Coastguard Worker #include <vector> 17*8975f5c5SAndroid Build Coastguard Worker 18*8975f5c5SAndroid Build Coastguard Worker namespace egl 19*8975f5c5SAndroid Build Coastguard Worker { 20*8975f5c5SAndroid Build Coastguard Worker class Display; 21*8975f5c5SAndroid Build Coastguard Worker struct ValidationContext; 22*8975f5c5SAndroid Build Coastguard Worker 23*8975f5c5SAndroid Build Coastguard Worker // Validates {key, value} for each attribute. Generates an error and returns false on invalid usage. 24*8975f5c5SAndroid Build Coastguard Worker using AttributeValidationFunc = 25*8975f5c5SAndroid Build Coastguard Worker std::function<bool(const ValidationContext *, const Display *, EGLAttrib)>; 26*8975f5c5SAndroid Build Coastguard Worker 27*8975f5c5SAndroid Build Coastguard Worker enum AttributeMapType 28*8975f5c5SAndroid Build Coastguard Worker { 29*8975f5c5SAndroid Build Coastguard Worker Invalid, 30*8975f5c5SAndroid Build Coastguard Worker Attrib, 31*8975f5c5SAndroid Build Coastguard Worker Int, 32*8975f5c5SAndroid Build Coastguard Worker }; 33*8975f5c5SAndroid Build Coastguard Worker 34*8975f5c5SAndroid Build Coastguard Worker class AttributeMap final 35*8975f5c5SAndroid Build Coastguard Worker { 36*8975f5c5SAndroid Build Coastguard Worker public: 37*8975f5c5SAndroid Build Coastguard Worker static constexpr size_t kMapSize = 2; 38*8975f5c5SAndroid Build Coastguard Worker using Map = angle::FlatUnorderedMap<EGLAttrib, EGLAttrib, kMapSize>; 39*8975f5c5SAndroid Build Coastguard Worker 40*8975f5c5SAndroid Build Coastguard Worker AttributeMap(); 41*8975f5c5SAndroid Build Coastguard Worker AttributeMap(const AttributeMap &other); 42*8975f5c5SAndroid Build Coastguard Worker AttributeMap &operator=(const AttributeMap &other); 43*8975f5c5SAndroid Build Coastguard Worker ~AttributeMap(); 44*8975f5c5SAndroid Build Coastguard Worker 45*8975f5c5SAndroid Build Coastguard Worker void insert(EGLAttrib key, EGLAttrib value); 46*8975f5c5SAndroid Build Coastguard Worker bool contains(EGLAttrib key) const; 47*8975f5c5SAndroid Build Coastguard Worker 48*8975f5c5SAndroid Build Coastguard Worker EGLAttrib get(EGLAttrib key) const; 49*8975f5c5SAndroid Build Coastguard Worker EGLAttrib get(EGLAttrib key, EGLAttrib defaultValue) const; 50*8975f5c5SAndroid Build Coastguard Worker EGLint getAsInt(EGLAttrib key) const; 51*8975f5c5SAndroid Build Coastguard Worker EGLint getAsInt(EGLAttrib key, EGLint defaultValue) const; 52*8975f5c5SAndroid Build Coastguard Worker 53*8975f5c5SAndroid Build Coastguard Worker template <typename PackedEnumT> getAsPackedEnum(EGLAttrib key)54*8975f5c5SAndroid Build Coastguard Worker PackedEnumT getAsPackedEnum(EGLAttrib key) const 55*8975f5c5SAndroid Build Coastguard Worker { 56*8975f5c5SAndroid Build Coastguard Worker return FromEGLenum<PackedEnumT>(static_cast<EGLenum>(get(key))); 57*8975f5c5SAndroid Build Coastguard Worker } 58*8975f5c5SAndroid Build Coastguard Worker 59*8975f5c5SAndroid Build Coastguard Worker using const_iterator = Map::const_iterator; 60*8975f5c5SAndroid Build Coastguard Worker 61*8975f5c5SAndroid Build Coastguard Worker template <typename PackedEnumT> getAsPackedEnum(EGLAttrib key,PackedEnumT defaultValue)62*8975f5c5SAndroid Build Coastguard Worker PackedEnumT getAsPackedEnum(EGLAttrib key, PackedEnumT defaultValue) const 63*8975f5c5SAndroid Build Coastguard Worker { 64*8975f5c5SAndroid Build Coastguard Worker const_iterator iter = attribs().find(key); 65*8975f5c5SAndroid Build Coastguard Worker return (attribs().find(key) != attribs().end()) 66*8975f5c5SAndroid Build Coastguard Worker ? FromEGLenum<PackedEnumT>(static_cast<EGLenum>(iter->second)) 67*8975f5c5SAndroid Build Coastguard Worker : defaultValue; 68*8975f5c5SAndroid Build Coastguard Worker } 69*8975f5c5SAndroid Build Coastguard Worker 70*8975f5c5SAndroid Build Coastguard Worker bool isEmpty() const; 71*8975f5c5SAndroid Build Coastguard Worker std::vector<EGLint> toIntVector() const; 72*8975f5c5SAndroid Build Coastguard Worker 73*8975f5c5SAndroid Build Coastguard Worker const_iterator begin() const; 74*8975f5c5SAndroid Build Coastguard Worker const_iterator end() const; 75*8975f5c5SAndroid Build Coastguard Worker 76*8975f5c5SAndroid Build Coastguard Worker [[nodiscard]] bool validate(const ValidationContext *val, 77*8975f5c5SAndroid Build Coastguard Worker const egl::Display *display, 78*8975f5c5SAndroid Build Coastguard Worker AttributeValidationFunc validationFunc) const; 79*8975f5c5SAndroid Build Coastguard Worker 80*8975f5c5SAndroid Build Coastguard Worker // TODO: remove this and validate at every call site. http://anglebug.com/42265167 81*8975f5c5SAndroid Build Coastguard Worker void initializeWithoutValidation() const; 82*8975f5c5SAndroid Build Coastguard Worker 83*8975f5c5SAndroid Build Coastguard Worker static AttributeMap CreateFromIntArray(const EGLint *attributes); 84*8975f5c5SAndroid Build Coastguard Worker static AttributeMap CreateFromAttribArray(const EGLAttrib *attributes); 85*8975f5c5SAndroid Build Coastguard Worker getType()86*8975f5c5SAndroid Build Coastguard Worker AttributeMapType getType() const { return mMapType; } 87*8975f5c5SAndroid Build Coastguard Worker 88*8975f5c5SAndroid Build Coastguard Worker private: 89*8975f5c5SAndroid Build Coastguard Worker bool isValidated() const; 90*8975f5c5SAndroid Build Coastguard Worker attribs()91*8975f5c5SAndroid Build Coastguard Worker const Map &attribs() const 92*8975f5c5SAndroid Build Coastguard Worker { 93*8975f5c5SAndroid Build Coastguard Worker ASSERT(isValidated()); 94*8975f5c5SAndroid Build Coastguard Worker return mValidatedAttributes; 95*8975f5c5SAndroid Build Coastguard Worker } 96*8975f5c5SAndroid Build Coastguard Worker attribs()97*8975f5c5SAndroid Build Coastguard Worker Map &attribs() 98*8975f5c5SAndroid Build Coastguard Worker { 99*8975f5c5SAndroid Build Coastguard Worker ASSERT(isValidated()); 100*8975f5c5SAndroid Build Coastguard Worker return mValidatedAttributes; 101*8975f5c5SAndroid Build Coastguard Worker } 102*8975f5c5SAndroid Build Coastguard Worker 103*8975f5c5SAndroid Build Coastguard Worker mutable const EGLint *mIntPointer = nullptr; 104*8975f5c5SAndroid Build Coastguard Worker mutable const EGLAttrib *mAttribPointer = nullptr; 105*8975f5c5SAndroid Build Coastguard Worker mutable Map mValidatedAttributes; 106*8975f5c5SAndroid Build Coastguard Worker mutable AttributeMapType mMapType = AttributeMapType::Invalid; 107*8975f5c5SAndroid Build Coastguard Worker }; 108*8975f5c5SAndroid Build Coastguard Worker } // namespace egl 109*8975f5c5SAndroid Build Coastguard Worker 110*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_ATTRIBUTEMAP_H_ 111