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