1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 3.0 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 Implementation-defined limit tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es3fImplementationLimitTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluDefs.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluStrUtil.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
29*35238bceSAndroid Build Coastguard Worker
30*35238bceSAndroid Build Coastguard Worker #include <vector>
31*35238bceSAndroid Build Coastguard Worker #include <set>
32*35238bceSAndroid Build Coastguard Worker #include <algorithm>
33*35238bceSAndroid Build Coastguard Worker #include <iterator>
34*35238bceSAndroid Build Coastguard Worker #include <limits>
35*35238bceSAndroid Build Coastguard Worker
36*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
37*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
38*35238bceSAndroid Build Coastguard Worker
39*35238bceSAndroid Build Coastguard Worker namespace deqp
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker namespace gles3
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker namespace Functional
44*35238bceSAndroid Build Coastguard Worker {
45*35238bceSAndroid Build Coastguard Worker
46*35238bceSAndroid Build Coastguard Worker using std::set;
47*35238bceSAndroid Build Coastguard Worker using std::string;
48*35238bceSAndroid Build Coastguard Worker using std::vector;
49*35238bceSAndroid Build Coastguard Worker using namespace glw; // GL types
50*35238bceSAndroid Build Coastguard Worker
51*35238bceSAndroid Build Coastguard Worker namespace LimitQuery
52*35238bceSAndroid Build Coastguard Worker {
53*35238bceSAndroid Build Coastguard Worker
54*35238bceSAndroid Build Coastguard Worker // Query function template.
55*35238bceSAndroid Build Coastguard Worker template <typename T>
56*35238bceSAndroid Build Coastguard Worker T query(const glw::Functions &gl, uint32_t param);
57*35238bceSAndroid Build Coastguard Worker
58*35238bceSAndroid Build Coastguard Worker // Compare template.
59*35238bceSAndroid Build Coastguard Worker template <typename T>
compare(const T & min,const T & reported)60*35238bceSAndroid Build Coastguard Worker inline bool compare(const T &min, const T &reported)
61*35238bceSAndroid Build Coastguard Worker {
62*35238bceSAndroid Build Coastguard Worker return min <= reported;
63*35238bceSAndroid Build Coastguard Worker }
64*35238bceSAndroid Build Coastguard Worker
65*35238bceSAndroid Build Coastguard Worker // Types for queries
66*35238bceSAndroid Build Coastguard Worker
67*35238bceSAndroid Build Coastguard Worker struct NegInt
68*35238bceSAndroid Build Coastguard Worker {
69*35238bceSAndroid Build Coastguard Worker GLint value;
NegIntdeqp::gles3::Functional::LimitQuery::NegInt70*35238bceSAndroid Build Coastguard Worker NegInt(GLint value_) : value(value_)
71*35238bceSAndroid Build Coastguard Worker {
72*35238bceSAndroid Build Coastguard Worker }
73*35238bceSAndroid Build Coastguard Worker };
74*35238bceSAndroid Build Coastguard Worker
operator <<(std::ostream & str,const NegInt & v)75*35238bceSAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &str, const NegInt &v)
76*35238bceSAndroid Build Coastguard Worker {
77*35238bceSAndroid Build Coastguard Worker return str << v.value;
78*35238bceSAndroid Build Coastguard Worker }
79*35238bceSAndroid Build Coastguard Worker
80*35238bceSAndroid Build Coastguard Worker struct FloatRange
81*35238bceSAndroid Build Coastguard Worker {
82*35238bceSAndroid Build Coastguard Worker float min;
83*35238bceSAndroid Build Coastguard Worker float max;
FloatRangedeqp::gles3::Functional::LimitQuery::FloatRange84*35238bceSAndroid Build Coastguard Worker FloatRange(float min_, float max_) : min(min_), max(max_)
85*35238bceSAndroid Build Coastguard Worker {
86*35238bceSAndroid Build Coastguard Worker }
87*35238bceSAndroid Build Coastguard Worker };
88*35238bceSAndroid Build Coastguard Worker
operator <<(std::ostream & str,const FloatRange & range)89*35238bceSAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &str, const FloatRange &range)
90*35238bceSAndroid Build Coastguard Worker {
91*35238bceSAndroid Build Coastguard Worker return str << range.min << ", " << range.max;
92*35238bceSAndroid Build Coastguard Worker }
93*35238bceSAndroid Build Coastguard Worker
94*35238bceSAndroid Build Coastguard Worker struct AlignmentInt
95*35238bceSAndroid Build Coastguard Worker {
96*35238bceSAndroid Build Coastguard Worker GLint value;
AlignmentIntdeqp::gles3::Functional::LimitQuery::AlignmentInt97*35238bceSAndroid Build Coastguard Worker AlignmentInt(GLint value_) : value(value_)
98*35238bceSAndroid Build Coastguard Worker {
99*35238bceSAndroid Build Coastguard Worker }
100*35238bceSAndroid Build Coastguard Worker };
101*35238bceSAndroid Build Coastguard Worker
operator <<(std::ostream & str,const AlignmentInt & v)102*35238bceSAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &str, const AlignmentInt &v)
103*35238bceSAndroid Build Coastguard Worker {
104*35238bceSAndroid Build Coastguard Worker return str << v.value;
105*35238bceSAndroid Build Coastguard Worker }
106*35238bceSAndroid Build Coastguard Worker
107*35238bceSAndroid Build Coastguard Worker // For custom formatting
108*35238bceSAndroid Build Coastguard Worker struct Boolean
109*35238bceSAndroid Build Coastguard Worker {
110*35238bceSAndroid Build Coastguard Worker GLboolean value;
Booleandeqp::gles3::Functional::LimitQuery::Boolean111*35238bceSAndroid Build Coastguard Worker Boolean(GLboolean value_) : value(value_)
112*35238bceSAndroid Build Coastguard Worker {
113*35238bceSAndroid Build Coastguard Worker }
114*35238bceSAndroid Build Coastguard Worker };
115*35238bceSAndroid Build Coastguard Worker
operator <<(std::ostream & str,const Boolean & boolean)116*35238bceSAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &str, const Boolean &boolean)
117*35238bceSAndroid Build Coastguard Worker {
118*35238bceSAndroid Build Coastguard Worker return str << (boolean.value ? "GL_TRUE" : "GL_FALSE");
119*35238bceSAndroid Build Coastguard Worker }
120*35238bceSAndroid Build Coastguard Worker
121*35238bceSAndroid Build Coastguard Worker // Query function implementations.
122*35238bceSAndroid Build Coastguard Worker template <>
query(const glw::Functions & gl,uint32_t param)123*35238bceSAndroid Build Coastguard Worker GLint query<GLint>(const glw::Functions &gl, uint32_t param)
124*35238bceSAndroid Build Coastguard Worker {
125*35238bceSAndroid Build Coastguard Worker GLint val = -1;
126*35238bceSAndroid Build Coastguard Worker gl.getIntegerv(param, &val);
127*35238bceSAndroid Build Coastguard Worker return val;
128*35238bceSAndroid Build Coastguard Worker }
129*35238bceSAndroid Build Coastguard Worker
130*35238bceSAndroid Build Coastguard Worker template <>
query(const glw::Functions & gl,uint32_t param)131*35238bceSAndroid Build Coastguard Worker GLint64 query<GLint64>(const glw::Functions &gl, uint32_t param)
132*35238bceSAndroid Build Coastguard Worker {
133*35238bceSAndroid Build Coastguard Worker GLint64 val = -1;
134*35238bceSAndroid Build Coastguard Worker gl.getInteger64v(param, &val);
135*35238bceSAndroid Build Coastguard Worker return val;
136*35238bceSAndroid Build Coastguard Worker }
137*35238bceSAndroid Build Coastguard Worker
138*35238bceSAndroid Build Coastguard Worker template <>
query(const glw::Functions & gl,uint32_t param)139*35238bceSAndroid Build Coastguard Worker GLuint64 query<GLuint64>(const glw::Functions &gl, uint32_t param)
140*35238bceSAndroid Build Coastguard Worker {
141*35238bceSAndroid Build Coastguard Worker GLint64 val = 0;
142*35238bceSAndroid Build Coastguard Worker gl.getInteger64v(param, &val);
143*35238bceSAndroid Build Coastguard Worker return (GLuint64)val;
144*35238bceSAndroid Build Coastguard Worker }
145*35238bceSAndroid Build Coastguard Worker
146*35238bceSAndroid Build Coastguard Worker template <>
query(const glw::Functions & gl,uint32_t param)147*35238bceSAndroid Build Coastguard Worker GLfloat query<GLfloat>(const glw::Functions &gl, uint32_t param)
148*35238bceSAndroid Build Coastguard Worker {
149*35238bceSAndroid Build Coastguard Worker GLfloat val = -1000.f;
150*35238bceSAndroid Build Coastguard Worker gl.getFloatv(param, &val);
151*35238bceSAndroid Build Coastguard Worker return val;
152*35238bceSAndroid Build Coastguard Worker }
153*35238bceSAndroid Build Coastguard Worker
154*35238bceSAndroid Build Coastguard Worker template <>
query(const glw::Functions & gl,uint32_t param)155*35238bceSAndroid Build Coastguard Worker NegInt query<NegInt>(const glw::Functions &gl, uint32_t param)
156*35238bceSAndroid Build Coastguard Worker {
157*35238bceSAndroid Build Coastguard Worker return NegInt(query<GLint>(gl, param));
158*35238bceSAndroid Build Coastguard Worker }
159*35238bceSAndroid Build Coastguard Worker
160*35238bceSAndroid Build Coastguard Worker template <>
query(const glw::Functions & gl,uint32_t param)161*35238bceSAndroid Build Coastguard Worker Boolean query<Boolean>(const glw::Functions &gl, uint32_t param)
162*35238bceSAndroid Build Coastguard Worker {
163*35238bceSAndroid Build Coastguard Worker GLboolean val = GL_FALSE;
164*35238bceSAndroid Build Coastguard Worker gl.getBooleanv(param, &val);
165*35238bceSAndroid Build Coastguard Worker return Boolean(val);
166*35238bceSAndroid Build Coastguard Worker }
167*35238bceSAndroid Build Coastguard Worker
168*35238bceSAndroid Build Coastguard Worker template <>
query(const glw::Functions & gl,uint32_t param)169*35238bceSAndroid Build Coastguard Worker FloatRange query<FloatRange>(const glw::Functions &gl, uint32_t param)
170*35238bceSAndroid Build Coastguard Worker {
171*35238bceSAndroid Build Coastguard Worker float v[2] = {-1.0f, -1.0f};
172*35238bceSAndroid Build Coastguard Worker gl.getFloatv(param, &v[0]);
173*35238bceSAndroid Build Coastguard Worker return FloatRange(v[0], v[1]);
174*35238bceSAndroid Build Coastguard Worker }
175*35238bceSAndroid Build Coastguard Worker
176*35238bceSAndroid Build Coastguard Worker template <>
query(const glw::Functions & gl,uint32_t param)177*35238bceSAndroid Build Coastguard Worker AlignmentInt query<AlignmentInt>(const glw::Functions &gl, uint32_t param)
178*35238bceSAndroid Build Coastguard Worker {
179*35238bceSAndroid Build Coastguard Worker return AlignmentInt(query<GLint>(gl, param));
180*35238bceSAndroid Build Coastguard Worker }
181*35238bceSAndroid Build Coastguard Worker
182*35238bceSAndroid Build Coastguard Worker // Special comparison operators
183*35238bceSAndroid Build Coastguard Worker template <>
compare(const Boolean & min,const Boolean & reported)184*35238bceSAndroid Build Coastguard Worker bool compare<Boolean>(const Boolean &min, const Boolean &reported)
185*35238bceSAndroid Build Coastguard Worker {
186*35238bceSAndroid Build Coastguard Worker return !min.value || (min.value && reported.value);
187*35238bceSAndroid Build Coastguard Worker }
188*35238bceSAndroid Build Coastguard Worker
189*35238bceSAndroid Build Coastguard Worker template <>
compare(const NegInt & min,const NegInt & reported)190*35238bceSAndroid Build Coastguard Worker bool compare<NegInt>(const NegInt &min, const NegInt &reported)
191*35238bceSAndroid Build Coastguard Worker {
192*35238bceSAndroid Build Coastguard Worker // Reverse comparison.
193*35238bceSAndroid Build Coastguard Worker return reported.value <= min.value;
194*35238bceSAndroid Build Coastguard Worker }
195*35238bceSAndroid Build Coastguard Worker
196*35238bceSAndroid Build Coastguard Worker template <>
compare(const FloatRange & min,const FloatRange & reported)197*35238bceSAndroid Build Coastguard Worker bool compare<FloatRange>(const FloatRange &min, const FloatRange &reported)
198*35238bceSAndroid Build Coastguard Worker {
199*35238bceSAndroid Build Coastguard Worker return reported.min <= min.min && min.max <= reported.max;
200*35238bceSAndroid Build Coastguard Worker }
201*35238bceSAndroid Build Coastguard Worker
202*35238bceSAndroid Build Coastguard Worker template <>
compare(const AlignmentInt & min,const AlignmentInt & reported)203*35238bceSAndroid Build Coastguard Worker bool compare<AlignmentInt>(const AlignmentInt &min, const AlignmentInt &reported)
204*35238bceSAndroid Build Coastguard Worker {
205*35238bceSAndroid Build Coastguard Worker // Reverse comparison.
206*35238bceSAndroid Build Coastguard Worker return reported.value <= min.value;
207*35238bceSAndroid Build Coastguard Worker }
208*35238bceSAndroid Build Coastguard Worker
209*35238bceSAndroid Build Coastguard Worker // Special error descriptions
210*35238bceSAndroid Build Coastguard Worker
211*35238bceSAndroid Build Coastguard Worker enum QueryClass
212*35238bceSAndroid Build Coastguard Worker {
213*35238bceSAndroid Build Coastguard Worker CLASS_VALUE = 0,
214*35238bceSAndroid Build Coastguard Worker CLASS_RANGE,
215*35238bceSAndroid Build Coastguard Worker CLASS_ALIGNMENT,
216*35238bceSAndroid Build Coastguard Worker };
217*35238bceSAndroid Build Coastguard Worker
218*35238bceSAndroid Build Coastguard Worker template <QueryClass Class>
219*35238bceSAndroid Build Coastguard Worker struct QueryClassTraits
220*35238bceSAndroid Build Coastguard Worker {
221*35238bceSAndroid Build Coastguard Worker static const char *const s_errorDescription;
222*35238bceSAndroid Build Coastguard Worker };
223*35238bceSAndroid Build Coastguard Worker
224*35238bceSAndroid Build Coastguard Worker template <>
225*35238bceSAndroid Build Coastguard Worker const char *const QueryClassTraits<CLASS_VALUE>::s_errorDescription =
226*35238bceSAndroid Build Coastguard Worker "reported value is less than minimum required value!";
227*35238bceSAndroid Build Coastguard Worker
228*35238bceSAndroid Build Coastguard Worker template <>
229*35238bceSAndroid Build Coastguard Worker const char *const QueryClassTraits<CLASS_RANGE>::s_errorDescription =
230*35238bceSAndroid Build Coastguard Worker "reported range does not contain the minimum required range!";
231*35238bceSAndroid Build Coastguard Worker
232*35238bceSAndroid Build Coastguard Worker template <>
233*35238bceSAndroid Build Coastguard Worker const char *const QueryClassTraits<CLASS_ALIGNMENT>::s_errorDescription =
234*35238bceSAndroid Build Coastguard Worker "reported alignment is larger than minimum required aligmnent!";
235*35238bceSAndroid Build Coastguard Worker
236*35238bceSAndroid Build Coastguard Worker template <typename T>
237*35238bceSAndroid Build Coastguard Worker struct QueryTypeTraits
238*35238bceSAndroid Build Coastguard Worker {
239*35238bceSAndroid Build Coastguard Worker };
240*35238bceSAndroid Build Coastguard Worker
241*35238bceSAndroid Build Coastguard Worker template <>
242*35238bceSAndroid Build Coastguard Worker struct QueryTypeTraits<GLint>
243*35238bceSAndroid Build Coastguard Worker {
244*35238bceSAndroid Build Coastguard Worker enum
245*35238bceSAndroid Build Coastguard Worker {
246*35238bceSAndroid Build Coastguard Worker CLASS = CLASS_VALUE
247*35238bceSAndroid Build Coastguard Worker };
248*35238bceSAndroid Build Coastguard Worker };
249*35238bceSAndroid Build Coastguard Worker template <>
250*35238bceSAndroid Build Coastguard Worker struct QueryTypeTraits<GLint64>
251*35238bceSAndroid Build Coastguard Worker {
252*35238bceSAndroid Build Coastguard Worker enum
253*35238bceSAndroid Build Coastguard Worker {
254*35238bceSAndroid Build Coastguard Worker CLASS = CLASS_VALUE
255*35238bceSAndroid Build Coastguard Worker };
256*35238bceSAndroid Build Coastguard Worker };
257*35238bceSAndroid Build Coastguard Worker template <>
258*35238bceSAndroid Build Coastguard Worker struct QueryTypeTraits<GLuint64>
259*35238bceSAndroid Build Coastguard Worker {
260*35238bceSAndroid Build Coastguard Worker enum
261*35238bceSAndroid Build Coastguard Worker {
262*35238bceSAndroid Build Coastguard Worker CLASS = CLASS_VALUE
263*35238bceSAndroid Build Coastguard Worker };
264*35238bceSAndroid Build Coastguard Worker };
265*35238bceSAndroid Build Coastguard Worker template <>
266*35238bceSAndroid Build Coastguard Worker struct QueryTypeTraits<GLfloat>
267*35238bceSAndroid Build Coastguard Worker {
268*35238bceSAndroid Build Coastguard Worker enum
269*35238bceSAndroid Build Coastguard Worker {
270*35238bceSAndroid Build Coastguard Worker CLASS = CLASS_VALUE
271*35238bceSAndroid Build Coastguard Worker };
272*35238bceSAndroid Build Coastguard Worker };
273*35238bceSAndroid Build Coastguard Worker template <>
274*35238bceSAndroid Build Coastguard Worker struct QueryTypeTraits<Boolean>
275*35238bceSAndroid Build Coastguard Worker {
276*35238bceSAndroid Build Coastguard Worker enum
277*35238bceSAndroid Build Coastguard Worker {
278*35238bceSAndroid Build Coastguard Worker CLASS = CLASS_VALUE
279*35238bceSAndroid Build Coastguard Worker };
280*35238bceSAndroid Build Coastguard Worker };
281*35238bceSAndroid Build Coastguard Worker template <>
282*35238bceSAndroid Build Coastguard Worker struct QueryTypeTraits<NegInt>
283*35238bceSAndroid Build Coastguard Worker {
284*35238bceSAndroid Build Coastguard Worker enum
285*35238bceSAndroid Build Coastguard Worker {
286*35238bceSAndroid Build Coastguard Worker CLASS = CLASS_VALUE
287*35238bceSAndroid Build Coastguard Worker };
288*35238bceSAndroid Build Coastguard Worker };
289*35238bceSAndroid Build Coastguard Worker template <>
290*35238bceSAndroid Build Coastguard Worker struct QueryTypeTraits<FloatRange>
291*35238bceSAndroid Build Coastguard Worker {
292*35238bceSAndroid Build Coastguard Worker enum
293*35238bceSAndroid Build Coastguard Worker {
294*35238bceSAndroid Build Coastguard Worker CLASS = CLASS_RANGE
295*35238bceSAndroid Build Coastguard Worker };
296*35238bceSAndroid Build Coastguard Worker };
297*35238bceSAndroid Build Coastguard Worker template <>
298*35238bceSAndroid Build Coastguard Worker struct QueryTypeTraits<AlignmentInt>
299*35238bceSAndroid Build Coastguard Worker {
300*35238bceSAndroid Build Coastguard Worker enum
301*35238bceSAndroid Build Coastguard Worker {
302*35238bceSAndroid Build Coastguard Worker CLASS = CLASS_ALIGNMENT
303*35238bceSAndroid Build Coastguard Worker };
304*35238bceSAndroid Build Coastguard Worker };
305*35238bceSAndroid Build Coastguard Worker
306*35238bceSAndroid Build Coastguard Worker } // namespace LimitQuery
307*35238bceSAndroid Build Coastguard Worker
308*35238bceSAndroid Build Coastguard Worker using namespace LimitQuery;
309*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
310*35238bceSAndroid Build Coastguard Worker
311*35238bceSAndroid Build Coastguard Worker template <typename T>
312*35238bceSAndroid Build Coastguard Worker class LimitQueryCase : public TestCase
313*35238bceSAndroid Build Coastguard Worker {
314*35238bceSAndroid Build Coastguard Worker public:
LimitQueryCase(Context & context,const char * name,const char * description,uint32_t limit,const T & minRequiredValue)315*35238bceSAndroid Build Coastguard Worker LimitQueryCase(Context &context, const char *name, const char *description, uint32_t limit,
316*35238bceSAndroid Build Coastguard Worker const T &minRequiredValue)
317*35238bceSAndroid Build Coastguard Worker : TestCase(context, name, description)
318*35238bceSAndroid Build Coastguard Worker , m_limit(limit)
319*35238bceSAndroid Build Coastguard Worker , m_minRequiredValue(minRequiredValue)
320*35238bceSAndroid Build Coastguard Worker {
321*35238bceSAndroid Build Coastguard Worker }
322*35238bceSAndroid Build Coastguard Worker
iterate(void)323*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void)
324*35238bceSAndroid Build Coastguard Worker {
325*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
326*35238bceSAndroid Build Coastguard Worker const T value = query<T>(m_context.getRenderContext().getFunctions(), m_limit);
327*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "Query failed");
328*35238bceSAndroid Build Coastguard Worker
329*35238bceSAndroid Build Coastguard Worker const bool isOk = compare<T>(m_minRequiredValue, value);
330*35238bceSAndroid Build Coastguard Worker
331*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << "Reported: " << value << TestLog::EndMessage;
332*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << "Minimum required: " << m_minRequiredValue << TestLog::EndMessage;
333*35238bceSAndroid Build Coastguard Worker
334*35238bceSAndroid Build Coastguard Worker if (!isOk)
335*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << "FAIL: "
336*35238bceSAndroid Build Coastguard Worker << QueryClassTraits<(QueryClass)QueryTypeTraits<T>::CLASS>::s_errorDescription
337*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
338*35238bceSAndroid Build Coastguard Worker
339*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
340*35238bceSAndroid Build Coastguard Worker isOk ? "Pass" : "Requirement not satisfied");
341*35238bceSAndroid Build Coastguard Worker return STOP;
342*35238bceSAndroid Build Coastguard Worker }
343*35238bceSAndroid Build Coastguard Worker
344*35238bceSAndroid Build Coastguard Worker private:
345*35238bceSAndroid Build Coastguard Worker uint32_t m_limit;
346*35238bceSAndroid Build Coastguard Worker T m_minRequiredValue;
347*35238bceSAndroid Build Coastguard Worker };
348*35238bceSAndroid Build Coastguard Worker
349*35238bceSAndroid Build Coastguard Worker static const uint32_t s_requiredCompressedTexFormats[] = {GL_COMPRESSED_R11_EAC,
350*35238bceSAndroid Build Coastguard Worker GL_COMPRESSED_SIGNED_R11_EAC,
351*35238bceSAndroid Build Coastguard Worker GL_COMPRESSED_RG11_EAC,
352*35238bceSAndroid Build Coastguard Worker GL_COMPRESSED_SIGNED_RG11_EAC,
353*35238bceSAndroid Build Coastguard Worker GL_COMPRESSED_RGB8_ETC2,
354*35238bceSAndroid Build Coastguard Worker GL_COMPRESSED_SRGB8_ETC2,
355*35238bceSAndroid Build Coastguard Worker GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,
356*35238bceSAndroid Build Coastguard Worker GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,
357*35238bceSAndroid Build Coastguard Worker GL_COMPRESSED_RGBA8_ETC2_EAC,
358*35238bceSAndroid Build Coastguard Worker GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC};
359*35238bceSAndroid Build Coastguard Worker
360*35238bceSAndroid Build Coastguard Worker class CompressedTextureFormatsQueryCase : public TestCase
361*35238bceSAndroid Build Coastguard Worker {
362*35238bceSAndroid Build Coastguard Worker public:
CompressedTextureFormatsQueryCase(Context & context)363*35238bceSAndroid Build Coastguard Worker CompressedTextureFormatsQueryCase(Context &context)
364*35238bceSAndroid Build Coastguard Worker : TestCase(context, "compressed_texture_formats", "GL_COMPRESSED_TEXTURE_FORMATS")
365*35238bceSAndroid Build Coastguard Worker {
366*35238bceSAndroid Build Coastguard Worker }
367*35238bceSAndroid Build Coastguard Worker
iterate(void)368*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void)
369*35238bceSAndroid Build Coastguard Worker {
370*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
371*35238bceSAndroid Build Coastguard Worker const GLint numFormats = query<GLint>(gl, GL_NUM_COMPRESSED_TEXTURE_FORMATS);
372*35238bceSAndroid Build Coastguard Worker vector<GLint> formats(numFormats);
373*35238bceSAndroid Build Coastguard Worker bool allFormatsOk = true;
374*35238bceSAndroid Build Coastguard Worker
375*35238bceSAndroid Build Coastguard Worker if (numFormats > 0)
376*35238bceSAndroid Build Coastguard Worker gl.getIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, &formats[0]);
377*35238bceSAndroid Build Coastguard Worker
378*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "Query failed");
379*35238bceSAndroid Build Coastguard Worker
380*35238bceSAndroid Build Coastguard Worker // Log formats.
381*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << "Reported:" << TestLog::EndMessage;
382*35238bceSAndroid Build Coastguard Worker for (vector<GLint>::const_iterator fmt = formats.begin(); fmt != formats.end(); fmt++)
383*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << glu::getCompressedTextureFormatStr(*fmt) << TestLog::EndMessage;
384*35238bceSAndroid Build Coastguard Worker
385*35238bceSAndroid Build Coastguard Worker // Check that all required formats are in list.
386*35238bceSAndroid Build Coastguard Worker {
387*35238bceSAndroid Build Coastguard Worker set<GLint> formatSet(formats.begin(), formats.end());
388*35238bceSAndroid Build Coastguard Worker
389*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_requiredCompressedTexFormats); ndx++)
390*35238bceSAndroid Build Coastguard Worker {
391*35238bceSAndroid Build Coastguard Worker const uint32_t fmt = s_requiredCompressedTexFormats[ndx];
392*35238bceSAndroid Build Coastguard Worker const bool found = formatSet.find(fmt) != formatSet.end();
393*35238bceSAndroid Build Coastguard Worker
394*35238bceSAndroid Build Coastguard Worker if (!found)
395*35238bceSAndroid Build Coastguard Worker {
396*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << "ERROR: " << glu::getCompressedTextureFormatStr(fmt)
397*35238bceSAndroid Build Coastguard Worker << " is missing!" << TestLog::EndMessage;
398*35238bceSAndroid Build Coastguard Worker allFormatsOk = false;
399*35238bceSAndroid Build Coastguard Worker }
400*35238bceSAndroid Build Coastguard Worker }
401*35238bceSAndroid Build Coastguard Worker }
402*35238bceSAndroid Build Coastguard Worker
403*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(allFormatsOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
404*35238bceSAndroid Build Coastguard Worker allFormatsOk ? "Pass" : "Requirement not satisfied");
405*35238bceSAndroid Build Coastguard Worker return STOP;
406*35238bceSAndroid Build Coastguard Worker }
407*35238bceSAndroid Build Coastguard Worker };
408*35238bceSAndroid Build Coastguard Worker
queryExtensionsNonIndexed(const glw::Functions & gl)409*35238bceSAndroid Build Coastguard Worker static vector<string> queryExtensionsNonIndexed(const glw::Functions &gl)
410*35238bceSAndroid Build Coastguard Worker {
411*35238bceSAndroid Build Coastguard Worker const string extensionStr = (const char *)gl.getString(GL_EXTENSIONS);
412*35238bceSAndroid Build Coastguard Worker vector<string> extensionList;
413*35238bceSAndroid Build Coastguard Worker size_t pos = 0;
414*35238bceSAndroid Build Coastguard Worker
415*35238bceSAndroid Build Coastguard Worker for (;;)
416*35238bceSAndroid Build Coastguard Worker {
417*35238bceSAndroid Build Coastguard Worker const size_t nextPos = extensionStr.find(' ', pos);
418*35238bceSAndroid Build Coastguard Worker const size_t len = nextPos == string::npos ? extensionStr.length() - pos : nextPos - pos;
419*35238bceSAndroid Build Coastguard Worker
420*35238bceSAndroid Build Coastguard Worker if (len > 0)
421*35238bceSAndroid Build Coastguard Worker extensionList.push_back(extensionStr.substr(pos, len));
422*35238bceSAndroid Build Coastguard Worker
423*35238bceSAndroid Build Coastguard Worker if (nextPos == string::npos)
424*35238bceSAndroid Build Coastguard Worker break;
425*35238bceSAndroid Build Coastguard Worker else
426*35238bceSAndroid Build Coastguard Worker pos = nextPos + 1;
427*35238bceSAndroid Build Coastguard Worker }
428*35238bceSAndroid Build Coastguard Worker
429*35238bceSAndroid Build Coastguard Worker return extensionList;
430*35238bceSAndroid Build Coastguard Worker }
431*35238bceSAndroid Build Coastguard Worker
queryExtensionsIndexed(const glw::Functions & gl)432*35238bceSAndroid Build Coastguard Worker static vector<string> queryExtensionsIndexed(const glw::Functions &gl)
433*35238bceSAndroid Build Coastguard Worker {
434*35238bceSAndroid Build Coastguard Worker const int numExtensions = query<GLint>(gl, GL_NUM_EXTENSIONS);
435*35238bceSAndroid Build Coastguard Worker vector<string> extensions(numExtensions);
436*35238bceSAndroid Build Coastguard Worker
437*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "GL_NUM_EXTENSIONS query failed");
438*35238bceSAndroid Build Coastguard Worker
439*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < numExtensions; ndx++)
440*35238bceSAndroid Build Coastguard Worker extensions[ndx] = (const char *)gl.getStringi(GL_EXTENSIONS, (GLuint)ndx);
441*35238bceSAndroid Build Coastguard Worker
442*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glGetStringi(GL_EXTENSIONS) failed");
443*35238bceSAndroid Build Coastguard Worker
444*35238bceSAndroid Build Coastguard Worker return extensions;
445*35238bceSAndroid Build Coastguard Worker }
446*35238bceSAndroid Build Coastguard Worker
compareExtensionLists(const vector<string> & a,const vector<string> & b)447*35238bceSAndroid Build Coastguard Worker static bool compareExtensionLists(const vector<string> &a, const vector<string> &b)
448*35238bceSAndroid Build Coastguard Worker {
449*35238bceSAndroid Build Coastguard Worker if (a.size() != b.size())
450*35238bceSAndroid Build Coastguard Worker return false;
451*35238bceSAndroid Build Coastguard Worker
452*35238bceSAndroid Build Coastguard Worker set<string> extsInB(b.begin(), b.end());
453*35238bceSAndroid Build Coastguard Worker
454*35238bceSAndroid Build Coastguard Worker for (vector<string>::const_iterator i = a.begin(); i != a.end(); ++i)
455*35238bceSAndroid Build Coastguard Worker {
456*35238bceSAndroid Build Coastguard Worker if (extsInB.find(*i) == extsInB.end())
457*35238bceSAndroid Build Coastguard Worker return false;
458*35238bceSAndroid Build Coastguard Worker }
459*35238bceSAndroid Build Coastguard Worker
460*35238bceSAndroid Build Coastguard Worker return true;
461*35238bceSAndroid Build Coastguard Worker }
462*35238bceSAndroid Build Coastguard Worker
463*35238bceSAndroid Build Coastguard Worker class ExtensionQueryCase : public TestCase
464*35238bceSAndroid Build Coastguard Worker {
465*35238bceSAndroid Build Coastguard Worker public:
ExtensionQueryCase(Context & context)466*35238bceSAndroid Build Coastguard Worker ExtensionQueryCase(Context &context) : TestCase(context, "extensions", "GL_EXTENSIONS")
467*35238bceSAndroid Build Coastguard Worker {
468*35238bceSAndroid Build Coastguard Worker }
469*35238bceSAndroid Build Coastguard Worker
iterate(void)470*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void)
471*35238bceSAndroid Build Coastguard Worker {
472*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
473*35238bceSAndroid Build Coastguard Worker const vector<string> nonIndexedExts = queryExtensionsNonIndexed(gl);
474*35238bceSAndroid Build Coastguard Worker const vector<string> indexedExts = queryExtensionsIndexed(gl);
475*35238bceSAndroid Build Coastguard Worker const bool isOk = compareExtensionLists(nonIndexedExts, indexedExts);
476*35238bceSAndroid Build Coastguard Worker
477*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message
478*35238bceSAndroid Build Coastguard Worker << "Extensions as reported by glGetStringi(GL_EXTENSIONS):" << TestLog::EndMessage;
479*35238bceSAndroid Build Coastguard Worker for (vector<string>::const_iterator ext = indexedExts.begin(); ext != indexedExts.end(); ++ext)
480*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << *ext << TestLog::EndMessage;
481*35238bceSAndroid Build Coastguard Worker
482*35238bceSAndroid Build Coastguard Worker if (!isOk)
483*35238bceSAndroid Build Coastguard Worker {
484*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message
485*35238bceSAndroid Build Coastguard Worker << "Extensions as reported by glGetString(GL_EXTENSIONS):" << TestLog::EndMessage;
486*35238bceSAndroid Build Coastguard Worker for (vector<string>::const_iterator ext = nonIndexedExts.begin(); ext != nonIndexedExts.end(); ++ext)
487*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << *ext << TestLog::EndMessage;
488*35238bceSAndroid Build Coastguard Worker
489*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << "ERROR: Extension lists do not match!" << TestLog::EndMessage;
490*35238bceSAndroid Build Coastguard Worker }
491*35238bceSAndroid Build Coastguard Worker
492*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
493*35238bceSAndroid Build Coastguard Worker isOk ? "Pass" : "Invalid extension list");
494*35238bceSAndroid Build Coastguard Worker return STOP;
495*35238bceSAndroid Build Coastguard Worker }
496*35238bceSAndroid Build Coastguard Worker };
497*35238bceSAndroid Build Coastguard Worker
ImplementationLimitTests(Context & context)498*35238bceSAndroid Build Coastguard Worker ImplementationLimitTests::ImplementationLimitTests(Context &context)
499*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "implementation_limits", "Implementation-defined limits")
500*35238bceSAndroid Build Coastguard Worker {
501*35238bceSAndroid Build Coastguard Worker }
502*35238bceSAndroid Build Coastguard Worker
~ImplementationLimitTests(void)503*35238bceSAndroid Build Coastguard Worker ImplementationLimitTests::~ImplementationLimitTests(void)
504*35238bceSAndroid Build Coastguard Worker {
505*35238bceSAndroid Build Coastguard Worker }
506*35238bceSAndroid Build Coastguard Worker
init(void)507*35238bceSAndroid Build Coastguard Worker void ImplementationLimitTests::init(void)
508*35238bceSAndroid Build Coastguard Worker {
509*35238bceSAndroid Build Coastguard Worker const int minVertexUniformBlocks = 12;
510*35238bceSAndroid Build Coastguard Worker const int minVertexUniformComponents = 1024;
511*35238bceSAndroid Build Coastguard Worker
512*35238bceSAndroid Build Coastguard Worker const int minFragmentUniformBlocks = 12;
513*35238bceSAndroid Build Coastguard Worker const int minFragmentUniformComponents = 896;
514*35238bceSAndroid Build Coastguard Worker
515*35238bceSAndroid Build Coastguard Worker const int minUniformBlockSize = 16384;
516*35238bceSAndroid Build Coastguard Worker const int minCombinedVertexUniformComponents =
517*35238bceSAndroid Build Coastguard Worker (minVertexUniformBlocks * minUniformBlockSize) / 4 + minVertexUniformComponents;
518*35238bceSAndroid Build Coastguard Worker const int minCombinedFragmentUniformComponents =
519*35238bceSAndroid Build Coastguard Worker (minFragmentUniformBlocks * minUniformBlockSize) / 4 + minFragmentUniformComponents;
520*35238bceSAndroid Build Coastguard Worker
521*35238bceSAndroid Build Coastguard Worker #define LIMIT_CASE(NAME, PARAM, TYPE, MIN_VAL) \
522*35238bceSAndroid Build Coastguard Worker addChild(new LimitQueryCase<TYPE>(m_context, #NAME, #PARAM, PARAM, MIN_VAL))
523*35238bceSAndroid Build Coastguard Worker
524*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_element_index, GL_MAX_ELEMENT_INDEX, GLint64, (1 << 24) - 1);
525*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(subpixel_bits, GL_SUBPIXEL_BITS, GLint, 4);
526*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_3d_texture_size, GL_MAX_3D_TEXTURE_SIZE, GLint, 256);
527*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_texture_size, GL_MAX_TEXTURE_SIZE, GLint, 2048);
528*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_array_texture_layers, GL_MAX_ARRAY_TEXTURE_LAYERS, GLint, 256);
529*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_texture_lod_bias, GL_MAX_TEXTURE_LOD_BIAS, GLfloat, 2.0f);
530*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_cube_map_texture_size, GL_MAX_CUBE_MAP_TEXTURE_SIZE, GLint, 2048);
531*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_renderbuffer_size, GL_MAX_RENDERBUFFER_SIZE, GLint, 2048);
532*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_draw_buffers, GL_MAX_DRAW_BUFFERS, GLint, 4);
533*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_color_attachments, GL_MAX_COLOR_ATTACHMENTS, GLint, 4);
534*35238bceSAndroid Build Coastguard Worker // GL_MAX_VIEWPORT_DIMS
535*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(aliased_point_size_range, GL_ALIASED_POINT_SIZE_RANGE, FloatRange, FloatRange(1, 1));
536*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(aliased_line_width_range, GL_ALIASED_LINE_WIDTH_RANGE, FloatRange, FloatRange(1, 1));
537*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_elements_indices, GL_MAX_ELEMENTS_INDICES, GLint, 0);
538*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_elements_vertices, GL_MAX_ELEMENTS_VERTICES, GLint, 0);
539*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(num_compressed_texture_formats, GL_NUM_COMPRESSED_TEXTURE_FORMATS, GLint,
540*35238bceSAndroid Build Coastguard Worker DE_LENGTH_OF_ARRAY(s_requiredCompressedTexFormats));
541*35238bceSAndroid Build Coastguard Worker addChild(new CompressedTextureFormatsQueryCase(m_context)); // GL_COMPRESSED_TEXTURE_FORMATS
542*35238bceSAndroid Build Coastguard Worker // GL_PROGRAM_BINARY_FORMATS
543*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(num_program_binary_formats, GL_NUM_PROGRAM_BINARY_FORMATS, GLint, 0);
544*35238bceSAndroid Build Coastguard Worker // GL_SHADER_BINARY_FORMATS
545*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(num_shader_binary_formats, GL_NUM_SHADER_BINARY_FORMATS, GLint, 0);
546*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(shader_compiler, GL_SHADER_COMPILER, Boolean, GL_TRUE);
547*35238bceSAndroid Build Coastguard Worker // Shader data type ranges & precisions
548*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_server_wait_timeout, GL_MAX_SERVER_WAIT_TIMEOUT, GLuint64, 0);
549*35238bceSAndroid Build Coastguard Worker
550*35238bceSAndroid Build Coastguard Worker // Version and extension support
551*35238bceSAndroid Build Coastguard Worker addChild(new ExtensionQueryCase(m_context)); // GL_EXTENSIONS + consistency validation
552*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(num_extensions, GL_NUM_EXTENSIONS, GLint, 0);
553*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(major_version, GL_MAJOR_VERSION, GLint, 3);
554*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(minor_version, GL_MINOR_VERSION, GLint, 0);
555*35238bceSAndroid Build Coastguard Worker // GL_RENDERER
556*35238bceSAndroid Build Coastguard Worker // GL_SHADING_LANGUAGE_VERSION
557*35238bceSAndroid Build Coastguard Worker // GL_VENDOR
558*35238bceSAndroid Build Coastguard Worker // GL_VERSION
559*35238bceSAndroid Build Coastguard Worker
560*35238bceSAndroid Build Coastguard Worker // Vertex shader limits
561*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_vertex_attribs, GL_MAX_VERTEX_ATTRIBS, GLint, 16);
562*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_vertex_uniform_components, GL_MAX_VERTEX_UNIFORM_COMPONENTS, GLint, minVertexUniformComponents);
563*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_vertex_uniform_vectors, GL_MAX_VERTEX_UNIFORM_VECTORS, GLint, minVertexUniformComponents / 4);
564*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_vertex_uniform_blocks, GL_MAX_VERTEX_UNIFORM_BLOCKS, GLint, minVertexUniformBlocks);
565*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_vertex_output_components, GL_MAX_VERTEX_OUTPUT_COMPONENTS, GLint, 64);
566*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_vertex_texture_image_units, GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, GLint, 16);
567*35238bceSAndroid Build Coastguard Worker
568*35238bceSAndroid Build Coastguard Worker // Fragment shader limits
569*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_fragment_uniform_components, GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, GLint,
570*35238bceSAndroid Build Coastguard Worker minFragmentUniformComponents);
571*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_fragment_uniform_vectors, GL_MAX_FRAGMENT_UNIFORM_VECTORS, GLint, minFragmentUniformComponents / 4);
572*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_fragment_uniform_blocks, GL_MAX_FRAGMENT_UNIFORM_BLOCKS, GLint, minFragmentUniformBlocks);
573*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_fragment_input_components, GL_MAX_FRAGMENT_INPUT_COMPONENTS, GLint, 60);
574*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_texture_image_units, GL_MAX_TEXTURE_IMAGE_UNITS, GLint, 16);
575*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(min_program_texel_offset, GL_MIN_PROGRAM_TEXEL_OFFSET, NegInt, -8);
576*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_program_texel_offset, GL_MAX_PROGRAM_TEXEL_OFFSET, GLint, 7);
577*35238bceSAndroid Build Coastguard Worker
578*35238bceSAndroid Build Coastguard Worker // Aggregate shader limits
579*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_uniform_buffer_bindings, GL_MAX_UNIFORM_BUFFER_BINDINGS, GLint, 24);
580*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_uniform_block_size, GL_MAX_UNIFORM_BLOCK_SIZE, GLint64, minUniformBlockSize);
581*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(uniform_buffer_offset_alignment, GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, AlignmentInt, 256);
582*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_combined_uniform_blocks, GL_MAX_COMBINED_UNIFORM_BLOCKS, GLint, 24);
583*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_combined_vertex_uniform_components, GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS, GLint64,
584*35238bceSAndroid Build Coastguard Worker minCombinedVertexUniformComponents);
585*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_combined_fragment_uniform_components, GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS, GLint64,
586*35238bceSAndroid Build Coastguard Worker minCombinedFragmentUniformComponents);
587*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_varying_components, GL_MAX_VARYING_COMPONENTS, GLint, 60);
588*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_varying_vectors, GL_MAX_VARYING_VECTORS, GLint, 15);
589*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_combined_texture_image_units, GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, GLint, 32);
590*35238bceSAndroid Build Coastguard Worker
591*35238bceSAndroid Build Coastguard Worker // Transform feedback limits
592*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_transform_feedback_interleaved_components, GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS, GLint,
593*35238bceSAndroid Build Coastguard Worker 64);
594*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_transform_feedback_separate_attribs, GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, GLint, 4);
595*35238bceSAndroid Build Coastguard Worker LIMIT_CASE(max_transform_feedback_separate_components, GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS, GLint, 4);
596*35238bceSAndroid Build Coastguard Worker }
597*35238bceSAndroid Build Coastguard Worker
598*35238bceSAndroid Build Coastguard Worker } // namespace Functional
599*35238bceSAndroid Build Coastguard Worker } // namespace gles3
600*35238bceSAndroid Build Coastguard Worker } // namespace deqp
601