1 /*-------------------------------------------------------------------------
2 * drawElements Quality Program EGL Module
3 * ---------------------------------------
4 *
5 * Copyright 2014 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*!
20 * \file
21 * \brief Choose config reference implementation.
22 *//*--------------------------------------------------------------------*/
23
24 #include "teglChooseConfigReference.hpp"
25
26 #include "egluUtil.hpp"
27 #include "egluConfigInfo.hpp"
28 #include "egluStrUtil.hpp"
29 #include "eglwLibrary.hpp"
30 #include "eglwEnums.hpp"
31
32 #include "deSTLUtil.hpp"
33
34 #include <algorithm>
35 #include <vector>
36 #include <map>
37
38 namespace deqp
39 {
40 namespace egl
41 {
42
43 using namespace eglw;
44 using eglu::ConfigInfo;
45
46 enum Criteria
47 {
48 CRITERIA_AT_LEAST = 0,
49 CRITERIA_EXACT,
50 CRITERIA_MASK,
51 CRITERIA_SPECIAL,
52
53 CRITERIA_LAST
54 };
55
56 enum SortOrder
57 {
58 SORTORDER_NONE = 0,
59 SORTORDER_SMALLER,
60 SORTORDER_SPECIAL,
61
62 SORTORDER_LAST
63 };
64
65 struct AttribRule
66 {
67 EGLenum name;
68 EGLint value;
69 Criteria criteria;
70 SortOrder sortOrder;
71
AttribRuledeqp::egl::AttribRule72 AttribRule(void) : name(EGL_NONE), value(EGL_NONE), criteria(CRITERIA_LAST), sortOrder(SORTORDER_LAST)
73 {
74 }
75
AttribRuledeqp::egl::AttribRule76 AttribRule(EGLenum name_, EGLint value_, Criteria criteria_, SortOrder sortOrder_)
77 : name(name_)
78 , value(value_)
79 , criteria(criteria_)
80 , sortOrder(sortOrder_)
81 {
82 }
83 };
84
85 class SurfaceConfig
86 {
87 private:
getCaveatRank(EGLenum caveat)88 static int getCaveatRank(EGLenum caveat)
89 {
90 switch (caveat)
91 {
92 case EGL_NONE:
93 return 0;
94 case EGL_SLOW_CONFIG:
95 return 1;
96 case EGL_NON_CONFORMANT_CONFIG:
97 return 2;
98 default:
99 TCU_THROW(TestError,
100 (std::string("Unknown config caveat: ") + eglu::getConfigCaveatStr(caveat).toString()).c_str());
101 }
102 }
103
getColorBufferTypeRank(EGLenum type)104 static int getColorBufferTypeRank(EGLenum type)
105 {
106 switch (type)
107 {
108 case EGL_RGB_BUFFER:
109 return 0;
110 case EGL_LUMINANCE_BUFFER:
111 return 1;
112 case EGL_YUV_BUFFER_EXT:
113 return 2;
114 default:
115 TCU_THROW(
116 TestError,
117 (std::string("Unknown color buffer type: ") + eglu::getColorBufferTypeStr(type).toString()).c_str());
118 }
119 }
120
getYuvOrderRank(EGLenum order)121 static int getYuvOrderRank(EGLenum order)
122 {
123 switch (order)
124 {
125 case EGL_NONE:
126 return 0;
127 case EGL_YUV_ORDER_YUV_EXT:
128 return 1;
129 case EGL_YUV_ORDER_YVU_EXT:
130 return 2;
131 case EGL_YUV_ORDER_YUYV_EXT:
132 return 3;
133 case EGL_YUV_ORDER_YVYU_EXT:
134 return 4;
135 case EGL_YUV_ORDER_UYVY_EXT:
136 return 5;
137 case EGL_YUV_ORDER_VYUY_EXT:
138 return 6;
139 case EGL_YUV_ORDER_AYUV_EXT:
140 return 7;
141 default:
142 TCU_THROW(TestError, (std::string("Unknown YUV order: ") + eglu::getYuvOrderStr(order).toString()).c_str());
143 }
144 }
145
getYuvPlaneBppValue(EGLenum bpp)146 static int getYuvPlaneBppValue(EGLenum bpp)
147 {
148 switch (bpp)
149 {
150 case EGL_YUV_PLANE_BPP_0_EXT:
151 return 0;
152 case EGL_YUV_PLANE_BPP_8_EXT:
153 return 8;
154 case EGL_YUV_PLANE_BPP_10_EXT:
155 return 10;
156 default:
157 TCU_THROW(TestError,
158 (std::string("Unknown YUV plane BPP: ") + eglu::getYuvPlaneBppStr(bpp).toString()).c_str());
159 }
160 }
161
getColorComponentTypeRank(EGLenum compType)162 static int getColorComponentTypeRank(EGLenum compType)
163 {
164 switch (compType)
165 {
166 case EGL_COLOR_COMPONENT_TYPE_FIXED_EXT:
167 return 0;
168 case EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT:
169 return 1;
170 default:
171 TCU_THROW(TestError, (std::string("Unknown color component type: ") +
172 eglu::getColorComponentTypeStr(compType).toString())
173 .c_str());
174 }
175 }
176
177 typedef bool (*CompareFunc)(const SurfaceConfig &a, const SurfaceConfig &b);
178
compareCaveat(const SurfaceConfig & a,const SurfaceConfig & b)179 static bool compareCaveat(const SurfaceConfig &a, const SurfaceConfig &b)
180 {
181 return getCaveatRank((EGLenum)a.m_info.configCaveat) < getCaveatRank((EGLenum)b.m_info.configCaveat);
182 }
183
compareColorBufferType(const SurfaceConfig & a,const SurfaceConfig & b)184 static bool compareColorBufferType(const SurfaceConfig &a, const SurfaceConfig &b)
185 {
186 return getColorBufferTypeRank((EGLenum)a.m_info.colorBufferType) <
187 getColorBufferTypeRank((EGLenum)b.m_info.colorBufferType);
188 }
189
compareYuvOrder(const SurfaceConfig & a,const SurfaceConfig & b)190 static bool compareYuvOrder(const SurfaceConfig &a, const SurfaceConfig &b)
191 {
192 return getYuvOrderRank((EGLenum)a.m_info.yuvOrder) < getYuvOrderRank((EGLenum)b.m_info.yuvOrder);
193 }
194
compareColorComponentType(const SurfaceConfig & a,const SurfaceConfig & b)195 static bool compareColorComponentType(const SurfaceConfig &a, const SurfaceConfig &b)
196 {
197 return getColorComponentTypeRank((EGLenum)a.m_info.colorComponentType) <
198 getColorComponentTypeRank((EGLenum)b.m_info.colorComponentType);
199 }
200
compareColorBufferBits(const SurfaceConfig & a,const SurfaceConfig & b,const tcu::BVec4 & specifiedRGBColors,const tcu::BVec2 & specifiedLuminanceColors,bool yuvPlaneBppSpecified)201 static bool compareColorBufferBits(const SurfaceConfig &a, const SurfaceConfig &b,
202 const tcu::BVec4 &specifiedRGBColors, const tcu::BVec2 &specifiedLuminanceColors,
203 bool yuvPlaneBppSpecified)
204 {
205 DE_ASSERT(a.m_info.colorBufferType == b.m_info.colorBufferType);
206 switch (a.m_info.colorBufferType)
207 {
208 case EGL_RGB_BUFFER:
209 {
210 const tcu::IVec4 mask(specifiedRGBColors.cast<int32_t>());
211
212 return (a.m_info.redSize * mask[0] + a.m_info.greenSize * mask[1] + a.m_info.blueSize * mask[2] +
213 a.m_info.alphaSize * mask[3]) > (b.m_info.redSize * mask[0] + b.m_info.greenSize * mask[1] +
214 b.m_info.blueSize * mask[2] + b.m_info.alphaSize * mask[3]);
215 }
216
217 case EGL_LUMINANCE_BUFFER:
218 {
219 const tcu::IVec2 mask(specifiedLuminanceColors.cast<int32_t>());
220
221 return (a.m_info.luminanceSize * mask[0] + a.m_info.alphaSize * mask[1]) >
222 (b.m_info.luminanceSize * mask[0] + b.m_info.alphaSize * mask[1]);
223 }
224
225 case EGL_YUV_BUFFER_EXT:
226 return yuvPlaneBppSpecified ? (a.m_info.yuvPlaneBpp > b.m_info.yuvPlaneBpp) : false;
227
228 default:
229 DE_ASSERT(false);
230 return true;
231 }
232 }
233
234 template <EGLenum Attribute>
compareAttributeSmaller(const SurfaceConfig & a,const SurfaceConfig & b)235 static bool compareAttributeSmaller(const SurfaceConfig &a, const SurfaceConfig &b)
236 {
237 return a.getAttribute(Attribute) < b.getAttribute(Attribute);
238 }
239
240 public:
SurfaceConfig(EGLConfig config,ConfigInfo & info)241 SurfaceConfig(EGLConfig config, ConfigInfo &info) : m_config(config), m_info(info)
242 {
243 }
244
getEglConfig(void) const245 EGLConfig getEglConfig(void) const
246 {
247 return m_config;
248 }
249
getAttribute(const EGLenum attribute) const250 EGLint getAttribute(const EGLenum attribute) const
251 {
252 return m_info.getAttribute(attribute);
253 }
254
operator ==(const SurfaceConfig & a,const SurfaceConfig & b)255 friend bool operator==(const SurfaceConfig &a, const SurfaceConfig &b)
256 {
257 const std::map<EGLenum, AttribRule> defaultRules = getDefaultRules();
258
259 for (std::map<EGLenum, AttribRule>::const_iterator iter = defaultRules.begin(); iter != defaultRules.end();
260 iter++)
261 {
262 const EGLenum attribute = iter->first;
263
264 if (a.getAttribute(attribute) != b.getAttribute(attribute))
265 return false;
266 }
267 return true;
268 }
269
compareTo(const SurfaceConfig & b,const tcu::BVec4 & specifiedRGBColors,const tcu::BVec2 & specifiedLuminanceColors,bool yuvPlaneBppSpecified) const270 bool compareTo(const SurfaceConfig &b, const tcu::BVec4 &specifiedRGBColors,
271 const tcu::BVec2 &specifiedLuminanceColors, bool yuvPlaneBppSpecified) const
272 {
273 static const SurfaceConfig::CompareFunc compareFuncs[] = {
274 SurfaceConfig::compareAttributeSmaller<EGL_CONFIG_SELECT_GROUP_EXT>,
275 SurfaceConfig::compareCaveat,
276 SurfaceConfig::compareColorComponentType,
277 SurfaceConfig::compareColorBufferType,
278 nullptr, // SurfaceConfig::compareColorBufferBits,
279 SurfaceConfig::compareAttributeSmaller<EGL_BUFFER_SIZE>,
280 SurfaceConfig::compareAttributeSmaller<EGL_SAMPLE_BUFFERS>,
281 SurfaceConfig::compareAttributeSmaller<EGL_SAMPLES>,
282 SurfaceConfig::compareAttributeSmaller<EGL_DEPTH_SIZE>,
283 SurfaceConfig::compareAttributeSmaller<EGL_STENCIL_SIZE>,
284 SurfaceConfig::compareAttributeSmaller<EGL_ALPHA_MASK_SIZE>,
285 SurfaceConfig::compareYuvOrder,
286 SurfaceConfig::compareAttributeSmaller<EGL_CONFIG_ID>};
287
288 if (*this == b)
289 return false; // std::sort() can compare object to itself.
290
291 for (int ndx = 0; ndx < (int)DE_LENGTH_OF_ARRAY(compareFuncs); ndx++)
292 {
293 if (!compareFuncs[ndx])
294 {
295 if (compareColorBufferBits(*this, b, specifiedRGBColors, specifiedLuminanceColors,
296 yuvPlaneBppSpecified))
297 return true;
298 else if (compareColorBufferBits(b, *this, specifiedRGBColors, specifiedLuminanceColors,
299 yuvPlaneBppSpecified))
300 return false;
301
302 continue;
303 }
304
305 if (compareFuncs[ndx](*this, b))
306 return true;
307 else if (compareFuncs[ndx](b, *this))
308 return false;
309 }
310
311 TCU_FAIL("Unable to compare configs - duplicate ID?");
312 }
313
getDefaultRules(void)314 static std::map<EGLenum, AttribRule> getDefaultRules(void)
315 {
316 // \todo [2011-03-24 pyry] From EGL 1.4 spec - check that this is valid for other versions as well
317 std::map<EGLenum, AttribRule> rules;
318
319 // Attribute Default Selection Criteria Sort Order Sort Priority
320 rules[EGL_BUFFER_SIZE] = AttribRule(EGL_BUFFER_SIZE, 0, CRITERIA_AT_LEAST, SORTORDER_SMALLER); // 4
321 rules[EGL_RED_SIZE] = AttribRule(EGL_RED_SIZE, 0, CRITERIA_AT_LEAST, SORTORDER_SPECIAL); // 3
322 rules[EGL_GREEN_SIZE] = AttribRule(EGL_GREEN_SIZE, 0, CRITERIA_AT_LEAST, SORTORDER_SPECIAL); // 3
323 rules[EGL_BLUE_SIZE] = AttribRule(EGL_BLUE_SIZE, 0, CRITERIA_AT_LEAST, SORTORDER_SPECIAL); // 3
324 rules[EGL_LUMINANCE_SIZE] = AttribRule(EGL_LUMINANCE_SIZE, 0, CRITERIA_AT_LEAST, SORTORDER_SPECIAL); // 3
325 rules[EGL_ALPHA_SIZE] = AttribRule(EGL_ALPHA_SIZE, 0, CRITERIA_AT_LEAST, SORTORDER_SPECIAL); // 3
326 rules[EGL_ALPHA_MASK_SIZE] = AttribRule(EGL_ALPHA_MASK_SIZE, 0, CRITERIA_AT_LEAST, SORTORDER_SMALLER); // 9
327 rules[EGL_BIND_TO_TEXTURE_RGB] =
328 AttribRule(EGL_BIND_TO_TEXTURE_RGB, EGL_DONT_CARE, CRITERIA_EXACT, SORTORDER_NONE);
329 rules[EGL_BIND_TO_TEXTURE_RGBA] =
330 AttribRule(EGL_BIND_TO_TEXTURE_RGBA, EGL_DONT_CARE, CRITERIA_EXACT, SORTORDER_NONE);
331 rules[EGL_COLOR_BUFFER_TYPE] =
332 AttribRule(EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER, CRITERIA_EXACT, SORTORDER_NONE); // 2
333 rules[EGL_CONFIG_CAVEAT] =
334 AttribRule(EGL_CONFIG_CAVEAT, EGL_DONT_CARE, CRITERIA_EXACT, SORTORDER_SPECIAL); // 1
335 rules[EGL_CONFIG_ID] = AttribRule(EGL_CONFIG_ID, EGL_DONT_CARE, CRITERIA_EXACT, SORTORDER_SMALLER); // 11
336 rules[EGL_CONFORMANT] = AttribRule(EGL_CONFORMANT, 0, CRITERIA_MASK, SORTORDER_NONE);
337 rules[EGL_DEPTH_SIZE] = AttribRule(EGL_DEPTH_SIZE, 0, CRITERIA_AT_LEAST, SORTORDER_SMALLER); // 7
338 rules[EGL_LEVEL] = AttribRule(EGL_LEVEL, 0, CRITERIA_EXACT, SORTORDER_NONE);
339 rules[EGL_MAX_SWAP_INTERVAL] = AttribRule(EGL_MAX_SWAP_INTERVAL, EGL_DONT_CARE, CRITERIA_EXACT, SORTORDER_NONE);
340 rules[EGL_MIN_SWAP_INTERVAL] = AttribRule(EGL_MIN_SWAP_INTERVAL, EGL_DONT_CARE, CRITERIA_EXACT, SORTORDER_NONE);
341 rules[EGL_NATIVE_RENDERABLE] = AttribRule(EGL_NATIVE_RENDERABLE, EGL_DONT_CARE, CRITERIA_EXACT, SORTORDER_NONE);
342 rules[EGL_NATIVE_VISUAL_TYPE] =
343 AttribRule(EGL_NATIVE_VISUAL_TYPE, EGL_DONT_CARE, CRITERIA_EXACT, SORTORDER_SPECIAL); // 10
344 rules[EGL_RENDERABLE_TYPE] = AttribRule(EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT, CRITERIA_MASK, SORTORDER_NONE);
345 rules[EGL_SAMPLE_BUFFERS] = AttribRule(EGL_SAMPLE_BUFFERS, 0, CRITERIA_AT_LEAST, SORTORDER_SMALLER); // 5
346 rules[EGL_SAMPLES] = AttribRule(EGL_SAMPLES, 0, CRITERIA_AT_LEAST, SORTORDER_SMALLER); // 6
347 rules[EGL_STENCIL_SIZE] = AttribRule(EGL_STENCIL_SIZE, 0, CRITERIA_AT_LEAST, SORTORDER_SMALLER); // 8
348 rules[EGL_SURFACE_TYPE] = AttribRule(EGL_SURFACE_TYPE, EGL_WINDOW_BIT, CRITERIA_MASK, SORTORDER_NONE);
349 rules[EGL_TRANSPARENT_TYPE] = AttribRule(EGL_TRANSPARENT_TYPE, EGL_NONE, CRITERIA_EXACT, SORTORDER_NONE);
350 rules[EGL_TRANSPARENT_RED_VALUE] =
351 AttribRule(EGL_TRANSPARENT_RED_VALUE, EGL_DONT_CARE, CRITERIA_EXACT, SORTORDER_NONE);
352 rules[EGL_TRANSPARENT_GREEN_VALUE] =
353 AttribRule(EGL_TRANSPARENT_GREEN_VALUE, EGL_DONT_CARE, CRITERIA_EXACT, SORTORDER_NONE);
354 rules[EGL_TRANSPARENT_BLUE_VALUE] =
355 AttribRule(EGL_TRANSPARENT_BLUE_VALUE, EGL_DONT_CARE, CRITERIA_EXACT, SORTORDER_NONE);
356
357 // EGL_EXT_yuv_surface
358 rules[EGL_YUV_ORDER_EXT] = AttribRule(EGL_YUV_ORDER_EXT, EGL_DONT_CARE, CRITERIA_EXACT, SORTORDER_SPECIAL);
359 rules[EGL_YUV_NUMBER_OF_PLANES_EXT] =
360 AttribRule(EGL_YUV_NUMBER_OF_PLANES_EXT, EGL_DONT_CARE, CRITERIA_EXACT, SORTORDER_NONE);
361 rules[EGL_YUV_SUBSAMPLE_EXT] = AttribRule(EGL_YUV_SUBSAMPLE_EXT, EGL_DONT_CARE, CRITERIA_EXACT, SORTORDER_NONE);
362 rules[EGL_YUV_DEPTH_RANGE_EXT] =
363 AttribRule(EGL_YUV_DEPTH_RANGE_EXT, EGL_DONT_CARE, CRITERIA_EXACT, SORTORDER_NONE);
364 rules[EGL_YUV_CSC_STANDARD_EXT] =
365 AttribRule(EGL_YUV_CSC_STANDARD_EXT, EGL_DONT_CARE, CRITERIA_EXACT, SORTORDER_NONE);
366 rules[EGL_YUV_PLANE_BPP_EXT] =
367 AttribRule(EGL_YUV_PLANE_BPP_EXT, EGL_DONT_CARE, CRITERIA_AT_LEAST, SORTORDER_SPECIAL); // 3
368
369 // EGL_EXT_pixel_format_float
370 rules[EGL_COLOR_COMPONENT_TYPE_EXT] =
371 AttribRule(EGL_COLOR_COMPONENT_TYPE_EXT, EGL_COLOR_COMPONENT_TYPE_FIXED_EXT, CRITERIA_EXACT,
372 SORTORDER_SPECIAL); // 2
373
374 // EGL_ANDROID_recordable
375 rules[EGL_RECORDABLE_ANDROID] =
376 AttribRule(EGL_RECORDABLE_ANDROID, EGL_DONT_CARE, CRITERIA_EXACT, SORTORDER_NONE);
377
378 // EGL_EXT_config_select_group
379 rules[EGL_CONFIG_SELECT_GROUP_EXT] =
380 AttribRule(EGL_CONFIG_SELECT_GROUP_EXT, EGL_DONT_CARE, CRITERIA_SPECIAL, SORTORDER_SMALLER); // 0
381
382 return rules;
383 }
384
385 private:
386 EGLConfig m_config;
387 ConfigInfo m_info;
388 };
389
390 class CompareConfigs
391 {
392 public:
CompareConfigs(const tcu::BVec4 & specifiedRGBColors,const tcu::BVec2 & specifiedLuminanceColors,bool yuvPlaneBppSpecified)393 CompareConfigs(const tcu::BVec4 &specifiedRGBColors, const tcu::BVec2 &specifiedLuminanceColors,
394 bool yuvPlaneBppSpecified)
395 : m_specifiedRGBColors(specifiedRGBColors)
396 , m_specifiedLuminanceColors(specifiedLuminanceColors)
397 , m_yuvPlaneBppSpecified(yuvPlaneBppSpecified)
398 {
399 }
400
operator ()(const SurfaceConfig & a,const SurfaceConfig & b)401 bool operator()(const SurfaceConfig &a, const SurfaceConfig &b)
402 {
403 return a.compareTo(b, m_specifiedRGBColors, m_specifiedLuminanceColors, m_yuvPlaneBppSpecified);
404 }
405
406 private:
407 const tcu::BVec4 m_specifiedRGBColors;
408 const tcu::BVec2 m_specifiedLuminanceColors;
409 const bool m_yuvPlaneBppSpecified;
410 };
411
412 class ConfigFilter
413 {
414 private:
415 std::map<EGLenum, AttribRule> m_rules;
416
417 public:
ConfigFilter()418 ConfigFilter() : m_rules(SurfaceConfig::getDefaultRules())
419 {
420 }
421
setValue(EGLenum name,EGLint value)422 void setValue(EGLenum name, EGLint value)
423 {
424 DE_ASSERT(de::contains(m_rules, name));
425 m_rules[name].value = value;
426 }
427
setValues(std::vector<std::pair<EGLenum,EGLint>> values)428 void setValues(std::vector<std::pair<EGLenum, EGLint>> values)
429 {
430 for (size_t ndx = 0; ndx < values.size(); ndx++)
431 {
432 const EGLenum name = values[ndx].first;
433 const EGLint value = values[ndx].second;
434
435 setValue(name, value);
436 }
437 }
438
getAttribute(EGLenum name) const439 AttribRule getAttribute(EGLenum name) const
440 {
441 DE_ASSERT(de::contains(m_rules, name));
442 return m_rules.find(name)->second;
443 }
444
isMatch(const SurfaceConfig & config) const445 bool isMatch(const SurfaceConfig &config) const
446 {
447 bool match = true;
448 for (std::map<EGLenum, AttribRule>::const_iterator iter = m_rules.begin(); iter != m_rules.end(); iter++)
449 {
450 const AttribRule rule = iter->second;
451
452 if (rule.value == EGL_DONT_CARE)
453 continue;
454 else if (rule.name == EGL_MATCH_NATIVE_PIXMAP)
455 TCU_CHECK(rule.value == EGL_NONE); // Not supported
456 else if (rule.name == EGL_TRANSPARENT_RED_VALUE || rule.name == EGL_TRANSPARENT_GREEN_VALUE ||
457 rule.name == EGL_TRANSPARENT_BLUE_VALUE)
458 continue;
459 else
460 {
461 const EGLint cfgValue = config.getAttribute(rule.name);
462
463 if (rule.name == EGL_CONFIG_ID)
464 return (rule.value == cfgValue);
465
466 switch (rule.criteria)
467 {
468 case CRITERIA_EXACT:
469 if (rule.value != cfgValue)
470 match = false;
471 break;
472
473 case CRITERIA_AT_LEAST:
474 if (rule.value > cfgValue)
475 match = false;
476 break;
477
478 case CRITERIA_MASK:
479 if ((rule.value & cfgValue) != rule.value)
480 match = false;
481 break;
482
483 default:
484 TCU_FAIL("Unknown criteria");
485 }
486 }
487 }
488
489 return match;
490 }
491
getSpecifiedRGBColors(void) const492 tcu::BVec4 getSpecifiedRGBColors(void) const
493 {
494 const EGLenum bitAttribs[] = {EGL_RED_SIZE, EGL_GREEN_SIZE, EGL_BLUE_SIZE, EGL_ALPHA_SIZE};
495
496 tcu::BVec4 result;
497
498 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(bitAttribs); ndx++)
499 {
500 const EGLenum attrib = bitAttribs[ndx];
501 const EGLint value = getAttribute(attrib).value;
502
503 if (value != 0 && value != EGL_DONT_CARE)
504 result[ndx] = true;
505 else
506 result[ndx] = false;
507 }
508
509 return result;
510 }
511
getSpecifiedLuminanceColors(void) const512 tcu::BVec2 getSpecifiedLuminanceColors(void) const
513 {
514 const EGLenum bitAttribs[] = {EGL_LUMINANCE_SIZE, EGL_ALPHA_SIZE};
515
516 tcu::BVec2 result;
517
518 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(bitAttribs); ndx++)
519 {
520 const EGLenum attrib = bitAttribs[ndx];
521 const EGLint value = getAttribute(attrib).value;
522
523 if (value != 0 && value != EGL_DONT_CARE)
524 result[ndx] = true;
525 else
526 result[ndx] = false;
527 }
528
529 return result;
530 }
531
isYuvPlaneBppSpecified(void) const532 bool isYuvPlaneBppSpecified(void) const
533 {
534 const EGLenum attrib = EGL_YUV_PLANE_BPP_EXT;
535 const EGLint value = getAttribute(attrib).value;
536
537 return (value != 0) && (value != EGL_DONT_CARE);
538 }
539
filter(const std::vector<SurfaceConfig> & configs) const540 std::vector<SurfaceConfig> filter(const std::vector<SurfaceConfig> &configs) const
541 {
542 std::vector<SurfaceConfig> out;
543
544 for (std::vector<SurfaceConfig>::const_iterator iter = configs.begin(); iter != configs.end(); iter++)
545 {
546 if (isMatch(*iter))
547 out.push_back(*iter);
548 }
549
550 return out;
551 }
552 };
553
chooseConfigReference(const Library & egl,EGLDisplay display,std::vector<EGLConfig> & dst,const std::vector<std::pair<EGLenum,EGLint>> & attributes)554 void chooseConfigReference(const Library &egl, EGLDisplay display, std::vector<EGLConfig> &dst,
555 const std::vector<std::pair<EGLenum, EGLint>> &attributes)
556 {
557 // Get all configs
558 std::vector<EGLConfig> eglConfigs = eglu::getConfigs(egl, display);
559
560 // Config infos - including extension attributes
561 std::vector<ConfigInfo> configInfos;
562 configInfos.resize(eglConfigs.size());
563
564 for (size_t ndx = 0; ndx < eglConfigs.size(); ndx++)
565 {
566 eglu::queryCoreConfigInfo(egl, display, eglConfigs[ndx], &configInfos[ndx]);
567 eglu::queryExtConfigInfo(egl, display, eglConfigs[ndx], &configInfos[ndx]);
568 }
569
570 // Pair configs with info
571 std::vector<SurfaceConfig> configs;
572 for (size_t ndx = 0; ndx < eglConfigs.size(); ndx++)
573 configs.push_back(SurfaceConfig(eglConfigs[ndx], configInfos[ndx]));
574
575 // Filter configs
576 ConfigFilter configFilter;
577 configFilter.setValues(attributes);
578
579 std::vector<SurfaceConfig> filteredConfigs = configFilter.filter(configs);
580
581 // Sort configs
582 std::sort(filteredConfigs.begin(), filteredConfigs.end(),
583 CompareConfigs(configFilter.getSpecifiedRGBColors(), configFilter.getSpecifiedLuminanceColors(),
584 configFilter.isYuvPlaneBppSpecified()));
585
586 // Write to dst list
587 dst.resize(filteredConfigs.size());
588 for (size_t ndx = 0; ndx < filteredConfigs.size(); ndx++)
589 dst[ndx] = filteredConfigs[ndx].getEglConfig();
590 }
591
592 } // namespace egl
593 } // namespace deqp
594