xref: /aosp_15_r20/external/angle/src/libANGLE/AttributeMap.cpp (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 #include "libANGLE/AttributeMap.h"
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker namespace egl
12*8975f5c5SAndroid Build Coastguard Worker {
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker AttributeMap::AttributeMap() = default;
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker AttributeMap::AttributeMap(const AttributeMap &other) = default;
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker AttributeMap &AttributeMap::operator=(const AttributeMap &other) = default;
19*8975f5c5SAndroid Build Coastguard Worker 
20*8975f5c5SAndroid Build Coastguard Worker AttributeMap::~AttributeMap() = default;
21*8975f5c5SAndroid Build Coastguard Worker 
insert(EGLAttrib key,EGLAttrib value)22*8975f5c5SAndroid Build Coastguard Worker void AttributeMap::insert(EGLAttrib key, EGLAttrib value)
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker     mValidatedAttributes[key] = value;
25*8975f5c5SAndroid Build Coastguard Worker }
26*8975f5c5SAndroid Build Coastguard Worker 
contains(EGLAttrib key) const27*8975f5c5SAndroid Build Coastguard Worker bool AttributeMap::contains(EGLAttrib key) const
28*8975f5c5SAndroid Build Coastguard Worker {
29*8975f5c5SAndroid Build Coastguard Worker     return (attribs().find(key) != attribs().end());
30*8975f5c5SAndroid Build Coastguard Worker }
31*8975f5c5SAndroid Build Coastguard Worker 
get(EGLAttrib key) const32*8975f5c5SAndroid Build Coastguard Worker EGLAttrib AttributeMap::get(EGLAttrib key) const
33*8975f5c5SAndroid Build Coastguard Worker {
34*8975f5c5SAndroid Build Coastguard Worker     auto iter = attribs().find(key);
35*8975f5c5SAndroid Build Coastguard Worker     ASSERT(iter != attribs().end());
36*8975f5c5SAndroid Build Coastguard Worker     return iter->second;
37*8975f5c5SAndroid Build Coastguard Worker }
38*8975f5c5SAndroid Build Coastguard Worker 
get(EGLAttrib key,EGLAttrib defaultValue) const39*8975f5c5SAndroid Build Coastguard Worker EGLAttrib AttributeMap::get(EGLAttrib key, EGLAttrib defaultValue) const
40*8975f5c5SAndroid Build Coastguard Worker {
41*8975f5c5SAndroid Build Coastguard Worker     auto iter = attribs().find(key);
42*8975f5c5SAndroid Build Coastguard Worker     return (iter != attribs().end()) ? iter->second : defaultValue;
43*8975f5c5SAndroid Build Coastguard Worker }
44*8975f5c5SAndroid Build Coastguard Worker 
getAsInt(EGLAttrib key) const45*8975f5c5SAndroid Build Coastguard Worker EGLint AttributeMap::getAsInt(EGLAttrib key) const
46*8975f5c5SAndroid Build Coastguard Worker {
47*8975f5c5SAndroid Build Coastguard Worker     return static_cast<EGLint>(get(key));
48*8975f5c5SAndroid Build Coastguard Worker }
49*8975f5c5SAndroid Build Coastguard Worker 
getAsInt(EGLAttrib key,EGLint defaultValue) const50*8975f5c5SAndroid Build Coastguard Worker EGLint AttributeMap::getAsInt(EGLAttrib key, EGLint defaultValue) const
51*8975f5c5SAndroid Build Coastguard Worker {
52*8975f5c5SAndroid Build Coastguard Worker     return static_cast<EGLint>(get(key, static_cast<EGLAttrib>(defaultValue)));
53*8975f5c5SAndroid Build Coastguard Worker }
54*8975f5c5SAndroid Build Coastguard Worker 
isEmpty() const55*8975f5c5SAndroid Build Coastguard Worker bool AttributeMap::isEmpty() const
56*8975f5c5SAndroid Build Coastguard Worker {
57*8975f5c5SAndroid Build Coastguard Worker     return attribs().empty();
58*8975f5c5SAndroid Build Coastguard Worker }
59*8975f5c5SAndroid Build Coastguard Worker 
toIntVector() const60*8975f5c5SAndroid Build Coastguard Worker std::vector<EGLint> AttributeMap::toIntVector() const
61*8975f5c5SAndroid Build Coastguard Worker {
62*8975f5c5SAndroid Build Coastguard Worker     std::vector<EGLint> ret;
63*8975f5c5SAndroid Build Coastguard Worker     for (const auto &pair : attribs())
64*8975f5c5SAndroid Build Coastguard Worker     {
65*8975f5c5SAndroid Build Coastguard Worker         ret.push_back(static_cast<EGLint>(pair.first));
66*8975f5c5SAndroid Build Coastguard Worker         ret.push_back(static_cast<EGLint>(pair.second));
67*8975f5c5SAndroid Build Coastguard Worker     }
68*8975f5c5SAndroid Build Coastguard Worker     ret.push_back(EGL_NONE);
69*8975f5c5SAndroid Build Coastguard Worker 
70*8975f5c5SAndroid Build Coastguard Worker     return ret;
71*8975f5c5SAndroid Build Coastguard Worker }
72*8975f5c5SAndroid Build Coastguard Worker 
begin() const73*8975f5c5SAndroid Build Coastguard Worker AttributeMap::const_iterator AttributeMap::begin() const
74*8975f5c5SAndroid Build Coastguard Worker {
75*8975f5c5SAndroid Build Coastguard Worker     return attribs().begin();
76*8975f5c5SAndroid Build Coastguard Worker }
77*8975f5c5SAndroid Build Coastguard Worker 
end() const78*8975f5c5SAndroid Build Coastguard Worker AttributeMap::const_iterator AttributeMap::end() const
79*8975f5c5SAndroid Build Coastguard Worker {
80*8975f5c5SAndroid Build Coastguard Worker     return attribs().end();
81*8975f5c5SAndroid Build Coastguard Worker }
82*8975f5c5SAndroid Build Coastguard Worker 
validate(const ValidationContext * val,const egl::Display * display,AttributeValidationFunc validationFunc) const83*8975f5c5SAndroid Build Coastguard Worker bool AttributeMap::validate(const ValidationContext *val,
84*8975f5c5SAndroid Build Coastguard Worker                             const egl::Display *display,
85*8975f5c5SAndroid Build Coastguard Worker                             AttributeValidationFunc validationFunc) const
86*8975f5c5SAndroid Build Coastguard Worker {
87*8975f5c5SAndroid Build Coastguard Worker     if (mIntPointer)
88*8975f5c5SAndroid Build Coastguard Worker     {
89*8975f5c5SAndroid Build Coastguard Worker         for (const EGLint *curAttrib = mIntPointer; curAttrib[0] != EGL_NONE; curAttrib += 2)
90*8975f5c5SAndroid Build Coastguard Worker         {
91*8975f5c5SAndroid Build Coastguard Worker             if (!validationFunc(val, display, curAttrib[0]))
92*8975f5c5SAndroid Build Coastguard Worker             {
93*8975f5c5SAndroid Build Coastguard Worker                 return false;
94*8975f5c5SAndroid Build Coastguard Worker             }
95*8975f5c5SAndroid Build Coastguard Worker 
96*8975f5c5SAndroid Build Coastguard Worker             mValidatedAttributes[static_cast<EGLAttrib>(curAttrib[0])] =
97*8975f5c5SAndroid Build Coastguard Worker                 static_cast<EGLAttrib>(curAttrib[1]);
98*8975f5c5SAndroid Build Coastguard Worker         }
99*8975f5c5SAndroid Build Coastguard Worker         mIntPointer = nullptr;
100*8975f5c5SAndroid Build Coastguard Worker     }
101*8975f5c5SAndroid Build Coastguard Worker 
102*8975f5c5SAndroid Build Coastguard Worker     if (mAttribPointer)
103*8975f5c5SAndroid Build Coastguard Worker     {
104*8975f5c5SAndroid Build Coastguard Worker         for (const EGLAttrib *curAttrib = mAttribPointer; curAttrib[0] != EGL_NONE; curAttrib += 2)
105*8975f5c5SAndroid Build Coastguard Worker         {
106*8975f5c5SAndroid Build Coastguard Worker             if (!validationFunc(val, display, curAttrib[0]))
107*8975f5c5SAndroid Build Coastguard Worker             {
108*8975f5c5SAndroid Build Coastguard Worker                 return false;
109*8975f5c5SAndroid Build Coastguard Worker             }
110*8975f5c5SAndroid Build Coastguard Worker 
111*8975f5c5SAndroid Build Coastguard Worker             mValidatedAttributes[curAttrib[0]] = curAttrib[1];
112*8975f5c5SAndroid Build Coastguard Worker         }
113*8975f5c5SAndroid Build Coastguard Worker         mAttribPointer = nullptr;
114*8975f5c5SAndroid Build Coastguard Worker     }
115*8975f5c5SAndroid Build Coastguard Worker 
116*8975f5c5SAndroid Build Coastguard Worker     return true;
117*8975f5c5SAndroid Build Coastguard Worker }
118*8975f5c5SAndroid Build Coastguard Worker 
initializeWithoutValidation() const119*8975f5c5SAndroid Build Coastguard Worker void AttributeMap::initializeWithoutValidation() const
120*8975f5c5SAndroid Build Coastguard Worker {
121*8975f5c5SAndroid Build Coastguard Worker     auto alwaysTrue = [](const ValidationContext *, const egl::Display *, EGLAttrib) {
122*8975f5c5SAndroid Build Coastguard Worker         return true;
123*8975f5c5SAndroid Build Coastguard Worker     };
124*8975f5c5SAndroid Build Coastguard Worker     (void)validate(nullptr, nullptr, alwaysTrue);
125*8975f5c5SAndroid Build Coastguard Worker }
126*8975f5c5SAndroid Build Coastguard Worker 
127*8975f5c5SAndroid Build Coastguard Worker // static
CreateFromIntArray(const EGLint * attributes)128*8975f5c5SAndroid Build Coastguard Worker AttributeMap AttributeMap::CreateFromIntArray(const EGLint *attributes)
129*8975f5c5SAndroid Build Coastguard Worker {
130*8975f5c5SAndroid Build Coastguard Worker     AttributeMap map;
131*8975f5c5SAndroid Build Coastguard Worker     map.mIntPointer = attributes;
132*8975f5c5SAndroid Build Coastguard Worker     map.mMapType    = AttributeMapType::Int;
133*8975f5c5SAndroid Build Coastguard Worker     return map;
134*8975f5c5SAndroid Build Coastguard Worker }
135*8975f5c5SAndroid Build Coastguard Worker 
136*8975f5c5SAndroid Build Coastguard Worker // static
CreateFromAttribArray(const EGLAttrib * attributes)137*8975f5c5SAndroid Build Coastguard Worker AttributeMap AttributeMap::CreateFromAttribArray(const EGLAttrib *attributes)
138*8975f5c5SAndroid Build Coastguard Worker {
139*8975f5c5SAndroid Build Coastguard Worker     AttributeMap map;
140*8975f5c5SAndroid Build Coastguard Worker     map.mAttribPointer = attributes;
141*8975f5c5SAndroid Build Coastguard Worker     map.mMapType       = AttributeMapType::Attrib;
142*8975f5c5SAndroid Build Coastguard Worker     return map;
143*8975f5c5SAndroid Build Coastguard Worker }
144*8975f5c5SAndroid Build Coastguard Worker 
isValidated() const145*8975f5c5SAndroid Build Coastguard Worker bool AttributeMap::isValidated() const
146*8975f5c5SAndroid Build Coastguard Worker {
147*8975f5c5SAndroid Build Coastguard Worker     return mIntPointer == nullptr && mAttribPointer == nullptr;
148*8975f5c5SAndroid Build Coastguard Worker }
149*8975f5c5SAndroid Build Coastguard Worker }  // namespace egl
150