13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 3.0 Module
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * -------------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Sync stress tests.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es3sSyncTests.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestLog.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deRandom.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuVector.hpp"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluShaderProgram.hpp"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluCallLogWrapper.hpp"
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluRenderContext.hpp"
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deStringUtil.hpp"
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deString.h"
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <vector>
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glw.h"
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::TestLog;
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::vector;
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles3
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Stress
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const int NUM_CASE_ITERATIONS = 1;
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum WaitCommand
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	COMMAND_WAIT_SYNC			= 1 << 0,
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	COMMAND_CLIENT_WAIT_SYNC	= 1 << 1
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass FenceSyncCase : public TestCase, public glu::CallLogWrapper
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						FenceSyncCase		(Context& context, const char* name, const char* description, int numPrimitives, deUint32 waitCommand);
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						~FenceSyncCase		(void);
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				init				(void);
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				deinit				(void);
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	IterateResult		iterate				(void);
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						FenceSyncCase		(const FenceSyncCase& other);
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FenceSyncCase&		operator=			(const FenceSyncCase& other);
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int					m_numSyncs;
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32			m_waitCommand;
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::ShaderProgram*	m_program;
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<GLsync>		m_syncObjects;
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int					m_iterNdx;
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	de::Random			m_rnd;
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
803c827367444ee418f129b2c238299f49d3264554Jarkko PoyryFenceSyncCase::FenceSyncCase (Context& context, const char* name, const char* description, int numSyncs, deUint32 waitCommand)
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCase			(context, name, description)
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, CallLogWrapper	(context.getRenderContext().getFunctions(), context.getTestContext().getLog())
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_numSyncs		(numSyncs)
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_waitCommand		(waitCommand)
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_program			(DE_NULL)
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_syncObjects		(DE_NULL)
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_iterNdx			(0)
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_rnd				(deStringHash(name))
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
923c827367444ee418f129b2c238299f49d3264554Jarkko PoyryFenceSyncCase::~FenceSyncCase (void)
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FenceSyncCase::deinit();
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void generateVertices (std::vector<float>& dst, int numPrimitives, de::Random& rnd)
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int numVertices = 3*numPrimitives;
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	dst.resize(numVertices * 4);
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < numVertices; i++)
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		dst[i*4    ] = rnd.getFloat(-1.0f, 1.0f);	// x
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		dst[i*4 + 1] = rnd.getFloat(-1.0f, 1.0f);	// y
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		dst[i*4 + 2] = rnd.getFloat( 0.0f, 1.0f);	// z
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		dst[i*4 + 3] = 1.0f;						// w
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid FenceSyncCase::init (void)
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char*	vertShaderSource =
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"#version 300 es\n"
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"layout(location = 0) in mediump vec4 a_position;\n"
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"\n"
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"void main (void)\n"
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"{\n"
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"	gl_Position = a_position;\n"
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"}\n";
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char* fragShaderSource =
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"#version 300 es\n"
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"layout(location = 0) out mediump vec4 o_color;\n"
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"\n"
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"void main (void)\n"
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"{\n"
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"	o_color = vec4(0.25, 0.5, 0.75, 1.0);\n"
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"}\n";
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(!m_program);
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_program = new glu::ShaderProgram(m_context.getRenderContext(), glu::makeVtxFragSources(vertShaderSource, fragShaderSource));
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!m_program->isOk())
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_testCtx.getLog() << *m_program;
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_FAIL("Failed to compile shader program");
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); // Initialize test result to pass.
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_MSG ("Case initialization finished");
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid FenceSyncCase::deinit (void)
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_program)
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		delete m_program;
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_program = DE_NULL;
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < (int)m_syncObjects.size(); i++)
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_syncObjects[i])
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteSync(m_syncObjects[i]);
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_syncObjects.erase(m_syncObjects.begin(), m_syncObjects.end());
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1593c827367444ee418f129b2c238299f49d3264554Jarkko PoyryFenceSyncCase::IterateResult FenceSyncCase::iterate (void)
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestLog&				log		= m_testCtx.getLog();
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<float>		vertices;
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool					testOk	= true;
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::string				header	= "Case iteration " + de::toString(m_iterNdx+1) + " / " + de::toString(NUM_CASE_ITERATIONS);
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::ScopedLogSection	section	(log, header, header);
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enableLogging(true);
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TCU_CHECK		(m_program);
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glUseProgram	(m_program->getProgram());
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glEnable		(GL_DEPTH_TEST);
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glClearColor	(0.3f, 0.3f, 0.3f, 1.0f);
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glClearDepthf	(1.0f);
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glClear			(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Generate vertices
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glEnableVertexAttribArray	(0);
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	generateVertices			(vertices, m_numSyncs, m_rnd);
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glVertexAttribPointer		(0, 4, GL_FLOAT, GL_FALSE, 0, &vertices[0]);
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_syncObjects.resize		(m_numSyncs);
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Perform draws and create sync objects
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enableLogging(false);
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	log << TestLog::Message << "// NOT LOGGED: " << m_numSyncs << " glDrawArrays and glFenceSync calls done here." << TestLog::EndMessage;
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < m_numSyncs; i++)
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDrawArrays(GL_TRIANGLES, i*3, 3);
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_syncObjects[i] = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLU_CHECK_MSG("Sync object created");
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enableLogging(true);
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	log << TestLog::Message << "// Draws performed, sync objects created." << TestLog::EndMessage;
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Wait for sync objects
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_rnd.shuffle(m_syncObjects.begin(), m_syncObjects.end());
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enableLogging(false);
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_waitCommand & COMMAND_WAIT_SYNC)
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		log << TestLog::Message << "// NOT LOGGED: " << m_numSyncs << " glWaitSync calls done here." << TestLog::EndMessage;
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (m_waitCommand & COMMAND_CLIENT_WAIT_SYNC)
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		log << TestLog::Message << "// NOT LOGGED: " << m_numSyncs << " glClientWaitSync calls done here." << TestLog::EndMessage;
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < m_numSyncs; i++)
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLenum waitValue = 0;
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_waitCommand & COMMAND_WAIT_SYNC)
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glWaitSync(m_syncObjects[i], 0, GL_TIMEOUT_IGNORED);
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_MSG("glWaitSync called");
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (m_waitCommand & COMMAND_CLIENT_WAIT_SYNC)
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			waitValue = glClientWaitSync(m_syncObjects[i], 0, 100);
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_MSG("glClientWaitSync called");
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			switch (waitValue)
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case GL_ALREADY_SIGNALED:	 break;
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case GL_TIMEOUT_EXPIRED:	 break;
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case GL_CONDITION_SATISFIED: break;
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case GL_WAIT_FAILED:		 log << TestLog::Message << "// glClientWaitSync returned GL_WAIT_FAILED"	<< TestLog::EndMessage; testOk = false; break;
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				default:					 TCU_FAIL("glClientWaitSync returned an unknown return value.");
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enableLogging(true);
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glFinish();
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Delete sync objects
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enableLogging(false);
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	log << TestLog::Message << "// NOT LOGGED: " << m_numSyncs << " glDeleteSync calls done here." << TestLog::EndMessage;
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < (int)m_syncObjects.size(); i++)
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_syncObjects[i])
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteSync(m_syncObjects[i]);
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_MSG("Sync object deleted");
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enableLogging(true);
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_syncObjects.erase(m_syncObjects.begin(), m_syncObjects.end());
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Evaluate test result
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	log << TestLog::Message << "// Test result: " << (testOk ? "Passed!" : "Failed!") << TestLog::EndMessage;
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!testOk)
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return STOP;
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	log << TestLog::Message << "// Sync objects created and deleted successfully." << TestLog::EndMessage;
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return (++m_iterNdx < NUM_CASE_ITERATIONS) ? CONTINUE : STOP;
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2683c827367444ee418f129b2c238299f49d3264554Jarkko PoyrySyncTests::SyncTests (Context& context)
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup(context, "fence_sync", "Fence Sync Tests")
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2733c827367444ee418f129b2c238299f49d3264554Jarkko PoyrySyncTests::~SyncTests (void)
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid SyncTests::init (void)
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Fence sync stress tests.
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FenceSyncCase(m_context, "wait_sync_10_syncs",				"",	10,		COMMAND_WAIT_SYNC));
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FenceSyncCase(m_context, "wait_sync_1000_syncs",			"",	1000,	COMMAND_WAIT_SYNC));
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FenceSyncCase(m_context, "wait_sync_10000_syncs",			"",	10000,	COMMAND_WAIT_SYNC));
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FenceSyncCase(m_context, "client_wait_sync_10_syncs",		"",	10,		COMMAND_CLIENT_WAIT_SYNC));
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FenceSyncCase(m_context, "client_wait_sync_1000_syncs",	"",	1000,	COMMAND_CLIENT_WAIT_SYNC));
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FenceSyncCase(m_context, "client_wait_sync_10000_syncs",	"",	10000,	COMMAND_CLIENT_WAIT_SYNC));
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Stress
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles3
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
293