1 #ifndef _GLSSTATEQUERYUTIL_HPP
2 #define _GLSSTATEQUERYUTIL_HPP
3 /*-------------------------------------------------------------------------
4 * drawElements Quality Program OpenGL (ES) Module
5 * -----------------------------------------------
6 *
7 * Copyright 2014 The Android Open Source Project
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 *
21 *//*!
22 * \file
23 * \brief State Query test utils.
24 *//*--------------------------------------------------------------------*/
25
26 #include "tcuDefs.hpp"
27 #include "tcuTestLog.hpp"
28 #include "tcuTestContext.hpp"
29 #include "tcuResultCollector.hpp"
30 #include "glwDefs.hpp"
31 #include "deMath.h"
32
33 namespace glu
34 {
35 class CallLogWrapper;
36 } // namespace glu
37
38 namespace deqp
39 {
40 namespace gls
41 {
42 namespace StateQueryUtil
43 {
44
45 #define GLS_COLLECT_GL_ERROR(RES, ERR, MSG) \
46 do \
47 { \
48 const uint32_t err = (ERR); \
49 if (err != GL_NO_ERROR) \
50 (RES).fail(std::string("Got Error ") + glu::getErrorStr(err).toString() + ": " + (MSG)); \
51 } while (false)
52
53 /*--------------------------------------------------------------------*//*!
54 * \brief Rounds given float to the nearest integer (half up).
55 *
56 * Returns the nearest integer for a float argument. In the case that there
57 * are two nearest integers at the equal distance (aka. the argument is of
58 * form x.5), the integer with the higher value is chosen. (x.5 rounds to x+1)
59 *//*--------------------------------------------------------------------*/
60 template <typename T>
roundGLfloatToNearestIntegerHalfUp(float val)61 T roundGLfloatToNearestIntegerHalfUp(float val)
62 {
63 return (T)(deFloatFloor(val + 0.5f));
64 }
65
66 /*--------------------------------------------------------------------*//*!
67 * \brief Rounds given float to the nearest integer (half down).
68 *
69 * Returns the nearest integer for a float argument. In the case that there
70 * are two nearest integers at the equal distance (aka. the argument is of
71 * form x.5), the integer with the higher value is chosen. (x.5 rounds to x)
72 *//*--------------------------------------------------------------------*/
73 template <typename T>
roundGLfloatToNearestIntegerHalfDown(float val)74 T roundGLfloatToNearestIntegerHalfDown(float val)
75 {
76 return (T)(deFloatCeil(val - 0.5f));
77 }
78
79 template <typename T>
80 class StateQueryMemoryWriteGuard
81 {
82 public:
83 StateQueryMemoryWriteGuard(void);
84
85 operator T &(void);
86 T *operator&(void);
87
88 bool isUndefined(void) const;
89 bool isMemoryContaminated(void) const;
90 bool isPreguardContaminated(void) const;
91 bool isPostguardContaminated(void) const;
92 bool verifyValidity(tcu::TestContext &testCtx) const;
93 bool verifyValidity(tcu::ResultCollector &result) const;
94
get(void) const95 const T &get(void) const
96 {
97 return m_value;
98 }
99
100 private:
101 enum
102 {
103 WRITE_GUARD_VALUE = 0xDE
104 };
105
106 T m_preguard;
107 T m_value;
108 T m_postguard; // \note guards are not const qualified since the GL implementation might modify them
109 };
110
111 template <typename T>
StateQueryMemoryWriteGuard(void)112 StateQueryMemoryWriteGuard<T>::StateQueryMemoryWriteGuard(void)
113 {
114 DE_STATIC_ASSERT(sizeof(T) * 3 == sizeof(StateQueryMemoryWriteGuard<T>)); // tightly packed
115
116 deMemset(&m_preguard, WRITE_GUARD_VALUE, sizeof(m_preguard));
117 deMemset(&m_value, WRITE_GUARD_VALUE, sizeof(m_value));
118 deMemset(&m_postguard, WRITE_GUARD_VALUE, sizeof(m_postguard));
119 }
120
121 template <typename T>
operator T&(void)122 StateQueryMemoryWriteGuard<T>::operator T &(void)
123 {
124 return m_value;
125 }
126
127 template <typename T>
operator &(void)128 T *StateQueryMemoryWriteGuard<T>::operator&(void)
129 {
130 return &m_value;
131 }
132
133 template <typename T>
isUndefined() const134 bool StateQueryMemoryWriteGuard<T>::isUndefined() const
135 {
136 for (size_t i = 0; i < sizeof(T); ++i)
137 if (((uint8_t *)&m_value)[i] != (uint8_t)WRITE_GUARD_VALUE)
138 return false;
139 return true;
140 }
141
142 template <typename T>
isMemoryContaminated() const143 bool StateQueryMemoryWriteGuard<T>::isMemoryContaminated() const
144 {
145 return isPreguardContaminated() || isPostguardContaminated();
146 }
147
148 template <typename T>
isPreguardContaminated(void) const149 bool StateQueryMemoryWriteGuard<T>::isPreguardContaminated(void) const
150 {
151 for (size_t i = 0; i < sizeof(T); ++i)
152 if (((uint8_t *)&m_preguard)[i] != (uint8_t)WRITE_GUARD_VALUE)
153 return true;
154 return false;
155 }
156
157 template <typename T>
isPostguardContaminated(void) const158 bool StateQueryMemoryWriteGuard<T>::isPostguardContaminated(void) const
159 {
160 for (size_t i = 0; i < sizeof(T); ++i)
161 if (((uint8_t *)&m_postguard)[i] != (uint8_t)WRITE_GUARD_VALUE)
162 return true;
163 return false;
164 }
165
166 template <typename T>
verifyValidity(tcu::TestContext & testCtx) const167 bool StateQueryMemoryWriteGuard<T>::verifyValidity(tcu::TestContext &testCtx) const
168 {
169 using tcu::TestLog;
170
171 if (isPreguardContaminated())
172 {
173 testCtx.getLog() << TestLog::Message << "// ERROR: Pre-guard value was modified " << TestLog::EndMessage;
174 if (testCtx.getTestResult() == QP_TEST_RESULT_PASS || testCtx.getTestResult() == QP_TEST_RESULT_LAST)
175 testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Get* did an illegal memory write");
176
177 return false;
178 }
179 else if (isPostguardContaminated())
180 {
181 testCtx.getLog() << TestLog::Message << "// ERROR: Post-guard value was modified " << TestLog::EndMessage;
182 if (testCtx.getTestResult() == QP_TEST_RESULT_PASS || testCtx.getTestResult() == QP_TEST_RESULT_LAST)
183 testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Get* did an illegal memory write");
184
185 return false;
186 }
187 else if (isUndefined())
188 {
189 testCtx.getLog() << TestLog::Message << "// ERROR: Get* did not return a value" << TestLog::EndMessage;
190 if (testCtx.getTestResult() == QP_TEST_RESULT_PASS || testCtx.getTestResult() == QP_TEST_RESULT_LAST)
191 testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Get* did not return a value");
192
193 return false;
194 }
195
196 return true;
197 }
198
199 template <typename T>
verifyValidity(tcu::ResultCollector & result) const200 bool StateQueryMemoryWriteGuard<T>::verifyValidity(tcu::ResultCollector &result) const
201 {
202 using tcu::TestLog;
203
204 if (isPreguardContaminated())
205 {
206 result.fail("pre-guard value was modified");
207 return false;
208 }
209 else if (isPostguardContaminated())
210 {
211 result.fail("post-guard value was modified");
212 return false;
213 }
214 else if (isUndefined())
215 {
216 result.fail("Get* did not return a value");
217 return false;
218 }
219
220 return true;
221 }
222
223 template <typename T>
operator <<(std::ostream & str,const StateQueryMemoryWriteGuard<T> & guard)224 std::ostream &operator<<(std::ostream &str, const StateQueryMemoryWriteGuard<T> &guard)
225 {
226 return str << guard.get();
227 }
228
229 // Verifiers
230
231 enum QueryType
232 {
233 QUERY_BOOLEAN = 0,
234 QUERY_BOOLEAN_VEC4,
235 QUERY_ISENABLED,
236 QUERY_INTEGER,
237 QUERY_INTEGER64,
238 QUERY_FLOAT,
239
240 // indexed
241 QUERY_INDEXED_BOOLEAN,
242 QUERY_INDEXED_BOOLEAN_VEC4,
243 QUERY_INDEXED_ISENABLED,
244 QUERY_INDEXED_INTEGER,
245 QUERY_INDEXED_INTEGER_VEC4,
246 QUERY_INDEXED_INTEGER64,
247 QUERY_INDEXED_INTEGER64_VEC4,
248
249 // attributes
250 QUERY_ATTRIBUTE_INTEGER,
251 QUERY_ATTRIBUTE_FLOAT,
252 QUERY_ATTRIBUTE_PURE_INTEGER,
253 QUERY_ATTRIBUTE_PURE_UNSIGNED_INTEGER,
254
255 // fb
256 QUERY_FRAMEBUFFER_INTEGER,
257
258 // program
259 QUERY_PROGRAM_INTEGER,
260 QUERY_PROGRAM_INTEGER_VEC3,
261
262 // program pipeline
263 QUERY_PIPELINE_INTEGER,
264
265 // texture param
266 QUERY_TEXTURE_PARAM_INTEGER,
267 QUERY_TEXTURE_PARAM_FLOAT,
268 QUERY_TEXTURE_PARAM_PURE_INTEGER,
269 QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER,
270 QUERY_TEXTURE_PARAM_INTEGER_VEC4,
271 QUERY_TEXTURE_PARAM_FLOAT_VEC4,
272 QUERY_TEXTURE_PARAM_PURE_INTEGER_VEC4,
273 QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER_VEC4,
274
275 // texture level
276 QUERY_TEXTURE_LEVEL_INTEGER,
277 QUERY_TEXTURE_LEVEL_FLOAT,
278
279 // pointer
280 QUERY_POINTER,
281
282 // object states
283 QUERY_ISTEXTURE,
284
285 // query queries
286 QUERY_QUERY,
287
288 // sampler state
289 QUERY_SAMPLER_PARAM_INTEGER,
290 QUERY_SAMPLER_PARAM_FLOAT,
291 QUERY_SAMPLER_PARAM_PURE_INTEGER,
292 QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER,
293 QUERY_SAMPLER_PARAM_INTEGER_VEC4,
294 QUERY_SAMPLER_PARAM_FLOAT_VEC4,
295 QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4,
296 QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4,
297
298 QUERY_LAST
299 };
300
301 enum DataType
302 {
303 DATATYPE_BOOLEAN = 0,
304 DATATYPE_INTEGER,
305 DATATYPE_INTEGER64,
306 DATATYPE_FLOAT16,
307 DATATYPE_FLOAT,
308 DATATYPE_UNSIGNED_INTEGER,
309 DATATYPE_INTEGER_VEC3,
310 DATATYPE_FLOAT_VEC4,
311 DATATYPE_INTEGER_VEC4,
312 DATATYPE_INTEGER64_VEC4,
313 DATATYPE_UNSIGNED_INTEGER_VEC4,
314 DATATYPE_BOOLEAN_VEC4,
315 DATATYPE_POINTER,
316
317 DATATYPE_LAST
318 };
319
320 class QueriedState
321 {
322 public:
323 typedef glw::GLint GLIntVec3[3];
324 typedef glw::GLint GLIntVec4[4];
325 typedef glw::GLuint GLUintVec4[4];
326 typedef glw::GLfloat GLFloatVec4[4];
327 typedef bool BooleanVec4[4];
328 typedef glw::GLint64 GLInt64Vec4[4];
329
330 QueriedState(void);
331 explicit QueriedState(glw::GLint);
332 explicit QueriedState(glw::GLint64);
333 explicit QueriedState(bool);
334 explicit QueriedState(glw::GLfloat);
335 explicit QueriedState(glw::GLuint);
336 explicit QueriedState(const GLIntVec3 &);
337 explicit QueriedState(void *);
338 explicit QueriedState(const GLIntVec4 &);
339 explicit QueriedState(const GLUintVec4 &);
340 explicit QueriedState(const GLFloatVec4 &);
341 explicit QueriedState(const BooleanVec4 &);
342 explicit QueriedState(const GLInt64Vec4 &);
343
344 bool isUndefined(void) const;
345 DataType getType(void) const;
346
347 glw::GLint &getIntAccess(void);
348 glw::GLint64 &getInt64Access(void);
349 bool &getBoolAccess(void);
350 glw::GLfloat &getFloatAccess(void);
351 glw::GLuint &getUintAccess(void);
352 GLIntVec3 &getIntVec3Access(void);
353 void *&getPtrAccess(void);
354 GLIntVec4 &getIntVec4Access(void);
355 GLUintVec4 &getUintVec4Access(void);
356 GLFloatVec4 &getFloatVec4Access(void);
357 BooleanVec4 &getBooleanVec4Access(void);
358 GLInt64Vec4 &getInt64Vec4Access(void);
359
360 private:
361 DataType m_type;
362 union
363 {
364 glw::GLint vInt;
365 glw::GLint64 vInt64;
366 bool vBool;
367 glw::GLfloat vFloat;
368 glw::GLuint vUint;
369 GLIntVec3 vIntVec3;
370 void *vPtr;
371 GLIntVec4 vIntVec4;
372 GLUintVec4 vUintVec4;
373 GLFloatVec4 vFloatVec4;
374 BooleanVec4 vBooleanVec4;
375 GLInt64Vec4 vInt64Vec4;
376 } m_v;
377 };
378
379 // query functions
380
381 void queryState(tcu::ResultCollector &result, glu::CallLogWrapper &gl, QueryType type, glw::GLenum pname,
382 QueriedState &state);
383 void queryIndexedState(tcu::ResultCollector &result, glu::CallLogWrapper &gl, QueryType type, glw::GLenum target,
384 int index, QueriedState &state);
385 void queryAttributeState(tcu::ResultCollector &result, glu::CallLogWrapper &gl, QueryType type, glw::GLenum target,
386 int index, QueriedState &state);
387 void queryFramebufferState(tcu::ResultCollector &result, glu::CallLogWrapper &gl, QueryType type, glw::GLenum target,
388 glw::GLenum pname, QueriedState &state);
389 void queryProgramState(tcu::ResultCollector &result, glu::CallLogWrapper &gl, QueryType type, glw::GLuint program,
390 glw::GLenum pname, QueriedState &state);
391 void queryPipelineState(tcu::ResultCollector &result, glu::CallLogWrapper &gl, QueryType type, glw::GLuint pipeline,
392 glw::GLenum pname, QueriedState &state);
393 void queryTextureParamState(tcu::ResultCollector &result, glu::CallLogWrapper &gl, QueryType type, glw::GLenum target,
394 glw::GLenum pname, QueriedState &state);
395 void queryTextureLevelState(tcu::ResultCollector &result, glu::CallLogWrapper &gl, QueryType type, glw::GLenum target,
396 int level, glw::GLenum pname, QueriedState &state);
397 void queryPointerState(tcu::ResultCollector &result, glu::CallLogWrapper &gl, QueryType type, glw::GLenum pname,
398 QueriedState &state);
399 void queryObjectState(tcu::ResultCollector &result, glu::CallLogWrapper &gl, QueryType type, glw::GLuint handle,
400 QueriedState &state);
401 void queryQueryState(tcu::ResultCollector &result, glu::CallLogWrapper &gl, QueryType type, glw::GLenum target,
402 glw::GLenum pname, QueriedState &state);
403 void querySamplerState(tcu::ResultCollector &result, glu::CallLogWrapper &gl, QueryType type, glw::GLuint sampler,
404 glw::GLenum pname, QueriedState &state);
405
406 // verification functions
407
408 void verifyBoolean(tcu::ResultCollector &result, QueriedState &state, bool expected);
409 void verifyInteger(tcu::ResultCollector &result, QueriedState &state, int expected);
410 void verifyIntegerMin(tcu::ResultCollector &result, QueriedState &state, int minValue);
411 void verifyIntegerMax(tcu::ResultCollector &result, QueriedState &state, int maxValue);
412 void verifyIntegersEqual(tcu::ResultCollector &result, QueriedState &stateA, QueriedState &stateB);
413 void verifyFloat(tcu::ResultCollector &result, QueriedState &state, float expected);
414 void verifyFloatMin(tcu::ResultCollector &result, QueriedState &state, float minValue);
415 void verifyFloatMax(tcu::ResultCollector &result, QueriedState &state, float maxValue);
416 void verifyIntegerVec3(tcu::ResultCollector &result, QueriedState &state, const tcu::IVec3 &expected);
417 void verifyIntegerVec4(tcu::ResultCollector &result, QueriedState &state, const tcu::IVec4 &expected);
418 void verifyUnsignedIntegerVec4(tcu::ResultCollector &result, QueriedState &state, const tcu::UVec4 &expected);
419 void verifyFloatVec4(tcu::ResultCollector &result, QueriedState &state, const tcu::Vec4 &expected);
420 void verifyBooleanVec4(tcu::ResultCollector &result, QueriedState &state, const tcu::BVec4 &expected);
421 void verifyPointer(tcu::ResultCollector &result, QueriedState &state, const void *expected);
422 void verifyNormalizedI32Vec4(tcu::ResultCollector &result, QueriedState &state, const tcu::IVec4 &expected);
423
424 // Helper functions that both query and verify
425
426 void verifyStateBoolean(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target, bool expected,
427 QueryType type);
428 void verifyStateInteger(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target, int expected,
429 QueryType type);
430 void verifyStateIntegerMin(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target, int minValue,
431 QueryType type);
432 void verifyStateIntegerMax(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target, int maxValue,
433 QueryType type);
434 void verifyStateIntegerEqualToOther(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target,
435 glw::GLenum other, QueryType type);
436 void verifyStateFloat(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target, float reference,
437 QueryType type);
438 void verifyStateFloatMin(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target, float minValue,
439 QueryType type);
440 void verifyStateFloatMax(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target, float maxValue,
441 QueryType type);
442 void verifyStatePointer(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target, const void *expected,
443 QueryType type);
444 void verifyStateIndexedBoolean(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target, int index,
445 bool expected, QueryType type);
446 void verifyStateIndexedBooleanVec4(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target, int index,
447 const tcu::BVec4 &expected, QueryType type);
448 void verifyStateIndexedInteger(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target, int index,
449 int expected, QueryType type);
450 void verifyStateIndexedIntegerMin(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target, int index,
451 int minValue, QueryType type);
452 void verifyStateAttributeInteger(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target, int index,
453 int expected, QueryType type);
454 void verifyStateFramebufferInteger(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target,
455 glw::GLenum pname, int expected, QueryType type);
456 void verifyStateFramebufferIntegerMin(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target,
457 glw::GLenum pname, int minValue, QueryType type);
458 void verifyStateProgramInteger(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLuint program,
459 glw::GLenum pname, int expected, QueryType type);
460 void verifyStateProgramIntegerVec3(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLuint program,
461 glw::GLenum pname, const tcu::IVec3 &expected, QueryType type);
462 void verifyStatePipelineInteger(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLuint pipeline,
463 glw::GLenum pname, int expected, QueryType type);
464 void verifyStateTextureParamInteger(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target,
465 glw::GLenum pname, int expected, QueryType type);
466 void verifyStateTextureParamFloat(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target,
467 glw::GLenum pname, float expected, QueryType type);
468 void verifyStateTextureParamFloatVec4(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target,
469 glw::GLenum pname, const tcu::Vec4 &expected, QueryType type);
470 void verifyStateTextureParamNormalizedI32Vec4(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target,
471 glw::GLenum pname, const tcu::IVec4 &expected, QueryType type);
472 void verifyStateTextureParamIntegerVec4(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target,
473 glw::GLenum pname, const tcu::IVec4 &expected, QueryType type);
474 void verifyStateTextureParamUnsignedIntegerVec4(tcu::ResultCollector &result, glu::CallLogWrapper &gl,
475 glw::GLenum target, glw::GLenum pname, const tcu::UVec4 &expected,
476 QueryType type);
477 void verifyStateTextureLevelInteger(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target,
478 int level, glw::GLenum pname, int expected, QueryType type);
479 void verifyStateObjectBoolean(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLuint handle, bool expected,
480 QueryType type);
481 void verifyStateQueryInteger(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLenum target,
482 glw::GLenum pname, int expected, QueryType type);
483 void verifyStateSamplerParamInteger(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLuint sampler,
484 glw::GLenum pname, int expected, QueryType type);
485 void verifyStateSamplerParamFloat(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLuint sampler,
486 glw::GLenum pname, float expected, QueryType type);
487 void verifyStateSamplerParamFloatVec4(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLuint sampler,
488 glw::GLenum pname, const tcu::Vec4 &expected, QueryType type);
489 void verifyStateSamplerParamNormalizedI32Vec4(tcu::ResultCollector &result, glu::CallLogWrapper &gl,
490 glw::GLuint sampler, glw::GLenum pname, const tcu::IVec4 &expected,
491 QueryType type);
492 void verifyStateSamplerParamIntegerVec4(tcu::ResultCollector &result, glu::CallLogWrapper &gl, glw::GLuint sampler,
493 glw::GLenum pname, const tcu::IVec4 &expected, QueryType type);
494 void verifyStateSamplerParamUnsignedIntegerVec4(tcu::ResultCollector &result, glu::CallLogWrapper &gl,
495 glw::GLuint sampler, glw::GLenum pname, const tcu::UVec4 &expected,
496 QueryType type);
497
498 } // namespace StateQueryUtil
499 } // namespace gls
500 } // namespace deqp
501
502 #endif // _GLSSTATEQUERYUTIL_HPP
503