xref: /aosp_15_r20/external/angle/src/libANGLE/AttributeMap.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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