AttributeMap.cpp (3521B)
1 // 2 // Copyright 2014 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 #include "libANGLE/AttributeMap.h" 8 9 #include "common/debug.h" 10 11 namespace egl 12 { 13 14 AttributeMap::AttributeMap() = default; 15 16 AttributeMap::AttributeMap(const AttributeMap &other) = default; 17 18 AttributeMap &AttributeMap::operator=(const AttributeMap &other) = default; 19 20 AttributeMap::~AttributeMap() = default; 21 22 void AttributeMap::insert(EGLAttrib key, EGLAttrib value) 23 { 24 mValidatedAttributes[key] = value; 25 } 26 27 bool AttributeMap::contains(EGLAttrib key) const 28 { 29 return (attribs().find(key) != attribs().end()); 30 } 31 32 EGLAttrib AttributeMap::get(EGLAttrib key) const 33 { 34 auto iter = attribs().find(key); 35 ASSERT(iter != attribs().end()); 36 return iter->second; 37 } 38 39 EGLAttrib AttributeMap::get(EGLAttrib key, EGLAttrib defaultValue) const 40 { 41 auto iter = attribs().find(key); 42 return (iter != attribs().end()) ? iter->second : defaultValue; 43 } 44 45 EGLint AttributeMap::getAsInt(EGLAttrib key) const 46 { 47 return static_cast<EGLint>(get(key)); 48 } 49 50 EGLint AttributeMap::getAsInt(EGLAttrib key, EGLint defaultValue) const 51 { 52 return static_cast<EGLint>(get(key, static_cast<EGLAttrib>(defaultValue))); 53 } 54 55 bool AttributeMap::isEmpty() const 56 { 57 return attribs().empty(); 58 } 59 60 std::vector<EGLint> AttributeMap::toIntVector() const 61 { 62 std::vector<EGLint> ret; 63 for (const auto &pair : attribs()) 64 { 65 ret.push_back(static_cast<EGLint>(pair.first)); 66 ret.push_back(static_cast<EGLint>(pair.second)); 67 } 68 ret.push_back(EGL_NONE); 69 70 return ret; 71 } 72 73 AttributeMap::const_iterator AttributeMap::begin() const 74 { 75 return attribs().begin(); 76 } 77 78 AttributeMap::const_iterator AttributeMap::end() const 79 { 80 return attribs().end(); 81 } 82 83 bool AttributeMap::validate(const ValidationContext *val, 84 const egl::Display *display, 85 AttributeValidationFunc validationFunc) const 86 { 87 if (mIntPointer) 88 { 89 for (const EGLint *curAttrib = mIntPointer; curAttrib[0] != EGL_NONE; curAttrib += 2) 90 { 91 if (!validationFunc(val, display, curAttrib[0])) 92 { 93 return false; 94 } 95 96 mValidatedAttributes[static_cast<EGLAttrib>(curAttrib[0])] = 97 static_cast<EGLAttrib>(curAttrib[1]); 98 } 99 mIntPointer = nullptr; 100 } 101 102 if (mAttribPointer) 103 { 104 for (const EGLAttrib *curAttrib = mAttribPointer; curAttrib[0] != EGL_NONE; curAttrib += 2) 105 { 106 if (!validationFunc(val, display, curAttrib[0])) 107 { 108 return false; 109 } 110 111 mValidatedAttributes[curAttrib[0]] = curAttrib[1]; 112 } 113 mAttribPointer = nullptr; 114 } 115 116 return true; 117 } 118 119 void AttributeMap::initializeWithoutValidation() const 120 { 121 auto alwaysTrue = [](const ValidationContext *, const egl::Display *, EGLAttrib) { 122 return true; 123 }; 124 (void)validate(nullptr, nullptr, alwaysTrue); 125 } 126 127 // static 128 AttributeMap AttributeMap::CreateFromIntArray(const EGLint *attributes) 129 { 130 AttributeMap map; 131 map.mIntPointer = attributes; 132 return map; 133 } 134 135 // static 136 AttributeMap AttributeMap::CreateFromAttribArray(const EGLAttrib *attributes) 137 { 138 AttributeMap map; 139 map.mAttribPointer = attributes; 140 return map; 141 } 142 143 bool AttributeMap::isValidated() const 144 { 145 return mIntPointer == nullptr && mAttribPointer == nullptr; 146 } 147 } // namespace egl