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