13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program EGL 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 EGL gles2 sharing threaded tests
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "teglGLES2SharingThreadedTests.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestLog.hpp"
273c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "tcuThreadUtil.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deRandom.hpp"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deThread.hpp"
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deSharedPtr.hpp"
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMutex.hpp"
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deSemaphore.hpp"
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deStringUtil.hpp"
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deClock.h"
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deString.h"
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMemory.h"
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMath.h"
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluDefs.hpp"
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
433c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "glwEnums.hpp"
443c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "glwFunctions.hpp"
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
463c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "egluUtil.hpp"
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
483c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "eglwLibrary.hpp"
493c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "eglwEnums.hpp"
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <vector>
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <string>
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <memory>
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <sstream>
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::vector;
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::string;
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing de::SharedPtr;
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
603c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosusing namespace glw;
613c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosusing namespace eglw;
623c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace egl
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace GLES2ThreadTest
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture;
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Buffer;
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Shader;
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Program;
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass GLES2ResourceManager
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Texture>			popTexture			(int index);
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const SharedPtr<Texture>	getTexture			(int index) const { return m_textures[index]; }
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void						addTexture			(SharedPtr<Texture> texture) { m_textures.push_back(texture); }
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int							getTextureCount		(void) const { return (int)m_textures.size(); }
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Buffer>			popBuffer			(int index);
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const SharedPtr<Buffer>		getBuffer			(int index) const { return m_buffers[index]; }
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void						addBuffer			(SharedPtr<Buffer> buffer) { m_buffers.push_back(buffer); }
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int							getBufferCount		(void) const { return (int)m_buffers.size(); }
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Shader>			popShader			(int index);
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const SharedPtr<Shader>		getShader			(int index) const { return m_shaders[index]; }
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void						addShader			(SharedPtr<Shader> shader) { m_shaders.push_back(shader); }
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int							getShaderCount		(void) const { return (int)m_shaders.size(); }
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Program>			popProgram			(int index);
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const SharedPtr<Program>	getProgram			(int index) const { return m_programs[index]; }
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void						addProgram			(SharedPtr<Program> program) { m_programs.push_back(program); }
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int							getProgramCount		(void) const { return (int)m_programs.size(); }
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<SharedPtr<Texture> >	m_textures;
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<SharedPtr<Buffer> >		m_buffers;
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<SharedPtr<Shader> >		m_shaders;
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<SharedPtr<Program> >	m_programs;
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1063c827367444ee418f129b2c238299f49d3264554Jarkko PoyrySharedPtr<Texture> GLES2ResourceManager::popTexture (int index)
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Texture> texture = m_textures[index];
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_textures.erase(m_textures.begin() + index);
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return texture;
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1153c827367444ee418f129b2c238299f49d3264554Jarkko PoyrySharedPtr<Buffer> GLES2ResourceManager::popBuffer (int index)
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Buffer> buffer = m_buffers[index];
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_buffers.erase(m_buffers.begin() + index);
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return buffer;
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1243c827367444ee418f129b2c238299f49d3264554Jarkko PoyrySharedPtr<Shader> GLES2ResourceManager::popShader (int index)
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Shader> shader = m_shaders[index];
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_shaders.erase(m_shaders.begin() + index);
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return shader;
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1333c827367444ee418f129b2c238299f49d3264554Jarkko PoyrySharedPtr<Program> GLES2ResourceManager::popProgram (int index)
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Program> program = m_programs[index];
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_programs.erase(m_programs.begin() + index);
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return program;
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass GLES2Context : public tcu::ThreadUtil::Object
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2Context		(SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<GLES2ResourceManager> resourceManager);
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				~GLES2Context		(void);
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Call generation time attributes
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ResourceManager>	resourceManager;
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Run time attributes
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLDisplay		display;
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLContext		context;
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	struct
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1573c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		glEGLImageTargetTexture2DOESFunc	imageTargetTexture2D;
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} glExtensions;
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					GLES2Context		(const GLES2Context&);
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLES2Context&	operator=			(const GLES2Context&);
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1643c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGLES2Context::GLES2Context (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<GLES2ResourceManager> resourceManager_)
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: tcu::ThreadUtil::Object	("Context", event)
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, resourceManager			(resourceManager_)
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, display					(EGL_NO_DISPLAY)
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, context					(EGL_NO_CONTEXT)
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1703c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	glExtensions.imageTargetTexture2D = DE_NULL;
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1733c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGLES2Context::~GLES2Context (void)
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Surface : public tcu::ThreadUtil::Object
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				Surface		(SharedPtr<tcu::ThreadUtil::Event> event);
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				~Surface	(void);
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Run time attributes
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLSurface	surface;
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Surface		(const Surface&);
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Surface&	operator=	(const Surface&);
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1913c827367444ee418f129b2c238299f49d3264554Jarkko PoyrySurface::Surface (SharedPtr<tcu::ThreadUtil::Event> event)
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: tcu::ThreadUtil::Object	("Surface", event)
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, surface					(EGL_NO_SURFACE)
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1973c827367444ee418f129b2c238299f49d3264554Jarkko PoyrySurface::~Surface (void)
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// EGL thread with thread specifig state
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass EGLThread : public tcu::ThreadUtil::Thread
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
2053c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos								EGLThread	(const Library& egl_, const glw::Functions& gl_, int seed);
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								~EGLThread	(void);
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void				deinit		(void);
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2093c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	const Library&				egl;
2103c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	const glw::Functions&		gl;
2113c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Generation time attributes
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2Context>		context;
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Surface>			surface;
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Runtime attributes
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2Context>		runtimeContext;
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLSurface					eglSurface;
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2233c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry HaulosEGLThread::EGLThread (const Library& egl_, const glw::Functions& gl_, int seed)
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: tcu::ThreadUtil::Thread	(seed)
2253c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	, egl						(egl_)
2263c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	, gl						(gl_)
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, eglSurface				(EGL_NO_SURFACE)
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid EGLThread::deinit (void)
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (runtimeContext)
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (runtimeContext->context != EGL_NO_CONTEXT)
2363c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			egl.makeCurrent(runtimeContext->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2383c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		egl.destroyContext(runtimeContext->display, runtimeContext->context);
239fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi		runtimeContext->context = EGL_NO_CONTEXT;
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
241fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi		egl.destroySurface(runtimeContext->display, eglSurface);
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		eglSurface	= EGL_NO_SURFACE;
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2453c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	egl.releaseThread();
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2483c827367444ee418f129b2c238299f49d3264554Jarkko PoyryEGLThread::~EGLThread (void)
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
250fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi	EGLThread::deinit();
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass FenceSync
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				FenceSync	(void);
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				~FenceSync	(void);
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void		init		(EGLThread& thread, bool serverSync);
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool		waitReady	(EGLThread& thread);
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void		addWaiter	(void);
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLDisplay	m_display;
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLSyncKHR	m_sync;
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	de::Mutex	m_lock;
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int			m_waiterCount;
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool		m_serverSync;
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2723c827367444ee418f129b2c238299f49d3264554Jarkko PoyryFenceSync::FenceSync (void)
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: m_display		(EGL_NO_DISPLAY)
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_sync		(NULL)
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_waiterCount	(0)
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_serverSync	(false)
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2803c827367444ee418f129b2c238299f49d3264554Jarkko PoyryFenceSync::~FenceSync (void)
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid FenceSync::addWaiter (void)
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_lock.lock();
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_waiterCount++;
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_lock.unlock();
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid FenceSync::init (EGLThread& thread, bool serverSync)
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_display		= thread.runtimeContext->display;
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_serverSync	= serverSync;
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Use sync only if somebody will actualy depend on it
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_lock.lock();
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_waiterCount > 0)
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3003c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		thread.newMessage() << "Begin -- eglCreateSyncKHR(" << ((size_t)m_display) << ", EGL_SYNC_FENCE_KHR, DE_NULL)" << tcu::ThreadUtil::Message::End;
3013c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		m_sync = thread.egl.createSyncKHR(m_display, EGL_SYNC_FENCE_KHR, DE_NULL);
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "End -- " << ((size_t)m_sync) << " = eglCreateSyncKHR()" << tcu::ThreadUtil::Message::End;
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK(m_sync);
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_lock.unlock();
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyrybool FenceSync::waitReady (EGLThread& thread)
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool ok = true;
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_serverSync)
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "Begin -- eglWaitSyncKHR(" << ((size_t)m_display) << ", " << ((size_t)m_sync) << ", 0)" << tcu::ThreadUtil::Message::End;
3143c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		EGLint result = thread.egl.waitSyncKHR(m_display, m_sync, 0);
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "End -- " << result << " = eglWaitSyncKHR()" << tcu::ThreadUtil::Message::End;
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ok = result == EGL_TRUE;
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "Begin -- eglClientWaitSyncKHR(" << ((size_t)m_display) << ", " << ((size_t)m_sync) << ", EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 1000 000 000)" << tcu::ThreadUtil::Message::End;
3213c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		EGLint result = thread.egl.clientWaitSyncKHR(m_display, m_sync, EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 1000000000);
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "End -- " << result << " = eglClientWaitSyncKHR()" << tcu::ThreadUtil::Message::End;
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ok = result == EGL_CONDITION_SATISFIED_KHR;
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_lock.lock();
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_waiterCount--;
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_waiterCount >= 0);
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_waiterCount == 0)
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// \note [mika] This is no longer deterministic and eglDestroySyncKHR might happen in different places and in different threads
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "Begin -- eglDestroySyncKHR(" << ((size_t)m_display) << ", " << ((size_t)m_sync) << ")" << tcu::ThreadUtil::Message::End;
3343c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		EGLint destroyResult = thread.egl.destroySyncKHR(m_display, m_sync);
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "End -- " << destroyResult << " = eglDestroySyncKHR()" << tcu::ThreadUtil::Message::End;
3363c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		m_sync = DE_NULL;
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_lock.unlock();
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return ok;
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Object : public tcu::ThreadUtil::Object
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							Object			(const char* type, SharedPtr<tcu::ThreadUtil::Event> e, SharedPtr<FenceSync> sync);
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							~Object			(void);
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					readGL			(SharedPtr<FenceSync> sync, std::vector<SharedPtr<FenceSync> >& deps);
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					modifyGL		(SharedPtr<FenceSync> sync, std::vector<SharedPtr<FenceSync> >& deps);
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<FenceSync>			m_modifySync;
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<SharedPtr<FenceSync> >	m_readSyncs;
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3583c827367444ee418f129b2c238299f49d3264554Jarkko PoyryObject::Object (const char* type, SharedPtr<tcu::ThreadUtil::Event> e, SharedPtr<FenceSync> sync)
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: tcu::ThreadUtil::Object	(type, e)
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_modifySync				(sync)
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3643c827367444ee418f129b2c238299f49d3264554Jarkko PoyryObject::~Object	(void)
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid Object::readGL (SharedPtr<FenceSync> sync, std::vector<SharedPtr<FenceSync> >& deps)
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_modifySync)
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_modifySync->addWaiter();
3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Make call depend on last modifying call
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deps.push_back(m_modifySync);
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Add read dependency
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_readSyncs.push_back(sync);
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid Object::modifyGL (SharedPtr<FenceSync> sync, std::vector<SharedPtr<FenceSync> >& deps)
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Make call depend on all reads
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int readNdx = 0; readNdx < (int)m_readSyncs.size(); readNdx++)
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_readSyncs[readNdx])
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_readSyncs[readNdx]->addWaiter();
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deps.push_back(m_readSyncs[readNdx]);
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_modifySync)
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_modifySync->addWaiter();
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deps.push_back(m_modifySync);
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Update last modifying call
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_modifySync = sync;
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Clear read dependencies of last "version" of this object
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_readSyncs.clear();
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Operation : public tcu::ThreadUtil::Operation
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							Operation		(const char* name, bool useSync, bool serverSync);
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual					~Operation		(void);
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<FenceSync>	getSync			(void) { return m_sync; }
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					readGLObject	(SharedPtr<Object> object);
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					modifyGLObject	(SharedPtr<Object> object);
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void			execute			(tcu::ThreadUtil::Thread& thread);
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool								m_useSync;
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool								m_serverSync;
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<SharedPtr<FenceSync> >	m_syncDeps;
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<FenceSync>				m_sync;
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4223c827367444ee418f129b2c238299f49d3264554Jarkko PoyryOperation::Operation (const char* name, bool useSync, bool serverSync)
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: tcu::ThreadUtil::Operation	(name)
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_useSync						(useSync)
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_serverSync					(serverSync)
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_sync						(useSync ? SharedPtr<FenceSync>(new FenceSync()) : SharedPtr<FenceSync>())
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4303c827367444ee418f129b2c238299f49d3264554Jarkko PoyryOperation::~Operation (void)
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid Operation::readGLObject (SharedPtr<Object> object)
4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	object->read(m_event, m_deps);
4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	object->readGL(m_sync, m_syncDeps);
4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid Operation::modifyGLObject (SharedPtr<Object> object)
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	object->modify(m_event, m_deps);
4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	object->modifyGL(m_sync, m_syncDeps);
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4463c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid Operation::execute (tcu::ThreadUtil::Thread& t)
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4483c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
4493c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool success = true;
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Wait for dependencies and check that they succeeded
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int depNdx = 0; depNdx < (int)m_deps.size(); depNdx++)
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (!m_deps[depNdx]->waitReady())
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			success = false;
4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Try execute operation
4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (success)
4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		try
4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (m_useSync)
4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				for (int depNdx = 0; depNdx < (int)m_syncDeps.size(); depNdx++)
4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					EGLThread* eglThread = dynamic_cast<EGLThread*>(&thread);
4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					DE_ASSERT(eglThread);
4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					if (m_syncDeps[depNdx]->waitReady(*eglThread) != tcu::ThreadUtil::Event::RESULT_OK)
4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					{
4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						success = false;
4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						break;
4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					}
4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
4773fdee359c9eee4d6c1d823b23f7f64631b5945f8Jarkko Pöyry
4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (success)
4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				exec(thread);
4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (m_useSync)
4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					EGLThread* eglThread = dynamic_cast<EGLThread*>(&thread);
4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					DE_ASSERT(eglThread);
4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					m_sync->init(*eglThread, m_serverSync);
4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					thread.newMessage() << "Begin -- glFlush()" << tcu::ThreadUtil::Message::End;
4873c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos					GLU_CHECK_GLW_CALL(thread.gl, flush());
4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					thread.newMessage() << "End -- glFlush()" << tcu::ThreadUtil::Message::End;
4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
4903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else
4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					thread.newMessage() << "Begin -- glFinish()" << tcu::ThreadUtil::Message::End;
4933c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos					GLU_CHECK_GLW_CALL(thread.gl, finish());
4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					thread.newMessage() << "End -- glFinish()" << tcu::ThreadUtil::Message::End;
4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		catch (...)
4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// Got exception event failed
5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_event->setResult(tcu::ThreadUtil::Event::RESULT_FAILED);
5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			throw;
5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
506fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi	if (success)
507fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi		m_event->setResult(tcu::ThreadUtil::Event::RESULT_OK);
508fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi	else
5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_event->setResult(tcu::ThreadUtil::Event::RESULT_FAILED);
5103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_deps.clear();
5123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_event = SharedPtr<tcu::ThreadUtil::Event>();
5133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_syncDeps.clear();
5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_sync = SharedPtr<FenceSync>();
5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5173c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass EGLImage : public Object
5183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				EGLImage	(SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync);
5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual		~EGLImage	(void) {}
5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLImageKHR	image;
5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// EGLResource manager
5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass EGLResourceManager
5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					addContext		(SharedPtr<GLES2Context> context) { m_contexts.push_back(context); }
5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					addSurface		(SharedPtr<Surface> surface) { m_surfaces.push_back(surface); }
5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					addImage		(SharedPtr<EGLImage> image) { m_images.push_back(image); }
5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Surface>		popSurface		(int index);
5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2Context>	popContext		(int index);
5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<EGLImage>		popImage		(int index);
5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						getContextCount	(void) const { return (int)m_contexts.size(); }
5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						getSurfaceCount	(void) const { return (int)m_surfaces.size(); }
5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						getImageCount	(void) const { return (int)m_images.size(); }
5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<SharedPtr<GLES2Context> >	m_contexts;
5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<SharedPtr<Surface> >		m_surfaces;
5463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<SharedPtr<EGLImage> >		m_images;
5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5493c827367444ee418f129b2c238299f49d3264554Jarkko PoyrySharedPtr<Surface> EGLResourceManager::popSurface (int index)
5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Surface> surface = m_surfaces[index];
5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_surfaces.erase(m_surfaces.begin() + index);
5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return surface;
5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5563c827367444ee418f129b2c238299f49d3264554Jarkko PoyrySharedPtr<GLES2Context> EGLResourceManager::popContext (int index)
5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2Context> context = m_contexts[index];
5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_contexts.erase(m_contexts.begin() + index);
5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return context;
5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5633c827367444ee418f129b2c238299f49d3264554Jarkko PoyrySharedPtr<EGLImage> EGLResourceManager::popImage (int index)
5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<EGLImage> image = m_images[index];
5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_images.erase(m_images.begin() + index);
5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return image;
5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass CreateContext : public tcu::ThreadUtil::Operation
5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
5733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				CreateContext	(EGLDisplay display, EGLConfig config, SharedPtr<GLES2Context> shared, SharedPtr<GLES2Context>& context);
5743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void		exec			(tcu::ThreadUtil::Thread& thread);
5763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5773c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLDisplay					m_display;
5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLConfig					m_config;
5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2Context>		m_shared;
5813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2Context>		m_context;
5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
5833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5843c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCreateContext::CreateContext (EGLDisplay display, EGLConfig config, SharedPtr<GLES2Context> shared, SharedPtr<GLES2Context>& context)
5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: tcu::ThreadUtil::Operation	("CreateContext")
5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_display					(display)
5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_config					(config)
5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_shared					(shared)
5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (shared)
5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		modifyObject(SharedPtr<tcu::ThreadUtil::Object>(shared));
5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context = SharedPtr<GLES2Context>(new GLES2Context(getEvent(), (shared ? shared->resourceManager : SharedPtr<GLES2ResourceManager>(new GLES2ResourceManager))));
5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_context = context;
5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5973c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid CreateContext::exec (tcu::ThreadUtil::Thread& t)
5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5993c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_context->display = m_display;
6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6023c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	const EGLint attriblist[] =
6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_CONTEXT_CLIENT_VERSION, 2,
6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_NONE
6063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
6073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- eglBindAPI(EGL_OPENGL_ES_API)" << tcu::ThreadUtil::Message::End;
6093c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLU_CHECK_CALL(thread.egl, bindAPI(EGL_OPENGL_ES_API));
6103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- eglBindAPI()" << tcu::ThreadUtil::Message::End;
6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_shared)
6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(m_shared->context != EGL_NO_CONTEXT);
6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(m_shared->display != EGL_NO_DISPLAY);
6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(m_shared->display == m_display);
6173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "Begin -- eglCreateContext(" << m_display << ", " << m_config << ", " << m_shared->context << ", { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE })" << tcu::ThreadUtil::Message::End;
6193c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		m_context->context = thread.egl.createContext(m_display, m_config, m_shared->context, attriblist);
6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "End -- " << m_context->context << " = eglCreateContext()" << tcu::ThreadUtil::Message::End;
6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
6233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "Begin -- eglCreateContext(" << m_display << ", " << m_config << ", EGL_NO_CONTEXT, { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE })" << tcu::ThreadUtil::Message::End;
6253c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		m_context->context = thread.egl.createContext(m_display, m_config, EGL_NO_CONTEXT, attriblist);
6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "End -- " << m_context->context << " = eglCreateContext()" << tcu::ThreadUtil::Message::End;
6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6293c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLU_CHECK_MSG(thread.egl, "Failed to create GLES2 context");
6303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TCU_CHECK(m_context->context != EGL_NO_CONTEXT);
6313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass DestroyContext : public tcu::ThreadUtil::Operation
6343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
6363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							DestroyContext	(SharedPtr<GLES2Context> contex);
6373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					exec			(tcu::ThreadUtil::Thread& thread);
6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2Context>	m_context;
6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6433c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDestroyContext::DestroyContext (SharedPtr<GLES2Context> contex)
6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: tcu::ThreadUtil::Operation	("DestroyContext")
6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_context					(contex)
6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyObject(SharedPtr<tcu::ThreadUtil::Object>(m_context));
6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6503c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid DestroyContext::exec (tcu::ThreadUtil::Thread& t)
6513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6523c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
6533c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
6543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- eglDestroyContext(" << m_context->display << ", " << m_context->context << ")" << tcu::ThreadUtil::Message::End;
6553c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLU_CHECK_CALL(thread.egl, destroyContext(m_context->display, m_context->context));
6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- eglDestroyContext()" << tcu::ThreadUtil::Message::End;
6573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_context->display	= EGL_NO_DISPLAY;
6583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_context->context	= EGL_NO_CONTEXT;
6593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass MakeCurrent : public tcu::ThreadUtil::Operation
6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			MakeCurrent	(EGLThread& thread, EGLDisplay display, SharedPtr<Surface> surface, SharedPtr<GLES2Context> context);
6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec		(tcu::ThreadUtil::Thread& thread);
6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLDisplay				m_display;
6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Surface>		m_surface;
6713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2Context>	m_context;
6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6743c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMakeCurrent::MakeCurrent (EGLThread& thread, EGLDisplay display, SharedPtr<Surface> surface, SharedPtr<GLES2Context> context)
6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: tcu::ThreadUtil::Operation	("MakeCurrent")
6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_display					(display)
6773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_surface					(surface)
6783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_context					(context)
6793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_context)
6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		modifyObject(SharedPtr<tcu::ThreadUtil::Object>(m_context));
6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_surface)
6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		modifyObject(SharedPtr<tcu::ThreadUtil::Object>(m_surface));
6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Release old contexts
6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (thread.context)
6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		modifyObject(SharedPtr<tcu::ThreadUtil::Object>(thread.context));
6903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Release old surface
6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (thread.surface)
6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		modifyObject(SharedPtr<tcu::ThreadUtil::Object>(thread.surface));
6963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.context	= m_context;
6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.surface	= m_surface;
7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MakeCurrent::exec (tcu::ThreadUtil::Thread& t)
7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7043c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_context)
7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.eglSurface = m_surface->surface;
7093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.runtimeContext = m_context;
7103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(m_surface);
7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "Begin -- eglMakeCurrent(" << m_display << ", " << m_surface->surface << ", " << m_surface->surface << ", " << m_context->context << ")" << tcu::ThreadUtil::Message::End;
7133c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		EGLU_CHECK_CALL(thread.egl, makeCurrent(m_display, m_surface->surface, m_surface->surface, m_context->context));
7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "End -- eglMakeCurrent()" << tcu::ThreadUtil::Message::End;
7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.runtimeContext = m_context;
7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "Begin -- eglMakeCurrent(" << m_display << ", EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)" << tcu::ThreadUtil::Message::End;
7213c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		EGLU_CHECK_CALL(thread.egl, makeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "End -- eglMakeCurrent()" << tcu::ThreadUtil::Message::End;
7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass InitGLExtension : public tcu::ThreadUtil::Operation
7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			InitGLExtension		(const char* extension);
7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec				(tcu::ThreadUtil::Thread& thread);
7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::string					m_extension;
7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7373c827367444ee418f129b2c238299f49d3264554Jarkko PoyryInitGLExtension::InitGLExtension (const char* extension)
7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: tcu::ThreadUtil::Operation	("InitGLExtension")
7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_extension					(extension)
7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid InitGLExtension::exec (tcu::ThreadUtil::Thread& t)
7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7453c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Check extensions
7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool found = false;
7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glGetString(GL_EXTENSIONS)" << tcu::ThreadUtil::Message::End;
7513c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	std::string extensions = (const char*)thread.gl.getString(GL_EXTENSIONS);
7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glGetString()" << tcu::ThreadUtil::Message::End;
7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::string::size_type pos = extensions.find(" ");
7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	do
7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		std::string extension;
7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (pos != std::string::npos)
7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			extension = extensions.substr(0, pos);
7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			extensions = extensions.substr(pos+1);
7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			extension = extensions;
7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			extensions = "";
7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
7693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (extension == m_extension)
7713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			found = true;
7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
7753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		pos = extensions.find(" ");
7763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} while (pos != std::string::npos);
7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!found)
7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		throw tcu::NotSupportedError((m_extension + " not supported").c_str(), "", __FILE__, __LINE__);
7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Query function pointers
7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_extension == "GL_OES_EGL_image")
7843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "Begin -- eglGetProcAddress(\"glEGLImageTargetTexture2DOES\")" << tcu::ThreadUtil::Message::End;
7863c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		thread.runtimeContext->glExtensions.imageTargetTexture2D = (glEGLImageTargetTexture2DOESFunc)thread.egl.getProcAddress("glEGLImageTargetTexture2DOES");
7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "End --  " << ((void*)thread.runtimeContext->glExtensions.imageTargetTexture2D) << " = eglGetProcAddress()"<< tcu::ThreadUtil::Message::End;
7883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7913c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass CreatePBufferSurface : public tcu::ThreadUtil::Operation
7923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7933c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
7943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				CreatePBufferSurface	(EGLDisplay display, EGLConfig config, EGLint width, EGLint height, SharedPtr<Surface>& surface);
7953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void		exec					(tcu::ThreadUtil::Thread& thread);
7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
7983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLDisplay			m_display;
7993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLConfig			m_config;
8003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLint				m_width;
8013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLint				m_height;
8023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Surface>	m_surface;
8033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
8043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8053c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCreatePBufferSurface::CreatePBufferSurface (EGLDisplay display, EGLConfig config, EGLint width, EGLint height, SharedPtr<Surface>& surface)
8063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: tcu::ThreadUtil::Operation	("CreatePBufferSurface")
8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_display					(display)
8083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_config					(config)
8093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_width					(width)
8103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_height					(height)
8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	surface = SharedPtr<Surface>(new Surface(getEvent()));
8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_surface = surface;
8143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8163c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid CreatePBufferSurface::exec (tcu::ThreadUtil::Thread& t)
8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8183c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
8193c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
8203c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	const EGLint attriblist[] = {
8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_WIDTH, m_width,
8223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_HEIGHT, m_height,
8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_NONE
8243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
8253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- eglCreatePbufferSurface(" << m_display << ", " << m_config << ", { EGL_WIDTH, " << m_width << ", EGL_HEIGHT, " << m_height << ", EGL_NONE })" << tcu::ThreadUtil::Message::End;
8273c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	m_surface->surface = thread.egl.createPbufferSurface(m_display, m_config, attriblist);
8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- " << m_surface->surface << "= eglCreatePbufferSurface()" << tcu::ThreadUtil::Message::End;
8293c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLU_CHECK_MSG(thread.egl, "eglCreatePbufferSurface()");
8303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8323c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass DestroySurface : public tcu::ThreadUtil::Operation
8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DestroySurface	(EGLDisplay display, SharedPtr<Surface> surface);
8363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
8373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8383c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
8393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLDisplay			m_display;
8403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Surface>	m_surface;
8413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
8423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8433c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDestroySurface::DestroySurface (EGLDisplay display, SharedPtr<Surface> surface)
8443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: tcu::ThreadUtil::Operation	("DestroySurface")
8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_display					(display)
8463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_surface					(surface)
8473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyObject(SharedPtr<tcu::ThreadUtil::Object>(m_surface));
8493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8513c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid DestroySurface::exec (tcu::ThreadUtil::Thread& t)
8523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8533c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
8543c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
8553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- eglDestroySurface(" << m_display << ",  " << m_surface->surface << ")" << tcu::ThreadUtil::Message::End;
8563c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLU_CHECK_CALL(thread.egl, destroySurface(m_display, m_surface->surface));
8573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- eglDestroySurface()" << tcu::ThreadUtil::Message::End;
8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8603c827367444ee418f129b2c238299f49d3264554Jarkko PoyryEGLImage::EGLImage (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync)
8613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Object	("EGLImage", event, sync)
8623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, image		(EGL_NO_IMAGE_KHR)
8633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8663c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture : public Object
8673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8683c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			Texture (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync);
8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Runtime parameters
8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint	texture;
8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Call generation time parameters
8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool	isDefined;
8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<EGLImage>	sourceImage;
8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8803c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTexture::Texture (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync)
8813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Object					("Texture", event, sync)
8823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, texture					(0)
8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, isDefined					(false)
8843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8873c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass CreateTexture : public Operation
8883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
8903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			CreateTexture	(SharedPtr<Texture>& texture, bool useSync, bool serverSync);
8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
8923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Texture> m_texture;
8953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
8963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8973c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCreateTexture::CreateTexture (SharedPtr<Texture>& texture, bool useSync, bool serverSync)
8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("CreateTexture", useSync, serverSync)
8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	texture = SharedPtr<Texture>(new Texture(getEvent(), getSync()));
9013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_texture = texture;
9023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9043c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid CreateTexture::exec (tcu::ThreadUtil::Thread& t)
9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9063c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
9073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint tex = 0;
9083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glGenTextures(1, { 0 })" << tcu::ThreadUtil::Message::End;
9103c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, genTextures(1, &tex));
9113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glGenTextures(1, { " << tex << " })" << tcu::ThreadUtil::Message::End;
9123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_texture->texture = tex;
9143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass DeleteTexture : public Operation
9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9183c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DeleteTexture	(SharedPtr<Texture> texture, bool useSync, bool serverSync);
9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
9213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Texture> m_texture;
9243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
9253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9263c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDeleteTexture::DeleteTexture (SharedPtr<Texture> texture, bool useSync, bool serverSync)
9273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation		("DeleteTexture", useSync, serverSync)
9283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_texture		(texture)
9293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyGLObject(SharedPtr<Object>(m_texture));
9313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9333c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid DeleteTexture::exec (tcu::ThreadUtil::Thread& t)
9343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9353c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
9363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint tex = m_texture->texture;
9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glDeleteTextures(1, { " << tex << " })" << tcu::ThreadUtil::Message::End;
9393c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, deleteTextures(1, &tex));
9403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glDeleteTextures()" << tcu::ThreadUtil::Message::End;
9413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_texture->texture = 0;
9433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9453c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TexImage2D : public Operation
9463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9473c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
9483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TexImage2D	(SharedPtr<Texture> texture, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, bool useSync, bool serverSync);
9493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec		(tcu::ThreadUtil::Thread& thread);
9503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
9523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Texture>	m_texture;
9533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint				m_level;
9543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint				m_internalFormat;
9553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLsizei				m_width;
9563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLsizei				m_height;
9573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum				m_format;
9583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum				m_type;
9593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
9603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9613c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTexImage2D::TexImage2D (SharedPtr<Texture> texture, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, bool useSync, bool serverSync)
9623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation			("TexImage2D", useSync, serverSync)
9633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_texture			(texture)
9643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_level			(level)
9653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_internalFormat	(internalFormat)
9663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_width			(width)
9673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_height			(height)
9683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_format			(format)
9693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_type			(type)
9703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyGLObject(SharedPtr<Object>(m_texture));
9723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_texture->isDefined = true;
9733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Orphang texture
9753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	texture->sourceImage = SharedPtr<EGLImage>();
9763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9783c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid TexImage2D::exec (tcu::ThreadUtil::Thread& t)
9793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9803c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
9813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void* dummyData = thread.getDummyData(m_width*m_height*4);
9823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, " << m_texture->texture << ")" << tcu::ThreadUtil::Message::End;
9843c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, m_texture->texture));
9853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
9863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glTexImage2D(GL_TEXTURE_2D, " << m_level << ", " << m_internalFormat << ", " << m_width << ", " << m_height << ", 0, " << m_format << ", " << m_type << ", data)" << tcu::ThreadUtil::Message::End;
9883c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, texImage2D(GL_TEXTURE_2D, m_level, m_internalFormat, m_width, m_height, 0, m_format, m_type, dummyData));
9893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glTexImage2D()" << tcu::ThreadUtil::Message::End;
9903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, 0)" << tcu::ThreadUtil::Message::End;
9923c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, 0));
9933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
9943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9963c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TexSubImage2D : public Operation
9973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9983c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
9993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TexSubImage2D	(SharedPtr<Texture> texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, bool useSync, bool serverSync);
10003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
10013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10023c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
10033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Texture>	m_texture;
10043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint				m_level;
10053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint				m_xoffset;
10063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint				m_yoffset;
10073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLsizei				m_width;
10083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLsizei				m_height;
10093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum				m_format;
10103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum				m_type;
10113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
10123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10133c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTexSubImage2D::TexSubImage2D (SharedPtr<Texture> texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, bool useSync, bool serverSync)
10143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation		("TexSubImage2D", useSync, serverSync)
10153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_texture		(texture)
10163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_level		(level)
10173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_xoffset		(xoffset)
10183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_yoffset		(yoffset)
10193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_width		(width)
10203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_height		(height)
10213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_format		(format)
10223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_type		(type)
10233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyGLObject(SharedPtr<Object>(m_texture));
10253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_texture->sourceImage)
10273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		modifyGLObject(SharedPtr<Object>(m_texture->sourceImage));
10283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10303c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid TexSubImage2D::exec (tcu::ThreadUtil::Thread& t)
10313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10323c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
10333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void* dummyData = thread.getDummyData(m_width*m_height*4);
10343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, " << m_texture->texture << ")" << tcu::ThreadUtil::Message::End;
10363c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, m_texture->texture));
10373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
10383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glTexSubImage2D(GL_TEXTURE_2D, " << m_level << ", " << m_xoffset << ", " << m_yoffset << ", " << m_width << ", " << m_height << ", 0, " << m_format << ", " << m_type << ", <data>)" << tcu::ThreadUtil::Message::End;
10403c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, texSubImage2D(GL_TEXTURE_2D, m_level, m_xoffset, m_yoffset, m_width, m_height, m_format, m_type, dummyData));
10413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glSubTexImage2D()" << tcu::ThreadUtil::Message::End;
10423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, 0)" << tcu::ThreadUtil::Message::End;
10443c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, 0));
10453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
10463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10483c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass CopyTexImage2D : public Operation
10493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10503c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
10513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			CopyTexImage2D	(SharedPtr<Texture> texture, GLint level, GLint internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border, bool useSync, bool serverSync);
10523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
10533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10543c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
10553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Texture>	m_texture;
10563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint				m_level;
10573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint				m_internalFormat;
10583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint				m_x;
10593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint				m_y;
10603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLsizei				m_width;
10613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLsizei				m_height;
10623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint				m_border;
10633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
10643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10653c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCopyTexImage2D::CopyTexImage2D (SharedPtr<Texture> texture, GLint level, GLint internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border, bool useSync, bool serverSync)
10663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation			("CopyTexImage2D", useSync, serverSync)
10673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_texture			(texture)
10683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_level			(level)
10693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_internalFormat	(internalFormat)
10703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_x				(x)
10713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_y				(y)
10723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_width			(width)
10733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_height			(height)
10743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_border			(border)
10753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyGLObject(SharedPtr<Object>(m_texture));
10773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	texture->isDefined = true;
10783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Orphang texture
10803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	texture->sourceImage = SharedPtr<EGLImage>();
10813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10833c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid CopyTexImage2D::exec (tcu::ThreadUtil::Thread& t)
10843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10853c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
10863c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
10873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, " << m_texture->texture << ")" << tcu::ThreadUtil::Message::End;
10883c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, m_texture->texture));
10893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
10903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glCopyTexImage2D(GL_TEXTURE_2D, " << m_level << ", " << m_internalFormat << ", " << m_x << ", " << m_y << ", " << m_width << ", " << m_height << ", " << m_border << ")" << tcu::ThreadUtil::Message::End;
10923c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, copyTexImage2D(GL_TEXTURE_2D, m_level, m_internalFormat, m_x, m_y, m_width, m_height, m_border));
10933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glCopyTexImage2D()" << tcu::ThreadUtil::Message::End;
10943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, 0)" << tcu::ThreadUtil::Message::End;
10963c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, 0));
10973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
10983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11003c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass CopyTexSubImage2D : public Operation
11013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11023c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
11033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			CopyTexSubImage2D		(SharedPtr<Texture> texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, bool useSync, bool serverSync);
11043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec					(tcu::ThreadUtil::Thread& thread);
11053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11063c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
11073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Texture>	m_texture;
11083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint				m_level;
11093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint				m_xoffset;
11103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint				m_yoffset;
11113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint				m_x;
11123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint				m_y;
11133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLsizei				m_width;
11143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLsizei				m_height;
11153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
11163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11173c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCopyTexSubImage2D::CopyTexSubImage2D (SharedPtr<Texture> texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, bool useSync, bool serverSync)
11183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation		("CopyTexSubImage2D", useSync, serverSync)
11193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_texture		(texture)
11203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_level		(level)
11213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_xoffset		(xoffset)
11223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_yoffset		(yoffset)
11233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_x			(x)
11243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_y			(y)
11253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_width		(width)
11263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_height		(height)
11273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyGLObject(SharedPtr<Object>(m_texture));
11293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_texture->sourceImage)
11313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		modifyGLObject(SharedPtr<Object>(m_texture->sourceImage));
11323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11343c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid CopyTexSubImage2D::exec (tcu::ThreadUtil::Thread& t)
11353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11363c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
11373c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
11383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, " << m_texture->texture << ")" << tcu::ThreadUtil::Message::End;
11393c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, m_texture->texture));
11403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
11413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glCopyTexSubImage2D(GL_TEXTURE_2D, " << m_level << ", " << m_xoffset << ", " << m_yoffset << ", " << m_x << ", " << m_y << ", " << m_width << ", " << m_height << ")" << tcu::ThreadUtil::Message::End;
11433c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, copyTexSubImage2D(GL_TEXTURE_2D, m_level, m_xoffset, m_yoffset, m_x, m_y, m_width, m_height));
11443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glCopyTexSubImage2D()" << tcu::ThreadUtil::Message::End;
11453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, 0)" << tcu::ThreadUtil::Message::End;
11473c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, 0));
11483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
11493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Buffer : public Object
11523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11533c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
11543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				Buffer		(SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync);
11553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Runtime attributes
11573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint		buffer;
11583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLsizeiptr	size;
11593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Call generation time parameters
11613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool		isDefined;
11623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
11633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11643c827367444ee418f129b2c238299f49d3264554Jarkko PoyryBuffer::Buffer (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync)
11653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Object		("Buffer", event, sync)
11663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, buffer		(0)
11673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, size			(0)
11683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, isDefined		(false)
11693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11723c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass CreateBuffer : public Operation
11733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11743c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
11753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			CreateBuffer	(SharedPtr<Buffer>& buffer, bool useSync, bool serverSync);
11763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
11773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11783c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
11793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Buffer> m_buffer;
11803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
11813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11823c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCreateBuffer::CreateBuffer (SharedPtr<Buffer>& buffer, bool useSync, bool serverSync)
11833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("CreateBuffer", useSync, serverSync)
11843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	buffer = SharedPtr<Buffer>(new Buffer(getEvent(), getSync()));
11863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_buffer = buffer;
11873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11893c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid CreateBuffer::exec (tcu::ThreadUtil::Thread& t)
11903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11913c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
11923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint buffer = 0;
11933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glGenBuffers(1, { 0 })" << tcu::ThreadUtil::Message::End;
11953c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, genBuffers(1, &buffer));
11963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glGenBuffers(1, { " << buffer << " })" << tcu::ThreadUtil::Message::End;
11973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_buffer->buffer = buffer;
11993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
12003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12013c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass DeleteBuffer : public Operation
12023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12033c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
12043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DeleteBuffer	(SharedPtr<Buffer> buffer, bool useSync, bool serverSync);
12053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
12063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12073c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
12083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Buffer> m_buffer;
12093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
12103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12113c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDeleteBuffer::DeleteBuffer (SharedPtr<Buffer> buffer, bool useSync, bool serverSync)
12123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("DeleteBuffer", useSync, serverSync)
12133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_buffer	(buffer)
12143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyGLObject(SharedPtr<Object>(m_buffer));
12163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
12173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12183c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid DeleteBuffer::exec (tcu::ThreadUtil::Thread& t)
12193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12203c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
12213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint buffer = m_buffer->buffer;
12223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glDeleteBuffers(1, { " << buffer << " })" << tcu::ThreadUtil::Message::End;
12243c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, deleteBuffers(1, &buffer));
12253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glDeleteBuffers()" << tcu::ThreadUtil::Message::End;
12263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_buffer->buffer = 0;
12283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
12293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12303c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass BufferData : public Operation
12313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12323c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
12333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			BufferData	(SharedPtr<Buffer> buffer, GLenum target, GLsizeiptr size, GLenum usage, bool useSync, bool serverSync);
12343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec		(tcu::ThreadUtil::Thread& thread);
12353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
12373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Buffer>	m_buffer;
12383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum				m_target;
12393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLsizeiptr			m_size;
12403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum				m_usage;
12413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
12423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12433c827367444ee418f129b2c238299f49d3264554Jarkko PoyryBufferData::BufferData (SharedPtr<Buffer> buffer, GLenum target, GLsizeiptr size, GLenum usage, bool useSync, bool serverSync)
12443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("BufferData", useSync, serverSync)
12453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_buffer	(buffer)
12463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_target	(target)
12473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_size	(size)
12483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_usage	(usage)
12493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyGLObject(SharedPtr<Object>(m_buffer));
12513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	buffer->isDefined	= true;
12523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	buffer->size		= size;
12533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
12543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12553c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid BufferData::exec (tcu::ThreadUtil::Thread& t)
12563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12573c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
12583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void* dummyData = thread.getDummyData(m_size);
12593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindBuffer(" << m_target << ", " << m_buffer->buffer << ")" << tcu::ThreadUtil::Message::End;
12613c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindBuffer(m_target, m_buffer->buffer));
12623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindBuffer()" << tcu::ThreadUtil::Message::End;
12633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBufferData(" << m_target << ", " << m_size << ", <DATA>, " << m_usage << ")" << tcu::ThreadUtil::Message::End;
12653c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bufferData(m_target, m_size, dummyData, m_usage));
12663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBufferData()" << tcu::ThreadUtil::Message::End;
12673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindBuffer(" << m_target << ", 0)" << tcu::ThreadUtil::Message::End;
12693c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindBuffer(m_target, 0));
12703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindBuffer()" << tcu::ThreadUtil::Message::End;
12713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
12723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12733c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass BufferSubData : public Operation
12743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12753c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
12763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			BufferSubData	(SharedPtr<Buffer> buffer, GLenum target, GLintptr offset, GLsizeiptr size, bool useSync, bool serverSync);
12773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
12783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12793c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
12803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Buffer>	m_buffer;
12813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum				m_target;
12823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLintptr			m_offset;
12833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLsizeiptr			m_size;
12843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
12853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12863c827367444ee418f129b2c238299f49d3264554Jarkko PoyryBufferSubData::BufferSubData (SharedPtr<Buffer> buffer, GLenum target, GLintptr offset, GLsizeiptr size, bool useSync, bool serverSync)
12873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("BufferSubData", useSync, serverSync)
12883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_buffer	(buffer)
12893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_target	(target)
12903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_offset	(offset)
12913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_size	(size)
12923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyGLObject(SharedPtr<Object>(m_buffer));
12943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
12953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12963c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid BufferSubData::exec (tcu::ThreadUtil::Thread& t)
12973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12983c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
12993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void* dummyData = thread.getDummyData(m_size);
13003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindBuffer(" << m_target << ", " << m_buffer->buffer << ")" << tcu::ThreadUtil::Message::End;
13023c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindBuffer(m_target, m_buffer->buffer));
13033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindBuffer()" << tcu::ThreadUtil::Message::End;
13043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBufferSubData(" << m_target << ", " << m_offset << ", " << m_size << ", <DATA>)" << tcu::ThreadUtil::Message::End;
13063c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bufferSubData(m_target, m_offset, m_size, dummyData));
13073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBufferSubData()" << tcu::ThreadUtil::Message::End;
13083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindBuffer(" << m_target << ", 0)" << tcu::ThreadUtil::Message::End;
13103c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindBuffer(m_target, 0));
13113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindBuffer()" << tcu::ThreadUtil::Message::End;
13123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
13133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13143c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Shader : public Object
13153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
13163c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
13173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				Shader		(SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync);
13183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint		shader;
13203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		type;
13213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool		isDefined;
13223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool		compiled;
13233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
13243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13253c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShader::Shader (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync)
13263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Object		("Shader", event, sync)
13273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, shader		(0)
13283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, type			(GL_NONE)
13293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, isDefined		(false)
13303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, compiled		(false)
13313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
13323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
13333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13343c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass CreateShader : public Operation
13353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
13363c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
13373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			CreateShader	(GLenum type, SharedPtr<Shader>& shader, bool useSync, bool serverSync);
13383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
13393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13403c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
13413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Shader>	m_shader;
13423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum				m_type;
13433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
13443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13453c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCreateShader::CreateShader (GLenum type, SharedPtr<Shader>& shader, bool useSync, bool serverSync)
13463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("CreateShader", useSync, serverSync)
13473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_type	(type)
13483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
13493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	shader = SharedPtr<Shader>(new Shader(getEvent(), getSync()));
13503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	shader->type = type;
13513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_shader = shader;
13533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
13543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13553c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid CreateShader::exec (tcu::ThreadUtil::Thread& t)
13563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
13573c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
13583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint shader = 0;
13593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glCreateShader(" << m_type << ")" << tcu::ThreadUtil::Message::End;
13613c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	shader = thread.gl.createShader(m_type);
13623c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_MSG(thread.gl, "glCreateShader()");
13633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- " << shader  << " = glCreateShader(" << m_type << ")" << tcu::ThreadUtil::Message::End;
13643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_shader->shader	= shader;
13663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
13673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13683c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass DeleteShader : public Operation
13693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
13703c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
13713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DeleteShader	(SharedPtr<Shader> shader, bool useSync, bool serverSync);
13723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
13733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13743c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
13753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Shader> m_shader;
13763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
13773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13783c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDeleteShader::DeleteShader (SharedPtr<Shader> shader, bool useSync, bool serverSync)
13793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("DeleteShader", useSync, serverSync)
13803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_shader	(shader)
13813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
13823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyGLObject(SharedPtr<Object>(m_shader));
13833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
13843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13853c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid DeleteShader::exec (tcu::ThreadUtil::Thread& t)
13863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
13873c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
13883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint shader = m_shader->shader;
13893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glDeleteShader(" << shader << ")" << tcu::ThreadUtil::Message::End;
13913c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, deleteShader(shader));
13923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glDeleteShader()" << tcu::ThreadUtil::Message::End;
13933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_shader->shader = 0;
13953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
13963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13973c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ShaderSource : public Operation
13983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
13993c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
14003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			ShaderSource	(SharedPtr<Shader> sharder, const char* source, bool useSync, bool serverSync);
14013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
14023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14033c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
14043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Shader>	m_shader;
14053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	string				m_source;
14063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
14073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14083c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderSource::ShaderSource (SharedPtr<Shader> shader, const char* source, bool useSync, bool serverSync)
14093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("ShaderSource", useSync, serverSync)
14103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_shader	(shader)
14113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_source	(source)
14123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
14133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyGLObject(SharedPtr<Object>(m_shader));
14143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_shader->isDefined = true;
14153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
14163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14173c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid ShaderSource::exec (tcu::ThreadUtil::Thread& t)
14183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
14193c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
14203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char* shaderSource = m_source.c_str();
14213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14223c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	thread.newMessage() << "Begin -- glShaderSource(" << m_shader->shader << ", 1, \"" << shaderSource << "\", DE_NULL)" << tcu::ThreadUtil::Message::End;
14233c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, shaderSource(m_shader->shader, 1, &shaderSource, DE_NULL));
14243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glShaderSource()" << tcu::ThreadUtil::Message::End;
14253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
14263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14273c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ShaderCompile : public Operation
14283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
14293c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
14303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			ShaderCompile	(SharedPtr<Shader> sharder, bool useSync, bool serverSync);
14313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
14323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14333c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
14343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Shader> m_shader;
14353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
14363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14373c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderCompile::ShaderCompile (SharedPtr<Shader> shader, bool useSync, bool serverSync)
14383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("ShaderCompile", useSync, serverSync)
14393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_shader	(shader)
14403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
14413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_shader->compiled = true;
14423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyGLObject(SharedPtr<Object>(m_shader));
14433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
14443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14453c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid ShaderCompile::exec (tcu::ThreadUtil::Thread& t)
14463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
14473c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
14483c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
14493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glCompileShader(" << m_shader->shader << ")" << tcu::ThreadUtil::Message::End;
14503c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, compileShader(m_shader->shader));
14513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glCompileShader()" << tcu::ThreadUtil::Message::End;
14523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
14533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14543c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Program : public Object
14553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
14563c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
14573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						Program		(SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync);
14583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Generation time attributes
14603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Shader>	vertexShader;
14613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Shader>	fragmentShader;
14623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool				linked;
14633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Runtime attributes
14653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint				program;
14663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint				runtimeVertexShader;
14673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint				runtimeFragmentShader;
14683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
14693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14703c827367444ee418f129b2c238299f49d3264554Jarkko PoyryProgram::Program (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync)
14713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Object					("Program", event, sync)
14723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, linked					(false)
14733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, program					(0)
14743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, runtimeVertexShader		(0)
14753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, runtimeFragmentShader		(0)
14763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
14773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
14783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14793c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass CreateProgram : public Operation
14803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
14813c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
14823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			CreateProgram	(SharedPtr<Program>& program, bool useSync, bool serverSync);
14833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
14843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14853c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
14863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Program> m_program;
14873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
14883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14893c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCreateProgram::CreateProgram (SharedPtr<Program>& program, bool useSync, bool serverSync)
14903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("CreateProgram", useSync, serverSync)
14913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
14923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	program = SharedPtr<Program>(new Program(getEvent(), getSync()));
14933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_program = program;
14943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
14953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14963c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid CreateProgram::exec (tcu::ThreadUtil::Thread& t)
14973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
14983c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
14993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint program = 0;
15003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glCreateProgram()" << tcu::ThreadUtil::Message::End;
15023c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	program = thread.gl.createProgram();
15033c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_MSG(thread.gl, "glCreateProgram()");
15043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- " << program  << " = glCreateProgram()" << tcu::ThreadUtil::Message::End;
15053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_program->program	= program;
15073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
15083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15093c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass DeleteProgram : public Operation
15103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
15113c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
15123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DeleteProgram	(SharedPtr<Program> program, bool useSync, bool serverSync);
15133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
15143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15153c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
15163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Program> m_program;
15173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
15183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15193c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDeleteProgram::DeleteProgram (SharedPtr<Program> program, bool useSync, bool serverSync)
15203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("DeleteProgram", useSync, serverSync)
15213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_program	(program)
15223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
15233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyGLObject(SharedPtr<Object>(m_program));
15243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
15253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15263c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid DeleteProgram::exec (tcu::ThreadUtil::Thread& t)
15273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
15283c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
15293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint program = m_program->program;
15303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glDeleteProgram(" << program << ")" << tcu::ThreadUtil::Message::End;
15323c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, deleteProgram(program));
15333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glDeleteProgram()" << tcu::ThreadUtil::Message::End;
15343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_program->program = 0;
15363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
15373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15383c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass AttachShader : public Operation
15393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
15403c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
15413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			AttachShader	(SharedPtr<Program> sharder, SharedPtr<Shader> shader, bool useSync, bool serverSync);
15423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
15433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
15453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Program>	m_program;
15463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Shader>	m_shader;
15473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
15483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15493c827367444ee418f129b2c238299f49d3264554Jarkko PoyryAttachShader::AttachShader (SharedPtr<Program> program, SharedPtr<Shader> shader, bool useSync, bool serverSync)
15503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("AttachShader", useSync, serverSync)
15513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_program	(program)
15523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_shader	(shader)
15533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
15543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyGLObject(SharedPtr<Object>(m_program));
15553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	readGLObject(SharedPtr<Object>(m_shader));
15563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_shader->type == GL_VERTEX_SHADER)
15583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_program->vertexShader = shader;
15593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (m_shader->type == GL_FRAGMENT_SHADER)
15603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_program->fragmentShader = shader;
15613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
15623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(false);
15633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
15643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15653c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid AttachShader::exec (tcu::ThreadUtil::Thread& t)
15663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
15673c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
15683c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
15693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glAttachShader(" << m_program->program << ", " << m_shader->shader << ")" << tcu::ThreadUtil::Message::End;
15703c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, attachShader(m_program->program, m_shader->shader));
15713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glAttachShader()" << tcu::ThreadUtil::Message::End;
15723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_shader->type == GL_VERTEX_SHADER)
15743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_program->runtimeVertexShader = m_shader->shader;
15753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (m_shader->type == GL_FRAGMENT_SHADER)
15763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_program->runtimeFragmentShader = m_shader->shader;
15773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
15783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(false);
15793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
15803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15813c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass DetachShader : public Operation
15823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
15833c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
15843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DetachShader	(SharedPtr<Program> sharder, GLenum type, bool useSync, bool serverSync);
15853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
15863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15873c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
15883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Program>	m_program;
15893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum				m_type;
15903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
15913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15923c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDetachShader::DetachShader (SharedPtr<Program> program, GLenum type, bool useSync, bool serverSync)
15933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("DetachShader", useSync, serverSync)
15943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_program	(program)
15953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_type	(type)
15963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
15973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyGLObject(SharedPtr<Object>(m_program));
15983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_type == GL_VERTEX_SHADER)
16003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
16013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(m_program->vertexShader);
16023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_program->vertexShader = SharedPtr<Shader>();
16033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
16043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (m_type == GL_FRAGMENT_SHADER)
16053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
16063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(m_program->fragmentShader);
16073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_program->fragmentShader = SharedPtr<Shader>();
16083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
16093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
16103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(false);
16113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
16123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16133c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid DetachShader::exec (tcu::ThreadUtil::Thread& t)
16143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
16153c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
16163c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
16173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_type == GL_VERTEX_SHADER)
16183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
16193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "Begin -- glDetachShader(" << m_program->program << ", " << m_program->runtimeVertexShader << ")" << tcu::ThreadUtil::Message::End;
16203c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		GLU_CHECK_GLW_CALL(thread.gl, detachShader(m_program->program, m_program->runtimeVertexShader));
16213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "End -- glDetachShader()" << tcu::ThreadUtil::Message::End;
16223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_program->runtimeVertexShader = 0;
16233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
16243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (m_type == GL_FRAGMENT_SHADER)
16253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
16263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "Begin -- glDetachShader(" << m_program->program << ", " << m_program->runtimeFragmentShader << ")" << tcu::ThreadUtil::Message::End;
16273c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		GLU_CHECK_GLW_CALL(thread.gl, detachShader(m_program->program, m_program->runtimeFragmentShader));
16283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		thread.newMessage() << "End -- glDetachShader()" << tcu::ThreadUtil::Message::End;
16293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_program->runtimeFragmentShader = 0;
16303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
16313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
16323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(false);
16333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
16343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16353c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass LinkProgram : public Operation
16363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
16373c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
16383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			LinkProgram	(SharedPtr<Program> program, bool useSync, bool serverSync);
16393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec		(tcu::ThreadUtil::Thread& thread);
16403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16413c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
16423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Program> m_program;
16433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
16443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16453c827367444ee418f129b2c238299f49d3264554Jarkko PoyryLinkProgram::LinkProgram (SharedPtr<Program> program, bool useSync, bool serverSync)
16463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("LinkProgram", useSync, serverSync)
16473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_program	(program)
16483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
16493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyGLObject(SharedPtr<Object>(m_program));
16503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	program->linked = true;
16513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
16523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16533c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid LinkProgram::exec (tcu::ThreadUtil::Thread& t)
16543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
16553c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
16563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint program = m_program->program;
16573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glLinkProgram(" << program << ")" << tcu::ThreadUtil::Message::End;
16593c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, linkProgram(program));
16603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glLinkProgram()" << tcu::ThreadUtil::Message::End;
16613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
16623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16633c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass RenderBuffer : public Operation
16643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
16653c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
16663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			RenderBuffer	(SharedPtr<Program> program, SharedPtr<Buffer> buffer, bool useSync, bool serverSync);
16673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
16683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16693c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
16703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Program>	m_program;
16713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Buffer>	m_buffer;
16723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
16733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16743c827367444ee418f129b2c238299f49d3264554Jarkko PoyryRenderBuffer::RenderBuffer (SharedPtr<Program> program, SharedPtr<Buffer> buffer, bool useSync, bool serverSync)
16753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("RenderBuffer", useSync, serverSync)
16763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_program	(program)
16773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_buffer	(buffer)
16783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
16793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	readGLObject(SharedPtr<Object>(program));
16803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	readGLObject(SharedPtr<Object>(buffer));
16813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
16823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16833c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid RenderBuffer::exec (tcu::ThreadUtil::Thread& t)
16843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
16853c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
16863c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
16873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glClearColor(0.5f, 0.5f, 0.5f, 1.0f)" << tcu::ThreadUtil::Message::End;
16883c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, clearColor(0.5f, 0.5f, 0.5f, 1.0f));
16893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glClearColor()" << tcu::ThreadUtil::Message::End;
16903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glClear(GL_COLOR_BUFFER_BIT)" << tcu::ThreadUtil::Message::End;
16923c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, clear(GL_COLOR_BUFFER_BIT));
16933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glClear()" << tcu::ThreadUtil::Message::End;
16943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glUseProgram(" << m_program->program << ")" << tcu::ThreadUtil::Message::End;
16963c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, useProgram(m_program->program));
16973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glUseProgram()" << tcu::ThreadUtil::Message::End;
16983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glGetAttribLocation(" << m_program->program << ", \"a_pos\")" << tcu::ThreadUtil::Message::End;
17003c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLint posLoc = thread.gl.getAttribLocation(m_program->program, "a_pos");
17013c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_MSG(thread.gl, "glGetAttribLocation()");
17023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- " << posLoc << " = glGetAttribLocation()" << tcu::ThreadUtil::Message::End;
17033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glEnableVertexAttribArray(" << posLoc << ")" << tcu::ThreadUtil::Message::End;
17053c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, enableVertexAttribArray(posLoc));
17063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glEnableVertexAttribArray()" << tcu::ThreadUtil::Message::End;
17073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindBuffer(GL_ARRAY_BUFFER, " << m_buffer->buffer << ")" << tcu::ThreadUtil::Message::End;
17093c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindBuffer(GL_ARRAY_BUFFER, m_buffer->buffer));
17103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindBuffer()" << tcu::ThreadUtil::Message::End;
17113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glVertexAttribPointer(" << posLoc << ", GL_BYTE, GL_TRUE, 0, 0)" << tcu::ThreadUtil::Message::End;
17133c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, vertexAttribPointer(posLoc, 2, GL_BYTE, GL_TRUE, 0, 0));
17143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glVertexAttribPointer()" << tcu::ThreadUtil::Message::End;
17153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glDrawArrays(GL_TRIANGLES, 0, " << (m_buffer->size / 2) << ")" << tcu::ThreadUtil::Message::End;
17173c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, drawArrays(GL_TRIANGLES, 0, (GLsizei)m_buffer->size / 2));
17183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glDrawArrays()" << tcu::ThreadUtil::Message::End;
17193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindBuffer(GL_ARRAY_BUFFER, 0)" << tcu::ThreadUtil::Message::End;
17213c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindBuffer(GL_ARRAY_BUFFER, 0));
17223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindBuffer()" << tcu::ThreadUtil::Message::End;
17233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glDisableVertexAttribArray(" << posLoc << ")" << tcu::ThreadUtil::Message::End;
17253c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, disableVertexAttribArray(posLoc));
17263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glDisableVertexAttribArray()" << tcu::ThreadUtil::Message::End;
17273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glUseProgram(0)" << tcu::ThreadUtil::Message::End;
17293c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, useProgram(0));
17303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glUseProgram()" << tcu::ThreadUtil::Message::End;
17313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
17323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17333c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass RenderTexture : public Operation
17343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
17353c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
17363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			RenderTexture	(SharedPtr<Program> program, SharedPtr<Texture> texture, bool useSync, bool serverSync);
17373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
17383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17393c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
17403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Program>	m_program;
17413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Texture>	m_texture;
17423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
17433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17443c827367444ee418f129b2c238299f49d3264554Jarkko PoyryRenderTexture::RenderTexture (SharedPtr<Program> program, SharedPtr<Texture> texture, bool useSync, bool serverSync)
17453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("RenderTexture", useSync, serverSync)
17463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_program	(program)
17473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_texture	(texture)
17483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
17493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	readGLObject(SharedPtr<Object>(program));
17503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	readGLObject(SharedPtr<Object>(texture));
17513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
17523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17533c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid RenderTexture::exec (tcu::ThreadUtil::Thread& t)
17543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
17553c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
17563c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
17573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glClearColor(0.5f, 0.5f, 0.5f, 1.0f)" << tcu::ThreadUtil::Message::End;
17583c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, clearColor(0.5f, 0.5f, 0.5f, 1.0f));
17593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glClearColor()" << tcu::ThreadUtil::Message::End;
17603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glClear(GL_COLOR_BUFFER_BIT)" << tcu::ThreadUtil::Message::End;
17623c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, clear(GL_COLOR_BUFFER_BIT));
17633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glClear()" << tcu::ThreadUtil::Message::End;
17643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glUseProgram(" << m_program->program << ")" << tcu::ThreadUtil::Message::End;
17663c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, useProgram(m_program->program));
17673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glUseProgram()" << tcu::ThreadUtil::Message::End;
17683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, " << m_texture->texture << ")" << tcu::ThreadUtil::Message::End;
17703c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, m_texture->texture));
17713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
17723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glGetUniformLocation(" << m_program->program << ", \"u_sampler\")" << tcu::ThreadUtil::Message::End;
17743c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLint samplerPos = thread.gl.getUniformLocation(m_program->program, "u_sampler");
17753c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_MSG(thread.gl, "glGetUniformLocation()");
17763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glGetUniformLocation()" << tcu::ThreadUtil::Message::End;
17773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glUniform1i(" << samplerPos << ", 0)" << tcu::ThreadUtil::Message::End;
17793c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, uniform1i(samplerPos, 0));
17803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glUniform1i()" << tcu::ThreadUtil::Message::End;
17813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glGetAttribLocation(" << m_program->program << ", \"a_pos\")" << tcu::ThreadUtil::Message::End;
17843c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLint posLoc = thread.gl.getAttribLocation(m_program->program, "a_pos");
17853c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_MSG(thread.gl, "glGetAttribLocation()");
17863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- " << posLoc << " = glGetAttribLocation()" << tcu::ThreadUtil::Message::End;
17873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glEnableVertexAttribArray(" << posLoc << ")" << tcu::ThreadUtil::Message::End;
17893c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, enableVertexAttribArray(posLoc));
17903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glEnableVertexAttribArray()" << tcu::ThreadUtil::Message::End;
17913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindBuffer(GL_ARRAY_BUFFER, 0)" << tcu::ThreadUtil::Message::End;
17933c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindBuffer(GL_ARRAY_BUFFER, 0));
17943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindBuffer()" << tcu::ThreadUtil::Message::End;
17953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float coords[] = {
17983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		-1.0, -1.0,
17993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 1.0, -1.0,
18003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 1.0,  1.0,
18013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 1.0,  1.0,
18033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		-1.0,  1.0,
18043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		-1.0, -1.0
18053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
18063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glVertexAttribPointer(" << posLoc << ", GL_FLOAT, GL_FALSE, 0, <data>)" << tcu::ThreadUtil::Message::End;
18083c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, vertexAttribPointer(posLoc, 2, GL_FLOAT, GL_FALSE, 0, coords));
18093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glVertexAttribPointer()" << tcu::ThreadUtil::Message::End;
18103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glDrawArrays(GL_TRIANGLES, 0, 6)" << tcu::ThreadUtil::Message::End;
18123c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, drawArrays(GL_TRIANGLES, 0, 6));
18133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glDrawArrays()" << tcu::ThreadUtil::Message::End;
18143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindBuffer(GL_ARRAY_BUFFER, 0)" << tcu::ThreadUtil::Message::End;
18163c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindBuffer(GL_ARRAY_BUFFER, 0));
18173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindBuffer()" << tcu::ThreadUtil::Message::End;
18183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, 0)" << tcu::ThreadUtil::Message::End;
18203c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, 0));
18213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
18223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glDisableVertexAttribArray(" << posLoc << ")" << tcu::ThreadUtil::Message::End;
18243c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, disableVertexAttribArray(posLoc));
18253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glDisableVertexAttribArray()" << tcu::ThreadUtil::Message::End;
18263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glUseProgram(0)" << tcu::ThreadUtil::Message::End;
18283c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, useProgram(0));
18293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glUseProgram()" << tcu::ThreadUtil::Message::End;
18303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
18313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18323c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ReadPixels : public Operation
18333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
18343c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
18353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			ReadPixels		(int x, int y, int width, int height, GLenum format, GLenum type, SharedPtr<tcu::ThreadUtil::DataBlock>& data, bool useSync, bool serverSync);
18363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec			(tcu::ThreadUtil::Thread& thread);
18373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18383c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
18393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int										m_x;
18403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int										m_y;
18413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int										m_width;
18423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int										m_height;
18433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum									m_format;
18443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum									m_type;
18453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<tcu::ThreadUtil::DataBlock>	m_data;
18463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
18473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18483c827367444ee418f129b2c238299f49d3264554Jarkko PoyryReadPixels::ReadPixels (int x, int y, int width, int height, GLenum format, GLenum type, SharedPtr<tcu::ThreadUtil::DataBlock>& data, bool useSync, bool serverSync)
18493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("ReadPixels", useSync, serverSync)
18503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_x		(x)
18513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_y		(y)
18523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_width	(width)
18533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_height	(height)
18543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_format	(format)
18553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_type	(type)
18563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
18573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	data = SharedPtr<tcu::ThreadUtil::DataBlock>(new tcu::ThreadUtil::DataBlock(getEvent()));
18583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_data = data;
18593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
18603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18613c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid ReadPixels::exec (tcu::ThreadUtil::Thread& t)
18623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
18633c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
18643c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
18653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_type == GL_UNSIGNED_BYTE);
18663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_format == GL_RGBA);
18673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<deUint8> data((m_width-m_x)*(m_height-m_y)*4);
18693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glReadPixels(" << m_x << ", " << m_y << ", " << m_width << ", " << m_height << ", " << m_format << ", " << m_type << ", <data>)" << tcu::ThreadUtil::Message::End;
18713c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, readPixels(m_x, m_y, m_width, m_height, m_format, m_type, &(data[0])));
18723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glReadPixels()" << tcu::ThreadUtil::Message::End;
18733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_data->setData(data.size(), &(data[0]));
18753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
18763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18773c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass CreateImageFromTexture : public Operation
18783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
18793c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
18803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// \note [mika] Unlike eglCreateImageKHR this operation requires current context and uses it for creating EGLImage
18813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	//				Current context is required to support EGL sync objects in current tests system
18823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			CreateImageFromTexture	(SharedPtr<EGLImage>& image, SharedPtr<Texture> texture, bool useSync, bool serverSync);
18833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec					(tcu::ThreadUtil::Thread& thread);
18843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18853c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
18863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Texture>		m_texture;
18873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<EGLImage>		m_image;
18883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
18893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18903c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCreateImageFromTexture::CreateImageFromTexture (SharedPtr<EGLImage>& image, SharedPtr<Texture> texture, bool useSync, bool serverSync)
18913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("CreateImageFromTexture", useSync, serverSync)
18923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
18933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyGLObject(SharedPtr<Object>(texture));
18943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	image = SharedPtr<EGLImage>(new EGLImage(getEvent(), getSync()));
18953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_image					= image;
18973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_texture				= texture;
18983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_texture->sourceImage	= m_image;
18993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
19003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19013c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid CreateImageFromTexture::exec (tcu::ThreadUtil::Thread& t)
19023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
19033c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
19043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLint attribList[] = {
19063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_GL_TEXTURE_LEVEL_KHR, 0,
19073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_NONE
19083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
19093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, " << m_texture->texture << ")" << tcu::ThreadUtil::Message::End;
19113c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, m_texture->texture));
19123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
19133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Make texture image complete...
19153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)" << tcu::ThreadUtil::Message::End;
19163c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
19173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glTexParameteri()" << tcu::ThreadUtil::Message::End;
19183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)" << tcu::ThreadUtil::Message::End;
19203c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
19213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glTexParameteri()" << tcu::ThreadUtil::Message::End;
19223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)" << tcu::ThreadUtil::Message::End;
19243c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
19253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glTexParameteri()" << tcu::ThreadUtil::Message::End;
19263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)" << tcu::ThreadUtil::Message::End;
19283c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
19293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glTexParameteri()" << tcu::ThreadUtil::Message::End;
19303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- eglCreateImageKHR(" << thread.runtimeContext->display << ", " << thread.runtimeContext->context << ", EGL_GL_TEXTURE_2D_KHR, " << m_texture->texture << ", { EGL_GL_TEXTURE_LEVEL_KHR, 0, EGL_NONE })" << tcu::ThreadUtil::Message::End;
19323c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	m_image->image = thread.egl.createImageKHR(thread.runtimeContext->display, thread.runtimeContext->context, EGL_GL_TEXTURE_2D_KHR, (EGLClientBuffer)(deUintptr)m_texture->texture, attribList);
19333c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLU_CHECK_MSG(thread.egl, "eglCreateImageKHR()");
19343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- " << m_image->image << " = eglCreateImageKHR()" << tcu::ThreadUtil::Message::End;
19353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, 0)" << tcu::ThreadUtil::Message::End;
19373c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, 0));
19383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
19393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
19403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19413c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass DestroyImage : public Operation
19423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
19433c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
19443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// \note [mika] Unlike eglDestroyImageKHR this operation requires current context and uses it for creating EGLImage
19453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	//				Current context is required to support EGL sync objects in current tests system
19463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DestroyImage		(SharedPtr<EGLImage> image, bool useSync, bool serverSync);
19473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec				(tcu::ThreadUtil::Thread& thread);
19483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19493c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
19503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<EGLImage>		m_image;
19513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
19523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19533c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDestroyImage::DestroyImage (SharedPtr<EGLImage> image, bool useSync, bool serverSync)
19543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("CreateImageFromTexture", useSync, serverSync)
19553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_image	(image)
19563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
19573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyGLObject(SharedPtr<Object>(image));
19583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
19593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19603c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid DestroyImage::exec (tcu::ThreadUtil::Thread& t)
19613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
19623c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
19633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- eglDestroyImageKHR(" << thread.runtimeContext->display << ", " << m_image->image << ")" << tcu::ThreadUtil::Message::End;
19653c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	thread.egl.destroyImageKHR(thread.runtimeContext->display, m_image->image);
19663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_image->image = EGL_NO_IMAGE_KHR;
19673c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLU_CHECK_MSG(thread.egl, "eglDestroyImageKHR()");
19683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- eglDestroyImageKHR()" << tcu::ThreadUtil::Message::End;
19693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
19703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19713c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass DefineTextureFromImage : public Operation
19723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
19733c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
19743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DefineTextureFromImage	(SharedPtr<Texture> texture, SharedPtr<EGLImage> image, bool useSync, bool serverSync);
19753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	exec					(tcu::ThreadUtil::Thread& thread);
19763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19773c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
19783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<Texture>	m_texture;
19793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<EGLImage>	m_image;
19803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
19813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19823c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDefineTextureFromImage::DefineTextureFromImage (SharedPtr<Texture> texture, SharedPtr<EGLImage> image, bool useSync, bool serverSync)
19833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: Operation	("DefineTextureFromImage", useSync, serverSync)
19843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
19853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	readGLObject(SharedPtr<Object>(image));
19863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	modifyGLObject(SharedPtr<Object>(texture));
19873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	texture->isDefined		= true;
19893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	texture->sourceImage	= image;
19903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_image		= image;
19923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_texture	= texture;
19933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
19943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid DefineTextureFromImage::exec (tcu::ThreadUtil::Thread& t)
19963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
19973c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLThread& thread = dynamic_cast<EGLThread&>(t);
19983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, " << m_texture->texture << ")" << tcu::ThreadUtil::Message::End;
20003c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, m_texture->texture));
20013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
20023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, " << m_image->image << ")" << tcu::ThreadUtil::Message::End;
20043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.runtimeContext->glExtensions.imageTargetTexture2D(GL_TEXTURE_2D, m_image->image);
20053c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_MSG(thread.gl, "glEGLImageTargetTexture2DOES()");
20063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glEGLImageTargetTexture2DOES()" << tcu::ThreadUtil::Message::End;
20073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, 0)" << tcu::ThreadUtil::Message::End;
20093c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, 0));
20103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
20113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
20123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // GLES2ThreadTest
20143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20153c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosstatic void requireEGLExtension (const Library& egl, EGLDisplay eglDisplay, const char* requiredExtension)
20163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
20173c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	if (!eglu::hasExtension(egl, eglDisplay, requiredExtension))
20183c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		TCU_THROW(NotSupportedError, (string(requiredExtension) + " not supported").c_str());
20193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
20203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20213c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum OperationId
20223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
20233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_NONE = 0,
20243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_CREATE_BUFFER,
20263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_DESTROY_BUFFER,
20273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_BUFFER_DATA,
20283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_BUFFER_SUBDATA,
20293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_CREATE_TEXTURE,
20313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_DESTROY_TEXTURE,
20323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_TEXIMAGE2D,
20333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_TEXSUBIMAGE2D,
20343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_COPYTEXIMAGE2D,
20353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_COPYTEXSUBIMAGE2D,
20363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_CREATE_VERTEX_SHADER,
20383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_CREATE_FRAGMENT_SHADER,
20393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_DESTROY_SHADER,
20403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_SHADER_SOURCE,
20413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_SHADER_COMPILE,
20423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_ATTACH_SHADER,
20443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_DETACH_SHADER,
20453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_CREATE_PROGRAM,
20473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_DESTROY_PROGRAM,
20483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_LINK_PROGRAM,
20493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE,
20513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_DESTROY_IMAGE,
20523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_TEXTURE_FROM_IMAGE,
20533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	THREADOPERATIONID_LAST
20553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
20563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20573c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass GLES2SharingRandomTest : public TestCase
20583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
20593c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
20603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	struct TestConfig
20613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
20623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				TestConfig		(void);
20633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int		threadCount;
20643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int		operationCount;
20653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool	serverSync;
20663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool	useFenceSync;
20673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool	useImages;
20683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		float probabilities[THREADOPERATIONID_LAST][THREADOPERATIONID_LAST];
20703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
20713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						GLES2SharingRandomTest		(EglTestContext& context, const TestConfig& config, const char* name, const char* description);
20723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						~GLES2SharingRandomTest		(void);
20733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				init						(void);
20753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				deinit						(void);
20763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	IterateResult		iterate						(void);
20773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				addRandomOperation			(GLES2ThreadTest::EGLResourceManager& resourceManager);
20793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20803c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
20813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestConfig				m_config;
20823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						m_seed;
20833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	de::Random				m_random;
20843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::TestLog&			m_log;
20853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool					m_threadsStarted;
20863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool					m_threadsRunning;
20873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool					m_executionReady;
20883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool					m_requiresRestart;
20893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint64				m_beginTimeUs;
20903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint64				m_timeOutUs;
20913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32				m_sleepTimeMs;
20923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint64				m_timeOutTimeUs;
20933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<GLES2ThreadTest::EGLThread*>	m_threads;
20953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLDisplay				m_eglDisplay;
20973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLConfig				m_eglConfig;
20983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	OperationId				m_lastOperation;
20993c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
21003c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	glw::Functions			m_gl;
21013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
21023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21033c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGLES2SharingRandomTest::TestConfig::TestConfig (void)
21043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: threadCount		(0)
21053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, operationCount	(0)
21063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, serverSync		(false)
21073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, useFenceSync		(false)
21083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, useImages			(false)
21093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
21103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deMemset(probabilities, 0, sizeof(probabilities));
21113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
21123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21133c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGLES2SharingRandomTest::GLES2SharingRandomTest (EglTestContext& context, const TestConfig& config, const char* name, const char* description)
21143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCase			(context, name, description)
21153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_config			(config)
21163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_seed			(deStringHash(name))
21173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_random			(deStringHash(name))
21183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_log				(m_testCtx.getLog())
21193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_threadsStarted	(false)
21203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_threadsRunning	(false)
21213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_executionReady	(false)
21223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_requiresRestart	(false)
21233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_beginTimeUs		(0)
21243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_timeOutUs		(10000000)	// 10 seconds
21253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_sleepTimeMs		(1)		// 1 milliseconds
21263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_timeOutTimeUs	(0)
21273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_eglDisplay		(EGL_NO_DISPLAY)
21283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_eglConfig		(0)
21293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_lastOperation	(THREADOPERATIONID_NONE)
21303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
21313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
21323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21333c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGLES2SharingRandomTest::~GLES2SharingRandomTest (void)
21343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
21353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLES2SharingRandomTest::deinit();
21363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
21373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21383c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2SharingRandomTest::init (void)
21393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
21403c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	const Library& egl = m_eglTestCtx.getLibrary();
21413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21423c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	const EGLint attribList[] =
21433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
21443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_RENDERABLE_TYPE,	EGL_OPENGL_ES2_BIT,
21453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_SURFACE_TYPE,		EGL_WINDOW_BIT,
21463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_ALPHA_SIZE,			1,
21473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_NONE
21483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
21493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21503c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	m_eglDisplay	= eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay());
2151653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	m_eglConfig		= eglu::chooseSingleConfig(egl, m_eglDisplay, attribList);
21523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21538e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos	m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(2,0));
21548e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos
21553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Check extensions
21563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.useFenceSync)
21573c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_fence_sync");
21583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.serverSync)
21603c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_wait_sync");
21613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.useImages)
21633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
21643c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_image_base");
21653c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_gl_texture_2D_image");
21663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
21673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLES2ThreadTest::EGLResourceManager resourceManager;
21693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Create contexts
21703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int threadNdx = 0; threadNdx < m_config.threadCount; threadNdx++)
21713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
21723c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		m_threads.push_back(new GLES2ThreadTest::EGLThread(egl, m_gl, deInt32Hash(m_seed+threadNdx)));
21733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<GLES2ThreadTest::GLES2Context> context;
21743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<GLES2ThreadTest::GLES2Context> shared = (threadNdx > 0 ? resourceManager.popContext(0) : SharedPtr<GLES2ThreadTest::GLES2Context>());
21753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateContext(m_eglDisplay, m_eglConfig, shared, context));
21763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		resourceManager.addContext(context);
21783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (shared)
21803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			resourceManager.addContext(shared);
21813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
21823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Create surfaces
21843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int threadNdx = 0; threadNdx < m_config.threadCount; threadNdx++)
21853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
21863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<GLES2ThreadTest::Surface> surface;
21873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreatePBufferSurface(m_eglDisplay, m_eglConfig, 400, 400, surface));
21883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		resourceManager.addSurface(surface);
21893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
21903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Make contexts current
21923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int threadNdx = 0; threadNdx < m_config.threadCount; threadNdx++)
21933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
21943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[threadNdx]->addOperation(new GLES2ThreadTest::MakeCurrent(*m_threads[threadNdx], m_eglDisplay, resourceManager.popSurface(0), resourceManager.popContext(0)));
21953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
21963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Operations to check fence sync support
21983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.useFenceSync)
21993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
22003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int threadNdx = 0; threadNdx < m_config.threadCount; threadNdx++)
22013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
22023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::InitGLExtension("GL_OES_EGL_sync"));
22033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
22043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
22053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Init EGLimage support
22073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.useImages)
22083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
22093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int threadNdx = 0; threadNdx < m_config.threadCount; threadNdx++)
22103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
22113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::InitGLExtension("GL_OES_EGL_image"));
22123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
22133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
22143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Add random operations
22163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int operationNdx = 0; operationNdx < m_config.operationCount; operationNdx++)
22173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addRandomOperation(resourceManager);
22183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
221975071e721851f8df8558b7ea80b9738e43a4354cMika Isojärvi	{
222075071e721851f8df8558b7ea80b9738e43a4354cMika Isojärvi		int threadNdx  = 0;
222175071e721851f8df8558b7ea80b9738e43a4354cMika Isojärvi
222275071e721851f8df8558b7ea80b9738e43a4354cMika Isojärvi		// Destroy images
222375071e721851f8df8558b7ea80b9738e43a4354cMika Isojärvi		// \note Android reference counts EGLDisplays so we can't trust the eglTerminate() to clean up resources
222475071e721851f8df8558b7ea80b9738e43a4354cMika Isojärvi		while (resourceManager.getImageCount() > 0)
222575071e721851f8df8558b7ea80b9738e43a4354cMika Isojärvi		{
222675071e721851f8df8558b7ea80b9738e43a4354cMika Isojärvi			const SharedPtr<GLES2ThreadTest::EGLImage> image = resourceManager.popImage(0);
222775071e721851f8df8558b7ea80b9738e43a4354cMika Isojärvi
222875071e721851f8df8558b7ea80b9738e43a4354cMika Isojärvi			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DestroyImage(image, m_config.useFenceSync, m_config.serverSync));
222975071e721851f8df8558b7ea80b9738e43a4354cMika Isojärvi
223075071e721851f8df8558b7ea80b9738e43a4354cMika Isojärvi			threadNdx = (threadNdx + 1) % m_config.threadCount;
223175071e721851f8df8558b7ea80b9738e43a4354cMika Isojärvi		}
223275071e721851f8df8558b7ea80b9738e43a4354cMika Isojärvi	}
223375071e721851f8df8558b7ea80b9738e43a4354cMika Isojärvi
22343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Release contexts
22353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int threadNdx = 0; threadNdx < m_config.threadCount; threadNdx++)
22363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
22373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<GLES2ThreadTest::GLES2Context>	context = m_threads[threadNdx]->context;
22383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<GLES2ThreadTest::Surface>			surface = m_threads[threadNdx]->surface;
22393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[threadNdx]->addOperation(new GLES2ThreadTest::MakeCurrent(*m_threads[threadNdx], m_eglDisplay, SharedPtr<GLES2ThreadTest::Surface>(), SharedPtr<GLES2ThreadTest::GLES2Context>()));
22413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		resourceManager.addSurface(surface);
22433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		resourceManager.addContext(context);
22443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
22453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Destroy contexts
22473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
22483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DestroyContext(resourceManager.popContext(0)));
22493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Destroy surfaces
22513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int threadNdx = 0; threadNdx < m_config.threadCount; threadNdx++)
22523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DestroySurface(m_eglDisplay, resourceManager.popSurface(0)));
22533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
22543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2SharingRandomTest::deinit (void)
22563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
22573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
2258fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi	{
22593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		delete m_threads[threadNdx];
2260fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi		m_threads[threadNdx] = DE_NULL;
2261fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi	}
22623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads.clear();
22643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22658e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos	if (m_eglDisplay != EGL_NO_DISPLAY)
22668e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos	{
22678e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos		m_eglTestCtx.getLibrary().terminate(m_eglDisplay);
22688e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos		m_eglDisplay = EGL_NO_DISPLAY;
22698e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos	}
22703c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
22713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TCU_CHECK(!m_requiresRestart);
22723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
22733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22743c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2SharingRandomTest::addRandomOperation (GLES2ThreadTest::EGLResourceManager& resourceManager)
22753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
227635f4933c31a65a00084b6533e4a0deb098036d66Jarkko Pöyry	int threadNdx	= m_random.getUint32() % (deUint32)m_threads.size();
22773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<OperationId>	operations;
22793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<float>			weights;
22803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operations.push_back(THREADOPERATIONID_CREATE_BUFFER);
22823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_CREATE_BUFFER]);
22833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operations.push_back(THREADOPERATIONID_CREATE_TEXTURE);
22853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_CREATE_TEXTURE]);
22863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operations.push_back(THREADOPERATIONID_CREATE_VERTEX_SHADER);
22883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_CREATE_VERTEX_SHADER]);
22893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operations.push_back(THREADOPERATIONID_CREATE_FRAGMENT_SHADER);
22913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]);
22923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operations.push_back(THREADOPERATIONID_CREATE_PROGRAM);
22943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_CREATE_PROGRAM]);
22953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int destroyableBufferNdx				= -1;
22973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int destroyableTextureNdx				= -1;
22983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int destroyableShaderNdx				= -1;
22993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int destroyableProgramNdx				= -1;
23003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int vertexShaderNdx						= -1;
23023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int fragmentShaderNdx					= -1;
23033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int definedTextureNdx					= -1;
23053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int definedBufferNdx					= -1;
23073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int definedShaderNdx					= -1;
23093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int detachableProgramNdx				= -1;
23113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum detachShaderType					= GL_VERTEX_SHADER;
23123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int unusedVertexAttachmentProgramNdx	= -1;
23143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int unusedFragmentAttachmentProgramNdx	= -1;
23153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int linkableProgramNdx					= -1;
23173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int attachProgramNdx					= -1;
23193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int attachShaderNdx						= -1;
23203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int nonSiblingTextureNdx				= -1;
23223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_threads[threadNdx]->context->resourceManager->getBufferCount() > 0)
23243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		destroyableBufferNdx = m_random.getUint32() % m_threads[threadNdx]->context->resourceManager->getBufferCount();
23253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_threads[threadNdx]->context->resourceManager->getTextureCount() > 0)
23273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		destroyableTextureNdx = m_random.getUint32() % m_threads[threadNdx]->context->resourceManager->getTextureCount();
23283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_threads[threadNdx]->context->resourceManager->getShaderCount() > 0)
23303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		destroyableShaderNdx = m_random.getUint32() % m_threads[threadNdx]->context->resourceManager->getShaderCount();
23313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_threads[threadNdx]->context->resourceManager->getProgramCount() > 0)
23333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		destroyableProgramNdx = m_random.getUint32() % m_threads[threadNdx]->context->resourceManager->getProgramCount();
23343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Check what kind of buffers we have
23363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int bufferNdx = 0; bufferNdx < m_threads[threadNdx]->context->resourceManager->getBufferCount(); bufferNdx++)
23373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
23383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<GLES2ThreadTest::Buffer> buffer = m_threads[threadNdx]->context->resourceManager->getBuffer(bufferNdx);
23393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (buffer->isDefined)
23413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
23423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (definedBufferNdx == -1)
23433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				definedBufferNdx = bufferNdx;
23443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_random.getBool())
23453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				definedBufferNdx = bufferNdx;
23463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
23473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
23483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Check what kind of textures we have
23503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int textureNdx = 0; textureNdx < m_threads[threadNdx]->context->resourceManager->getTextureCount(); textureNdx++)
23513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
23523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->getTexture(textureNdx);
23533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (texture->isDefined)
23553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
23563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (definedTextureNdx == -1)
23573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				definedTextureNdx = textureNdx;
23583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_random.getBool())
23593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				definedTextureNdx = textureNdx;
23603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (!texture->sourceImage)
23623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
23633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (nonSiblingTextureNdx == -1)
23643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					nonSiblingTextureNdx = textureNdx;
23653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else if (m_random.getBool())
23663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					nonSiblingTextureNdx = textureNdx;
23673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
23683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
23693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
23713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Check what kind of shaders we have
23733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int shaderNdx = 0; shaderNdx < m_threads[threadNdx]->context->resourceManager->getShaderCount(); shaderNdx++)
23743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
23753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<GLES2ThreadTest::Shader> shader = m_threads[threadNdx]->context->resourceManager->getShader(shaderNdx);
23763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Defined shader found
23783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (shader->isDefined)
23793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
23803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (definedShaderNdx == -1)
23813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				definedShaderNdx = shaderNdx;
23823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_random.getBool())
23833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				definedShaderNdx = shaderNdx;
23843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
23853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Vertex shader found
23873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (shader->type == GL_VERTEX_SHADER)
23883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
23893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (vertexShaderNdx == -1)
23903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				vertexShaderNdx = shaderNdx;
23913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_random.getBool())
23923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				vertexShaderNdx = shaderNdx;
23933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
23943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Fragmet shader found
23963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (shader->type == GL_FRAGMENT_SHADER)
23973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
23983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (fragmentShaderNdx == -1)
23993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				fragmentShaderNdx = shaderNdx;
24003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_random.getBool())
24013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				fragmentShaderNdx = shaderNdx;
24023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
24033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
24043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Check what kind of programs we have
24063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int programNdx = 0; programNdx < m_threads[threadNdx]->context->resourceManager->getProgramCount(); programNdx++)
24073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
24083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<GLES2ThreadTest::Program> program = m_threads[threadNdx]->context->resourceManager->getProgram(programNdx);
24093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Program that can be detached
24113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (program->vertexShader || program->fragmentShader)
24123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
24133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (detachableProgramNdx == -1)
24143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
24153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				detachableProgramNdx = programNdx;
24163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (program->vertexShader)
24183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					detachShaderType = GL_VERTEX_SHADER;
24193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else if (program->fragmentShader)
24203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					detachShaderType = GL_FRAGMENT_SHADER;
24213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else
24223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					DE_ASSERT(false);
24233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
24243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_random.getBool())
24253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
24263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				detachableProgramNdx = programNdx;
24273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (program->vertexShader)
24293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					detachShaderType = GL_VERTEX_SHADER;
24303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else if (program->fragmentShader)
24313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					detachShaderType = GL_FRAGMENT_SHADER;
24323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else
24333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					DE_ASSERT(false);
24343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
24353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
24363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Program that can be attached vertex shader
24383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (!program->vertexShader)
24393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
24403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (unusedVertexAttachmentProgramNdx == -1)
24413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				unusedVertexAttachmentProgramNdx = programNdx;
24423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_random.getBool())
24433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				unusedVertexAttachmentProgramNdx = programNdx;
24443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
24453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Program that can be attached fragment shader
24473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (!program->fragmentShader)
24483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
24493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (unusedFragmentAttachmentProgramNdx == -1)
24503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				unusedFragmentAttachmentProgramNdx = programNdx;
24513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_random.getBool())
24523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				unusedFragmentAttachmentProgramNdx = programNdx;
24533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
24543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Program that can be linked
24563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (program->vertexShader && program->fragmentShader)
24573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
24583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (linkableProgramNdx == -1)
24593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				linkableProgramNdx = programNdx;
24603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_random.getBool())
24613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				linkableProgramNdx = programNdx;
24623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
24633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
24643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has images
24663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (resourceManager.getImageCount() > 0)
24673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
24683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_DESTROY_IMAGE]);
24693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_DESTROY_IMAGE);
24703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_threads[threadNdx]->context->resourceManager->getTextureCount() > 0)
24723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
24733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_TEXTURE_FROM_IMAGE]);
24743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			operations.push_back(THREADOPERATIONID_TEXTURE_FROM_IMAGE);
24753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
24763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
24773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has buffer
24793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (destroyableBufferNdx != -1)
24803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
24813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_DESTROY_BUFFER]);
24823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_DESTROY_BUFFER);
24833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_BUFFER_DATA]);
24853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_BUFFER_DATA);
24863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
24873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has buffer with defined data
24893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (definedBufferNdx != -1)
24903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
24913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_BUFFER_SUBDATA]);
24923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_BUFFER_SUBDATA);
24933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
24943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has texture
24963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (destroyableTextureNdx != -1)
24973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
24983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_DESTROY_TEXTURE]);
24993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_DESTROY_TEXTURE);
25003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_TEXIMAGE2D]);
25023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_TEXIMAGE2D);
25033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_COPYTEXIMAGE2D]);
25053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_COPYTEXIMAGE2D);
25063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has texture with data
25093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (definedTextureNdx != -1)
25103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_TEXSUBIMAGE2D]);
25123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_TEXSUBIMAGE2D);
25133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_COPYTEXSUBIMAGE2D]);
25153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_COPYTEXSUBIMAGE2D);
25163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has texture that can be used as EGLimage source
25193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (nonSiblingTextureNdx != -1)
25203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]);
25223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE);
25233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has shader
25263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (destroyableShaderNdx != -1)
25273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_DESTROY_SHADER]);
25293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_DESTROY_SHADER);
25303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_SHADER_SOURCE]);
25323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_SHADER_SOURCE);
25333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has shader with defined source
25363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (definedShaderNdx != -1)
25373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_SHADER_COMPILE]);
25393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_SHADER_COMPILE);
25403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has program
25433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (destroyableProgramNdx != -1)
25443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_DESTROY_PROGRAM]);
25463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_DESTROY_PROGRAM);
25473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has program that can be linked
25503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (linkableProgramNdx != -1)
25513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_LINK_PROGRAM]);
25533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_LINK_PROGRAM);
25543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// has program with attachments
25573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (detachableProgramNdx != -1)
25583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_DETACH_SHADER]);
25603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_DETACH_SHADER);
25613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has program and shader pair that can be attached
25643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (fragmentShaderNdx != -1 && unusedFragmentAttachmentProgramNdx != -1)
25653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (attachProgramNdx == -1)
25673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
25683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(attachShaderNdx == -1);
25693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			attachProgramNdx = unusedFragmentAttachmentProgramNdx;
25703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			attachShaderNdx = fragmentShaderNdx;
25713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_ATTACH_SHADER]);
25733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			operations.push_back(THREADOPERATIONID_ATTACH_SHADER);
25743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
25753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (m_random.getBool())
25763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
25773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			attachProgramNdx = unusedFragmentAttachmentProgramNdx;
25783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			attachShaderNdx = fragmentShaderNdx;
25793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
25803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (vertexShaderNdx != -1 && unusedVertexAttachmentProgramNdx != -1)
25833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (attachProgramNdx == -1)
25853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
25863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(attachShaderNdx == -1);
25873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			attachProgramNdx = unusedVertexAttachmentProgramNdx;
25883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			attachShaderNdx = vertexShaderNdx;
25893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_ATTACH_SHADER]);
25913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			operations.push_back(THREADOPERATIONID_ATTACH_SHADER);
25923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
25933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (m_random.getBool())
25943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
25953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			attachProgramNdx = unusedVertexAttachmentProgramNdx;
25963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			attachShaderNdx = vertexShaderNdx;
25973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
25983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	OperationId op = m_random.chooseWeighted<OperationId, std::vector<OperationId> ::iterator>(operations.begin(), operations.end(), weights.begin());
26013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (op)
26033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
26043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_CREATE_BUFFER:
26053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Buffer> buffer;
26073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateBuffer(buffer, m_config.useFenceSync, m_config.serverSync));
26083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addBuffer(buffer);
26093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_DESTROY_BUFFER:
26133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Buffer> buffer = m_threads[threadNdx]->context->resourceManager->popBuffer(destroyableBufferNdx);
26153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DeleteBuffer(buffer, m_config.useFenceSync, m_config.serverSync));
26163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_BUFFER_DATA:
26203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Buffer> buffer = m_threads[threadNdx]->context->resourceManager->popBuffer(destroyableBufferNdx);
26223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::BufferData(buffer, GL_ARRAY_BUFFER, 1024, GL_DYNAMIC_DRAW, m_config.useFenceSync, m_config.serverSync));
26233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addBuffer(buffer);
26243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_BUFFER_SUBDATA:
26283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Buffer> buffer = m_threads[threadNdx]->context->resourceManager->popBuffer(definedBufferNdx);
26303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::BufferSubData(buffer, GL_ARRAY_BUFFER, 1, 20, m_config.useFenceSync, m_config.serverSync));
26313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addBuffer(buffer);
26323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_CREATE_TEXTURE:
26363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Texture> texture;
26383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateTexture(texture, m_config.useFenceSync, m_config.serverSync));
26393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addTexture(texture);
26403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_DESTROY_TEXTURE:
26443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DeleteTexture(m_threads[threadNdx]->context->resourceManager->popTexture(destroyableTextureNdx), m_config.useFenceSync, m_config.serverSync));
26453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_TEXIMAGE2D:
26483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->popTexture(destroyableTextureNdx);
26503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::TexImage2D(texture, 0, GL_RGBA, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
26513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addTexture(texture);
26523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_TEXSUBIMAGE2D:
26563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->popTexture(definedTextureNdx);
26583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::TexSubImage2D(texture, 0, 30, 30, 50, 50, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
26593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addTexture(texture);
26603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_COPYTEXIMAGE2D:
26643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->popTexture(destroyableTextureNdx);
26663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CopyTexImage2D(texture, 0, GL_RGBA, 20, 20, 300, 300, 0, m_config.useFenceSync, m_config.serverSync));
26673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addTexture(texture);
26683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_COPYTEXSUBIMAGE2D:
26723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->popTexture(definedTextureNdx);
26743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CopyTexSubImage2D(texture, 0, 10, 10, 30, 30, 50, 50, m_config.useFenceSync, m_config.serverSync));
26753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addTexture(texture);
26763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_CREATE_VERTEX_SHADER:
26803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Shader> shader;
26823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateShader(GL_VERTEX_SHADER, shader, m_config.useFenceSync, m_config.serverSync));
26833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addShader(shader);
26843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_CREATE_FRAGMENT_SHADER:
26883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Shader> shader;
26903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateShader(GL_FRAGMENT_SHADER, shader, m_config.useFenceSync, m_config.serverSync));
26913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addShader(shader);
26923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_DESTROY_SHADER:
26963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DeleteShader(m_threads[threadNdx]->context->resourceManager->popShader(destroyableShaderNdx), m_config.useFenceSync, m_config.serverSync));
26973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_SHADER_SOURCE:
27003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
27013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const char* vertexShaderSource =
27023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"attribute mediump vec4 a_pos;\n"
27033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"varying mediump vec4 v_pos;\n"
27043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"void main (void)\n"
27053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"{\n"
27063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"\tv_pos = a_pos;\n"
27073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"\tgl_Position = a_pos;\n"
27083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"}\n";
27093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const char* fragmentShaderSource =
27113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"varying mediump vec4 v_pos;\n"
27123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"void main (void)\n"
27133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"{\n"
27143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"\tgl_FragColor = v_pos;\n"
27153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"}\n";
27163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Shader> shader = m_threads[threadNdx]->context->resourceManager->popShader(destroyableShaderNdx);
27173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::ShaderSource(shader, (shader->type == GL_VERTEX_SHADER ? vertexShaderSource : fragmentShaderSource), m_config.useFenceSync, m_config.serverSync));
27183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addShader(shader);
27193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
27213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_SHADER_COMPILE:
27233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
27243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Shader> shader = m_threads[threadNdx]->context->resourceManager->popShader(definedShaderNdx);
27253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::ShaderCompile(shader, m_config.useFenceSync, m_config.serverSync));
27263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addShader(shader);
27273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
27293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_CREATE_PROGRAM:
27313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
27323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Program> program;
27333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateProgram(program, m_config.useFenceSync, m_config.serverSync));
27343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addProgram(program);
27353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
27373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_DESTROY_PROGRAM:
27393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DeleteProgram(m_threads[threadNdx]->context->resourceManager->popProgram(destroyableProgramNdx), m_config.useFenceSync, m_config.serverSync));
27403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_ATTACH_SHADER:
27433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
27443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Program>	program = m_threads[threadNdx]->context->resourceManager->popProgram(attachProgramNdx);
27453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Shader>	shader	= m_threads[threadNdx]->context->resourceManager->popShader(attachShaderNdx);
27463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::AttachShader(program, shader, m_config.useFenceSync, m_config.serverSync));
27483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addProgram(program);
27503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addShader(shader);
27513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
27533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_DETACH_SHADER:
27553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
27563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Program>	program = m_threads[threadNdx]->context->resourceManager->popProgram(detachableProgramNdx);
27573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DetachShader(program, detachShaderType, m_config.useFenceSync, m_config.serverSync));
27583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addProgram(program);
27593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
27613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_LINK_PROGRAM:
27633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
27643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Program>	program = m_threads[threadNdx]->context->resourceManager->popProgram(linkableProgramNdx);
27653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::LinkProgram(program, m_config.useFenceSync, m_config.serverSync));
27663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addProgram(program);
27673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
27693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE:
27713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
27723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::EGLImage> image;
27733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->popTexture(nonSiblingTextureNdx);
27743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateImageFromTexture(image, texture, m_config.useFenceSync, m_config.serverSync));
27753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// \note [mika] Can source be added back to resourceManager?
27763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addTexture(texture);
27773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			resourceManager.addImage(image);
27783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
27803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_DESTROY_IMAGE:
27823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
27833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int imageNdx = m_random.getInt(0, resourceManager.getImageCount()-1);
27843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::EGLImage> image = resourceManager.popImage(imageNdx);
27853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DestroyImage(image, m_config.useFenceSync, m_config.serverSync));
27863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
27883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_TEXTURE_FROM_IMAGE:
27903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
27913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int imageNdx = m_random.getInt(0, resourceManager.getImageCount()-1);
27923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->popTexture(destroyableTextureNdx);
27933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::EGLImage> image = resourceManager.popImage(imageNdx);
27943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DefineTextureFromImage(texture, image, m_config.useFenceSync, m_config.serverSync));
27953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addTexture(texture);
27963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			resourceManager.addImage(image);
27973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
27993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
28013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(false);
28023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
28033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_lastOperation = op;
28053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
28063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28073c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytcu::TestCase::IterateResult GLES2SharingRandomTest::iterate (void)
28083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
28093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!m_threadsStarted)
28103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
28113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_beginTimeUs = deGetMicroseconds();
28123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Execute threads
28143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
28153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->exec();
28163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threadsStarted = true;
28183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threadsRunning = true;
28193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
28203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_threadsRunning)
28223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
28233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Wait threads to finish
28243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int readyThreads = 0;
28253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
28263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2827fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			const tcu::ThreadUtil::Thread::ThreadStatus status = m_threads[threadNdx]->getStatus();
2828fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
2829fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			if (status != tcu::ThreadUtil::Thread::THREADSTATUS_RUNNING && status != tcu::ThreadUtil::Thread::THREADSTATUS_NOT_STARTED)
28303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				readyThreads++;
28313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
28323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (readyThreads == (int)m_threads.size())
28343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
28353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
28363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_threads[threadNdx]->join();
28373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_executionReady	= true;
28393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_requiresRestart	= false;
28403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
28413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (deGetMicroseconds() - m_beginTimeUs > m_timeOutUs)
28433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
28443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
28453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
28463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (m_threads[threadNdx]->getStatus() != tcu::ThreadUtil::Thread::THREADSTATUS_RUNNING)
28473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
28483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					if (m_threads[threadNdx]->isStarted())
28493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						m_threads[threadNdx]->join();
28503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
28513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
28523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_executionReady	= true;
28533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_requiresRestart	= true;
28543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_timeOutTimeUs		= deGetMicroseconds();
28553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
28563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
28573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
28583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			deSleep(m_sleepTimeMs);
28593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
28603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
28613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_executionReady)
28633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
28643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		std::vector<int> indices(m_threads.size(), 0);
2865fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
2866fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi		if (m_timeOutTimeUs != 0)
2867fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			m_log << tcu::TestLog::Message << "Execution timeout limit reached. Trying to get per thread logs. This is potentially dangerous." << tcu::TestLog::EndMessage;
2868fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
28693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		while (true)
28703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2871653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos			int			firstThread = -1;
28723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// Find first thread with messages
28743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
28753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
28763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (m_threads[threadNdx]->getMessageCount() > indices[threadNdx])
28773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
28783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					firstThread = threadNdx;
28793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
28803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
28813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
28823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// No more messages
28843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (firstThread == -1)
28853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
28863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
28883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
28893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				// No more messages in this thread
28903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (m_threads[threadNdx]->getMessageCount() <= indices[threadNdx])
28913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					continue;
28923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if ((m_threads[threadNdx]->getMessage(indices[threadNdx]).getTime() - m_beginTimeUs) < (m_threads[firstThread]->getMessage(indices[firstThread]).getTime() - m_beginTimeUs))
28943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					firstThread = threadNdx;
28953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
28963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2897fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			tcu::ThreadUtil::Message message = m_threads[firstThread]->getMessage(indices[firstThread]);
2898fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
2899fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			m_log << tcu::TestLog::Message << "[" << (message.getTime() - m_beginTimeUs) << "] (" << firstThread << ") " << message.getMessage() << tcu::TestLog::EndMessage;
29003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			indices[firstThread]++;
29013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
29023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2903fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi		if (m_timeOutTimeUs != 0)
2904fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			m_log << tcu::TestLog::Message << "[" << (m_timeOutTimeUs - m_beginTimeUs) << "] Execution timeout limit reached" << tcu::TestLog::EndMessage;
2905fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
29063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool isOk = true;
29073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool notSupported = false;
29083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
29103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2911fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			const tcu::ThreadUtil::Thread::ThreadStatus status = m_threads[threadNdx]->getStatus();
2912fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
2913fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			switch (status)
29143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
2915fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_FAILED:
2916fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_INIT_FAILED:
2917fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_RUNNING:
2918fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					isOk = false;
2919fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					break;
29203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2921fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_NOT_SUPPORTED:
2922fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					notSupported = true;
2923fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					break;
29243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2925fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_READY:
2926fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					// Nothing
2927fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					break;
2928fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
2929fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				default:
2930fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					DE_ASSERT(false);
2931fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					isOk = false;
2932fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			};
29333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
29343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (notSupported)
29363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			throw tcu::NotSupportedError("Thread threw tcu::NotSupportedError", "", __FILE__, __LINE__);
29373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (isOk)
29393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
29403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
29413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
29423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return STOP;
29443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
29453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return CONTINUE;
29473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
29483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29493c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass GLES2ThreadedSharingTest : public TestCase
29503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
29513c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
29523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	struct TestConfig
29533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
29543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		enum ResourceType
29553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
29563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			RESOURCETYPE_BUFFER = 0,
29573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			RESOURCETYPE_TEXTURE,
29583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			RESOURCETYPE_VERTEX_SHADER,
29593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			RESOURCETYPE_FRAGMENT_SHADER,
29603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			RESOURCETYPE_PROGRAM,
29613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			RESOURCETYPE_IMAGE
29623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		};
29633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ResourceType	resourceType;
29653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool			singleContext;
29663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int				define;
29673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int				modify;
29683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool			useFenceSync;
29693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool			serverSync;
29703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool			render;
29713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
29723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						GLES2ThreadedSharingTest	(EglTestContext& context, const TestConfig& config, const char* name, const char* description);
29733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						~GLES2ThreadedSharingTest	(void);
29743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				init						(void);
29763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				deinit						(void);
29773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	IterateResult		iterate						(void);
29783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				addBufferOperations			(void);
29803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				addTextureOperations		(void);
29813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				addImageOperations			(void);
29823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				addShaderOperations			(GLenum type);
29833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				addProgramOperations		(void);
29843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29853c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
29863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestConfig				m_config;
29873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::TestLog&			m_log;
29883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						m_seed;
29893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool					m_threadsStarted;
29903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool					m_threadsRunning;
29913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool					m_executionReady;
29923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool					m_requiresRestart;
29933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint64				m_beginTimeUs;
29943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint64				m_timeOutUs;
29953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32				m_sleepTimeMs;
29963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint64				m_timeOutTimeUs;
29973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<GLES2ThreadTest::EGLThread*>	m_threads;
29993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLDisplay				m_eglDisplay;
30013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLConfig				m_eglConfig;
30023c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	glw::Functions			m_gl;
30033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
30043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30053c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGLES2ThreadedSharingTest::GLES2ThreadedSharingTest (EglTestContext& context, const TestConfig& config, const char* name, const char* description)
30063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCase			(context, name, description)
30073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_config			(config)
30083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_log				(m_testCtx.getLog())
30093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_seed			(deStringHash(name))
30103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_threadsStarted	(false)
30113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_threadsRunning	(false)
30123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_executionReady	(false)
30133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_requiresRestart	(false)
30143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_beginTimeUs		(0)
30153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_timeOutUs		(10000000)	// 10 seconds
30163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_sleepTimeMs		(1)			// 1 milliseconds
30173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_timeOutTimeUs	(0)
30183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_eglDisplay		(EGL_NO_DISPLAY)
30193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_eglConfig		(0)
30203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
30213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
30223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30233c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGLES2ThreadedSharingTest::~GLES2ThreadedSharingTest (void)
30243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
30253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLES2ThreadedSharingTest::deinit();
30263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
30273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30283c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2ThreadedSharingTest::init (void)
30293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
30303c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	const Library& egl = m_eglTestCtx.getLibrary();
30313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30323c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	const EGLint attribList[] =
30333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
30343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_RENDERABLE_TYPE,	EGL_OPENGL_ES2_BIT,
30353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_SURFACE_TYPE,		EGL_WINDOW_BIT,
30363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_ALPHA_SIZE,			1,
30373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_NONE
30383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
30393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30403c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	m_eglDisplay	= eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay());
3041653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	m_eglConfig		= eglu::chooseSingleConfig(egl, m_eglDisplay, attribList);
30423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30438e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos	m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(2,0));
30448e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos
30453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Check extensions
30463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.useFenceSync)
30473c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_fence_sync");
30483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.serverSync)
30503c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_wait_sync");
30513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.resourceType == TestConfig::RESOURCETYPE_IMAGE)
30533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
30543c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_image_base");
30553c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_gl_texture_2D_image");
30563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
30573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Create threads
30593c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	m_threads.push_back(new GLES2ThreadTest::EGLThread(egl, m_gl, deInt32Hash(m_seed)));
30603c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	m_threads.push_back(new GLES2ThreadTest::EGLThread(egl, m_gl, deInt32Hash(m_seed*200)));
30613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::GLES2Context> contex1;
30633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::GLES2Context> contex2;
30643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Surface> surface1;
30663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Surface> surface2;
30673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Create contexts
30693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::CreateContext(m_eglDisplay, m_eglConfig, SharedPtr<GLES2ThreadTest::GLES2Context>(), contex1));
30703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[1]->addOperation(new GLES2ThreadTest::CreateContext(m_eglDisplay, m_eglConfig, contex1, contex2));
30713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Create surfaces
30733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::CreatePBufferSurface(m_eglDisplay, m_eglConfig, 400, 400, surface1));
30743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[1]->addOperation(new GLES2ThreadTest::CreatePBufferSurface(m_eglDisplay, m_eglConfig, 400, 400, surface2));
30753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Make current contexts
30773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::MakeCurrent(*m_threads[0], m_eglDisplay, surface1, contex1));
30783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[1]->addOperation(new GLES2ThreadTest::MakeCurrent(*m_threads[1], m_eglDisplay, surface2, contex2));
30793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Operations to check fence sync support
30803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.useFenceSync)
30813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
30823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::InitGLExtension("GL_OES_EGL_sync"));
30833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::InitGLExtension("GL_OES_EGL_sync"));
30843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
30853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (m_config.resourceType)
30883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
30893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TestConfig::RESOURCETYPE_BUFFER:
30903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addBufferOperations();
30913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
30923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TestConfig::RESOURCETYPE_TEXTURE:
30943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addTextureOperations();
30953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
30963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TestConfig::RESOURCETYPE_IMAGE:
30983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addImageOperations();
30993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
31003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TestConfig::RESOURCETYPE_VERTEX_SHADER:
31023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addShaderOperations(GL_VERTEX_SHADER);
31033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
31043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TestConfig::RESOURCETYPE_FRAGMENT_SHADER:
31063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addShaderOperations(GL_FRAGMENT_SHADER);
31073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
31083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TestConfig::RESOURCETYPE_PROGRAM:
31103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addProgramOperations();
31113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
31123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
31143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(false);
31153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
31163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Relaese contexts
31183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::MakeCurrent(*m_threads[0], m_eglDisplay, SharedPtr<GLES2ThreadTest::Surface>(), SharedPtr<GLES2ThreadTest::GLES2Context>()));
31193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[1]->addOperation(new GLES2ThreadTest::MakeCurrent(*m_threads[0], m_eglDisplay, SharedPtr<GLES2ThreadTest::Surface>(), SharedPtr<GLES2ThreadTest::GLES2Context>()));
31203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Destory context
31223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::DestroyContext(contex1));
31233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[1]->addOperation(new GLES2ThreadTest::DestroyContext(contex2));
31243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Destroy surfaces
31263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::DestroySurface(m_eglDisplay, surface1));
31273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[1]->addOperation(new GLES2ThreadTest::DestroySurface(m_eglDisplay, surface2));
31283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
31293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31303c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2ThreadedSharingTest::addBufferOperations (void)
31313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
31323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Add operations for verify
31333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Shader>	vertexShader;
31343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Shader>	fragmentShader;
31353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Program>	program;
31363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
31383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
31393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* vertexShaderSource =
31403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"attribute highp vec2 a_pos;\n"
31413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"varying mediump vec2 v_pos;\n"
31423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
31433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
31443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tv_pos = a_pos;\n"
31453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_Position = vec4(a_pos, 0.0, 1.0);\n"
31463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n";
31473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* fragmentShaderSource =
31493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"varying mediump vec2 v_pos;\n"
31503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
31513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
31523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_FragColor = vec4(v_pos, 0.5, 1.0);\n"
31533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n";
31543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_VERTEX_SHADER, vertexShader, m_config.useFenceSync, m_config.serverSync));
31563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(vertexShader, vertexShaderSource, m_config.useFenceSync, m_config.serverSync));
31573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(vertexShader, m_config.useFenceSync, m_config.serverSync));
31583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_FRAGMENT_SHADER, fragmentShader, m_config.useFenceSync, m_config.serverSync));
31603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(fragmentShader, fragmentShaderSource, m_config.useFenceSync, m_config.serverSync));
31613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(fragmentShader, m_config.useFenceSync, m_config.serverSync));
31623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateProgram(program, m_config.useFenceSync, m_config.serverSync));
31643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, fragmentShader, m_config.useFenceSync, m_config.serverSync));
31653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, vertexShader, m_config.useFenceSync, m_config.serverSync));
31663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::LinkProgram(program, m_config.useFenceSync, m_config.serverSync));
31683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
31693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Buffer> buffer;
31713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::CreateBuffer(buffer, m_config.useFenceSync, m_config.serverSync));
31733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.define)
31753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
31763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.modify || m_config.render)
31773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::BufferData(buffer, GL_ARRAY_BUFFER, 1024, GL_DYNAMIC_DRAW, m_config.useFenceSync, m_config.serverSync));
31783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
31793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::BufferData(buffer, GL_ARRAY_BUFFER, 1024, GL_DYNAMIC_DRAW, m_config.useFenceSync, m_config.serverSync));
31803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
31813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify)
31833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
31843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
31853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::BufferSubData(buffer, GL_ARRAY_BUFFER, 17, 17, m_config.useFenceSync, m_config.serverSync));
31863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
31873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::BufferSubData(buffer, GL_ARRAY_BUFFER, 17, 17, m_config.useFenceSync, m_config.serverSync));
31883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
31893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
31913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
31923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::RenderBuffer(program, buffer, m_config.useFenceSync, m_config.serverSync));
31933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::RenderBuffer(program, buffer, m_config.useFenceSync, m_config.serverSync));
31943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<tcu::ThreadUtil::DataBlock> pixels1;
31963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<tcu::ThreadUtil::DataBlock> pixels2;
31973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, pixels1, m_config.useFenceSync, m_config.serverSync));
31993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::ReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, pixels2, m_config.useFenceSync, m_config.serverSync));
32003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new tcu::ThreadUtil::CompareData(pixels1, pixels2));
32023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
32033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify || m_config.render)
32053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteBuffer(buffer, m_config.useFenceSync, m_config.serverSync));
32063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
32073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::DeleteBuffer(buffer, m_config.useFenceSync, m_config.serverSync));
32083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
32103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
32113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(vertexShader, m_config.useFenceSync, m_config.serverSync));
32123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(fragmentShader, m_config.useFenceSync, m_config.serverSync));
32133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteProgram(program, m_config.useFenceSync, m_config.serverSync));
32143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
32153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
32163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32173c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2ThreadedSharingTest::addTextureOperations (void)
32183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
32193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Add operations for verify
32203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Shader>	vertexShader;
32213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Shader>	fragmentShader;
32223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Program>	program;
32233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
32253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
32263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* vertexShaderSource =
32273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"attribute highp vec2 a_pos;\n"
32283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"varying mediump vec2 v_pos;\n"
32293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
32303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
32313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tv_pos = a_pos;\n"
32323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_Position = vec4(a_pos, 0.0, 1.0);\n"
32333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n";
32343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* fragmentShaderSource =
32363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"varying mediump vec2 v_pos;\n"
32373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"uniform sampler2D u_sampler;\n"
32383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
32393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
32403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_FragColor = texture2D(u_sampler, v_pos);\n"
32413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n";
32423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_VERTEX_SHADER, vertexShader, m_config.useFenceSync, m_config.serverSync));
32443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(vertexShader, vertexShaderSource, m_config.useFenceSync, m_config.serverSync));
32453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(vertexShader, m_config.useFenceSync, m_config.serverSync));
32463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_FRAGMENT_SHADER, fragmentShader, m_config.useFenceSync, m_config.serverSync));
32483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(fragmentShader, fragmentShaderSource, m_config.useFenceSync, m_config.serverSync));
32493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(fragmentShader, m_config.useFenceSync, m_config.serverSync));
32503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateProgram(program, m_config.useFenceSync, m_config.serverSync));
32523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, fragmentShader, m_config.useFenceSync, m_config.serverSync));
32533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, vertexShader, m_config.useFenceSync, m_config.serverSync));
32543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::LinkProgram(program, m_config.useFenceSync, m_config.serverSync));
32563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
32573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Texture> texture;
32593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::CreateTexture(texture, m_config.useFenceSync, m_config.serverSync));
32613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.define == 1)
32633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
32643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.modify || m_config.render)
32653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::TexImage2D(texture, 0, GL_RGBA, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
32663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
32673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::TexImage2D(texture, 0, GL_RGBA, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
32683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
32693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.define == 2)
32713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
32723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.modify || m_config.render)
32733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::CopyTexImage2D(texture, 0, GL_RGBA, 17, 17, 256, 256, 0, m_config.useFenceSync, m_config.serverSync));
32743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
32753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::CopyTexImage2D(texture, 0, GL_RGBA, 17, 17, 256, 256, 0, m_config.useFenceSync, m_config.serverSync));
32763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
32773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify == 1)
32793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
32803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
32813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::TexSubImage2D(texture, 0, 17, 17, 29, 29, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
32823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
32833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::TexSubImage2D(texture, 0, 17, 17, 29, 29, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
32843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
32853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify == 2)
32873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
32883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
32893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::CopyTexSubImage2D(texture, 0, 7, 7, 17, 17, 29, 29, m_config.useFenceSync, m_config.serverSync));
32903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
32913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::CopyTexSubImage2D(texture, 0, 7, 7, 17, 17, 29, 29, m_config.useFenceSync, m_config.serverSync));
32923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
32933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
32953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
32963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<tcu::ThreadUtil::DataBlock> pixels1;
32973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<tcu::ThreadUtil::DataBlock> pixels2;
32983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::RenderTexture(program, texture, m_config.useFenceSync, m_config.serverSync));
33003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::RenderTexture(program, texture, m_config.useFenceSync, m_config.serverSync));
33013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, pixels1, m_config.useFenceSync, m_config.serverSync));
33033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::ReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, pixels2, m_config.useFenceSync, m_config.serverSync));
33043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new tcu::ThreadUtil::CompareData(pixels1, pixels2));
33063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
33073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify || m_config.render)
33093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteTexture(texture, m_config.useFenceSync, m_config.serverSync));
33103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
33113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::DeleteTexture(texture, m_config.useFenceSync, m_config.serverSync));
33123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
33143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
33153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(vertexShader, m_config.useFenceSync, m_config.serverSync));
33163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(fragmentShader, m_config.useFenceSync, m_config.serverSync));
33173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteProgram(program, m_config.useFenceSync, m_config.serverSync));
33183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
33193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
33203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33213c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2ThreadedSharingTest::addImageOperations (void)
33223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
33233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Add operations for verify
33243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Shader>	vertexShader;
33253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Shader>	fragmentShader;
33263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Program>	program;
33273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::InitGLExtension("GL_OES_EGL_image"));
33293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[1]->addOperation(new GLES2ThreadTest::InitGLExtension("GL_OES_EGL_image"));
33303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
33323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
33333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* vertexShaderSource =
33343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"attribute highp vec2 a_pos;\n"
33353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"varying mediump vec2 v_pos;\n"
33363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
33373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
33383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tv_pos = a_pos;\n"
33393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_Position = vec4(a_pos, 0.0, 1.0);\n"
33403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n";
33413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* fragmentShaderSource =
33433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"varying mediump vec2 v_pos;\n"
33443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"uniform sampler2D u_sampler;\n"
33453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
33463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
33473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_FragColor = texture2D(u_sampler, v_pos);\n"
33483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n";
33493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_VERTEX_SHADER, vertexShader, m_config.useFenceSync, m_config.serverSync));
33513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(vertexShader, vertexShaderSource, m_config.useFenceSync, m_config.serverSync));
33523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(vertexShader, m_config.useFenceSync, m_config.serverSync));
33533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_FRAGMENT_SHADER, fragmentShader, m_config.useFenceSync, m_config.serverSync));
33553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(fragmentShader, fragmentShaderSource, m_config.useFenceSync, m_config.serverSync));
33563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(fragmentShader, m_config.useFenceSync, m_config.serverSync));
33573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateProgram(program, m_config.useFenceSync, m_config.serverSync));
33593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, fragmentShader, m_config.useFenceSync, m_config.serverSync));
33603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, vertexShader, m_config.useFenceSync, m_config.serverSync));
33613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::LinkProgram(program, m_config.useFenceSync, m_config.serverSync));
33633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
33643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Texture>		sourceTexture;
33663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Texture>		texture;
33673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::EGLImage>	image;
33683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::CreateTexture(sourceTexture, m_config.useFenceSync, m_config.serverSync));
33703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::TexImage2D(sourceTexture, 0, GL_RGBA, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
33713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.define == 1)
33733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
33743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.modify || m_config.render)
33753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::CreateImageFromTexture(image, sourceTexture, m_config.useFenceSync, m_config.serverSync));
33763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
33773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::CreateImageFromTexture(image, sourceTexture, m_config.useFenceSync, m_config.serverSync));
33783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
33793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.define == 2)
33813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
33823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateImageFromTexture(image, sourceTexture, m_config.useFenceSync, m_config.serverSync));
33833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateTexture(texture, m_config.useFenceSync, m_config.serverSync));
33843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.modify || m_config.render)
33863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::DefineTextureFromImage(texture, image, m_config.useFenceSync, m_config.serverSync));
33873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
33883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::DefineTextureFromImage(texture, image, m_config.useFenceSync, m_config.serverSync));
33893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
33903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::DeleteTexture(sourceTexture, m_config.useFenceSync, m_config.serverSync));
33923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify == 1)
33943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
33953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(m_config.define != 1);
33963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
33983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::TexSubImage2D(texture, 0, 17, 17, 29, 29, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
33993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
34003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::TexSubImage2D(texture, 0, 17, 17, 29, 29, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
34013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
34023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify == 2)
34043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
34053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(m_config.define != 1);
34063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
34083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::CopyTexSubImage2D(texture, 0, 7, 7, 17, 17, 29, 29, m_config.useFenceSync, m_config.serverSync));
34093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
34103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::CopyTexSubImage2D(texture, 0, 7, 7, 17, 17, 29, 29, m_config.useFenceSync, m_config.serverSync));
34113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
34123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify == 3)
34143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
34153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(m_config.define != 1);
34163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
34183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::TexImage2D(texture, 0, GL_RGBA, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
34193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
34203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::TexImage2D(texture, 0, GL_RGBA, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
34213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
34223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify == 4)
34243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
34253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(m_config.define != 1);
34263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
34283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::CopyTexImage2D(texture, 0, GL_RGBA, 7, 7, 256, 256, 0, m_config.useFenceSync, m_config.serverSync));
34293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
34303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::CopyTexImage2D(texture, 0, GL_RGBA, 7, 7, 256, 256, 0, m_config.useFenceSync, m_config.serverSync));
34313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
34323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
34343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
34353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(m_config.define != 1);
34363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<tcu::ThreadUtil::DataBlock> pixels1;
34383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<tcu::ThreadUtil::DataBlock> pixels2;
34393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::RenderTexture(program, texture, m_config.useFenceSync, m_config.serverSync));
34413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::RenderTexture(program, texture, m_config.useFenceSync, m_config.serverSync));
34423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, pixels1, m_config.useFenceSync, m_config.serverSync));
34443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::ReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, pixels2, m_config.useFenceSync, m_config.serverSync));
34453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new tcu::ThreadUtil::CompareData(pixels1, pixels2));
34473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
34483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (texture)
34503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
34513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.modify || m_config.render)
34523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::DeleteTexture(texture, m_config.useFenceSync, m_config.serverSync));
34533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
34543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::DeleteTexture(texture, m_config.useFenceSync, m_config.serverSync));
34553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
34563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify || m_config.render)
34583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DestroyImage(image, m_config.useFenceSync, m_config.serverSync));
34593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
34603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::DestroyImage(image, m_config.useFenceSync, m_config.serverSync));
34613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
34633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
34643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(vertexShader, m_config.useFenceSync, m_config.serverSync));
34653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(fragmentShader, m_config.useFenceSync, m_config.serverSync));
34663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteProgram(program, m_config.useFenceSync, m_config.serverSync));
34673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
34683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
34693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34703c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2ThreadedSharingTest::addShaderOperations (GLenum type)
34713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
34723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Shader> shader;
34733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(type, shader, m_config.useFenceSync, m_config.serverSync));
34753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.define)
34773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
34783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* vertexShaderSource =
34793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"attribute mediump vec4 a_pos;\n"
34803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
34813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
34823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_Position = a_pos;\n"
34833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}";
34843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* fragmentShaderSource =
34863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
34873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
34883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
34893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}";
34903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.modify || m_config.render)
34923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(shader, (type == GL_VERTEX_SHADER ? vertexShaderSource : fragmentShaderSource), m_config.useFenceSync, m_config.serverSync));
34933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
34943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::ShaderSource(shader, (type == GL_VERTEX_SHADER ? vertexShaderSource : fragmentShaderSource), m_config.useFenceSync, m_config.serverSync));
34953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
34963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify)
34983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
34993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
35003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(shader, m_config.useFenceSync, m_config.serverSync));
35013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
35023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::ShaderCompile(shader, m_config.useFenceSync, m_config.serverSync));
35033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
35043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(!m_config.render);
35063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify || m_config.render)
35083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(shader, m_config.useFenceSync, m_config.serverSync));
35093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
35103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::DeleteShader(shader, m_config.useFenceSync, m_config.serverSync));
35113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
35123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35133c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2ThreadedSharingTest::addProgramOperations (void)
35143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
35153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Add operations for verify
35163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Shader>	vertexShader;
35173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Shader>	fragmentShader;
35183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.define)
35203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
35213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* vertexShaderSource =
35223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"attribute highp vec2 a_pos;\n"
35233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"varying mediump vec2 v_pos;\n"
35243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
35253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
35263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tv_pos = a_pos;\n"
35273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_Position = vec4(a_pos, 0.0, 1.0);\n"
35283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n";
35293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* fragmentShaderSource =
35313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"varying mediump vec2 v_pos;\n"
35323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
35333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
35343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_FragColor = vec4(v_pos, 0.5, 1.0);\n"
35353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n";
35363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_VERTEX_SHADER, vertexShader, m_config.useFenceSync, m_config.serverSync));
35383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(vertexShader, vertexShaderSource, m_config.useFenceSync, m_config.serverSync));
35393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(vertexShader, m_config.useFenceSync, m_config.serverSync));
35403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_FRAGMENT_SHADER, fragmentShader, m_config.useFenceSync, m_config.serverSync));
35423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(fragmentShader, fragmentShaderSource, m_config.useFenceSync, m_config.serverSync));
35433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(fragmentShader, m_config.useFenceSync, m_config.serverSync));
35443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
35453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Program> program;
35473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::CreateProgram(program, m_config.useFenceSync, m_config.serverSync));
35493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.define)
35513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
35523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Attach shaders
35533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.modify || m_config.render)
35543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
35553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, vertexShader, m_config.useFenceSync, m_config.serverSync));
35563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, fragmentShader, m_config.useFenceSync, m_config.serverSync));
35573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
35583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
35593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
35603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::AttachShader(program, vertexShader, m_config.useFenceSync, m_config.serverSync));
35613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::AttachShader(program, fragmentShader, m_config.useFenceSync, m_config.serverSync));
35623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
35633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
35643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify == 1)
35663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
35673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Link program
35683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
35693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::LinkProgram(program, m_config.useFenceSync, m_config.serverSync));
35703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
35713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::LinkProgram(program, m_config.useFenceSync, m_config.serverSync));
35723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
35733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify == 2)
35753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
35763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Link program
35773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
35783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
35793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::DetachShader(program, GL_VERTEX_SHADER, m_config.useFenceSync, m_config.serverSync));
35803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::DetachShader(program, GL_FRAGMENT_SHADER, m_config.useFenceSync, m_config.serverSync));
35813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
35823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
35833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
35843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::DetachShader(program, GL_VERTEX_SHADER, m_config.useFenceSync, m_config.serverSync));
35853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::DetachShader(program, GL_FRAGMENT_SHADER, m_config.useFenceSync, m_config.serverSync));
35863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
35873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
35883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
35903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
35913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(false);
35923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
35933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify || m_config.render)
35953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteProgram(program, m_config.useFenceSync, m_config.serverSync));
35963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
35973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::DeleteProgram(program, m_config.useFenceSync, m_config.serverSync));
35983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
36003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
36013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(vertexShader, m_config.useFenceSync, m_config.serverSync));
36023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(fragmentShader, m_config.useFenceSync, m_config.serverSync));
36033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
36043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
36053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36063c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2ThreadedSharingTest::deinit (void)
36073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
36083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
3609fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi	{
36103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		delete m_threads[threadNdx];
3611fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi		m_threads[threadNdx] = DE_NULL;
3612fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi	}
36133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads.clear();
36158e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos
36168e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos	if (m_eglDisplay != EGL_NO_DISPLAY)
36178e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos	{
36188e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos		m_eglTestCtx.getLibrary().terminate(m_eglDisplay);
36198e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos		m_eglDisplay = EGL_NO_DISPLAY;
36208e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos	}
36213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TCU_CHECK(!m_requiresRestart);
36233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
36243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36253c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytcu::TestCase::IterateResult GLES2ThreadedSharingTest::iterate (void)
36263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
36273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!m_threadsStarted)
36283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
36293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_beginTimeUs = deGetMicroseconds();
36303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Execute threads
36323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
36333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->exec();
36343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threadsStarted = true;
36363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threadsRunning = true;
36373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
36383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_threadsRunning)
36403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
36413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Wait threads to finish
36423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int readyThreads = 0;
36433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
36443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
36453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (m_threads[threadNdx]->getStatus() != tcu::ThreadUtil::Thread::THREADSTATUS_RUNNING)
36463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				readyThreads++;
36473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
36483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (readyThreads == (int)m_threads.size())
36503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
36513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
36523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_threads[threadNdx]->join();
36533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_executionReady	= true;
36553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_requiresRestart	= false;
36563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
36573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (deGetMicroseconds() - m_beginTimeUs > m_timeOutUs)
36593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
36603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
36613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
36623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (m_threads[threadNdx]->getStatus() != tcu::ThreadUtil::Thread::THREADSTATUS_RUNNING)
36633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					m_threads[threadNdx]->join();
36643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
36653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_executionReady	= true;
36663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_requiresRestart	= true;
36673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_timeOutTimeUs		= deGetMicroseconds();
36683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
36693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
36703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
36713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			deSleep(m_sleepTimeMs);
36723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
36733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
36743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_executionReady)
36763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
36773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		std::vector<int> indices(m_threads.size(), 0);
3678fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
3679fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi		if (m_timeOutTimeUs != 0)
3680fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			m_log << tcu::TestLog::Message << "Execution timeout limit reached. Trying to get per thread logs. This is potentially dangerous." << tcu::TestLog::EndMessage;
3681fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
36823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		while (true)
36833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3684653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos			int			firstThread = -1;
36853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// Find first thread with messages
36873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
36883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
36893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (m_threads[threadNdx]->getMessageCount() > indices[threadNdx])
36903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
36913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					firstThread = threadNdx;
36923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
36933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
36943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
36953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// No more messages
36973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (firstThread == -1)
36983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
36993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
37013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
37023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				// No more messages in this thread
37033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (m_threads[threadNdx]->getMessageCount() <= indices[threadNdx])
37043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					continue;
37053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if ((m_threads[threadNdx]->getMessage(indices[threadNdx]).getTime() - m_beginTimeUs) < (m_threads[firstThread]->getMessage(indices[firstThread]).getTime() - m_beginTimeUs))
37073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					firstThread = threadNdx;
37083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
37093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3710fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			tcu::ThreadUtil::Message message = m_threads[firstThread]->getMessage(indices[firstThread]);
3711fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
3712fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			m_log << tcu::TestLog::Message << "[" << (message.getTime() - m_beginTimeUs) << "] (" << firstThread << ") " << message.getMessage() << tcu::TestLog::EndMessage;
37133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			indices[firstThread]++;
37143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
37153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3716fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi		if (m_timeOutTimeUs != 0)
3717fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			m_log << tcu::TestLog::Message << "[" << (m_timeOutTimeUs - m_beginTimeUs) << "] Execution timeout limit reached" << tcu::TestLog::EndMessage;
3718fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
37193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool isOk = true;
37203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool notSupported = false;
37213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
37233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3724fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			const tcu::ThreadUtil::Thread::ThreadStatus status = m_threads[threadNdx]->getStatus();
3725fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
3726fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			switch (status)
37273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
3728fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_FAILED:
3729fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_INIT_FAILED:
3730fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_RUNNING:
3731fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					isOk = false;
3732fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					break;
37333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3734fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_NOT_SUPPORTED:
3735fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					notSupported = true;
3736fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					break;
3737fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
3738fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_READY:
3739fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					// Nothing
3740fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					break;
3741fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
3742fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				default:
3743fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					DE_ASSERT(false);
3744fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					isOk = false;
3745fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			};
37463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
37473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (notSupported)
37493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			throw tcu::NotSupportedError("Thread threw tcu::NotSupportedError", "", __FILE__, __LINE__);
37503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (isOk)
37523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
37533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
37543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
37553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return STOP;
37573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
37583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return CONTINUE;
37603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
37613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37623c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void addSimpleTests (EglTestContext& ctx, tcu::TestCaseGroup* group, bool useSync, bool serverSync)
37633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
37643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
37653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* bufferTests = new TestCaseGroup(ctx, "buffers", "Buffer management tests");
37663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
37683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
37693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_BUFFER;
37713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
37723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
37733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 0;
37743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
37753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
37763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bufferTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "gen_delete", "Generate and delete buffer"));
37773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
37783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
37803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
37813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_BUFFER;
37833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
37843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
37853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
37863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
37873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
37883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bufferTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "bufferdata", "Generate, set data and delete buffer"));
37893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
37903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
37923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
37933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_BUFFER;
37953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
37963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
37973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
37983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
37993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
38003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bufferTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "buffersubdata", "Generate, set data, update data and delete buffer"));
38013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
38023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
38043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
38053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_BUFFER;
38073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
38083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
38093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
38103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
38113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
38123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bufferTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "bufferdata_render", "Generate, set data, render and delete buffer"));
38133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
38143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
38163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
38173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_BUFFER;
38193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
38203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
38213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
38223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
38233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
38243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bufferTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "buffersubdata_render", "Generate, set data, update data, render and delete buffer"));
38253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
38263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(bufferTests);
38283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
38293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
38313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* textureTests = new TestCaseGroup(ctx, "textures", "Texture management tests");
38323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
38343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
38353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
38373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
38383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
38393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 0;
38403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
38413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
38423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "gen_delete", "Generate and delete texture"));
38433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
38443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
38463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
38473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
38493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
38503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
38513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
38523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
38533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
38543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d", "Generate, set data and delete texture"));
38553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
38563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
38583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
38593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
38613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
38623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
38633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
38643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
38653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
38663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d_texsubimage2d", "Generate, set data, update data and delete texture"));
38673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
38683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
38703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
38713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
38733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
38743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
38753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
38763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 2;
38773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
38783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d_copytexsubimage2d", "Generate, set data, update data and delete texture"));
38793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
38803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
38823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
38833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
38853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
38863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
38873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
38883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
38893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
38903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d_render", "Generate, set data, render and delete texture"));
38913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
38923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
38943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
38953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
38973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
38983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
38993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
39003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
39013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
39023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d_texsubimage2d_render", "Generate, set data, update data, render and delete texture"));
39033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
39043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
39063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
39073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
39093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
39103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
39113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
39123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 2;
39133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
39143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d_copytexsubimage2d_render", "Generate, set data, update data, render and delete texture"));
39153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
39163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
39183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
39193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
39213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
39223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
39233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
39243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
39253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
39263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d", "Generate, set data and delete texture"));
39273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
39283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
39303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
39313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
39333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
39343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
39353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
39363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
39373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
39383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d_texsubimage2d", "Generate, set data, update data and delete texture"));
39393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
39403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
39423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
39433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
39453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
39463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
39473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
39483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 2;
39493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
39503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d_copytexsubimage2d", "Generate, set data, update data and delete texture"));
39513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
39523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
39543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
39553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
39573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
39583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
39593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
39603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
39613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
39623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d_render", "Generate, set data, render and delete texture"));
39633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
39643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
39663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
39673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
39693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
39703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
39713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
39723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
39733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
39743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d_texsubimage2d_render", "Generate, set data, update data, render and delete texture"));
39753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
39763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
39783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
39793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
39813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
39823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
39833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
39843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 2;
39853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
39863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d_copytexsubimage2d_render", "Generate, set data, update data, render and delete texture"));
39873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
39883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(textureTests);
39903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
39913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
39933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* shaderTests = new TestCaseGroup(ctx, "shaders", "Shader management tests");
39943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
39963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
39973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_VERTEX_SHADER;
39993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
40003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
40013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 0;
40023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
40033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
40043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "vtx_create_destroy", "Create and delete shader"));
40053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
40063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
40083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
40093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_VERTEX_SHADER;
40113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
40123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
40133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
40143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
40153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
40163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "vtx_shadersource", "Create, set source and delete shader"));
40173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
40183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
40203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
40213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_VERTEX_SHADER;
40233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
40243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
40253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
40263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
40273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
40283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "vtx_compile", "Create, set source, compile and delete shader"));
40293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
40303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
40323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
40333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_FRAGMENT_SHADER;
40353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
40363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
40373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 0;
40383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
40393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
40403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "frag_create_destroy", "Create and delete shader"));
40413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
40423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
40443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
40453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_FRAGMENT_SHADER;
40473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
40483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
40493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
40503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
40513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
40523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "frag_shadersource", "Create, set source and delete shader"));
40533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
40543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
40563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
40573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_FRAGMENT_SHADER;
40593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
40603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
40613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
40623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
40633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
40643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "frag_compile", "Create, set source, compile and delete shader"));
40653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
40663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(shaderTests);
40683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
40693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
40713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* programTests = new TestCaseGroup(ctx, "programs", "Program management tests");
40723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
40743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
40753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_PROGRAM;
40773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
40783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
40793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 0;
40803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
40813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
40823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			programTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "create_destroy", "Create and delete program"));
40833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
40843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
40863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
40873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_PROGRAM;
40893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
40903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
40913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
40923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
40933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
40943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			programTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "attach", "Create, attach shaders and delete program"));
40953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
40963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
40983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
40993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_PROGRAM;
41013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
41023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
41033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
41043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
41053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
41063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			programTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "link", "Create, attach shaders, link and delete program"));
41073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
41083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(programTests);
41103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
41113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
41133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* imageTests = new TestCaseGroup(ctx, "images", "Image management tests");
41143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* textureSourceTests = new TestCaseGroup(ctx, "texture_source", "Image management tests with texture source.");
41163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
41173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
41183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
41203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
41213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
41223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
41233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
41243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
41253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "create_destroy", "Create and destroy EGLImage."));
41263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
41273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
41293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
41303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
41323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
41333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
41343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
41353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
41363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
41373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "create_texture", "Create texture from image."));
41383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
41393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
41413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
41423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
41443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
41453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
41463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
41473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
41483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
41493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "texsubimage2d", "Modify texture created from image with glTexSubImage2D."));
41503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
41513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
41533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
41543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
41563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
41573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
41583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
41593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 2;
41603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
41613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copytexsubimage2d", "Modify texture created from image with glCopyTexSubImage2D."));
41623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
41633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
41653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
41663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
41683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
41693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
41703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
41713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 3;
41723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
41733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d", "Modify texture created from image with glTexImage2D."));
41743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
41753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
41773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
41783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
41803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
41813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
41823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
41833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 4;
41843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
41853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d", "Modify texture created from image with glCopyTexImage2D."));
41863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
41873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
41893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
41903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
41923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
41933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
41943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
41953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
41963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
41973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "create_texture_render", "Create texture from image and render."));
41983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
41993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
42013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
42023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
42043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
42053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
42063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
42073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
42083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
42093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "texsubimage2d_render", "Modify texture created from image and render."));
42103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
42113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
42133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
42143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
42163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
42173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
42183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
42193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 2;
42203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
42213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copytexsubimage2d_render", "Modify texture created from image and render."));
42223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
42233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
42253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
42263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
42283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
42293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
42303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
42313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 3;
42323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
42333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d_render", "Modify texture created from image and render."));
42343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
42353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
42373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
42383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
42403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
42413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
42423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
42433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 4;
42443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
42453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d_render", "Modify texture created from image and render."));
42463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
42473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		imageTests->addChild(textureSourceTests);
42493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(imageTests);
42513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
42523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
42543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42553c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void addRandomTests (EglTestContext& ctx, tcu::TestCaseGroup* group, bool useSync, bool serverSync)
42563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
42573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
42583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* textureTests = new TestCaseGroup(ctx, "textures", "Texture management tests");
42593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
42613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* genTextureTests = new TestCaseGroup(ctx, "gen_delete", "Texture gen and delete tests");
42623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int textureTestNdx = 0; textureTestNdx < 20; textureTestNdx++)
42643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
42653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
42663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
42673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
42683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + textureTestNdx % 5;
42693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 30 + textureTestNdx;
42703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]				= 1.0f;
42723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.25f;
42743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]	= 0.75f;
42753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.5f;
42773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]	= 0.5f;
42783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(textureTestNdx);
42803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				genTextureTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
42813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
42823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(genTextureTests);
42843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
42853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
42873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texImage2DTests = new TestCaseGroup(ctx, "teximage2d", "Texture gen, delete and teximage2D tests");
42883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int textureTestNdx = 0; textureTestNdx < 20; textureTestNdx++)
42903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
42913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
42923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
42933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
42943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + textureTestNdx % 5;
42953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 40 + textureTestNdx;
42963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]				= 1.0f;
42983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.10f;
43003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]	= 0.10f;
43013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]		= 0.80f;
43023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.30f;
43043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]	= 0.40f;
43053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]		= 0.30f;
43063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]		= 0.40f;
43083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]		= 0.40f;
43093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]			= 0.20f;
43103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(textureTestNdx);
43123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
43133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
43143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(texImage2DTests);
43163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
43173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
43193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texSubImage2DTests = new TestCaseGroup(ctx, "texsubimage2d", "Texture gen, delete, teximage2D and texsubimage2d tests");
43203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int textureTestNdx = 0; textureTestNdx < 20; textureTestNdx++)
43223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
43233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
43243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
43253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
43263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + textureTestNdx % 5;
43273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 50 + textureTestNdx;
43283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]				= 1.0f;
43303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.05f;
43323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]	= 0.10f;
43333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]		= 0.80f;
43343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXSUBIMAGE2D]		= 0.05f;
43353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.30f;
43373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]	= 0.40f;
43383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]		= 0.20f;
43393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXSUBIMAGE2D]	= 0.10f;
43403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]		= 0.20f;
43423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]		= 0.20f;
43433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]			= 0.10f;
43443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXSUBIMAGE2D]			= 0.50f;
43453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.20f;
43473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]		= 0.25f;
43483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]			= 0.25f;
43493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_TEXSUBIMAGE2D]		= 0.30f;
43503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(textureTestNdx);
43523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
43533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
43543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(texSubImage2DTests);
43563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
43573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
43593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* copyTexImage2DTests = new TestCaseGroup(ctx, "copyteximage2d", "Texture gen, delete and copyteximage2d tests");
43603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int textureTestNdx = 0; textureTestNdx < 20; textureTestNdx++)
43623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
43633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
43643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
43653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
43663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + textureTestNdx % 5;
43673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 40 + textureTestNdx;
43683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]				= 1.0f;
43703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.10f;
43723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]	= 0.10f;
43733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_COPYTEXIMAGE2D]	= 0.80f;
43743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.30f;
43763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]	= 0.40f;
43773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_COPYTEXIMAGE2D]	= 0.30f;
43783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.40f;
43803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]	= 0.40f;
43813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_COPYTEXIMAGE2D]	= 0.20f;
43823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(textureTestNdx);
43853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				copyTexImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
43863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
43873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(copyTexImage2DTests);
43893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
43903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
43923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* copyTexSubImage2DTests = new TestCaseGroup(ctx, "copytexsubimage2d", "Texture gen, delete, teximage2D and copytexsubimage2d tests");
43933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int textureTestNdx = 0; textureTestNdx < 20; textureTestNdx++)
43953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
43963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
43973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
43983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
43993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + textureTestNdx % 5;
44003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 50 + textureTestNdx;
44013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]					= 1.0f;
44033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]		= 0.05f;
44053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]		= 0.10f;
44063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]			= 0.80f;
44073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_COPYTEXSUBIMAGE2D]		= 0.05f;
44083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]		= 0.30f;
44103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]		= 0.40f;
44113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]			= 0.20f;
44123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_COPYTEXSUBIMAGE2D]	= 0.10f;
44133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]			= 0.20f;
44153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]			= 0.20f;
44163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]				= 0.10f;
44173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_COPYTEXSUBIMAGE2D]			= 0.50f;
44183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.20f;
44203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]		= 0.25f;
44213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]			= 0.25f;
44223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_COPYTEXSUBIMAGE2D]	= 0.30f;
44233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(textureTestNdx);
44263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				copyTexSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
44273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
44283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(copyTexSubImage2DTests);
44303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
44313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(textureTests);
44333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* bufferTests = new TestCaseGroup(ctx, "buffers", "Buffer management tests");
44353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
44373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* genBufferTests = new TestCaseGroup(ctx, "gen_delete", "Buffer gen and delete tests");
44383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int bufferTestNdx = 0; bufferTestNdx < 20; bufferTestNdx++)
44403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
44413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
44423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
44433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
44443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + bufferTestNdx % 5;
44453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 30 + bufferTestNdx;
44463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_BUFFER]				= 1.0f;
44483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_DESTROY_BUFFER]		= 0.25f;
44503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_CREATE_BUFFER]		= 0.75f;
44513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_DESTROY_BUFFER]	= 0.5f;
44533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_CREATE_BUFFER]		= 0.5f;
44543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(bufferTestNdx);
44563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				genBufferTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
44573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
44583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bufferTests->addChild(genBufferTests);
44603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
44613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
44633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texImage2DTests = new TestCaseGroup(ctx, "bufferdata", "Buffer gen, delete and bufferdata tests");
44643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int bufferTestNdx = 0; bufferTestNdx < 20; bufferTestNdx++)
44663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
44673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
44683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
44693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
44703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + bufferTestNdx % 5;
44713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 40 + bufferTestNdx;
44723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_BUFFER]				= 1.0f;
44743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_DESTROY_BUFFER]		= 0.10f;
44763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_CREATE_BUFFER]		= 0.10f;
44773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_BUFFER_DATA]		= 0.80f;
44783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_DESTROY_BUFFER]	= 0.30f;
44803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_CREATE_BUFFER]		= 0.40f;
44813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_BUFFER_DATA]		= 0.30f;
44823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_DESTROY_BUFFER]		= 0.40f;
44843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_CREATE_BUFFER]		= 0.40f;
44853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_BUFFER_DATA]			= 0.20f;
44863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(bufferTestNdx);
44883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
44893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
44903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bufferTests->addChild(texImage2DTests);
44923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
44933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
44953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texSubImage2DTests = new TestCaseGroup(ctx, "buffersubdata", "Buffer gen, delete, bufferdata and bufferdata tests");
44963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int bufferTestNdx = 0; bufferTestNdx < 20; bufferTestNdx++)
44983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
44993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
45003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
45013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
45023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + bufferTestNdx % 5;
45033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 50 + bufferTestNdx;
45043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_BUFFER]				= 1.0f;
45063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_DESTROY_BUFFER]		= 0.05f;
45083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_CREATE_BUFFER]		= 0.10f;
45093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_BUFFER_DATA]		= 0.80f;
45103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_BUFFER_SUBDATA]		= 0.05f;
45113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_DESTROY_BUFFER]	= 0.30f;
45133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_CREATE_BUFFER]		= 0.40f;
45143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_BUFFER_DATA]		= 0.20f;
45153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_BUFFER_SUBDATA]	= 0.10f;
45163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_DESTROY_BUFFER]		= 0.20f;
45183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_CREATE_BUFFER]		= 0.20f;
45193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_BUFFER_DATA]			= 0.10f;
45203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_BUFFER_SUBDATA]		= 0.50f;
45213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_SUBDATA][THREADOPERATIONID_DESTROY_BUFFER]	= 0.20f;
45233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_SUBDATA][THREADOPERATIONID_CREATE_BUFFER]		= 0.25f;
45243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_SUBDATA][THREADOPERATIONID_BUFFER_DATA]		= 0.25f;
45253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_SUBDATA][THREADOPERATIONID_BUFFER_SUBDATA]	= 0.30f;
45263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(bufferTestNdx);
45283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
45293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
45303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bufferTests->addChild(texSubImage2DTests);
45323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
45333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(bufferTests);
45353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* shaderTests = new TestCaseGroup(ctx, "shaders", "Shader management tests");
45373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
45393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* createShaderTests = new TestCaseGroup(ctx, "create_destroy", "Shader create and destroy tests");
45403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int shaderTestNdx = 0; shaderTestNdx < 20; shaderTestNdx++)
45423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
45433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
45443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
45453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
45463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + shaderTestNdx % 5;
45473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 30 + shaderTestNdx;
45483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_VERTEX_SHADER]						= 0.5f;
45503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]						= 0.5f;
45513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_SHADER]				= 0.20f;
45533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.40f;
45543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]		= 0.40f;
45553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_SHADER]			= 0.20f;
45573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.40f;
45583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]	= 0.40f;
45593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_SHADER]					= 0.5f;
45613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.25f;
45623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.25f;
45633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(shaderTestNdx);
45653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				createShaderTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
45663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
45673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTests->addChild(createShaderTests);
45693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
45703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
45723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texImage2DTests = new TestCaseGroup(ctx, "source", "Shader create, destroy and source tests");
45733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int shaderTestNdx = 0; shaderTestNdx < 20; shaderTestNdx++)
45753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
45763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
45773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
45783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
45793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + shaderTestNdx % 5;
45803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 40 + shaderTestNdx;
45813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_VERTEX_SHADER]						= 0.5f;
45833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]						= 0.5f;
45843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_SHADER]				= 0.10f;
45863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.20f;
45873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]		= 0.20f;
45883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_SOURCE]				= 0.50f;
45893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_SHADER]			= 0.10f;
45913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.20f;
45923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]	= 0.20f;
45933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_SOURCE]				= 0.50f;
45943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_SHADER]					= 0.30f;
45963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.30f;
45973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.30f;
45983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_SOURCE]						= 0.10f;
45993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_DESTROY_SHADER]						= 0.20f;
46013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
46023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]				= 0.20f;
46033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_SOURCE]						= 0.40f;
46043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(shaderTestNdx);
46063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
46073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
46083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTests->addChild(texImage2DTests);
46103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
46113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
46133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texSubImage2DTests = new TestCaseGroup(ctx, "compile", "Shader create, destroy, source and compile tests");
46143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int shaderTestNdx = 0; shaderTestNdx < 20; shaderTestNdx++)
46163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
46173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
46183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
46193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
46203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + shaderTestNdx % 5;
46213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 50 + shaderTestNdx;
46223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_VERTEX_SHADER]						= 0.5f;
46243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]						= 0.5f;
46253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_SHADER]				= 0.10f;
46273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.15f;
46283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]		= 0.15f;
46293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_SOURCE]				= 0.50f;
46303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_COMPILE]				= 0.10f;
46313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_SHADER]			= 0.10f;
46333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.15f;
46343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]	= 0.15f;
46353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_SOURCE]				= 0.50f;
46363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_COMPILE]			= 0.10f;
46373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_SHADER]					= 0.30f;
46393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.25f;
46403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.25f;
46413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_SOURCE]						= 0.10f;
46423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_COMPILE]					= 0.10f;
46433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_DESTROY_SHADER]						= 0.10f;
46453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.10f;
46463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]				= 0.10f;
46473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_SOURCE]						= 0.20f;
46483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_COMPILE]						= 0.50f;
46493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_DESTROY_SHADER]					= 0.15f;
46513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.15f;
46523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.15f;
46533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_SHADER_SOURCE]						= 0.30f;
46543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_SHADER_COMPILE]					= 0.30f;
46553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(shaderTestNdx);
46573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
46583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
46593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTests->addChild(texSubImage2DTests);
46613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
46623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(shaderTests);
46643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* programTests = new TestCaseGroup(ctx, "programs", "Program management tests");
46663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
46683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* createProgramTests = new TestCaseGroup(ctx, "create_destroy", "Program create and destroy tests");
46693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int programTestNdx = 0; programTestNdx < 20; programTestNdx++)
46713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
46723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
46733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
46743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
46753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + programTestNdx % 5;
46763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 30 + programTestNdx;
46773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_PROGRAM]				= 1.0f;
46793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM]	= 0.25f;
46813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM]	= 0.75f;
46823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM]	= 0.5f;
46843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM]	= 0.5f;
46853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(programTestNdx);
46873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				createProgramTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
46883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
46893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			programTests->addChild(createProgramTests);
46913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
46923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
46943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texImage2DTests = new TestCaseGroup(ctx, "attach_detach", "Program create, destroy, attach and detach tests");
46953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int programTestNdx = 0; programTestNdx < 20; programTestNdx++)
46973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
46983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
46993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
47003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
47013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + programTestNdx % 5;
47023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 60 + programTestNdx;
47033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_VERTEX_SHADER]						= 0.35f;
47053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]						= 0.35f;
47063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_PROGRAM]								= 0.30f;
47073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_SHADER]				= 0.10f;
47093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.10f;
47103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]		= 0.10f;
47113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_SOURCE]				= 0.30f;
47123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_COMPILE]				= 0.10f;
47133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_PROGRAM]				= 0.10f;
47143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_PROGRAM]				= 0.05f;
47153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_ATTACH_SHADER]				= 0.15f;
47163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_SHADER]			= 0.10f;
47183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.10f;
47193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]	= 0.10f;
47203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_SOURCE]				= 0.30f;
47213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_COMPILE]			= 0.10f;
47223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_PROGRAM]			= 0.10f;
47233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_PROGRAM]			= 0.05f;
47243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_ATTACH_SHADER]				= 0.15f;
47253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_SHADER]					= 0.20f;
47273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
47283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.20f;
47293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_SOURCE]						= 0.10f;
47303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_COMPILE]					= 0.10f;
47313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_PROGRAM]					= 0.15f;
47323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.15f;
47333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_ATTACH_SHADER]						= 0.15f;
47343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_DESTROY_SHADER]						= 0.10f;
47363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.10f;
47373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]				= 0.10f;
47383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_SOURCE]						= 0.20f;
47393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_COMPILE]						= 0.50f;
47403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_PROGRAM]						= 0.10f;
47413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.10f;
47423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_ATTACH_SHADER]						= 0.25f;
47433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_DESTROY_SHADER]					= 0.15f;
47453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.15f;
47463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.15f;
47473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_SHADER_SOURCE]						= 0.30f;
47483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_SHADER_COMPILE]					= 0.30f;
47493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_PROGRAM]					= 0.10f;
47503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.10f;
47513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_ATTACH_SHADER]						= 0.35f;
47523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_DESTROY_SHADER]					= 0.10f;
47543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
47553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.20f;
47563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_SHADER_SOURCE]						= 0.05f;
47573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_SHADER_COMPILE]					= 0.05f;
47583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM]					= 0.15f;
47593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.05f;
47603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_ATTACH_SHADER]						= 0.40f;
47613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_DESTROY_SHADER]					= 0.20f;
47633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
47643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.20f;
47653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_SHADER_SOURCE]					= 0.10f;
47663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_SHADER_COMPILE]					= 0.10f;
47673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM]					= 0.20f;
47683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.15f;
47693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_ATTACH_SHADER]					= 0.10f;
47703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_DESTROY_SHADER]						= 0.20f;
47723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
47733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]				= 0.20f;
47743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_SHADER_SOURCE]						= 0.10f;
47753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_SHADER_COMPILE]						= 0.10f;
47763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_CREATE_PROGRAM]						= 0.15f;
47773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.15f;
47783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_ATTACH_SHADER]						= 0.30f;
47793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(programTestNdx);
47813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
47823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
47833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			programTests->addChild(texImage2DTests);
47853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
47863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
47883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texSubImage2DTests = new TestCaseGroup(ctx, "link", "Program create, destroy, attach and link tests");
47893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int programTestNdx = 0; programTestNdx < 20; programTestNdx++)
47913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
47923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
47933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
47943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
47953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + programTestNdx % 5;
47963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 70 + programTestNdx;
47973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_VERTEX_SHADER]						= 0.35f;
47993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]						= 0.35f;
48003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_PROGRAM]								= 0.30f;
48013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_SHADER]				= 0.10f;
48033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.10f;
48043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]		= 0.10f;
48053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_SOURCE]				= 0.30f;
48063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_COMPILE]				= 0.10f;
48073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_PROGRAM]				= 0.10f;
48083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_PROGRAM]				= 0.05f;
48093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_ATTACH_SHADER]				= 0.15f;
48103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_LINK_PROGRAM]				= 0.10f;
48113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_SHADER]			= 0.10f;
48133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.10f;
48143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]	= 0.10f;
48153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_SOURCE]				= 0.30f;
48163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_COMPILE]			= 0.10f;
48173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_PROGRAM]			= 0.10f;
48183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_PROGRAM]			= 0.05f;
48193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_ATTACH_SHADER]				= 0.15f;
48203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_LINK_PROGRAM]				= 0.10f;
48213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_SHADER]					= 0.20f;
48233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
48243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.20f;
48253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_SOURCE]						= 0.10f;
48263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_COMPILE]					= 0.10f;
48273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_PROGRAM]					= 0.15f;
48283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.15f;
48293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_ATTACH_SHADER]						= 0.15f;
48303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_LINK_PROGRAM]						= 0.10f;
48313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_DESTROY_SHADER]						= 0.10f;
48333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.10f;
48343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]				= 0.10f;
48353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_SOURCE]						= 0.20f;
48363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_COMPILE]						= 0.50f;
48373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_PROGRAM]						= 0.10f;
48383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.10f;
48393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_ATTACH_SHADER]						= 0.25f;
48403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_LINK_PROGRAM]						= 0.20f;
48413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_DESTROY_SHADER]					= 0.15f;
48433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.15f;
48443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.15f;
48453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_SHADER_SOURCE]						= 0.30f;
48463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_SHADER_COMPILE]					= 0.30f;
48473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_PROGRAM]					= 0.10f;
48483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.10f;
48493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_ATTACH_SHADER]						= 0.35f;
48503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_LINK_PROGRAM]						= 0.20f;
48513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_DESTROY_SHADER]					= 0.10f;
48533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
48543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.20f;
48553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_SHADER_SOURCE]						= 0.05f;
48563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_SHADER_COMPILE]					= 0.05f;
48573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM]					= 0.15f;
48583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.05f;
48593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_ATTACH_SHADER]						= 0.40f;
48603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_LINK_PROGRAM]						= 0.05f;
48613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_DESTROY_SHADER]					= 0.20f;
48633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
48643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.20f;
48653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_SHADER_SOURCE]					= 0.10f;
48663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_SHADER_COMPILE]					= 0.10f;
48673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM]					= 0.20f;
48683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.15f;
48693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_ATTACH_SHADER]					= 0.10f;
48703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_LINK_PROGRAM]						= 0.05f;
48713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_DESTROY_SHADER]						= 0.20f;
48733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
48743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]				= 0.20f;
48753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_SHADER_SOURCE]						= 0.10f;
48763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_SHADER_COMPILE]						= 0.10f;
48773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_CREATE_PROGRAM]						= 0.15f;
48783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.15f;
48793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_ATTACH_SHADER]						= 0.30f;
48803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_LINK_PROGRAM]						= 0.30f;
48813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_DESTROY_SHADER]						= 0.20f;
48833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
48843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]				= 0.20f;
48853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_SHADER_SOURCE]						= 0.10f;
48863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_SHADER_COMPILE]						= 0.10f;
48873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM]						= 0.20f;
48883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM]						= 0.15f;
48893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_ATTACH_SHADER]						= 0.10f;
48903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_LINK_PROGRAM]						= 0.05f;
48913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(programTestNdx);
48933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
48943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
48953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			programTests->addChild(texSubImage2DTests);
48973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
48983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(programTests);
49003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* imageTests = new TestCaseGroup(ctx, "images", "Image management tests");
49023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
49043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texImage2DTests = new TestCaseGroup(ctx, "create_destroy", "Image gen, delete and teximage2D tests");
49053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int imageTestNdx = 0; imageTestNdx < 20; imageTestNdx++)
49073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
49083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
49093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
49103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
49113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + imageTestNdx % 5;
49123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 70 + imageTestNdx;
49133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useImages		= true;
49143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]									= 1.0f;
49163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.10f;
49183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.15f;
49193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.40f;
49203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.35f;
49213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]							= 0.30f;
49223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.15f;
49243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.20f;
49253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.40f;
49263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.35f;
49273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]							= 0.15f;
49283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]			= 0.25f;
49303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]				= 0.25f;
49313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]	= 0.40f;
49323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]				= 0.35f;
49333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]					= 0.15f;
49343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.25f;
49363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
49373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.40f;
49383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.35f;
49393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXIMAGE2D]								= 0.15f;
49403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]							= 0.25f;
49423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
49433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]					= 0.40f;
49443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE]								= 0.35f;
49453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]								= 0.15f;
49463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]					= 0.25f;
49483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]					= 0.25f;
49493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.30f;
49503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.15f;
49513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXIMAGE2D]						= 0.15f;
49523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(imageTestNdx);
49543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
49553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
49563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			imageTests->addChild(texImage2DTests);
49583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
49593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
49613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texImage2DTests = new TestCaseGroup(ctx, "teximage2d", "Image gen, delete and teximage2D tests");
49623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int imageTestNdx = 0; imageTestNdx < 20; imageTestNdx++)
49643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
49653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
49663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
49673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
49683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + imageTestNdx % 5;
49693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 70 + imageTestNdx;
49703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useImages		= true;
49713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]									= 1.0f;
49733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.10f;
49753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.15f;
49763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.20f;
49773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.15f;
49783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]							= 0.30f;
49793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.20f;
49803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.15f;
49823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.20f;
49833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.15f;
49843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.15f;
49853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]							= 0.15f;
49863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.15f;
49873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]			= 0.25f;
49893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]				= 0.25f;
49903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]	= 0.25f;
49913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]				= 0.25f;
49923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]					= 0.15f;
49933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]			= 0.15f;
49943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.25f;
49963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
49973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.25f;
49983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.25f;
49993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXIMAGE2D]								= 0.15f;
50003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]						= 0.15f;
50013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]							= 0.25f;
50033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
50043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]					= 0.25f;
50053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE]								= 0.25f;
50063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]								= 0.15f;
50073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXTURE_FROM_IMAGE]						= 0.15f;
50083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]					= 0.25f;
50103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]					= 0.25f;
50113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.25f;
50123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.25f;
50133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXIMAGE2D]						= 0.15f;
50143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]				= 0.15f;
50153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(imageTestNdx);
50173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
50183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
50193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			imageTests->addChild(texImage2DTests);
50213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
50223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
50243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texSubImage2DTests = new TestCaseGroup(ctx, "texsubimage2d", "Image gen, delete, teximage2D and texsubimage2d tests");
50253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int imageTestNdx = 0; imageTestNdx < 20; imageTestNdx++)
50273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
50283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
50293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
50303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
50313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + imageTestNdx % 5;
50323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 70 + imageTestNdx;
50333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useImages		= true;
50343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]									= 1.0f;
50363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.10f;
50383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.15f;
50393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.20f;
50403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.15f;
50413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]							= 0.30f;
50423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.20f;
50433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXSUBIMAGE2D]							= 0.10f;
50443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.15f;
50463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.20f;
50473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.15f;
50483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.15f;
50493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]							= 0.15f;
50503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.15f;
50513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXSUBIMAGE2D]						= 0.10f;
50523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]			= 0.25f;
50543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]				= 0.25f;
50553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]	= 0.25f;
50563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]				= 0.25f;
50573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]					= 0.15f;
50583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]			= 0.15f;
50593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXSUBIMAGE2D]				= 0.10f;
50603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.25f;
50623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
50633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.25f;
50643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.25f;
50653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXIMAGE2D]								= 0.15f;
50663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]						= 0.15f;
50673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXSUBIMAGE2D]							= 0.10f;
50683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]							= 0.25f;
50703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
50713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]					= 0.25f;
50723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE]								= 0.25f;
50733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]								= 0.15f;
50743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXTURE_FROM_IMAGE]						= 0.15f;
50753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXSUBIMAGE2D]								= 0.10f;
50763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]					= 0.25f;
50783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]					= 0.25f;
50793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.25f;
50803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.25f;
50813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXIMAGE2D]						= 0.15f;
50823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]				= 0.15f;
50833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXSUBIMAGE2D]						= 0.10f;
50843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.25f;
50863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
50873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.25f;
50883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE]							= 0.25f;
50893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]								= 0.15f;
50903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_TEXTURE_FROM_IMAGE]						= 0.15f;
50913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_TEXSUBIMAGE2D]							= 0.10f;
50923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(imageTestNdx);
50943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
50953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
50963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			imageTests->addChild(texSubImage2DTests);
50983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
50993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
51013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* copyTexImage2DTests = new TestCaseGroup(ctx, "copyteximage2d", "Image gen, delete and copyteximage2d tests");
51023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int imageTestNdx = 0; imageTestNdx < 20; imageTestNdx++)
51043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
51053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
51063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
51073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
51083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + imageTestNdx % 5;
51093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 70 + imageTestNdx;
51103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useImages		= true;
51113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]									= 1.0f;
51133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.10f;
51153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.15f;
51163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.20f;
51173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.15f;
51183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_COPYTEXIMAGE2D]						= 0.30f;
51193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.20f;
51203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.15f;
51223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.20f;
51233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.15f;
51243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.15f;
51253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_COPYTEXIMAGE2D]						= 0.15f;
51263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.15f;
51273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]			= 0.25f;
51293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]				= 0.25f;
51303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]	= 0.25f;
51313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]				= 0.25f;
51323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_COPYTEXIMAGE2D]				= 0.15f;
51333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]			= 0.15f;
51343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.25f;
51363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
51373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.25f;
51383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.25f;
51393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_COPYTEXIMAGE2D]							= 0.15f;
51403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]						= 0.15f;
51413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.25f;
51433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]						= 0.25f;
51443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.25f;
51453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE]							= 0.25f;
51463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_COPYTEXIMAGE2D]						= 0.15f;
51473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.15f;
51483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]					= 0.25f;
51503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]					= 0.25f;
51513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.25f;
51523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.25f;
51533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_COPYTEXIMAGE2D]					= 0.15f;
51543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]				= 0.15f;
51553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(imageTestNdx);
51573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				copyTexImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
51583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
51593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			imageTests->addChild(copyTexImage2DTests);
51613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
51623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
51643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* copyTexSubImage2DTests = new TestCaseGroup(ctx, "copytexsubimage2d", "Image gen, delete, teximage2D and copytexsubimage2d tests");
51653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int imageTestNdx = 0; imageTestNdx < 20; imageTestNdx++)
51673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
51683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
51693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
51703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
51713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + imageTestNdx % 5;
51723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 70 + imageTestNdx;
51733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useImages		= true;
51743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]									= 1.0f;
51763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.10f;
51783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.15f;
51793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.20f;
51803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.15f;
51813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]							= 0.30f;
51823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.20f;
51833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_COPYTEXSUBIMAGE2D]						= 0.10f;
51843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.15f;
51863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.20f;
51873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.15f;
51883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.15f;
51893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]							= 0.15f;
51903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.15f;
51913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_COPYTEXSUBIMAGE2D]					= 0.10f;
51923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]			= 0.25f;
51943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]				= 0.25f;
51953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]	= 0.25f;
51963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]				= 0.25f;
51973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]					= 0.15f;
51983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]			= 0.15f;
51993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_COPYTEXSUBIMAGE2D]			= 0.10f;
52003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.25f;
52023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
52033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.25f;
52043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.25f;
52053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXIMAGE2D]								= 0.15f;
52063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]						= 0.15f;
52073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_COPYTEXSUBIMAGE2D]						= 0.10f;
52083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]							= 0.25f;
52103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
52113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]					= 0.25f;
52123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE]								= 0.25f;
52133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]								= 0.15f;
52143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXTURE_FROM_IMAGE]						= 0.15f;
52153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_COPYTEXSUBIMAGE2D]							= 0.10f;
52163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]					= 0.25f;
52183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]					= 0.25f;
52193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.25f;
52203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.25f;
52213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXIMAGE2D]						= 0.15f;
52223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]				= 0.15f;
52233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_COPYTEXSUBIMAGE2D]					= 0.10f;
52243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]					= 0.25f;
52263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]						= 0.25f;
52273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.25f;
52283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE]						= 0.25f;
52293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]							= 0.15f;
52303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.15f;
52313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_COPYTEXSUBIMAGE2D]					= 0.10f;
52323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(imageTestNdx);
52353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				copyTexSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
52363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
52373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			imageTests->addChild(copyTexSubImage2DTests);
52393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
52403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(imageTests);
52423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
52433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
52443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52453c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGLES2SharingThreadedTests::GLES2SharingThreadedTests (EglTestContext& eglTestCtx)
52463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup(eglTestCtx, "multithread", "EGL GLES2 sharing multithread tests")
52473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
52483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
52493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52503c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2SharingThreadedTests::init (void)
52513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
52523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::TestCaseGroup* simpleTests = new TestCaseGroup(m_eglTestCtx, "simple", "Simple multithreaded tests");
52533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addSimpleTests(m_eglTestCtx, simpleTests, false, false);
52543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(simpleTests);
52553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestCaseGroup* randomTests = new TestCaseGroup(m_eglTestCtx, "random", "Random tests");
52573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addRandomTests(m_eglTestCtx, randomTests, false, false);
52583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(randomTests);
52593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::TestCaseGroup* simpleTestsSync = new TestCaseGroup(m_eglTestCtx, "simple_egl_sync", "Simple multithreaded tests with EGL_KHR_fence_sync");
52613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addSimpleTests(m_eglTestCtx, simpleTestsSync, true, false);
52623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(simpleTestsSync);
52633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestCaseGroup* randomTestsSync = new TestCaseGroup(m_eglTestCtx, "random_egl_sync", "Random tests with EGL_KHR_fence_sync");
52653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addRandomTests(m_eglTestCtx, randomTestsSync, true, false);
52663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(randomTestsSync);
52673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::TestCaseGroup* simpleTestsServerSync = new TestCaseGroup(m_eglTestCtx, "simple_egl_server_sync", "Simple multithreaded tests with EGL_KHR_fence_sync and EGL_KHR_wait_sync");
52693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addSimpleTests(m_eglTestCtx, simpleTestsServerSync, true, true);
52703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(simpleTestsServerSync);
52713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestCaseGroup* randomTestsServerSync = new TestCaseGroup(m_eglTestCtx, "random_egl_server_sync", "Random tests with EGL_KHR_fence_sync and EGL_KHR_wait_sync");
52733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addRandomTests(m_eglTestCtx, randomTestsServerSync, true, true);
52743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(randomTestsServerSync);
52753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
52763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // egl
52783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
5279