Home | History | Annotate | Download | only in egl
      1 /*-------------------------------------------------------------------------
      2  * drawElements Quality Program EGL Module
      3  * ---------------------------------------
      4  *
      5  * Copyright 2014 The Android Open Source Project
      6  *
      7  * Licensed under the Apache License, Version 2.0 (the "License");
      8  * you may not use this file except in compliance with the License.
      9  * You may obtain a copy of the License at
     10  *
     11  *      http://www.apache.org/licenses/LICENSE-2.0
     12  *
     13  * Unless required by applicable law or agreed to in writing, software
     14  * distributed under the License is distributed on an "AS IS" BASIS,
     15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16  * See the License for the specific language governing permissions and
     17  * limitations under the License.
     18  *
     19  *//*!
     20  * \file
     21  * \brief EGL EGL_KHR_fence_sync and EGL_KHR_reusable_sync tests
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "teglSyncTests.hpp"
     25 
     26 #include "egluNativeWindow.hpp"
     27 #include "egluStrUtil.hpp"
     28 #include "egluUtil.hpp"
     29 
     30 #include "eglwLibrary.hpp"
     31 #include "eglwEnums.hpp"
     32 
     33 #include "tcuTestLog.hpp"
     34 #include "tcuCommandLine.hpp"
     35 
     36 #include "gluDefs.hpp"
     37 
     38 #include "glwFunctions.hpp"
     39 #include "glwEnums.hpp"
     40 
     41 #include <vector>
     42 #include <string>
     43 #include <sstream>
     44 #include <set>
     45 
     46 using std::vector;
     47 using std::string;
     48 using std::set;
     49 
     50 using tcu::TestLog;
     51 
     52 using namespace eglw;
     53 using namespace glw;
     54 
     55 namespace deqp
     56 {
     57 namespace egl
     58 {
     59 namespace
     60 {
     61 
     62 const char* getSyncTypeName (EGLenum syncType)
     63 {
     64 	switch (syncType)
     65 	{
     66 		case EGL_SYNC_FENCE_KHR:	return "EGL_SYNC_FENCE_KHR";
     67 		case EGL_SYNC_REUSABLE_KHR:	return "EGL_SYNC_REUSABLE_KHR";
     68 		default:
     69 			DE_ASSERT(DE_FALSE);
     70 			return "<Unknown>";
     71 	}
     72 }
     73 
     74 class SyncTest : public TestCase
     75 {
     76 public:
     77 	enum Extension
     78 	{
     79 		EXTENSION_NONE				= 0,
     80 		EXTENSION_WAIT_SYNC			= (0x1 << 0),
     81 		EXTENSION_FENCE_SYNC		= (0x1 << 1),
     82 		EXTENSION_REUSABLE_SYNC		= (0x1 << 2)
     83 	};
     84 									SyncTest	(EglTestContext& eglTestCtx, EGLenum syncType, Extension extensions, bool useCurrentContext, const char* name, const char* description);
     85 									~SyncTest	(void);
     86 
     87 	void							init		(void);
     88 	void							deinit		(void);
     89 
     90 protected:
     91 	const EGLenum					m_syncType;
     92 	const Extension					m_extensions;
     93 	const bool						m_useCurrentContext;
     94 
     95 	glw::Functions					m_gl;
     96 
     97 	EGLDisplay						m_eglDisplay;
     98 	EGLConfig						m_eglConfig;
     99 	EGLSurface						m_eglSurface;
    100 	eglu::NativeWindow*				m_nativeWindow;
    101 	EGLContext						m_eglContext;
    102 	EGLSyncKHR						m_sync;
    103 };
    104 
    105 SyncTest::SyncTest (EglTestContext& eglTestCtx, EGLenum syncType, Extension extensions,  bool useCurrentContext, const char* name, const char* description)
    106 	: TestCase				(eglTestCtx, name, description)
    107 	, m_syncType			(syncType)
    108 	, m_extensions			(extensions)
    109 	, m_useCurrentContext	(useCurrentContext)
    110 	, m_eglDisplay			(EGL_NO_DISPLAY)
    111 	, m_eglSurface			(EGL_NO_SURFACE)
    112 	, m_nativeWindow		(DE_NULL)
    113 	, m_eglContext			(EGL_NO_CONTEXT)
    114 	, m_sync				(EGL_NO_SYNC_KHR)
    115 {
    116 }
    117 
    118 SyncTest::~SyncTest (void)
    119 {
    120 	SyncTest::deinit();
    121 }
    122 
    123 void requiredEGLExtensions (const Library& egl, EGLDisplay display, SyncTest::Extension requiredExtensions)
    124 {
    125 	SyncTest::Extension foundExtensions = SyncTest::EXTENSION_NONE;
    126 	std::istringstream	extensionStream(egl.queryString(display, EGL_EXTENSIONS));
    127 	string				extension;
    128 
    129 	EGLU_CHECK_MSG(egl, "eglQueryString(display, EGL_EXTENSIONS)");
    130 
    131 	while (std::getline(extensionStream, extension, ' '))
    132 	{
    133 		if (extension == "EGL_KHR_fence_sync")
    134 			foundExtensions = (SyncTest::Extension)(foundExtensions | SyncTest::EXTENSION_FENCE_SYNC);
    135 		else if (extension == "EGL_KHR_reusable_sync")
    136 			foundExtensions = (SyncTest::Extension)(foundExtensions | SyncTest::EXTENSION_REUSABLE_SYNC);
    137 		else if (extension == "EGL_KHR_wait_sync")
    138 			foundExtensions = (SyncTest::Extension)(foundExtensions | SyncTest::EXTENSION_WAIT_SYNC);
    139 	}
    140 
    141 	{
    142 		const SyncTest::Extension missingExtensions = (SyncTest::Extension)((foundExtensions & requiredExtensions) ^ requiredExtensions);
    143 
    144 		if ((missingExtensions & SyncTest::EXTENSION_FENCE_SYNC) != 0)
    145 			TCU_THROW(NotSupportedError, "EGL_KHR_fence_sync not supported");
    146 
    147 		if ((missingExtensions & SyncTest::EXTENSION_REUSABLE_SYNC) != 0)
    148 			TCU_THROW(NotSupportedError, "EGL_KHR_reusable_sync not supported");
    149 
    150 		if ((missingExtensions & SyncTest::EXTENSION_WAIT_SYNC) != 0)
    151 			TCU_THROW(NotSupportedError, "EGL_KHR_wait_sync not supported");
    152 	}
    153 }
    154 
    155 void requiredGLESExtensions (const glw::Functions& gl)
    156 {
    157 	bool				found = false;
    158 	std::istringstream	extensionStream((const char*)gl.getString(GL_EXTENSIONS));
    159 	string				extension;
    160 
    161 	GLU_CHECK_GLW_MSG(gl, "glGetString(GL_EXTENSIONS)");
    162 
    163 	while (std::getline(extensionStream, extension, ' '))
    164 	{
    165 		if (extension == "GL_OES_EGL_sync")
    166 			found = true;
    167 	}
    168 
    169 	if (!found)
    170 		TCU_THROW(NotSupportedError, "GL_OES_EGL_sync not supported");
    171 }
    172 
    173 SyncTest::Extension getSyncTypeExtension (EGLenum syncType)
    174 {
    175 	switch (syncType)
    176 	{
    177 		case EGL_SYNC_FENCE_KHR:	return SyncTest::EXTENSION_FENCE_SYNC;
    178 		case EGL_SYNC_REUSABLE_KHR:	return SyncTest::EXTENSION_REUSABLE_SYNC;
    179 		default:
    180 			DE_ASSERT(DE_FALSE);
    181 			return SyncTest::EXTENSION_NONE;
    182 	}
    183 }
    184 
    185 void SyncTest::init (void)
    186 {
    187 	const Library&						egl				= m_eglTestCtx.getLibrary();
    188 	const eglu::NativeWindowFactory&	windowFactory	= eglu::selectNativeWindowFactory(m_eglTestCtx.getNativeDisplayFactory(), m_testCtx.getCommandLine());
    189 
    190 	const EGLint displayAttribList[] =
    191 	{
    192 		EGL_RENDERABLE_TYPE,	EGL_OPENGL_ES2_BIT,
    193 		EGL_SURFACE_TYPE,		EGL_WINDOW_BIT,
    194 		EGL_ALPHA_SIZE,			1,
    195 		EGL_NONE
    196 	};
    197 
    198 	const EGLint contextAttribList[] =
    199 	{
    200 		EGL_CONTEXT_CLIENT_VERSION, 2,
    201 		EGL_NONE
    202 	};
    203 
    204 	m_eglDisplay	= eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay());
    205 	m_eglConfig		= eglu::chooseSingleConfig(egl, m_eglDisplay, displayAttribList);
    206 
    207 	m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(2,0));
    208 
    209 	{
    210 		const Extension syncTypeExtension = getSyncTypeExtension(m_syncType);
    211 		requiredEGLExtensions(egl, m_eglDisplay, (Extension)(m_extensions | syncTypeExtension));
    212 	}
    213 
    214 	if (m_useCurrentContext)
    215 	{
    216 		// Create context
    217 		EGLU_CHECK_CALL(egl, bindAPI(EGL_OPENGL_ES_API));
    218 		m_eglContext = egl.createContext(m_eglDisplay, m_eglConfig, EGL_NO_CONTEXT, contextAttribList);
    219 		EGLU_CHECK_MSG(egl, "Failed to create GLES2 context");
    220 
    221 		// Create surface
    222 		m_nativeWindow = windowFactory.createWindow(&m_eglTestCtx.getNativeDisplay(), m_eglDisplay, m_eglConfig, DE_NULL, eglu::WindowParams(480, 480, eglu::parseWindowVisibility(m_testCtx.getCommandLine())));
    223 		m_eglSurface = eglu::createWindowSurface(m_eglTestCtx.getNativeDisplay(), *m_nativeWindow, m_eglDisplay, m_eglConfig, DE_NULL);
    224 
    225 		EGLU_CHECK_CALL(egl, makeCurrent(m_eglDisplay, m_eglSurface, m_eglSurface, m_eglContext));
    226 
    227 		requiredGLESExtensions(m_gl);
    228 	}
    229 }
    230 
    231 void SyncTest::deinit (void)
    232 {
    233 	const Library&	egl		= m_eglTestCtx.getLibrary();
    234 
    235 	if (m_eglDisplay != EGL_NO_DISPLAY)
    236 	{
    237 		if (m_sync != EGL_NO_SYNC_KHR)
    238 		{
    239 			EGLU_CHECK_CALL(egl, destroySyncKHR(m_eglDisplay, m_sync));
    240 			m_sync = EGL_NO_SYNC_KHR;
    241 		}
    242 
    243 		EGLU_CHECK_CALL(egl, makeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
    244 
    245 		if (m_eglContext != EGL_NO_CONTEXT)
    246 		{
    247 			EGLU_CHECK_CALL(egl, destroyContext(m_eglDisplay, m_eglContext));
    248 			m_eglContext = EGL_NO_CONTEXT;
    249 		}
    250 
    251 		if (m_eglSurface != EGL_NO_SURFACE)
    252 		{
    253 			EGLU_CHECK_CALL(egl, destroySurface(m_eglDisplay, m_eglSurface));
    254 			m_eglSurface = EGL_NO_SURFACE;
    255 		}
    256 
    257 		delete m_nativeWindow;
    258 		m_nativeWindow = DE_NULL;
    259 
    260 		egl.terminate(m_eglDisplay);
    261 		m_eglDisplay = EGL_NO_DISPLAY;
    262 	}
    263 }
    264 
    265 class CreateNullAttribsTest : public SyncTest
    266 {
    267 public:
    268 					CreateNullAttribsTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    269 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE, syncType != EGL_SYNC_REUSABLE_KHR, "create_null_attribs", "create_null_attribs")
    270 	{
    271 	}
    272 
    273 	IterateResult	iterate					(void)
    274 	{
    275 		const Library&	egl		= m_eglTestCtx.getLibrary();
    276 		TestLog&		log		= m_testCtx.getLog();
    277 
    278 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
    279 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
    280 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
    281 
    282 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    283 		return STOP;
    284 	}
    285 };
    286 
    287 class CreateEmptyAttribsTest : public SyncTest
    288 {
    289 public:
    290 					CreateEmptyAttribsTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    291 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE, syncType != EGL_SYNC_REUSABLE_KHR,  "create_empty_attribs", "create_empty_attribs")
    292 	{
    293 	}
    294 
    295 	IterateResult	iterate					(void)
    296 	{
    297 
    298 		const Library&	egl				= m_eglTestCtx.getLibrary();
    299 		TestLog&		log				= m_testCtx.getLog();
    300 		const EGLint	attribList[]	=
    301 		{
    302 			EGL_NONE
    303 		};
    304 
    305 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, attribList);
    306 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", { EGL_NONE })" << TestLog::EndMessage;
    307 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
    308 
    309 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    310 		return STOP;
    311 	}
    312 };
    313 
    314 class CreateInvalidDisplayTest : public SyncTest
    315 {
    316 public:
    317 					CreateInvalidDisplayTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    318 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE, syncType != EGL_SYNC_REUSABLE_KHR,  "create_invalid_display", "create_invalid_display")
    319 	{
    320 	}
    321 
    322 	IterateResult	iterate						(void)
    323 	{
    324 		const Library&	egl		= m_eglTestCtx.getLibrary();
    325 		TestLog&		log		= m_testCtx.getLog();
    326 
    327 		m_sync = egl.createSyncKHR(EGL_NO_DISPLAY, m_syncType, NULL);
    328 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(EGL_NO_DISPLAY, " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
    329 
    330 		EGLint error = egl.getError();
    331 		log << TestLog::Message << error << " = eglGetError()" << TestLog::EndMessage;
    332 
    333 		if (error != EGL_BAD_DISPLAY)
    334 		{
    335 			log << TestLog::Message << "Unexpected error '" << eglu::getErrorStr(error) << "' expected EGL_BAD_DISPLAY" << TestLog::EndMessage;
    336 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
    337 			return STOP;
    338 		}
    339 
    340 		TCU_CHECK(m_sync == EGL_NO_SYNC_KHR);
    341 
    342 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    343 		return STOP;
    344 	}
    345 };
    346 
    347 class CreateInvalidTypeTest : public SyncTest
    348 {
    349 public:
    350 					CreateInvalidTypeTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    351 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE, syncType != EGL_SYNC_REUSABLE_KHR,  "create_invalid_type", "create_invalid_type")
    352 	{
    353 	}
    354 
    355 	IterateResult	iterate					(void)
    356 	{
    357 		const Library&	egl		= m_eglTestCtx.getLibrary();
    358 		TestLog&		log		= m_testCtx.getLog();
    359 
    360 		m_sync = egl.createSyncKHR(m_eglDisplay, EGL_NONE, NULL);
    361 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", EGL_NONE, NULL)" << TestLog::EndMessage;
    362 
    363 		EGLint error = egl.getError();
    364 		log << TestLog::Message << error << " = eglGetError()" << TestLog::EndMessage;
    365 
    366 		if (error != EGL_BAD_ATTRIBUTE)
    367 		{
    368 			log << TestLog::Message << "Unexpected error '" << eglu::getErrorStr(error) << "' expected EGL_BAD_ATTRIBUTE" << TestLog::EndMessage;
    369 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
    370 			return STOP;
    371 		}
    372 
    373 		TCU_CHECK(m_sync == EGL_NO_SYNC_KHR);
    374 
    375 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    376 		return STOP;
    377 	}
    378 };
    379 
    380 class CreateInvalidAttribsTest : public SyncTest
    381 {
    382 public:
    383 					CreateInvalidAttribsTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    384 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE, syncType != EGL_SYNC_REUSABLE_KHR,  "create_invalid_attribs", "create_invalid_attribs")
    385 	{
    386 	}
    387 
    388 	IterateResult	iterate						(void)
    389 	{
    390 		const Library&	egl		= m_eglTestCtx.getLibrary();
    391 		TestLog&		log		= m_testCtx.getLog();
    392 
    393 		EGLint attribs[] = {
    394 			2, 3, 4, 5,
    395 			EGL_NONE
    396 		};
    397 
    398 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, attribs);
    399 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", { 2, 3, 4, 5, EGL_NONE })" << TestLog::EndMessage;
    400 
    401 		EGLint error = egl.getError();
    402 		log << TestLog::Message << error << " = eglGetError()" << TestLog::EndMessage;
    403 
    404 		if (error != EGL_BAD_ATTRIBUTE)
    405 		{
    406 			log << TestLog::Message << "Unexpected error '" << eglu::getErrorStr(error) << "' expected EGL_BAD_ATTRIBUTE" << TestLog::EndMessage;
    407 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
    408 			return STOP;
    409 		}
    410 
    411 		TCU_CHECK(m_sync == EGL_NO_SYNC_KHR);
    412 
    413 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    414 		return STOP;
    415 	}
    416 };
    417 
    418 class CreateInvalidContextTest : public SyncTest
    419 {
    420 public:
    421 					CreateInvalidContextTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    422 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE, syncType != EGL_SYNC_REUSABLE_KHR,  "create_invalid_context", "create_invalid_context")
    423 	{
    424 	}
    425 
    426 	IterateResult	iterate						(void)
    427 	{
    428 		const Library&	egl		= m_eglTestCtx.getLibrary();
    429 		TestLog&		log		= m_testCtx.getLog();
    430 
    431 		log << TestLog::Message << "eglMakeCurrent(" << m_eglDisplay << ", EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)" << TestLog::EndMessage;
    432 		EGLU_CHECK_CALL(egl, makeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
    433 
    434 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
    435 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
    436 
    437 		EGLint error = egl.getError();
    438 		log << TestLog::Message << error << " = eglGetError()" << TestLog::EndMessage;
    439 
    440 		if (error != EGL_BAD_MATCH)
    441 		{
    442 			log << TestLog::Message << "Unexpected error '" << eglu::getErrorStr(error) << "' expected EGL_BAD_MATCH" << TestLog::EndMessage;
    443 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
    444 			return STOP;
    445 		}
    446 
    447 		TCU_CHECK(m_sync == EGL_NO_SYNC_KHR);
    448 
    449 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    450 		return STOP;
    451 	}
    452 };
    453 
    454 class ClientWaitNoTimeoutTest : public SyncTest
    455 {
    456 public:
    457 					ClientWaitNoTimeoutTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    458 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE, syncType != EGL_SYNC_REUSABLE_KHR,  "wait_no_timeout", "wait_no_timeout")
    459 	{
    460 	}
    461 
    462 	IterateResult	iterate					(void)
    463 	{
    464 		const Library&	egl		= m_eglTestCtx.getLibrary();
    465 		TestLog&		log		= m_testCtx.getLog();
    466 
    467 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
    468 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
    469 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
    470 
    471 		EGLint status = egl.clientWaitSyncKHR(m_eglDisplay, m_sync, 0, 0);
    472 		log << TestLog::Message << status << " = eglClientWaitSyncKHR(" << m_eglDisplay << ", " << m_sync << ", 0, 0)" << TestLog::EndMessage;
    473 
    474 		if (m_syncType == EGL_SYNC_FENCE_KHR)
    475 			TCU_CHECK(status == EGL_CONDITION_SATISFIED_KHR || status == EGL_TIMEOUT_EXPIRED_KHR);
    476 		else if (m_syncType == EGL_SYNC_REUSABLE_KHR)
    477 			TCU_CHECK(status == EGL_TIMEOUT_EXPIRED_KHR);
    478 		else
    479 			DE_ASSERT(DE_FALSE);
    480 
    481 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    482 		return STOP;
    483 	}
    484 
    485 };
    486 
    487 class ClientWaitForeverTest : public SyncTest
    488 {
    489 public:
    490 					ClientWaitForeverTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    491 	: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE, syncType != EGL_SYNC_REUSABLE_KHR, "wait_forever", "wait_forever")
    492 	{
    493 	}
    494 
    495 	IterateResult	iterate					(void)
    496 	{
    497 		const Library&	egl		= m_eglTestCtx.getLibrary();
    498 		TestLog&		log		= m_testCtx.getLog();
    499 
    500 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
    501 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
    502 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
    503 
    504 		if (m_syncType == EGL_SYNC_REUSABLE_KHR)
    505 		{
    506 			EGLBoolean ret = egl.signalSyncKHR(m_eglDisplay, m_sync, EGL_SIGNALED_KHR);
    507 			log << TestLog::Message << ret << " = eglSignalSyncKHR(" << m_eglDisplay << ", " << m_sync << ", EGL_SIGNALED_KHR)" << TestLog::EndMessage;
    508 			EGLU_CHECK_MSG(egl, "eglSignalSyncKHR()");
    509 		}
    510 		else if (m_syncType == EGL_SYNC_FENCE_KHR)
    511 		{
    512 			GLU_CHECK_GLW_CALL(m_gl, flush());
    513 			log << TestLog::Message << "glFlush()" << TestLog::EndMessage;
    514 		}
    515 		else
    516 			DE_ASSERT(DE_FALSE);
    517 
    518 		EGLint status = egl.clientWaitSyncKHR(m_eglDisplay, m_sync, 0, EGL_FOREVER_KHR);
    519 		log << TestLog::Message << status << " = eglClientWaitSyncKHR(" << m_eglDisplay << ", " << m_sync << ", 0, EGL_FOREVER_KHR)" << TestLog::EndMessage;
    520 
    521 		TCU_CHECK(status == EGL_CONDITION_SATISFIED_KHR);
    522 		EGLU_CHECK_MSG(egl, "eglClientWaitSyncKHR()");
    523 
    524 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    525 		return STOP;
    526 	}
    527 };
    528 
    529 class ClientWaitNoContextTest : public SyncTest
    530 {
    531 public:
    532 					ClientWaitNoContextTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    533 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE, syncType != EGL_SYNC_REUSABLE_KHR, "wait_no_context", "wait_no_Context")
    534 	{
    535 	}
    536 
    537 	IterateResult	iterate					(void)
    538 	{
    539 		const Library&	egl		= m_eglTestCtx.getLibrary();
    540 		TestLog&		log		= m_testCtx.getLog();
    541 
    542 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
    543 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
    544 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
    545 
    546 
    547 		if (m_syncType == EGL_SYNC_REUSABLE_KHR)
    548 		{
    549 			EGLBoolean ret = egl.signalSyncKHR(m_eglDisplay, m_sync, EGL_SIGNALED_KHR);
    550 			log << TestLog::Message << ret << " = eglSignalSyncKHR(" << m_eglDisplay << ", " << m_sync << ", EGL_SIGNALED_KHR)" << TestLog::EndMessage;
    551 			EGLU_CHECK_MSG(egl, "eglSignalSyncKHR()");
    552 		}
    553 		else if (m_syncType == EGL_SYNC_FENCE_KHR)
    554 		{
    555 			GLU_CHECK_GLW_CALL(m_gl, flush());
    556 			log << TestLog::Message << "glFlush()" << TestLog::EndMessage;
    557 		}
    558 		else
    559 			DE_ASSERT(DE_FALSE);
    560 
    561 		log << TestLog::Message << "eglMakeCurrent(" << m_eglDisplay << ", EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)" << TestLog::EndMessage;
    562 		EGLU_CHECK_CALL(egl, makeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
    563 
    564 		EGLint result = egl.clientWaitSyncKHR(m_eglDisplay, m_sync, 0, EGL_FOREVER_KHR);
    565 		log << TestLog::Message << result << " = eglClientWaitSyncKHR(" << m_eglDisplay << ", " << m_sync << ", 0, EGL_FOREVER_KHR)" << TestLog::EndMessage;
    566 
    567 		TCU_CHECK(result == EGL_CONDITION_SATISFIED_KHR);
    568 
    569 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    570 		return STOP;
    571 	}
    572 };
    573 
    574 class ClientWaitForeverFlushTest : public SyncTest
    575 {
    576 public:
    577 					ClientWaitForeverFlushTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    578 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE, syncType != EGL_SYNC_REUSABLE_KHR, "wait_forever_flush", "wait_forever_flush")
    579 	{
    580 	}
    581 
    582 	IterateResult	iterate						(void)
    583 	{
    584 		const Library&	egl		= m_eglTestCtx.getLibrary();
    585 		TestLog&		log		= m_testCtx.getLog();
    586 
    587 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
    588 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
    589 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
    590 
    591 		if (m_syncType == EGL_SYNC_REUSABLE_KHR)
    592 		{
    593 			EGLBoolean ret = egl.signalSyncKHR(m_eglDisplay, m_sync, EGL_SIGNALED_KHR);
    594 			log << TestLog::Message << ret << " = eglSignalSyncKHR(" << m_eglDisplay << ", " << m_sync << ", EGL_SIGNALED_KHR)" << TestLog::EndMessage;
    595 			EGLU_CHECK_MSG(egl, "eglSignalSyncKHR()");
    596 		}
    597 
    598 		EGLint status = egl.clientWaitSyncKHR(m_eglDisplay, m_sync, EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, EGL_FOREVER_KHR);
    599 		log << TestLog::Message << status << " = eglClientWaitSyncKHR(" << m_eglDisplay << ", " << m_sync << ", EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, EGL_FOREVER_KHR)" << TestLog::EndMessage;
    600 
    601 		TCU_CHECK(status == EGL_CONDITION_SATISFIED_KHR);
    602 
    603 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    604 		return STOP;
    605 	}
    606 };
    607 
    608 class ClientWaitInvalidDisplayTest : public SyncTest
    609 {
    610 public:
    611 					ClientWaitInvalidDisplayTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    612 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE, syncType != EGL_SYNC_REUSABLE_KHR, "wait_invalid_display", "wait_invalid_display")
    613 	{
    614 	}
    615 
    616 	IterateResult	iterate							(void)
    617 	{
    618 		const Library&	egl		= m_eglTestCtx.getLibrary();
    619 		TestLog&		log		= m_testCtx.getLog();
    620 
    621 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
    622 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
    623 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
    624 
    625 		EGLint status = egl.clientWaitSyncKHR(EGL_NO_DISPLAY, m_sync, EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, EGL_FOREVER_KHR);
    626 		log << TestLog::Message << status << " = eglClientWaitSyncKHR(EGL_NO_DISPLAY, " << m_sync << ", EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, EGL_FOREVER_KHR)" << TestLog::EndMessage;
    627 
    628 		EGLint error = egl.getError();
    629 		log << TestLog::Message << error << " = eglGetError()" << TestLog::EndMessage;
    630 
    631 		if (error != EGL_BAD_DISPLAY)
    632 		{
    633 			log << TestLog::Message << "Unexpected error '" << eglu::getErrorStr(error) << "' expected EGL_BAD_DISPLAY" << TestLog::EndMessage;
    634 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
    635 			return STOP;
    636 		}
    637 
    638 		TCU_CHECK(status == EGL_FALSE);
    639 
    640 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    641 		return STOP;
    642 	}
    643 };
    644 
    645 class ClientWaitInvalidSyncTest : public SyncTest
    646 {
    647 public:
    648 					ClientWaitInvalidSyncTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    649 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE, syncType != EGL_SYNC_REUSABLE_KHR, "wait_invalid_sync", "wait_invalid_sync")
    650 	{
    651 	}
    652 
    653 	IterateResult	iterate						(void)
    654 	{
    655 		const Library&	egl		= m_eglTestCtx.getLibrary();
    656 		TestLog&		log		= m_testCtx.getLog();
    657 
    658 		EGLint status = egl.clientWaitSyncKHR(m_eglDisplay, EGL_NO_SYNC_KHR, 0, EGL_FOREVER_KHR);
    659 		log << TestLog::Message << status << " = eglClientWaitSyncKHR(" << m_eglDisplay << ", EGL_NO_SYNC_KHR, 0, EGL_FOREVER_KHR)" << TestLog::EndMessage;
    660 
    661 		EGLint error = egl.getError();
    662 		log << TestLog::Message << error << " = eglGetError()" << TestLog::EndMessage;
    663 
    664 		if (error != EGL_BAD_PARAMETER)
    665 		{
    666 			log << TestLog::Message << "Unexpected error '" << eglu::getErrorStr(error) << "' expected EGL_BAD_PARAMETER" << TestLog::EndMessage;
    667 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
    668 			return STOP;
    669 		}
    670 
    671 		TCU_CHECK(status == EGL_FALSE);
    672 
    673 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    674 		return STOP;
    675 	}
    676 };
    677 
    678 class GetSyncTypeTest : public SyncTest
    679 {
    680 public:
    681 					GetSyncTypeTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    682 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE, syncType != EGL_SYNC_REUSABLE_KHR, "get_type", "get_type")
    683 	{
    684 	}
    685 
    686 	IterateResult	iterate			(void)
    687 	{
    688 		const Library&	egl		= m_eglTestCtx.getLibrary();
    689 		TestLog&		log		= m_testCtx.getLog();
    690 
    691 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
    692 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
    693 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
    694 
    695 		EGLint type = 0;
    696 		EGLU_CHECK_CALL(egl, getSyncAttribKHR(m_eglDisplay, m_sync, EGL_SYNC_TYPE_KHR, &type));
    697 		log << TestLog::Message << "eglGetSyncAttribKHR(" << m_eglDisplay << ", " << m_sync << ", EGL_SYNC_TYPE_KHR, {" << type << "})" << TestLog::EndMessage;
    698 
    699 		TCU_CHECK(type == ((EGLint)m_syncType));
    700 
    701 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    702 		return STOP;
    703 	}
    704 };
    705 
    706 class GetSyncStatusTest : public SyncTest
    707 {
    708 public:
    709 					GetSyncStatusTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    710 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE, syncType != EGL_SYNC_REUSABLE_KHR, "get_status", "get_status")
    711 	{
    712 	}
    713 
    714 	IterateResult	iterate				(void)
    715 	{
    716 		const Library&	egl		= m_eglTestCtx.getLibrary();
    717 		TestLog&		log		= m_testCtx.getLog();
    718 
    719 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
    720 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
    721 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
    722 
    723 		EGLint status = 0;
    724 		EGLU_CHECK_CALL(egl, getSyncAttribKHR(m_eglDisplay, m_sync, EGL_SYNC_STATUS_KHR, &status));
    725 		log << TestLog::Message << "eglGetSyncAttribKHR(" << m_eglDisplay << ", " << m_sync << ", EGL_SYNC_STATUS_KHR, {" << status << "})" << TestLog::EndMessage;
    726 
    727 		if (m_syncType == EGL_SYNC_FENCE_KHR)
    728 			TCU_CHECK(status == EGL_SIGNALED_KHR || status == EGL_UNSIGNALED_KHR);
    729 		else if (m_syncType == EGL_SYNC_REUSABLE_KHR)
    730 			TCU_CHECK(status == EGL_UNSIGNALED_KHR);
    731 
    732 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    733 		return STOP;
    734 	}
    735 };
    736 
    737 class GetSyncStatusSignaledTest : public SyncTest
    738 {
    739 public:
    740 					GetSyncStatusSignaledTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    741 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE, syncType != EGL_SYNC_REUSABLE_KHR, "get_status_signaled", "get_status_signaled")
    742 	{
    743 	}
    744 
    745 	IterateResult	iterate						(void)
    746 	{
    747 		const Library&	egl		= m_eglTestCtx.getLibrary();
    748 		TestLog&		log		= m_testCtx.getLog();
    749 
    750 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
    751 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
    752 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
    753 
    754 		if (m_syncType == EGL_SYNC_REUSABLE_KHR)
    755 		{
    756 			EGLBoolean ret = egl.signalSyncKHR(m_eglDisplay, m_sync, EGL_SIGNALED_KHR);
    757 			log << TestLog::Message << ret << " = eglSignalSyncKHR(" << m_eglDisplay << ", " << m_sync << ", EGL_SIGNALED_KHR)" << TestLog::EndMessage;
    758 			EGLU_CHECK_MSG(egl, "eglSignalSyncKHR()");
    759 		}
    760 		else if (m_syncType == EGL_SYNC_FENCE_KHR)
    761 		{
    762 			GLU_CHECK_GLW_CALL(m_gl, finish());
    763 			log << TestLog::Message << "glFinish()" << TestLog::EndMessage;
    764 		}
    765 		else
    766 			DE_ASSERT(DE_FALSE);
    767 
    768 		{
    769 			EGLint status = egl.clientWaitSyncKHR(m_eglDisplay, m_sync, EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, EGL_FOREVER_KHR);
    770 			log << TestLog::Message << status << " = eglClientWaitSyncKHR(" << m_eglDisplay << ", " << m_sync << ", EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, EGL_FOREVER_KHR)" << TestLog::EndMessage;
    771 			TCU_CHECK(status == EGL_CONDITION_SATISFIED_KHR);
    772 		}
    773 
    774 		EGLint status = 0;
    775 		EGLU_CHECK_CALL(egl, getSyncAttribKHR(m_eglDisplay, m_sync, EGL_SYNC_STATUS_KHR, &status));
    776 		log << TestLog::Message << "eglGetSyncAttribKHR(" << m_eglDisplay << ", " << m_sync << ", EGL_SYNC_STATUS_KHR, {" << status << "})" << TestLog::EndMessage;
    777 
    778 		TCU_CHECK(status == EGL_SIGNALED_KHR);
    779 
    780 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    781 		return STOP;
    782 	}
    783 };
    784 
    785 class GetSyncConditionTest : public SyncTest
    786 {
    787 public:
    788 					GetSyncConditionTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    789 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE, syncType != EGL_SYNC_REUSABLE_KHR, "get_condition", "get_condition")
    790 	{
    791 	}
    792 
    793 	IterateResult	iterate					(void)
    794 	{
    795 		const Library&	egl		= m_eglTestCtx.getLibrary();
    796 		TestLog&		log		= m_testCtx.getLog();
    797 
    798 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
    799 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
    800 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
    801 
    802 		EGLint condition = 0;
    803 		EGLU_CHECK_CALL(egl, getSyncAttribKHR(m_eglDisplay, m_sync, EGL_SYNC_CONDITION_KHR, &condition));
    804 		log << TestLog::Message << "eglGetSyncAttribKHR(" << m_eglDisplay << ", " << m_sync << ", EGL_SYNC_CONDITION_KHR, {" << condition << "})" << TestLog::EndMessage;
    805 
    806 		TCU_CHECK(condition == EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR);
    807 
    808 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    809 		return STOP;
    810 	}
    811 };
    812 
    813 class GetSyncInvalidDisplayTest : public SyncTest
    814 {
    815 public:
    816 					GetSyncInvalidDisplayTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    817 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE,  syncType != EGL_SYNC_REUSABLE_KHR,"get_invalid_display", "get_invalid_display")
    818 	{
    819 	}
    820 
    821 	IterateResult	iterate						(void)
    822 	{
    823 		const Library&	egl		= m_eglTestCtx.getLibrary();
    824 		TestLog&		log		= m_testCtx.getLog();
    825 
    826 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
    827 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
    828 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
    829 
    830 		EGLint condition = 0xF0F0F;
    831 		EGLBoolean result = egl.getSyncAttribKHR(EGL_NO_DISPLAY, m_sync, EGL_SYNC_CONDITION_KHR, &condition);
    832 		log << TestLog::Message << result << " = eglGetSyncAttribKHR(EGL_NO_DISPLAY, " << m_sync << ", EGL_SYNC_CONDITION_KHR, {" << condition << "})" << TestLog::EndMessage;
    833 
    834 		EGLint error = egl.getError();
    835 		log << TestLog::Message << error << " = eglGetError()" << TestLog::EndMessage;
    836 
    837 		if (error != EGL_BAD_DISPLAY)
    838 		{
    839 			log << TestLog::Message << "Unexpected error '" << eglu::getErrorStr(error) << "' expected EGL_BAD_DISPLAY" << TestLog::EndMessage;
    840 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
    841 			return STOP;
    842 		}
    843 
    844 		TCU_CHECK(result == EGL_FALSE);
    845 		TCU_CHECK(condition == 0xF0F0F);
    846 
    847 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    848 		return STOP;
    849 	}
    850 };
    851 
    852 class GetSyncInvalidSyncTest : public SyncTest
    853 {
    854 public:
    855 					GetSyncInvalidSyncTest	(EglTestContext& eglTestCtx, EGLenum syncType)\
    856 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE, syncType != EGL_SYNC_REUSABLE_KHR, "get_invalid_sync", "get_invalid_sync")
    857 	{
    858 	}
    859 
    860 	IterateResult	iterate					(void)
    861 	{
    862 		const Library&	egl		= m_eglTestCtx.getLibrary();
    863 		TestLog&		log		= m_testCtx.getLog();
    864 
    865 		EGLint condition = 0xF0F0F;
    866 		EGLBoolean result = egl.getSyncAttribKHR(m_eglDisplay, EGL_NO_SYNC_KHR, EGL_SYNC_CONDITION_KHR, &condition);
    867 		log << TestLog::Message << result << " = eglGetSyncAttribKHR(" << m_eglDisplay << ", EGL_NO_SYNC_KHR, EGL_SYNC_CONDITION_KHR, {" << condition << "})" << TestLog::EndMessage;
    868 
    869 		EGLint error = egl.getError();
    870 		log << TestLog::Message << error << " = eglGetError()" << TestLog::EndMessage;
    871 
    872 		if (error != EGL_BAD_PARAMETER)
    873 		{
    874 			log << TestLog::Message << "Unexpected error '" << eglu::getErrorStr(error) << "' expected EGL_BAD_PARAMETER" << TestLog::EndMessage;
    875 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
    876 			return STOP;
    877 		}
    878 
    879 		TCU_CHECK(result == EGL_FALSE);
    880 		TCU_CHECK(condition == 0xF0F0F);
    881 
    882 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    883 		return STOP;
    884 	}
    885 };
    886 
    887 class GetSyncInvalidAttributeTest : public SyncTest
    888 {
    889 public:
    890 					GetSyncInvalidAttributeTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    891 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE,  syncType != EGL_SYNC_REUSABLE_KHR,"get_invalid_attribute", "get_invalid_attribute")
    892 	{
    893 	}
    894 
    895 	IterateResult	iterate						(void)
    896 	{
    897 		const Library&	egl		= m_eglTestCtx.getLibrary();
    898 		TestLog&		log		= m_testCtx.getLog();
    899 
    900 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
    901 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
    902 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
    903 
    904 		EGLint condition = 0xF0F0F;
    905 		EGLBoolean result = egl.getSyncAttribKHR(m_eglDisplay, m_sync, EGL_NONE, &condition);
    906 		log << TestLog::Message << result << " = eglGetSyncAttribKHR(" << m_eglDisplay << ", " << m_sync << ", EGL_NONE, {" << condition << "})" << TestLog::EndMessage;
    907 
    908 		EGLint error = egl.getError();
    909 		log << TestLog::Message << error << " = eglGetError()" << TestLog::EndMessage;
    910 
    911 		if (error != EGL_BAD_ATTRIBUTE)
    912 		{
    913 			log << TestLog::Message << "Unexpected error '" << eglu::getErrorStr(error) << "' expected EGL_BAD_ATTRIBUTE" << TestLog::EndMessage;
    914 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
    915 			return STOP;
    916 		}
    917 
    918 		TCU_CHECK(result == EGL_FALSE);
    919 		TCU_CHECK(condition == 0xF0F0F);
    920 
    921 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    922 		return STOP;
    923 	}
    924 };
    925 
    926 class GetSyncInvalidValueTest : public SyncTest
    927 {
    928 public:
    929 					GetSyncInvalidValueTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    930 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE,  syncType != EGL_SYNC_REUSABLE_KHR,"get_invalid_value", "get_invalid_value")
    931 	{
    932 	}
    933 
    934 	IterateResult	iterate					(void)
    935 	{
    936 		const Library&	egl		= m_eglTestCtx.getLibrary();
    937 		TestLog&		log		= m_testCtx.getLog();
    938 
    939 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
    940 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
    941 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
    942 
    943 		EGLBoolean result = egl.getSyncAttribKHR(m_eglDisplay, m_sync, EGL_SYNC_TYPE_KHR, NULL);
    944 		log << TestLog::Message << result << " = eglGetSyncAttribKHR(" << m_eglDisplay << ", " << m_sync << ", EGL_SYNC_CONDITION_KHR, NULL)" << TestLog::EndMessage;
    945 
    946 		EGLint error = egl.getError();
    947 		log << TestLog::Message << error << " = eglGetError()" << TestLog::EndMessage;
    948 
    949 		if (error != EGL_BAD_PARAMETER)
    950 		{
    951 			log << TestLog::Message << "Unexpected error '" << eglu::getErrorStr(error) << "' expected EGL_BAD_PARAMETER" << TestLog::EndMessage;
    952 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
    953 			return STOP;
    954 		}
    955 
    956 		TCU_CHECK(result == EGL_FALSE);
    957 
    958 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    959 		return STOP;
    960 	}
    961 };
    962 
    963 class DestroySyncTest : public SyncTest
    964 {
    965 public:
    966 					DestroySyncTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    967 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE,  syncType != EGL_SYNC_REUSABLE_KHR,"destroy", "destroy")
    968 	{
    969 	}
    970 
    971 	IterateResult	iterate			(void)
    972 	{
    973 		const Library&	egl		= m_eglTestCtx.getLibrary();
    974 		TestLog&		log		= m_testCtx.getLog();
    975 
    976 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
    977 		log << TestLog::Message << "eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
    978 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
    979 
    980 		log << TestLog::Message << "eglDestroySyncKHR(" << m_eglDisplay << ", " << m_sync << ")" << TestLog::EndMessage;
    981 		EGLU_CHECK_CALL(egl, destroySyncKHR(m_eglDisplay, m_sync));
    982 		m_sync = EGL_NO_SYNC_KHR;
    983 
    984 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    985 		return STOP;
    986 	}
    987 };
    988 
    989 class DestroySyncInvalidDislayTest : public SyncTest
    990 {
    991 public:
    992 					DestroySyncInvalidDislayTest	(EglTestContext& eglTestCtx, EGLenum syncType)
    993 		: SyncTest(eglTestCtx, syncType, SyncTest::EXTENSION_NONE,  syncType != EGL_SYNC_REUSABLE_KHR,"destroy_invalid_display", "destroy_invalid_display")
    994 	{
    995 	}
    996 
    997 	IterateResult	iterate							(void)
    998 	{
    999 		const Library&	egl		= m_eglTestCtx.getLibrary();
   1000 		TestLog&		log		= m_testCtx.getLog();
   1001 
   1002 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
   1003 		log << TestLog::Message << "eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
   1004 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
   1005 
   1006 		EGLBoolean result = egl.destroySyncKHR(EGL_NO_DISPLAY, m_sync);
   1007 		log << TestLog::Message << result << " = eglDestroySyncKHR(EGL_NO_DISPLAY, " << m_sync << ")" << TestLog::EndMessage;
   1008 
   1009 		EGLint error = egl.getError();
   1010 		log << TestLog::Message << error << " = eglGetError()" << TestLog::EndMessage;
   1011 
   1012 		if (error != EGL_BAD_DISPLAY)
   1013 		{
   1014 			log << TestLog::Message << "Unexpected error '" << eglu::getErrorStr(error) << "' expected EGL_BAD_DISPLAY" << TestLog::EndMessage;
   1015 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
   1016 			return STOP;
   1017 		}
   1018 
   1019 		TCU_CHECK(result == EGL_FALSE);
   1020 
   1021 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
   1022 		return STOP;
   1023 	}
   1024 };
   1025 
   1026 class DestroySyncInvalidSyncTest : public SyncTest
   1027 {
   1028 public:
   1029 					DestroySyncInvalidSyncTest	(EglTestContext& eglTestCtx, EGLenum syncType)
   1030 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_NONE,  syncType != EGL_SYNC_REUSABLE_KHR,"destroy_invalid_sync", "destroy_invalid_sync")
   1031 	{
   1032 	}
   1033 
   1034 	IterateResult	iterate						(void)
   1035 	{
   1036 		const Library&	egl		= m_eglTestCtx.getLibrary();
   1037 		TestLog&		log		= m_testCtx.getLog();
   1038 
   1039 		EGLBoolean result = egl.destroySyncKHR(m_eglDisplay, EGL_NO_SYNC_KHR);
   1040 		log << TestLog::Message << result << " = eglDestroySyncKHR(" << m_eglDisplay << ", EGL_NO_SYNC_KHR)" << TestLog::EndMessage;
   1041 
   1042 		EGLint error = egl.getError();
   1043 		log << TestLog::Message << error << " = eglGetError()" << TestLog::EndMessage;
   1044 
   1045 		if (error != EGL_BAD_PARAMETER)
   1046 		{
   1047 			log << TestLog::Message << "Unexpected error '" << eglu::getErrorStr(error) << "' expected EGL_BAD_PARAMETER" << TestLog::EndMessage;
   1048 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
   1049 			return STOP;
   1050 		}
   1051 
   1052 		TCU_CHECK(result == EGL_FALSE);
   1053 
   1054 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
   1055 		return STOP;
   1056 	}
   1057 };
   1058 
   1059 class WaitSyncTest : public SyncTest
   1060 {
   1061 public:
   1062 					WaitSyncTest	(EglTestContext& eglTestCtx, EGLenum syncType)
   1063 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_WAIT_SYNC, true, "wait_server", "wait_server")
   1064 	{
   1065 	}
   1066 
   1067 	IterateResult	iterate			(void)
   1068 	{
   1069 		const Library&	egl		= m_eglTestCtx.getLibrary();
   1070 		TestLog&		log		= m_testCtx.getLog();
   1071 
   1072 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
   1073 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
   1074 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
   1075 
   1076 		EGLint status = egl.waitSyncKHR(m_eglDisplay, m_sync, 0);
   1077 		log << TestLog::Message << status << " = eglWaitSyncKHR(" << m_eglDisplay << ", " << m_sync << ", 0, 0)" << TestLog::EndMessage;
   1078 
   1079 		TCU_CHECK(status == EGL_TRUE);
   1080 
   1081 		GLU_CHECK_GLW_CALL(m_gl, finish());
   1082 
   1083 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
   1084 		return STOP;
   1085 	}
   1086 
   1087 };
   1088 
   1089 class WaitSyncInvalidDisplayTest : public SyncTest
   1090 {
   1091 public:
   1092 					WaitSyncInvalidDisplayTest	(EglTestContext& eglTestCtx, EGLenum syncType)
   1093 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_WAIT_SYNC, true, "wait_server_invalid_display", "wait_server_invalid_display")
   1094 	{
   1095 	}
   1096 
   1097 	IterateResult	iterate						(void)
   1098 	{
   1099 		const Library&	egl		= m_eglTestCtx.getLibrary();
   1100 		TestLog&		log		= m_testCtx.getLog();
   1101 
   1102 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
   1103 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
   1104 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
   1105 
   1106 		EGLint status = egl.waitSyncKHR(EGL_NO_DISPLAY, m_sync, 0);
   1107 		log << TestLog::Message << status << " = eglWaitSyncKHR(EGL_NO_DISPLAY, " << m_sync << ", 0)" << TestLog::EndMessage;
   1108 
   1109 		EGLint error = egl.getError();
   1110 		log << TestLog::Message << error << " = eglGetError()" << TestLog::EndMessage;
   1111 
   1112 		if (error != EGL_BAD_DISPLAY)
   1113 		{
   1114 			log << TestLog::Message << "Unexpected error '" << eglu::getErrorStr(error) << "' expected EGL_BAD_DISPLAY" << TestLog::EndMessage;
   1115 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
   1116 			return STOP;
   1117 		}
   1118 
   1119 		TCU_CHECK(status == EGL_FALSE);
   1120 
   1121 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
   1122 		return STOP;
   1123 	}
   1124 };
   1125 
   1126 class WaitSyncInvalidSyncTest : public SyncTest
   1127 {
   1128 public:
   1129 					WaitSyncInvalidSyncTest	(EglTestContext& eglTestCtx, EGLenum syncType)
   1130 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_WAIT_SYNC, true, "wait_server_invalid_sync", "wait_server_invalid_sync")
   1131 	{
   1132 	}
   1133 
   1134 	IterateResult	iterate					(void)
   1135 	{
   1136 		const Library&	egl		= m_eglTestCtx.getLibrary();
   1137 		TestLog&		log		= m_testCtx.getLog();
   1138 
   1139 		EGLint status = egl.waitSyncKHR(m_eglDisplay, EGL_NO_SYNC_KHR, 0);
   1140 		log << TestLog::Message << status << " = eglWaitSyncKHR(" << m_eglDisplay << ", EGL_NO_SYNC_KHR, 0)" << TestLog::EndMessage;
   1141 
   1142 		EGLint error = egl.getError();
   1143 		log << TestLog::Message << error << " = eglGetError()" << TestLog::EndMessage;
   1144 
   1145 		if (error != EGL_BAD_PARAMETER)
   1146 		{
   1147 			log << TestLog::Message << "Unexpected error '" << eglu::getErrorStr(error) << "' expected EGL_BAD_PARAMETER" << TestLog::EndMessage;
   1148 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
   1149 			return STOP;
   1150 		}
   1151 
   1152 		TCU_CHECK(status == EGL_FALSE);
   1153 
   1154 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
   1155 		return STOP;
   1156 	}
   1157 };
   1158 
   1159 class WaitSyncInvalidFlagTest : public SyncTest
   1160 {
   1161 public:
   1162 					WaitSyncInvalidFlagTest	(EglTestContext& eglTestCtx, EGLenum syncType)
   1163 		: SyncTest	(eglTestCtx, syncType, SyncTest::EXTENSION_WAIT_SYNC, true, "wait_server_invalid_flag", "wait_server_invalid_flag")
   1164 	{
   1165 	}
   1166 
   1167 	IterateResult	iterate					(void)
   1168 	{
   1169 		const Library&	egl		= m_eglTestCtx.getLibrary();
   1170 		TestLog&		log		= m_testCtx.getLog();
   1171 
   1172 		m_sync = egl.createSyncKHR(m_eglDisplay, m_syncType, NULL);
   1173 		log << TestLog::Message << m_sync << " = eglCreateSyncKHR(" << m_eglDisplay << ", " << getSyncTypeName(m_syncType) << ", NULL)" << TestLog::EndMessage;
   1174 		EGLU_CHECK_MSG(egl, "eglCreateSyncKHR()");
   1175 
   1176 		EGLint status = egl.waitSyncKHR(m_eglDisplay, m_sync, 0xFFFFFFFF);
   1177 		log << TestLog::Message << status << " = eglWaitSyncKHR(" << m_eglDisplay << ", " << m_sync << ", 0xFFFFFFFF)" << TestLog::EndMessage;
   1178 
   1179 		EGLint error = egl.getError();
   1180 		log << TestLog::Message << error << " = eglGetError()" << TestLog::EndMessage;
   1181 
   1182 		if (error != EGL_BAD_PARAMETER)
   1183 		{
   1184 			log << TestLog::Message << "Unexpected error '" << eglu::getErrorStr(error) << "' expected EGL_BAD_PARAMETER" << TestLog::EndMessage;
   1185 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
   1186 			return STOP;
   1187 		}
   1188 
   1189 		TCU_CHECK(status == EGL_FALSE);
   1190 
   1191 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
   1192 		return STOP;
   1193 	}
   1194 };
   1195 
   1196 } // anonymous
   1197 
   1198 FenceSyncTests::FenceSyncTests (EglTestContext& eglTestCtx)
   1199 	: TestCaseGroup	(eglTestCtx, "fence_sync", "EGL_KHR_fence_sync extension tests")
   1200 {
   1201 }
   1202 
   1203 void FenceSyncTests::init (void)
   1204 {
   1205 	// Add valid API test
   1206 	{
   1207 		TestCaseGroup* const valid = new TestCaseGroup(m_eglTestCtx, "valid", "Valid function calls");
   1208 
   1209 		// eglCreateSyncKHR tests
   1210 		valid->addChild(new CreateNullAttribsTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1211 		valid->addChild(new CreateEmptyAttribsTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1212 
   1213 		// eglClientWaitSyncKHR tests
   1214 		valid->addChild(new ClientWaitNoTimeoutTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1215 		valid->addChild(new ClientWaitForeverTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1216 		valid->addChild(new ClientWaitNoContextTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1217 		valid->addChild(new ClientWaitForeverFlushTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1218 
   1219 		// eglGetSyncAttribKHR tests
   1220 		valid->addChild(new GetSyncTypeTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1221 		valid->addChild(new GetSyncStatusTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1222 		valid->addChild(new GetSyncStatusSignaledTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1223 		valid->addChild(new GetSyncConditionTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1224 
   1225 		// eglDestroySyncKHR tests
   1226 		valid->addChild(new DestroySyncTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1227 
   1228 		// eglWaitSyncKHR tests
   1229 		valid->addChild(new WaitSyncTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1230 
   1231 		addChild(valid);
   1232 	}
   1233 
   1234 	// Add negative API tests
   1235 	{
   1236 		TestCaseGroup* const invalid = new TestCaseGroup(m_eglTestCtx, "invalid", "Invalid function calls");
   1237 
   1238 		// eglCreateSyncKHR tests
   1239 		invalid->addChild(new CreateInvalidDisplayTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1240 		invalid->addChild(new CreateInvalidTypeTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1241 		invalid->addChild(new CreateInvalidAttribsTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1242 		invalid->addChild(new CreateInvalidContextTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1243 
   1244 		// eglClientWaitSyncKHR tests
   1245 		invalid->addChild(new ClientWaitInvalidDisplayTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1246 		invalid->addChild(new ClientWaitInvalidSyncTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1247 
   1248 		// eglGetSyncAttribKHR tests
   1249 		invalid->addChild(new GetSyncInvalidDisplayTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1250 		invalid->addChild(new GetSyncInvalidSyncTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1251 		invalid->addChild(new GetSyncInvalidAttributeTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1252 		invalid->addChild(new GetSyncInvalidValueTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1253 
   1254 		// eglDestroySyncKHR tests
   1255 		invalid->addChild(new DestroySyncInvalidDislayTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1256 		invalid->addChild(new DestroySyncInvalidSyncTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1257 
   1258 		// eglWaitSyncKHR tests
   1259 		invalid->addChild(new WaitSyncInvalidDisplayTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1260 		invalid->addChild(new WaitSyncInvalidSyncTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1261 		invalid->addChild(new WaitSyncInvalidFlagTest(m_eglTestCtx, EGL_SYNC_FENCE_KHR));
   1262 
   1263 		addChild(invalid);
   1264 	}
   1265 }
   1266 
   1267 ReusableSyncTests::ReusableSyncTests (EglTestContext& eglTestCtx)
   1268 	: TestCaseGroup	(eglTestCtx, "reusable_sync", "EGL_KHR_reusable_sync extension tests")
   1269 {
   1270 }
   1271 
   1272 void ReusableSyncTests::init (void)
   1273 {
   1274 	// Add valid API test
   1275 	{
   1276 		TestCaseGroup* const valid = new TestCaseGroup(m_eglTestCtx, "valid", "Valid function calls");
   1277 
   1278 		// eglCreateSyncKHR tests
   1279 		valid->addChild(new CreateNullAttribsTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1280 		valid->addChild(new CreateEmptyAttribsTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1281 
   1282 		// eglClientWaitSyncKHR tests
   1283 		valid->addChild(new ClientWaitNoTimeoutTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1284 		valid->addChild(new ClientWaitForeverTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1285 		valid->addChild(new ClientWaitNoContextTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1286 		valid->addChild(new ClientWaitForeverFlushTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1287 
   1288 		// eglGetSyncAttribKHR tests
   1289 		valid->addChild(new GetSyncTypeTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1290 		valid->addChild(new GetSyncStatusTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1291 		valid->addChild(new GetSyncStatusSignaledTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1292 
   1293 		// eglDestroySyncKHR tests
   1294 		valid->addChild(new DestroySyncTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1295 
   1296 		// eglWaitSyncKHR tests
   1297 		valid->addChild(new WaitSyncTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1298 
   1299 		addChild(valid);
   1300 	}
   1301 
   1302 	// Add negative API tests
   1303 	{
   1304 		TestCaseGroup* const invalid = new TestCaseGroup(m_eglTestCtx, "invalid", "Invalid function calls");
   1305 
   1306 		// eglCreateSyncKHR tests
   1307 		invalid->addChild(new CreateInvalidDisplayTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1308 		invalid->addChild(new CreateInvalidTypeTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1309 		invalid->addChild(new CreateInvalidAttribsTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1310 
   1311 		// eglClientWaitSyncKHR tests
   1312 		invalid->addChild(new ClientWaitInvalidDisplayTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1313 		invalid->addChild(new ClientWaitInvalidSyncTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1314 
   1315 		// eglGetSyncAttribKHR tests
   1316 		invalid->addChild(new GetSyncInvalidDisplayTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1317 		invalid->addChild(new GetSyncInvalidSyncTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1318 		invalid->addChild(new GetSyncInvalidAttributeTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1319 		invalid->addChild(new GetSyncInvalidValueTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1320 
   1321 		// eglDestroySyncKHR tests
   1322 		invalid->addChild(new DestroySyncInvalidDislayTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1323 		invalid->addChild(new DestroySyncInvalidSyncTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1324 
   1325 		// eglWaitSyncKHR tests
   1326 		invalid->addChild(new WaitSyncInvalidDisplayTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1327 		invalid->addChild(new WaitSyncInvalidSyncTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1328 		invalid->addChild(new WaitSyncInvalidFlagTest(m_eglTestCtx, EGL_SYNC_REUSABLE_KHR));
   1329 
   1330 		addChild(invalid);
   1331 	}
   1332 }
   1333 
   1334 } // egl
   1335 } // deqp
   1336