1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 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 // Config.cpp: Implements the egl::Config class, describing the format, type
8*8975f5c5SAndroid Build Coastguard Worker // and size for an egl::Surface. Implements EGLConfig and related functionality.
9*8975f5c5SAndroid Build Coastguard Worker // [EGL 1.5] section 3.4 page 19.
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Config.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/AttributeMap.h"
13*8975f5c5SAndroid Build Coastguard Worker
14*8975f5c5SAndroid Build Coastguard Worker #include <algorithm>
15*8975f5c5SAndroid Build Coastguard Worker #include <vector>
16*8975f5c5SAndroid Build Coastguard Worker
17*8975f5c5SAndroid Build Coastguard Worker #include <EGL/eglext.h>
18*8975f5c5SAndroid Build Coastguard Worker #include "angle_gl.h"
19*8975f5c5SAndroid Build Coastguard Worker
20*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
21*8975f5c5SAndroid Build Coastguard Worker
22*8975f5c5SAndroid Build Coastguard Worker namespace egl
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker
Config()25*8975f5c5SAndroid Build Coastguard Worker Config::Config()
26*8975f5c5SAndroid Build Coastguard Worker : renderTargetFormat(GL_NONE),
27*8975f5c5SAndroid Build Coastguard Worker depthStencilFormat(GL_NONE),
28*8975f5c5SAndroid Build Coastguard Worker bufferSize(0),
29*8975f5c5SAndroid Build Coastguard Worker redSize(0),
30*8975f5c5SAndroid Build Coastguard Worker greenSize(0),
31*8975f5c5SAndroid Build Coastguard Worker blueSize(0),
32*8975f5c5SAndroid Build Coastguard Worker luminanceSize(0),
33*8975f5c5SAndroid Build Coastguard Worker alphaSize(0),
34*8975f5c5SAndroid Build Coastguard Worker alphaMaskSize(0),
35*8975f5c5SAndroid Build Coastguard Worker bindToTextureRGB(EGL_FALSE),
36*8975f5c5SAndroid Build Coastguard Worker bindToTextureRGBA(EGL_FALSE),
37*8975f5c5SAndroid Build Coastguard Worker bindToTextureTarget(EGL_TEXTURE_2D),
38*8975f5c5SAndroid Build Coastguard Worker colorBufferType(EGL_RGB_BUFFER),
39*8975f5c5SAndroid Build Coastguard Worker configCaveat(EGL_NONE),
40*8975f5c5SAndroid Build Coastguard Worker configID(0),
41*8975f5c5SAndroid Build Coastguard Worker conformant(0),
42*8975f5c5SAndroid Build Coastguard Worker depthSize(0),
43*8975f5c5SAndroid Build Coastguard Worker level(0),
44*8975f5c5SAndroid Build Coastguard Worker matchNativePixmap(EGL_FALSE),
45*8975f5c5SAndroid Build Coastguard Worker maxPBufferWidth(0),
46*8975f5c5SAndroid Build Coastguard Worker maxPBufferHeight(0),
47*8975f5c5SAndroid Build Coastguard Worker maxPBufferPixels(0),
48*8975f5c5SAndroid Build Coastguard Worker maxSwapInterval(0),
49*8975f5c5SAndroid Build Coastguard Worker minSwapInterval(0),
50*8975f5c5SAndroid Build Coastguard Worker nativeRenderable(EGL_FALSE),
51*8975f5c5SAndroid Build Coastguard Worker nativeVisualID(0),
52*8975f5c5SAndroid Build Coastguard Worker nativeVisualType(0),
53*8975f5c5SAndroid Build Coastguard Worker renderableType(0),
54*8975f5c5SAndroid Build Coastguard Worker sampleBuffers(0),
55*8975f5c5SAndroid Build Coastguard Worker samples(0),
56*8975f5c5SAndroid Build Coastguard Worker stencilSize(0),
57*8975f5c5SAndroid Build Coastguard Worker surfaceType(0),
58*8975f5c5SAndroid Build Coastguard Worker transparentType(EGL_NONE),
59*8975f5c5SAndroid Build Coastguard Worker transparentRedValue(0),
60*8975f5c5SAndroid Build Coastguard Worker transparentGreenValue(0),
61*8975f5c5SAndroid Build Coastguard Worker transparentBlueValue(0),
62*8975f5c5SAndroid Build Coastguard Worker optimalOrientation(0),
63*8975f5c5SAndroid Build Coastguard Worker colorComponentType(EGL_COLOR_COMPONENT_TYPE_FIXED_EXT),
64*8975f5c5SAndroid Build Coastguard Worker recordable(EGL_FALSE),
65*8975f5c5SAndroid Build Coastguard Worker framebufferTarget(EGL_FALSE), // TODO: http://anglebug.com/42262839
66*8975f5c5SAndroid Build Coastguard Worker yInverted(EGL_FALSE)
67*8975f5c5SAndroid Build Coastguard Worker {}
68*8975f5c5SAndroid Build Coastguard Worker
~Config()69*8975f5c5SAndroid Build Coastguard Worker Config::~Config() {}
70*8975f5c5SAndroid Build Coastguard Worker
71*8975f5c5SAndroid Build Coastguard Worker Config::Config(const Config &other) = default;
72*8975f5c5SAndroid Build Coastguard Worker
73*8975f5c5SAndroid Build Coastguard Worker Config &Config::operator=(const Config &other) = default;
74*8975f5c5SAndroid Build Coastguard Worker
75*8975f5c5SAndroid Build Coastguard Worker ConfigSet::ConfigSet() = default;
76*8975f5c5SAndroid Build Coastguard Worker
77*8975f5c5SAndroid Build Coastguard Worker ConfigSet::ConfigSet(const ConfigSet &other) = default;
78*8975f5c5SAndroid Build Coastguard Worker
79*8975f5c5SAndroid Build Coastguard Worker ConfigSet &ConfigSet::operator=(const ConfigSet &other) = default;
80*8975f5c5SAndroid Build Coastguard Worker
81*8975f5c5SAndroid Build Coastguard Worker ConfigSet::~ConfigSet() = default;
82*8975f5c5SAndroid Build Coastguard Worker
add(const Config & config)83*8975f5c5SAndroid Build Coastguard Worker EGLint ConfigSet::add(const Config &config)
84*8975f5c5SAndroid Build Coastguard Worker {
85*8975f5c5SAndroid Build Coastguard Worker // Set the config's ID to a small number that starts at 1 ([EGL 1.5] section 3.4)
86*8975f5c5SAndroid Build Coastguard Worker EGLint id = static_cast<EGLint>(mConfigs.size()) + 1;
87*8975f5c5SAndroid Build Coastguard Worker
88*8975f5c5SAndroid Build Coastguard Worker Config copyConfig(config);
89*8975f5c5SAndroid Build Coastguard Worker copyConfig.configID = id;
90*8975f5c5SAndroid Build Coastguard Worker mConfigs.insert(std::make_pair(id, copyConfig));
91*8975f5c5SAndroid Build Coastguard Worker
92*8975f5c5SAndroid Build Coastguard Worker return id;
93*8975f5c5SAndroid Build Coastguard Worker }
94*8975f5c5SAndroid Build Coastguard Worker
get(EGLint id) const95*8975f5c5SAndroid Build Coastguard Worker const Config &ConfigSet::get(EGLint id) const
96*8975f5c5SAndroid Build Coastguard Worker {
97*8975f5c5SAndroid Build Coastguard Worker ASSERT(mConfigs.find(id) != mConfigs.end());
98*8975f5c5SAndroid Build Coastguard Worker return mConfigs.find(id)->second;
99*8975f5c5SAndroid Build Coastguard Worker }
100*8975f5c5SAndroid Build Coastguard Worker
clear()101*8975f5c5SAndroid Build Coastguard Worker void ConfigSet::clear()
102*8975f5c5SAndroid Build Coastguard Worker {
103*8975f5c5SAndroid Build Coastguard Worker mConfigs.clear();
104*8975f5c5SAndroid Build Coastguard Worker }
105*8975f5c5SAndroid Build Coastguard Worker
size() const106*8975f5c5SAndroid Build Coastguard Worker size_t ConfigSet::size() const
107*8975f5c5SAndroid Build Coastguard Worker {
108*8975f5c5SAndroid Build Coastguard Worker return mConfigs.size();
109*8975f5c5SAndroid Build Coastguard Worker }
110*8975f5c5SAndroid Build Coastguard Worker
contains(const Config * config) const111*8975f5c5SAndroid Build Coastguard Worker bool ConfigSet::contains(const Config *config) const
112*8975f5c5SAndroid Build Coastguard Worker {
113*8975f5c5SAndroid Build Coastguard Worker for (auto i = mConfigs.begin(); i != mConfigs.end(); i++)
114*8975f5c5SAndroid Build Coastguard Worker {
115*8975f5c5SAndroid Build Coastguard Worker const Config &item = i->second;
116*8975f5c5SAndroid Build Coastguard Worker if (config == &item)
117*8975f5c5SAndroid Build Coastguard Worker {
118*8975f5c5SAndroid Build Coastguard Worker return true;
119*8975f5c5SAndroid Build Coastguard Worker }
120*8975f5c5SAndroid Build Coastguard Worker }
121*8975f5c5SAndroid Build Coastguard Worker
122*8975f5c5SAndroid Build Coastguard Worker return false;
123*8975f5c5SAndroid Build Coastguard Worker }
124*8975f5c5SAndroid Build Coastguard Worker
125*8975f5c5SAndroid Build Coastguard Worker // Function object used by STL sorting routines for ordering Configs according to [EGL 1.5]
126*8975f5c5SAndroid Build Coastguard Worker // section 3.4.1.2 page 28.
127*8975f5c5SAndroid Build Coastguard Worker class ConfigSorter
128*8975f5c5SAndroid Build Coastguard Worker {
129*8975f5c5SAndroid Build Coastguard Worker public:
ConfigSorter(const AttributeMap & attributeMap)130*8975f5c5SAndroid Build Coastguard Worker explicit ConfigSorter(const AttributeMap &attributeMap)
131*8975f5c5SAndroid Build Coastguard Worker : mWantRed(false),
132*8975f5c5SAndroid Build Coastguard Worker mWantGreen(false),
133*8975f5c5SAndroid Build Coastguard Worker mWantBlue(false),
134*8975f5c5SAndroid Build Coastguard Worker mWantAlpha(false),
135*8975f5c5SAndroid Build Coastguard Worker mWantLuminance(false)
136*8975f5c5SAndroid Build Coastguard Worker {
137*8975f5c5SAndroid Build Coastguard Worker scanForWantedComponents(attributeMap);
138*8975f5c5SAndroid Build Coastguard Worker }
139*8975f5c5SAndroid Build Coastguard Worker
operator ()(const Config * x,const Config * y) const140*8975f5c5SAndroid Build Coastguard Worker bool operator()(const Config *x, const Config *y) const { return (*this)(*x, *y); }
141*8975f5c5SAndroid Build Coastguard Worker
operator ()(const Config & x,const Config & y) const142*8975f5c5SAndroid Build Coastguard Worker bool operator()(const Config &x, const Config &y) const
143*8975f5c5SAndroid Build Coastguard Worker {
144*8975f5c5SAndroid Build Coastguard Worker #define SORT(attribute) \
145*8975f5c5SAndroid Build Coastguard Worker do \
146*8975f5c5SAndroid Build Coastguard Worker { \
147*8975f5c5SAndroid Build Coastguard Worker if (x.attribute != y.attribute) \
148*8975f5c5SAndroid Build Coastguard Worker return x.attribute < y.attribute; \
149*8975f5c5SAndroid Build Coastguard Worker } while (0)
150*8975f5c5SAndroid Build Coastguard Worker
151*8975f5c5SAndroid Build Coastguard Worker static_assert(EGL_NONE < EGL_SLOW_CONFIG && EGL_SLOW_CONFIG < EGL_NON_CONFORMANT_CONFIG,
152*8975f5c5SAndroid Build Coastguard Worker "Unexpected EGL enum value.");
153*8975f5c5SAndroid Build Coastguard Worker SORT(configCaveat);
154*8975f5c5SAndroid Build Coastguard Worker
155*8975f5c5SAndroid Build Coastguard Worker static_assert(EGL_COLOR_COMPONENT_TYPE_FIXED_EXT < EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT,
156*8975f5c5SAndroid Build Coastguard Worker "Unexpected order of EGL enums.");
157*8975f5c5SAndroid Build Coastguard Worker SORT(colorComponentType);
158*8975f5c5SAndroid Build Coastguard Worker
159*8975f5c5SAndroid Build Coastguard Worker static_assert(EGL_RGB_BUFFER < EGL_LUMINANCE_BUFFER, "Unexpected EGL enum value.");
160*8975f5c5SAndroid Build Coastguard Worker SORT(colorBufferType);
161*8975f5c5SAndroid Build Coastguard Worker
162*8975f5c5SAndroid Build Coastguard Worker // By larger total number of color bits, only considering those that are requested to be >
163*8975f5c5SAndroid Build Coastguard Worker // 0.
164*8975f5c5SAndroid Build Coastguard Worker EGLint xComponentsSize = wantedComponentsSize(x);
165*8975f5c5SAndroid Build Coastguard Worker EGLint yComponentsSize = wantedComponentsSize(y);
166*8975f5c5SAndroid Build Coastguard Worker if (xComponentsSize != yComponentsSize)
167*8975f5c5SAndroid Build Coastguard Worker {
168*8975f5c5SAndroid Build Coastguard Worker return xComponentsSize > yComponentsSize;
169*8975f5c5SAndroid Build Coastguard Worker }
170*8975f5c5SAndroid Build Coastguard Worker
171*8975f5c5SAndroid Build Coastguard Worker SORT(bufferSize);
172*8975f5c5SAndroid Build Coastguard Worker SORT(sampleBuffers);
173*8975f5c5SAndroid Build Coastguard Worker SORT(samples);
174*8975f5c5SAndroid Build Coastguard Worker SORT(depthSize);
175*8975f5c5SAndroid Build Coastguard Worker SORT(stencilSize);
176*8975f5c5SAndroid Build Coastguard Worker SORT(alphaMaskSize);
177*8975f5c5SAndroid Build Coastguard Worker SORT(nativeVisualType);
178*8975f5c5SAndroid Build Coastguard Worker SORT(configID);
179*8975f5c5SAndroid Build Coastguard Worker
180*8975f5c5SAndroid Build Coastguard Worker #undef SORT
181*8975f5c5SAndroid Build Coastguard Worker
182*8975f5c5SAndroid Build Coastguard Worker return false;
183*8975f5c5SAndroid Build Coastguard Worker }
184*8975f5c5SAndroid Build Coastguard Worker
185*8975f5c5SAndroid Build Coastguard Worker private:
wantsComponent(const AttributeMap & attributeMap,EGLAttrib component)186*8975f5c5SAndroid Build Coastguard Worker static bool wantsComponent(const AttributeMap &attributeMap, EGLAttrib component)
187*8975f5c5SAndroid Build Coastguard Worker {
188*8975f5c5SAndroid Build Coastguard Worker // [EGL 1.5] section 3.4.1.2 page 30
189*8975f5c5SAndroid Build Coastguard Worker // Sorting rule #3: by larger total number of color bits, not considering
190*8975f5c5SAndroid Build Coastguard Worker // components that are 0 or don't-care.
191*8975f5c5SAndroid Build Coastguard Worker EGLAttrib value = attributeMap.get(component, 0);
192*8975f5c5SAndroid Build Coastguard Worker return value != 0 && value != EGL_DONT_CARE;
193*8975f5c5SAndroid Build Coastguard Worker }
194*8975f5c5SAndroid Build Coastguard Worker
scanForWantedComponents(const AttributeMap & attributeMap)195*8975f5c5SAndroid Build Coastguard Worker void scanForWantedComponents(const AttributeMap &attributeMap)
196*8975f5c5SAndroid Build Coastguard Worker {
197*8975f5c5SAndroid Build Coastguard Worker mWantRed = wantsComponent(attributeMap, EGL_RED_SIZE);
198*8975f5c5SAndroid Build Coastguard Worker mWantGreen = wantsComponent(attributeMap, EGL_GREEN_SIZE);
199*8975f5c5SAndroid Build Coastguard Worker mWantBlue = wantsComponent(attributeMap, EGL_BLUE_SIZE);
200*8975f5c5SAndroid Build Coastguard Worker mWantAlpha = wantsComponent(attributeMap, EGL_ALPHA_SIZE);
201*8975f5c5SAndroid Build Coastguard Worker mWantLuminance = wantsComponent(attributeMap, EGL_LUMINANCE_SIZE);
202*8975f5c5SAndroid Build Coastguard Worker }
203*8975f5c5SAndroid Build Coastguard Worker
wantedComponentsSize(const Config & config) const204*8975f5c5SAndroid Build Coastguard Worker EGLint wantedComponentsSize(const Config &config) const
205*8975f5c5SAndroid Build Coastguard Worker {
206*8975f5c5SAndroid Build Coastguard Worker EGLint total = 0;
207*8975f5c5SAndroid Build Coastguard Worker
208*8975f5c5SAndroid Build Coastguard Worker if (mWantRed)
209*8975f5c5SAndroid Build Coastguard Worker total += config.redSize;
210*8975f5c5SAndroid Build Coastguard Worker if (mWantGreen)
211*8975f5c5SAndroid Build Coastguard Worker total += config.greenSize;
212*8975f5c5SAndroid Build Coastguard Worker if (mWantBlue)
213*8975f5c5SAndroid Build Coastguard Worker total += config.blueSize;
214*8975f5c5SAndroid Build Coastguard Worker if (mWantAlpha)
215*8975f5c5SAndroid Build Coastguard Worker total += config.alphaSize;
216*8975f5c5SAndroid Build Coastguard Worker if (mWantLuminance)
217*8975f5c5SAndroid Build Coastguard Worker total += config.luminanceSize;
218*8975f5c5SAndroid Build Coastguard Worker
219*8975f5c5SAndroid Build Coastguard Worker return total;
220*8975f5c5SAndroid Build Coastguard Worker }
221*8975f5c5SAndroid Build Coastguard Worker
222*8975f5c5SAndroid Build Coastguard Worker bool mWantRed;
223*8975f5c5SAndroid Build Coastguard Worker bool mWantGreen;
224*8975f5c5SAndroid Build Coastguard Worker bool mWantBlue;
225*8975f5c5SAndroid Build Coastguard Worker bool mWantAlpha;
226*8975f5c5SAndroid Build Coastguard Worker bool mWantLuminance;
227*8975f5c5SAndroid Build Coastguard Worker };
228*8975f5c5SAndroid Build Coastguard Worker
filter(const AttributeMap & attributeMap) const229*8975f5c5SAndroid Build Coastguard Worker std::vector<const Config *> ConfigSet::filter(const AttributeMap &attributeMap) const
230*8975f5c5SAndroid Build Coastguard Worker {
231*8975f5c5SAndroid Build Coastguard Worker std::vector<const Config *> result;
232*8975f5c5SAndroid Build Coastguard Worker result.reserve(mConfigs.size());
233*8975f5c5SAndroid Build Coastguard Worker
234*8975f5c5SAndroid Build Coastguard Worker for (auto configIter = mConfigs.begin(); configIter != mConfigs.end(); configIter++)
235*8975f5c5SAndroid Build Coastguard Worker {
236*8975f5c5SAndroid Build Coastguard Worker const Config &config = configIter->second;
237*8975f5c5SAndroid Build Coastguard Worker bool match = true;
238*8975f5c5SAndroid Build Coastguard Worker
239*8975f5c5SAndroid Build Coastguard Worker for (auto attribIter = attributeMap.begin(); attribIter != attributeMap.end(); attribIter++)
240*8975f5c5SAndroid Build Coastguard Worker {
241*8975f5c5SAndroid Build Coastguard Worker EGLAttrib attributeKey = attribIter->first;
242*8975f5c5SAndroid Build Coastguard Worker EGLAttrib attributeValue = attribIter->second;
243*8975f5c5SAndroid Build Coastguard Worker
244*8975f5c5SAndroid Build Coastguard Worker if (attributeValue == EGL_DONT_CARE)
245*8975f5c5SAndroid Build Coastguard Worker {
246*8975f5c5SAndroid Build Coastguard Worker continue;
247*8975f5c5SAndroid Build Coastguard Worker }
248*8975f5c5SAndroid Build Coastguard Worker
249*8975f5c5SAndroid Build Coastguard Worker switch (attributeKey)
250*8975f5c5SAndroid Build Coastguard Worker {
251*8975f5c5SAndroid Build Coastguard Worker case EGL_BUFFER_SIZE:
252*8975f5c5SAndroid Build Coastguard Worker match = config.bufferSize >= attributeValue;
253*8975f5c5SAndroid Build Coastguard Worker break;
254*8975f5c5SAndroid Build Coastguard Worker case EGL_ALPHA_SIZE:
255*8975f5c5SAndroid Build Coastguard Worker match = config.alphaSize >= attributeValue;
256*8975f5c5SAndroid Build Coastguard Worker break;
257*8975f5c5SAndroid Build Coastguard Worker case EGL_BLUE_SIZE:
258*8975f5c5SAndroid Build Coastguard Worker match = config.blueSize >= attributeValue;
259*8975f5c5SAndroid Build Coastguard Worker break;
260*8975f5c5SAndroid Build Coastguard Worker case EGL_GREEN_SIZE:
261*8975f5c5SAndroid Build Coastguard Worker match = config.greenSize >= attributeValue;
262*8975f5c5SAndroid Build Coastguard Worker break;
263*8975f5c5SAndroid Build Coastguard Worker case EGL_RED_SIZE:
264*8975f5c5SAndroid Build Coastguard Worker match = config.redSize >= attributeValue;
265*8975f5c5SAndroid Build Coastguard Worker break;
266*8975f5c5SAndroid Build Coastguard Worker case EGL_DEPTH_SIZE:
267*8975f5c5SAndroid Build Coastguard Worker match = config.depthSize >= attributeValue;
268*8975f5c5SAndroid Build Coastguard Worker break;
269*8975f5c5SAndroid Build Coastguard Worker case EGL_STENCIL_SIZE:
270*8975f5c5SAndroid Build Coastguard Worker match = config.stencilSize >= attributeValue;
271*8975f5c5SAndroid Build Coastguard Worker break;
272*8975f5c5SAndroid Build Coastguard Worker case EGL_CONFIG_CAVEAT:
273*8975f5c5SAndroid Build Coastguard Worker match = config.configCaveat == static_cast<EGLenum>(attributeValue);
274*8975f5c5SAndroid Build Coastguard Worker break;
275*8975f5c5SAndroid Build Coastguard Worker case EGL_CONFIG_ID:
276*8975f5c5SAndroid Build Coastguard Worker match = config.configID == attributeValue;
277*8975f5c5SAndroid Build Coastguard Worker break;
278*8975f5c5SAndroid Build Coastguard Worker case EGL_LEVEL:
279*8975f5c5SAndroid Build Coastguard Worker match = config.level == attributeValue;
280*8975f5c5SAndroid Build Coastguard Worker break;
281*8975f5c5SAndroid Build Coastguard Worker case EGL_NATIVE_RENDERABLE:
282*8975f5c5SAndroid Build Coastguard Worker match = config.nativeRenderable == static_cast<EGLBoolean>(attributeValue);
283*8975f5c5SAndroid Build Coastguard Worker break;
284*8975f5c5SAndroid Build Coastguard Worker case EGL_NATIVE_VISUAL_TYPE:
285*8975f5c5SAndroid Build Coastguard Worker match = config.nativeVisualType == attributeValue;
286*8975f5c5SAndroid Build Coastguard Worker break;
287*8975f5c5SAndroid Build Coastguard Worker case EGL_SAMPLES:
288*8975f5c5SAndroid Build Coastguard Worker match = config.samples >= attributeValue;
289*8975f5c5SAndroid Build Coastguard Worker break;
290*8975f5c5SAndroid Build Coastguard Worker case EGL_SAMPLE_BUFFERS:
291*8975f5c5SAndroid Build Coastguard Worker match = config.sampleBuffers >= attributeValue;
292*8975f5c5SAndroid Build Coastguard Worker break;
293*8975f5c5SAndroid Build Coastguard Worker case EGL_SURFACE_TYPE:
294*8975f5c5SAndroid Build Coastguard Worker match = (config.surfaceType & attributeValue) == attributeValue;
295*8975f5c5SAndroid Build Coastguard Worker break;
296*8975f5c5SAndroid Build Coastguard Worker case EGL_TRANSPARENT_TYPE:
297*8975f5c5SAndroid Build Coastguard Worker match = config.transparentType == static_cast<EGLenum>(attributeValue);
298*8975f5c5SAndroid Build Coastguard Worker break;
299*8975f5c5SAndroid Build Coastguard Worker case EGL_TRANSPARENT_BLUE_VALUE:
300*8975f5c5SAndroid Build Coastguard Worker if (attributeMap.get(EGL_TRANSPARENT_TYPE, EGL_NONE) != EGL_NONE)
301*8975f5c5SAndroid Build Coastguard Worker {
302*8975f5c5SAndroid Build Coastguard Worker match = config.transparentBlueValue == attributeValue;
303*8975f5c5SAndroid Build Coastguard Worker }
304*8975f5c5SAndroid Build Coastguard Worker break;
305*8975f5c5SAndroid Build Coastguard Worker case EGL_TRANSPARENT_GREEN_VALUE:
306*8975f5c5SAndroid Build Coastguard Worker if (attributeMap.get(EGL_TRANSPARENT_TYPE, EGL_NONE) != EGL_NONE)
307*8975f5c5SAndroid Build Coastguard Worker {
308*8975f5c5SAndroid Build Coastguard Worker match = config.transparentGreenValue == attributeValue;
309*8975f5c5SAndroid Build Coastguard Worker }
310*8975f5c5SAndroid Build Coastguard Worker break;
311*8975f5c5SAndroid Build Coastguard Worker case EGL_TRANSPARENT_RED_VALUE:
312*8975f5c5SAndroid Build Coastguard Worker if (attributeMap.get(EGL_TRANSPARENT_TYPE, EGL_NONE) != EGL_NONE)
313*8975f5c5SAndroid Build Coastguard Worker {
314*8975f5c5SAndroid Build Coastguard Worker match = config.transparentRedValue == attributeValue;
315*8975f5c5SAndroid Build Coastguard Worker }
316*8975f5c5SAndroid Build Coastguard Worker break;
317*8975f5c5SAndroid Build Coastguard Worker case EGL_BIND_TO_TEXTURE_RGB:
318*8975f5c5SAndroid Build Coastguard Worker match = config.bindToTextureRGB == static_cast<EGLBoolean>(attributeValue);
319*8975f5c5SAndroid Build Coastguard Worker break;
320*8975f5c5SAndroid Build Coastguard Worker case EGL_BIND_TO_TEXTURE_RGBA:
321*8975f5c5SAndroid Build Coastguard Worker match = config.bindToTextureRGBA == static_cast<EGLBoolean>(attributeValue);
322*8975f5c5SAndroid Build Coastguard Worker break;
323*8975f5c5SAndroid Build Coastguard Worker case EGL_BIND_TO_TEXTURE_TARGET_ANGLE:
324*8975f5c5SAndroid Build Coastguard Worker match = config.bindToTextureTarget == static_cast<EGLenum>(attributeValue);
325*8975f5c5SAndroid Build Coastguard Worker break;
326*8975f5c5SAndroid Build Coastguard Worker case EGL_MIN_SWAP_INTERVAL:
327*8975f5c5SAndroid Build Coastguard Worker match = config.minSwapInterval == attributeValue;
328*8975f5c5SAndroid Build Coastguard Worker break;
329*8975f5c5SAndroid Build Coastguard Worker case EGL_MAX_SWAP_INTERVAL:
330*8975f5c5SAndroid Build Coastguard Worker match = config.maxSwapInterval == attributeValue;
331*8975f5c5SAndroid Build Coastguard Worker break;
332*8975f5c5SAndroid Build Coastguard Worker case EGL_LUMINANCE_SIZE:
333*8975f5c5SAndroid Build Coastguard Worker match = config.luminanceSize >= attributeValue;
334*8975f5c5SAndroid Build Coastguard Worker break;
335*8975f5c5SAndroid Build Coastguard Worker case EGL_ALPHA_MASK_SIZE:
336*8975f5c5SAndroid Build Coastguard Worker match = config.alphaMaskSize >= attributeValue;
337*8975f5c5SAndroid Build Coastguard Worker break;
338*8975f5c5SAndroid Build Coastguard Worker case EGL_COLOR_BUFFER_TYPE:
339*8975f5c5SAndroid Build Coastguard Worker match = config.colorBufferType == static_cast<EGLenum>(attributeValue);
340*8975f5c5SAndroid Build Coastguard Worker break;
341*8975f5c5SAndroid Build Coastguard Worker case EGL_RENDERABLE_TYPE:
342*8975f5c5SAndroid Build Coastguard Worker match = (config.renderableType & attributeValue) == attributeValue;
343*8975f5c5SAndroid Build Coastguard Worker break;
344*8975f5c5SAndroid Build Coastguard Worker case EGL_MATCH_NATIVE_PIXMAP:
345*8975f5c5SAndroid Build Coastguard Worker match = false;
346*8975f5c5SAndroid Build Coastguard Worker UNIMPLEMENTED();
347*8975f5c5SAndroid Build Coastguard Worker break;
348*8975f5c5SAndroid Build Coastguard Worker case EGL_CONFORMANT:
349*8975f5c5SAndroid Build Coastguard Worker match = (config.conformant & attributeValue) == attributeValue;
350*8975f5c5SAndroid Build Coastguard Worker break;
351*8975f5c5SAndroid Build Coastguard Worker case EGL_MAX_PBUFFER_WIDTH:
352*8975f5c5SAndroid Build Coastguard Worker match = config.maxPBufferWidth >= attributeValue;
353*8975f5c5SAndroid Build Coastguard Worker break;
354*8975f5c5SAndroid Build Coastguard Worker case EGL_MAX_PBUFFER_HEIGHT:
355*8975f5c5SAndroid Build Coastguard Worker match = config.maxPBufferHeight >= attributeValue;
356*8975f5c5SAndroid Build Coastguard Worker break;
357*8975f5c5SAndroid Build Coastguard Worker case EGL_MAX_PBUFFER_PIXELS:
358*8975f5c5SAndroid Build Coastguard Worker match = config.maxPBufferPixels >= attributeValue;
359*8975f5c5SAndroid Build Coastguard Worker break;
360*8975f5c5SAndroid Build Coastguard Worker case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
361*8975f5c5SAndroid Build Coastguard Worker match = config.optimalOrientation == attributeValue;
362*8975f5c5SAndroid Build Coastguard Worker break;
363*8975f5c5SAndroid Build Coastguard Worker case EGL_COLOR_COMPONENT_TYPE_EXT:
364*8975f5c5SAndroid Build Coastguard Worker match = config.colorComponentType == static_cast<EGLenum>(attributeValue);
365*8975f5c5SAndroid Build Coastguard Worker break;
366*8975f5c5SAndroid Build Coastguard Worker case EGL_RECORDABLE_ANDROID:
367*8975f5c5SAndroid Build Coastguard Worker match = config.recordable == static_cast<EGLBoolean>(attributeValue);
368*8975f5c5SAndroid Build Coastguard Worker break;
369*8975f5c5SAndroid Build Coastguard Worker case EGL_FRAMEBUFFER_TARGET_ANDROID:
370*8975f5c5SAndroid Build Coastguard Worker match = config.framebufferTarget == static_cast<EGLBoolean>(attributeValue);
371*8975f5c5SAndroid Build Coastguard Worker break;
372*8975f5c5SAndroid Build Coastguard Worker case EGL_Y_INVERTED_NOK:
373*8975f5c5SAndroid Build Coastguard Worker match = config.yInverted == static_cast<EGLBoolean>(attributeValue);
374*8975f5c5SAndroid Build Coastguard Worker break;
375*8975f5c5SAndroid Build Coastguard Worker case EGL_MATCH_FORMAT_KHR:
376*8975f5c5SAndroid Build Coastguard Worker if (attributeValue == EGL_NONE)
377*8975f5c5SAndroid Build Coastguard Worker {
378*8975f5c5SAndroid Build Coastguard Worker match = (config.surfaceType & EGL_LOCK_SURFACE_BIT_KHR) == 0;
379*8975f5c5SAndroid Build Coastguard Worker }
380*8975f5c5SAndroid Build Coastguard Worker else
381*8975f5c5SAndroid Build Coastguard Worker {
382*8975f5c5SAndroid Build Coastguard Worker match = config.matchFormat == attributeValue;
383*8975f5c5SAndroid Build Coastguard Worker }
384*8975f5c5SAndroid Build Coastguard Worker break;
385*8975f5c5SAndroid Build Coastguard Worker default:
386*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
387*8975f5c5SAndroid Build Coastguard Worker }
388*8975f5c5SAndroid Build Coastguard Worker
389*8975f5c5SAndroid Build Coastguard Worker if (!match)
390*8975f5c5SAndroid Build Coastguard Worker {
391*8975f5c5SAndroid Build Coastguard Worker break;
392*8975f5c5SAndroid Build Coastguard Worker }
393*8975f5c5SAndroid Build Coastguard Worker }
394*8975f5c5SAndroid Build Coastguard Worker
395*8975f5c5SAndroid Build Coastguard Worker if (match)
396*8975f5c5SAndroid Build Coastguard Worker {
397*8975f5c5SAndroid Build Coastguard Worker result.push_back(&config);
398*8975f5c5SAndroid Build Coastguard Worker }
399*8975f5c5SAndroid Build Coastguard Worker }
400*8975f5c5SAndroid Build Coastguard Worker
401*8975f5c5SAndroid Build Coastguard Worker // Sort the result
402*8975f5c5SAndroid Build Coastguard Worker std::sort(result.begin(), result.end(), ConfigSorter(attributeMap));
403*8975f5c5SAndroid Build Coastguard Worker
404*8975f5c5SAndroid Build Coastguard Worker return result;
405*8975f5c5SAndroid Build Coastguard Worker }
406*8975f5c5SAndroid Build Coastguard Worker
begin()407*8975f5c5SAndroid Build Coastguard Worker ConfigSet::ConfigMap::iterator ConfigSet::begin()
408*8975f5c5SAndroid Build Coastguard Worker {
409*8975f5c5SAndroid Build Coastguard Worker return mConfigs.begin();
410*8975f5c5SAndroid Build Coastguard Worker }
411*8975f5c5SAndroid Build Coastguard Worker
end()412*8975f5c5SAndroid Build Coastguard Worker ConfigSet::ConfigMap::iterator ConfigSet::end()
413*8975f5c5SAndroid Build Coastguard Worker {
414*8975f5c5SAndroid Build Coastguard Worker return mConfigs.end();
415*8975f5c5SAndroid Build Coastguard Worker }
416*8975f5c5SAndroid Build Coastguard Worker } // namespace egl
417