Hash :
2265e37b
Author :
Date :
2022-10-12T09:27:16
Capture/Replay: Auto-generate EGL capture code. Replaces the custom code in the EGL stubs. Skips a few "Get" entry points because this CL doesn't implement pointer capture like we do for all the GL entry points. Includes a new state in the AttributeMap that indicates which type of attribute values we used when initializing the map. Bug: angleproject:4035 Change-Id: I272eac5e4068602ce710ef66c9a1dce5387943a5 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3949911 Reviewed-by: Yuxin Hu <yuxinhu@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
//
// Copyright 2014 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
#include "libANGLE/AttributeMap.h"
#include "common/debug.h"
namespace egl
{
AttributeMap::AttributeMap() = default;
AttributeMap::AttributeMap(const AttributeMap &other) = default;
AttributeMap &AttributeMap::operator=(const AttributeMap &other) = default;
AttributeMap::~AttributeMap() = default;
void AttributeMap::insert(EGLAttrib key, EGLAttrib value)
{
mValidatedAttributes[key] = value;
}
bool AttributeMap::contains(EGLAttrib key) const
{
return (attribs().find(key) != attribs().end());
}
EGLAttrib AttributeMap::get(EGLAttrib key) const
{
auto iter = attribs().find(key);
ASSERT(iter != attribs().end());
return iter->second;
}
EGLAttrib AttributeMap::get(EGLAttrib key, EGLAttrib defaultValue) const
{
auto iter = attribs().find(key);
return (iter != attribs().end()) ? iter->second : defaultValue;
}
EGLint AttributeMap::getAsInt(EGLAttrib key) const
{
return static_cast<EGLint>(get(key));
}
EGLint AttributeMap::getAsInt(EGLAttrib key, EGLint defaultValue) const
{
return static_cast<EGLint>(get(key, static_cast<EGLAttrib>(defaultValue)));
}
bool AttributeMap::isEmpty() const
{
return attribs().empty();
}
std::vector<EGLint> AttributeMap::toIntVector() const
{
std::vector<EGLint> ret;
for (const auto &pair : attribs())
{
ret.push_back(static_cast<EGLint>(pair.first));
ret.push_back(static_cast<EGLint>(pair.second));
}
ret.push_back(EGL_NONE);
return ret;
}
AttributeMap::const_iterator AttributeMap::begin() const
{
return attribs().begin();
}
AttributeMap::const_iterator AttributeMap::end() const
{
return attribs().end();
}
bool AttributeMap::validate(const ValidationContext *val,
const egl::Display *display,
AttributeValidationFunc validationFunc) const
{
if (mIntPointer)
{
for (const EGLint *curAttrib = mIntPointer; curAttrib[0] != EGL_NONE; curAttrib += 2)
{
if (!validationFunc(val, display, curAttrib[0]))
{
return false;
}
mValidatedAttributes[static_cast<EGLAttrib>(curAttrib[0])] =
static_cast<EGLAttrib>(curAttrib[1]);
}
mIntPointer = nullptr;
}
if (mAttribPointer)
{
for (const EGLAttrib *curAttrib = mAttribPointer; curAttrib[0] != EGL_NONE; curAttrib += 2)
{
if (!validationFunc(val, display, curAttrib[0]))
{
return false;
}
mValidatedAttributes[curAttrib[0]] = curAttrib[1];
}
mAttribPointer = nullptr;
}
return true;
}
void AttributeMap::initializeWithoutValidation() const
{
auto alwaysTrue = [](const ValidationContext *, const egl::Display *, EGLAttrib) {
return true;
};
(void)validate(nullptr, nullptr, alwaysTrue);
}
// static
AttributeMap AttributeMap::CreateFromIntArray(const EGLint *attributes)
{
AttributeMap map;
map.mIntPointer = attributes;
map.mMapType = AttributeMapType::Int;
return map;
}
// static
AttributeMap AttributeMap::CreateFromAttribArray(const EGLAttrib *attributes)
{
AttributeMap map;
map.mAttribPointer = attributes;
map.mMapType = AttributeMapType::Attrib;
return map;
}
bool AttributeMap::isValidated() const
{
return mIntPointer == nullptr && mAttribPointer == nullptr;
}
} // namespace egl