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());
21513c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry 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
22193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Release contexts
22203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int threadNdx = 0; threadNdx < m_config.threadCount; threadNdx++)
22213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
22223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<GLES2ThreadTest::GLES2Context>	context = m_threads[threadNdx]->context;
22233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<GLES2ThreadTest::Surface>			surface = m_threads[threadNdx]->surface;
22243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[threadNdx]->addOperation(new GLES2ThreadTest::MakeCurrent(*m_threads[threadNdx], m_eglDisplay, SharedPtr<GLES2ThreadTest::Surface>(), SharedPtr<GLES2ThreadTest::GLES2Context>()));
22263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		resourceManager.addSurface(surface);
22283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		resourceManager.addContext(context);
22293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
22303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Destroy contexts
22323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
22333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DestroyContext(resourceManager.popContext(0)));
22343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Destroy surfaces
22363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int threadNdx = 0; threadNdx < m_config.threadCount; threadNdx++)
22373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DestroySurface(m_eglDisplay, resourceManager.popSurface(0)));
22383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
22393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22403c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2SharingRandomTest::deinit (void)
22413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
22423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
2243fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi	{
22443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		delete m_threads[threadNdx];
2245fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi		m_threads[threadNdx] = DE_NULL;
2246fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi	}
22473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads.clear();
22493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22508e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos	if (m_eglDisplay != EGL_NO_DISPLAY)
22518e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos	{
22528e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos		m_eglTestCtx.getLibrary().terminate(m_eglDisplay);
22538e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos		m_eglDisplay = EGL_NO_DISPLAY;
22548e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos	}
22553c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
22563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TCU_CHECK(!m_requiresRestart);
22573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
22583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22593c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2SharingRandomTest::addRandomOperation (GLES2ThreadTest::EGLResourceManager& resourceManager)
22603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
22613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int threadNdx	= m_random.getUint32() % m_threads.size();
22623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<OperationId>	operations;
22643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<float>			weights;
22653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operations.push_back(THREADOPERATIONID_CREATE_BUFFER);
22673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_CREATE_BUFFER]);
22683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operations.push_back(THREADOPERATIONID_CREATE_TEXTURE);
22703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_CREATE_TEXTURE]);
22713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operations.push_back(THREADOPERATIONID_CREATE_VERTEX_SHADER);
22733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_CREATE_VERTEX_SHADER]);
22743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operations.push_back(THREADOPERATIONID_CREATE_FRAGMENT_SHADER);
22763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]);
22773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operations.push_back(THREADOPERATIONID_CREATE_PROGRAM);
22793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_CREATE_PROGRAM]);
22803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int destroyableBufferNdx				= -1;
22823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int destroyableTextureNdx				= -1;
22833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int destroyableShaderNdx				= -1;
22843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int destroyableProgramNdx				= -1;
22853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int vertexShaderNdx						= -1;
22873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int fragmentShaderNdx					= -1;
22883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int definedTextureNdx					= -1;
22903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int definedBufferNdx					= -1;
22923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int definedShaderNdx					= -1;
22943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int detachableProgramNdx				= -1;
22963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum detachShaderType					= GL_VERTEX_SHADER;
22973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int unusedVertexAttachmentProgramNdx	= -1;
22993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int unusedFragmentAttachmentProgramNdx	= -1;
23003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int linkableProgramNdx					= -1;
23023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int attachProgramNdx					= -1;
23043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int attachShaderNdx						= -1;
23053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int nonSiblingTextureNdx				= -1;
23073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_threads[threadNdx]->context->resourceManager->getBufferCount() > 0)
23093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		destroyableBufferNdx = m_random.getUint32() % m_threads[threadNdx]->context->resourceManager->getBufferCount();
23103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_threads[threadNdx]->context->resourceManager->getTextureCount() > 0)
23123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		destroyableTextureNdx = m_random.getUint32() % m_threads[threadNdx]->context->resourceManager->getTextureCount();
23133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_threads[threadNdx]->context->resourceManager->getShaderCount() > 0)
23153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		destroyableShaderNdx = m_random.getUint32() % m_threads[threadNdx]->context->resourceManager->getShaderCount();
23163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_threads[threadNdx]->context->resourceManager->getProgramCount() > 0)
23183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		destroyableProgramNdx = m_random.getUint32() % m_threads[threadNdx]->context->resourceManager->getProgramCount();
23193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Check what kind of buffers we have
23213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int bufferNdx = 0; bufferNdx < m_threads[threadNdx]->context->resourceManager->getBufferCount(); bufferNdx++)
23223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
23233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<GLES2ThreadTest::Buffer> buffer = m_threads[threadNdx]->context->resourceManager->getBuffer(bufferNdx);
23243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (buffer->isDefined)
23263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
23273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (definedBufferNdx == -1)
23283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				definedBufferNdx = bufferNdx;
23293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_random.getBool())
23303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				definedBufferNdx = bufferNdx;
23313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
23323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
23333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Check what kind of textures we have
23353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int textureNdx = 0; textureNdx < m_threads[threadNdx]->context->resourceManager->getTextureCount(); textureNdx++)
23363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
23373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->getTexture(textureNdx);
23383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (texture->isDefined)
23403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
23413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (definedTextureNdx == -1)
23423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				definedTextureNdx = textureNdx;
23433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_random.getBool())
23443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				definedTextureNdx = textureNdx;
23453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (!texture->sourceImage)
23473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
23483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (nonSiblingTextureNdx == -1)
23493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					nonSiblingTextureNdx = textureNdx;
23503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else if (m_random.getBool())
23513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					nonSiblingTextureNdx = textureNdx;
23523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
23533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
23543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
23563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Check what kind of shaders we have
23583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int shaderNdx = 0; shaderNdx < m_threads[threadNdx]->context->resourceManager->getShaderCount(); shaderNdx++)
23593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
23603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<GLES2ThreadTest::Shader> shader = m_threads[threadNdx]->context->resourceManager->getShader(shaderNdx);
23613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Defined shader found
23633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (shader->isDefined)
23643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
23653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (definedShaderNdx == -1)
23663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				definedShaderNdx = shaderNdx;
23673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_random.getBool())
23683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				definedShaderNdx = shaderNdx;
23693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
23703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Vertex shader found
23723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (shader->type == GL_VERTEX_SHADER)
23733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
23743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (vertexShaderNdx == -1)
23753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				vertexShaderNdx = shaderNdx;
23763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_random.getBool())
23773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				vertexShaderNdx = shaderNdx;
23783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
23793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Fragmet shader found
23813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (shader->type == GL_FRAGMENT_SHADER)
23823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
23833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (fragmentShaderNdx == -1)
23843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				fragmentShaderNdx = shaderNdx;
23853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_random.getBool())
23863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				fragmentShaderNdx = shaderNdx;
23873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
23883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
23893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Check what kind of programs we have
23913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int programNdx = 0; programNdx < m_threads[threadNdx]->context->resourceManager->getProgramCount(); programNdx++)
23923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
23933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<GLES2ThreadTest::Program> program = m_threads[threadNdx]->context->resourceManager->getProgram(programNdx);
23943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Program that can be detached
23963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (program->vertexShader || program->fragmentShader)
23973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
23983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (detachableProgramNdx == -1)
23993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
24003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				detachableProgramNdx = programNdx;
24013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (program->vertexShader)
24033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					detachShaderType = GL_VERTEX_SHADER;
24043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else if (program->fragmentShader)
24053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					detachShaderType = GL_FRAGMENT_SHADER;
24063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else
24073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					DE_ASSERT(false);
24083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
24093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_random.getBool())
24103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
24113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				detachableProgramNdx = programNdx;
24123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (program->vertexShader)
24143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					detachShaderType = GL_VERTEX_SHADER;
24153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else if (program->fragmentShader)
24163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					detachShaderType = GL_FRAGMENT_SHADER;
24173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else
24183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					DE_ASSERT(false);
24193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
24203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
24213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Program that can be attached vertex shader
24233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (!program->vertexShader)
24243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
24253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (unusedVertexAttachmentProgramNdx == -1)
24263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				unusedVertexAttachmentProgramNdx = programNdx;
24273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_random.getBool())
24283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				unusedVertexAttachmentProgramNdx = programNdx;
24293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
24303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Program that can be attached fragment shader
24323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (!program->fragmentShader)
24333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
24343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (unusedFragmentAttachmentProgramNdx == -1)
24353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				unusedFragmentAttachmentProgramNdx = programNdx;
24363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_random.getBool())
24373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				unusedFragmentAttachmentProgramNdx = programNdx;
24383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
24393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Program that can be linked
24413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (program->vertexShader && program->fragmentShader)
24423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
24433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (linkableProgramNdx == -1)
24443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				linkableProgramNdx = programNdx;
24453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_random.getBool())
24463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				linkableProgramNdx = programNdx;
24473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
24483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
24493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has images
24513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (resourceManager.getImageCount() > 0)
24523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
24533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_DESTROY_IMAGE]);
24543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_DESTROY_IMAGE);
24553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_threads[threadNdx]->context->resourceManager->getTextureCount() > 0)
24573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
24583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_TEXTURE_FROM_IMAGE]);
24593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			operations.push_back(THREADOPERATIONID_TEXTURE_FROM_IMAGE);
24603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
24613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
24623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has buffer
24643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (destroyableBufferNdx != -1)
24653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
24663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_DESTROY_BUFFER]);
24673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_DESTROY_BUFFER);
24683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_BUFFER_DATA]);
24703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_BUFFER_DATA);
24713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
24723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has buffer with defined data
24743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (definedBufferNdx != -1)
24753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
24763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_BUFFER_SUBDATA]);
24773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_BUFFER_SUBDATA);
24783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
24793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has texture
24813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (destroyableTextureNdx != -1)
24823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
24833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_DESTROY_TEXTURE]);
24843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_DESTROY_TEXTURE);
24853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_TEXIMAGE2D]);
24873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_TEXIMAGE2D);
24883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_COPYTEXIMAGE2D]);
24903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_COPYTEXIMAGE2D);
24913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
24923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has texture with data
24943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (definedTextureNdx != -1)
24953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
24963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_TEXSUBIMAGE2D]);
24973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_TEXSUBIMAGE2D);
24983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_COPYTEXSUBIMAGE2D]);
25003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_COPYTEXSUBIMAGE2D);
25013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has texture that can be used as EGLimage source
25043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (nonSiblingTextureNdx != -1)
25053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]);
25073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE);
25083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has shader
25113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (destroyableShaderNdx != -1)
25123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_DESTROY_SHADER]);
25143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_DESTROY_SHADER);
25153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_SHADER_SOURCE]);
25173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_SHADER_SOURCE);
25183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has shader with defined source
25213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (definedShaderNdx != -1)
25223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_SHADER_COMPILE]);
25243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_SHADER_COMPILE);
25253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has program
25283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (destroyableProgramNdx != -1)
25293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_DESTROY_PROGRAM]);
25313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_DESTROY_PROGRAM);
25323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has program that can be linked
25353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (linkableProgramNdx != -1)
25363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_LINK_PROGRAM]);
25383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_LINK_PROGRAM);
25393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// has program with attachments
25423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (detachableProgramNdx != -1)
25433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_DETACH_SHADER]);
25453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		operations.push_back(THREADOPERATIONID_DETACH_SHADER);
25463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Has program and shader pair that can be attached
25493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (fragmentShaderNdx != -1 && unusedFragmentAttachmentProgramNdx != -1)
25503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (attachProgramNdx == -1)
25523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
25533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(attachShaderNdx == -1);
25543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			attachProgramNdx = unusedFragmentAttachmentProgramNdx;
25553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			attachShaderNdx = fragmentShaderNdx;
25563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_ATTACH_SHADER]);
25583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			operations.push_back(THREADOPERATIONID_ATTACH_SHADER);
25593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
25603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (m_random.getBool())
25613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
25623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			attachProgramNdx = unusedFragmentAttachmentProgramNdx;
25633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			attachShaderNdx = fragmentShaderNdx;
25643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
25653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (vertexShaderNdx != -1 && unusedVertexAttachmentProgramNdx != -1)
25683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (attachProgramNdx == -1)
25703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
25713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(attachShaderNdx == -1);
25723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			attachProgramNdx = unusedVertexAttachmentProgramNdx;
25733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			attachShaderNdx = vertexShaderNdx;
25743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_ATTACH_SHADER]);
25763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			operations.push_back(THREADOPERATIONID_ATTACH_SHADER);
25773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
25783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (m_random.getBool())
25793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
25803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			attachProgramNdx = unusedVertexAttachmentProgramNdx;
25813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			attachShaderNdx = vertexShaderNdx;
25823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
25833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	OperationId op = m_random.chooseWeighted<OperationId, std::vector<OperationId> ::iterator>(operations.begin(), operations.end(), weights.begin());
25863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (op)
25883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_CREATE_BUFFER:
25903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
25913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Buffer> buffer;
25923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateBuffer(buffer, m_config.useFenceSync, m_config.serverSync));
25933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addBuffer(buffer);
25943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
25953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
25963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_DESTROY_BUFFER:
25983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
25993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Buffer> buffer = m_threads[threadNdx]->context->resourceManager->popBuffer(destroyableBufferNdx);
26003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DeleteBuffer(buffer, m_config.useFenceSync, m_config.serverSync));
26013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_BUFFER_DATA:
26053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Buffer> buffer = m_threads[threadNdx]->context->resourceManager->popBuffer(destroyableBufferNdx);
26073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::BufferData(buffer, GL_ARRAY_BUFFER, 1024, GL_DYNAMIC_DRAW, 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_BUFFER_SUBDATA:
26133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Buffer> buffer = m_threads[threadNdx]->context->resourceManager->popBuffer(definedBufferNdx);
26153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::BufferSubData(buffer, GL_ARRAY_BUFFER, 1, 20, m_config.useFenceSync, m_config.serverSync));
26163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addBuffer(buffer);
26173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_CREATE_TEXTURE:
26213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Texture> texture;
26233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateTexture(texture, m_config.useFenceSync, m_config.serverSync));
26243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addTexture(texture);
26253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_DESTROY_TEXTURE:
26293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DeleteTexture(m_threads[threadNdx]->context->resourceManager->popTexture(destroyableTextureNdx), m_config.useFenceSync, m_config.serverSync));
26303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_TEXIMAGE2D:
26333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->popTexture(destroyableTextureNdx);
26353c827367444ee418f129b2c238299f49d3264554Jarkko 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));
26363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addTexture(texture);
26373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_TEXSUBIMAGE2D:
26413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->popTexture(definedTextureNdx);
26433c827367444ee418f129b2c238299f49d3264554Jarkko 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));
26443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addTexture(texture);
26453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_COPYTEXIMAGE2D:
26493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->popTexture(destroyableTextureNdx);
26513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CopyTexImage2D(texture, 0, GL_RGBA, 20, 20, 300, 300, 0, m_config.useFenceSync, m_config.serverSync));
26523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addTexture(texture);
26533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_COPYTEXSUBIMAGE2D:
26573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->popTexture(definedTextureNdx);
26593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CopyTexSubImage2D(texture, 0, 10, 10, 30, 30, 50, 50, m_config.useFenceSync, m_config.serverSync));
26603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addTexture(texture);
26613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_CREATE_VERTEX_SHADER:
26653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Shader> shader;
26673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateShader(GL_VERTEX_SHADER, shader, m_config.useFenceSync, m_config.serverSync));
26683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addShader(shader);
26693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_CREATE_FRAGMENT_SHADER:
26733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Shader> shader;
26753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateShader(GL_FRAGMENT_SHADER, shader, m_config.useFenceSync, m_config.serverSync));
26763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addShader(shader);
26773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
26793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_DESTROY_SHADER:
26813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DeleteShader(m_threads[threadNdx]->context->resourceManager->popShader(destroyableShaderNdx), m_config.useFenceSync, m_config.serverSync));
26823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
26833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_SHADER_SOURCE:
26853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
26863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const char* vertexShaderSource =
26873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"attribute mediump vec4 a_pos;\n"
26883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"varying mediump vec4 v_pos;\n"
26893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"void main (void)\n"
26903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"{\n"
26913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"\tv_pos = a_pos;\n"
26923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"\tgl_Position = a_pos;\n"
26933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"}\n";
26943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const char* fragmentShaderSource =
26963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"varying mediump vec4 v_pos;\n"
26973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"void main (void)\n"
26983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"{\n"
26993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"\tgl_FragColor = v_pos;\n"
27003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				"}\n";
27013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Shader> shader = m_threads[threadNdx]->context->resourceManager->popShader(destroyableShaderNdx);
27023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::ShaderSource(shader, (shader->type == GL_VERTEX_SHADER ? vertexShaderSource : fragmentShaderSource), m_config.useFenceSync, m_config.serverSync));
27033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addShader(shader);
27043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
27063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_SHADER_COMPILE:
27083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
27093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Shader> shader = m_threads[threadNdx]->context->resourceManager->popShader(definedShaderNdx);
27103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::ShaderCompile(shader, m_config.useFenceSync, m_config.serverSync));
27113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addShader(shader);
27123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
27143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_CREATE_PROGRAM:
27163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
27173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Program> program;
27183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateProgram(program, m_config.useFenceSync, m_config.serverSync));
27193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addProgram(program);
27203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
27223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_DESTROY_PROGRAM:
27243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DeleteProgram(m_threads[threadNdx]->context->resourceManager->popProgram(destroyableProgramNdx), m_config.useFenceSync, m_config.serverSync));
27253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_ATTACH_SHADER:
27283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
27293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Program>	program = m_threads[threadNdx]->context->resourceManager->popProgram(attachProgramNdx);
27303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Shader>	shader	= m_threads[threadNdx]->context->resourceManager->popShader(attachShaderNdx);
27313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::AttachShader(program, shader, m_config.useFenceSync, m_config.serverSync));
27333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addProgram(program);
27353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addShader(shader);
27363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
27383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_DETACH_SHADER:
27403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
27413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Program>	program = m_threads[threadNdx]->context->resourceManager->popProgram(detachableProgramNdx);
27423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DetachShader(program, detachShaderType, m_config.useFenceSync, m_config.serverSync));
27433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addProgram(program);
27443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
27463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_LINK_PROGRAM:
27483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
27493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Program>	program = m_threads[threadNdx]->context->resourceManager->popProgram(linkableProgramNdx);
27503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::LinkProgram(program, m_config.useFenceSync, m_config.serverSync));
27513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addProgram(program);
27523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
27543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE:
27563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
27573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::EGLImage> image;
27583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->popTexture(nonSiblingTextureNdx);
27593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateImageFromTexture(image, texture, m_config.useFenceSync, m_config.serverSync));
27603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// \note [mika] Can source be added back to resourceManager?
27613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addTexture(texture);
27623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			resourceManager.addImage(image);
27633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
27653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_DESTROY_IMAGE:
27673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
27683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int imageNdx = m_random.getInt(0, resourceManager.getImageCount()-1);
27693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::EGLImage> image = resourceManager.popImage(imageNdx);
27703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DestroyImage(image, m_config.useFenceSync, m_config.serverSync));
27713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
27733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case THREADOPERATIONID_TEXTURE_FROM_IMAGE:
27753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
27763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int imageNdx = m_random.getInt(0, resourceManager.getImageCount()-1);
27773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->popTexture(destroyableTextureNdx);
27783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SharedPtr<GLES2ThreadTest::EGLImage> image = resourceManager.popImage(imageNdx);
27793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DefineTextureFromImage(texture, image, m_config.useFenceSync, m_config.serverSync));
27803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->context->resourceManager->addTexture(texture);
27813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			resourceManager.addImage(image);
27823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
27833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
27843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
27863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(false);
27873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
27883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_lastOperation = op;
27903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
27913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27923c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytcu::TestCase::IterateResult GLES2SharingRandomTest::iterate (void)
27933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
27943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!m_threadsStarted)
27953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
27963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_beginTimeUs = deGetMicroseconds();
27973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Execute threads
27993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
28003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->exec();
28013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threadsStarted = true;
28033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threadsRunning = true;
28043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
28053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_threadsRunning)
28073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
28083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Wait threads to finish
28093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int readyThreads = 0;
28103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
28113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2812fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			const tcu::ThreadUtil::Thread::ThreadStatus status = m_threads[threadNdx]->getStatus();
2813fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
2814fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			if (status != tcu::ThreadUtil::Thread::THREADSTATUS_RUNNING && status != tcu::ThreadUtil::Thread::THREADSTATUS_NOT_STARTED)
28153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				readyThreads++;
28163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
28173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (readyThreads == (int)m_threads.size())
28193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
28203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
28213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_threads[threadNdx]->join();
28223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_executionReady	= true;
28243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_requiresRestart	= false;
28253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
28263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (deGetMicroseconds() - m_beginTimeUs > m_timeOutUs)
28283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
28293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
28303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
28313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (m_threads[threadNdx]->getStatus() != tcu::ThreadUtil::Thread::THREADSTATUS_RUNNING)
28323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
28333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					if (m_threads[threadNdx]->isStarted())
28343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						m_threads[threadNdx]->join();
28353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
28363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
28373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_executionReady	= true;
28383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_requiresRestart	= true;
28393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_timeOutTimeUs		= deGetMicroseconds();
28403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
28413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
28423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
28433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			deSleep(m_sleepTimeMs);
28443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
28453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
28463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_executionReady)
28483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
28493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		std::vector<int> indices(m_threads.size(), 0);
2850fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
2851fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi		if (m_timeOutTimeUs != 0)
2852fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			m_log << tcu::TestLog::Message << "Execution timeout limit reached. Trying to get per thread logs. This is potentially dangerous." << tcu::TestLog::EndMessage;
2853fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
28543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		while (true)
28553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
28563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int 		firstThread = -1;
28573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// Find first thread with messages
28593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
28603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
28613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (m_threads[threadNdx]->getMessageCount() > indices[threadNdx])
28623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
28633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					firstThread = threadNdx;
28643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
28653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
28663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
28673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// No more messages
28693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (firstThread == -1)
28703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
28713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
28733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
28743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				// No more messages in this thread
28753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (m_threads[threadNdx]->getMessageCount() <= indices[threadNdx])
28763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					continue;
28773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if ((m_threads[threadNdx]->getMessage(indices[threadNdx]).getTime() - m_beginTimeUs) < (m_threads[firstThread]->getMessage(indices[firstThread]).getTime() - m_beginTimeUs))
28793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					firstThread = threadNdx;
28803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
28813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2882fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			tcu::ThreadUtil::Message message = m_threads[firstThread]->getMessage(indices[firstThread]);
2883fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
2884fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			m_log << tcu::TestLog::Message << "[" << (message.getTime() - m_beginTimeUs) << "] (" << firstThread << ") " << message.getMessage() << tcu::TestLog::EndMessage;
28853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			indices[firstThread]++;
28863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
28873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2888fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi		if (m_timeOutTimeUs != 0)
2889fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			m_log << tcu::TestLog::Message << "[" << (m_timeOutTimeUs - m_beginTimeUs) << "] Execution timeout limit reached" << tcu::TestLog::EndMessage;
2890fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
28913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool isOk = true;
28923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool notSupported = false;
28933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
28953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2896fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			const tcu::ThreadUtil::Thread::ThreadStatus status = m_threads[threadNdx]->getStatus();
2897fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
2898fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			switch (status)
28993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
2900fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_FAILED:
2901fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_INIT_FAILED:
2902fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_RUNNING:
2903fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					isOk = false;
2904fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					break;
29053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2906fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_NOT_SUPPORTED:
2907fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					notSupported = true;
2908fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					break;
29093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2910fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_READY:
2911fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					// Nothing
2912fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					break;
2913fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
2914fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				default:
2915fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					DE_ASSERT(false);
2916fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					isOk = false;
2917fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			};
29183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
29193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (notSupported)
29213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			throw tcu::NotSupportedError("Thread threw tcu::NotSupportedError", "", __FILE__, __LINE__);
29223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (isOk)
29243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
29253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
29263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
29273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return STOP;
29293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
29303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return CONTINUE;
29323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
29333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29343c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass GLES2ThreadedSharingTest : public TestCase
29353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
29363c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
29373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	struct TestConfig
29383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
29393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		enum ResourceType
29403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
29413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			RESOURCETYPE_BUFFER = 0,
29423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			RESOURCETYPE_TEXTURE,
29433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			RESOURCETYPE_VERTEX_SHADER,
29443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			RESOURCETYPE_FRAGMENT_SHADER,
29453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			RESOURCETYPE_PROGRAM,
29463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			RESOURCETYPE_IMAGE
29473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		};
29483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ResourceType	resourceType;
29503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool			singleContext;
29513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int				define;
29523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int				modify;
29533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool			useFenceSync;
29543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool			serverSync;
29553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool			render;
29563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
29573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						GLES2ThreadedSharingTest	(EglTestContext& context, const TestConfig& config, const char* name, const char* description);
29583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						~GLES2ThreadedSharingTest	(void);
29593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				init						(void);
29613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				deinit						(void);
29623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	IterateResult		iterate						(void);
29633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				addBufferOperations			(void);
29653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				addTextureOperations		(void);
29663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				addImageOperations			(void);
29673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				addShaderOperations			(GLenum type);
29683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				addProgramOperations		(void);
29693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29703c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
29713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestConfig				m_config;
29723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::TestLog&			m_log;
29733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						m_seed;
29743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool					m_threadsStarted;
29753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool					m_threadsRunning;
29763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool					m_executionReady;
29773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool					m_requiresRestart;
29783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint64				m_beginTimeUs;
29793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint64				m_timeOutUs;
29803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32				m_sleepTimeMs;
29813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint64				m_timeOutTimeUs;
29823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<GLES2ThreadTest::EGLThread*>	m_threads;
29843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLDisplay				m_eglDisplay;
29863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLConfig				m_eglConfig;
29873c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	glw::Functions			m_gl;
29883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
29893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29903c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGLES2ThreadedSharingTest::GLES2ThreadedSharingTest (EglTestContext& context, const TestConfig& config, const char* name, const char* description)
29913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCase			(context, name, description)
29923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_config			(config)
29933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_log				(m_testCtx.getLog())
29943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_seed			(deStringHash(name))
29953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_threadsStarted	(false)
29963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_threadsRunning	(false)
29973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_executionReady	(false)
29983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_requiresRestart	(false)
29993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_beginTimeUs		(0)
30003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_timeOutUs		(10000000)	// 10 seconds
30013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_sleepTimeMs		(1)			// 1 milliseconds
30023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_timeOutTimeUs	(0)
30033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_eglDisplay		(EGL_NO_DISPLAY)
30043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_eglConfig		(0)
30053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
30063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
30073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30083c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGLES2ThreadedSharingTest::~GLES2ThreadedSharingTest (void)
30093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
30103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLES2ThreadedSharingTest::deinit();
30113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
30123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30133c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2ThreadedSharingTest::init (void)
30143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
30153c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	const Library& egl = m_eglTestCtx.getLibrary();
30163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30173c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	const EGLint attribList[] =
30183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
30193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_RENDERABLE_TYPE,	EGL_OPENGL_ES2_BIT,
30203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_SURFACE_TYPE,		EGL_WINDOW_BIT,
30213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_ALPHA_SIZE,			1,
30223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGL_NONE
30233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
30243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30253c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	m_eglDisplay	= eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay());
30263c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	m_eglConfig 	= eglu::chooseSingleConfig(egl, m_eglDisplay, attribList);
30273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30288e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos	m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(2,0));
30298e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos
30303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Check extensions
30313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.useFenceSync)
30323c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_fence_sync");
30333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.serverSync)
30353c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_wait_sync");
30363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.resourceType == TestConfig::RESOURCETYPE_IMAGE)
30383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
30393c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_image_base");
30403c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_gl_texture_2D_image");
30413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
30423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Create threads
30443c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	m_threads.push_back(new GLES2ThreadTest::EGLThread(egl, m_gl, deInt32Hash(m_seed)));
30453c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	m_threads.push_back(new GLES2ThreadTest::EGLThread(egl, m_gl, deInt32Hash(m_seed*200)));
30463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::GLES2Context> contex1;
30483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::GLES2Context> contex2;
30493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Surface> surface1;
30513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Surface> surface2;
30523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Create contexts
30543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::CreateContext(m_eglDisplay, m_eglConfig, SharedPtr<GLES2ThreadTest::GLES2Context>(), contex1));
30553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[1]->addOperation(new GLES2ThreadTest::CreateContext(m_eglDisplay, m_eglConfig, contex1, contex2));
30563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Create surfaces
30583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::CreatePBufferSurface(m_eglDisplay, m_eglConfig, 400, 400, surface1));
30593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[1]->addOperation(new GLES2ThreadTest::CreatePBufferSurface(m_eglDisplay, m_eglConfig, 400, 400, surface2));
30603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Make current contexts
30623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::MakeCurrent(*m_threads[0], m_eglDisplay, surface1, contex1));
30633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[1]->addOperation(new GLES2ThreadTest::MakeCurrent(*m_threads[1], m_eglDisplay, surface2, contex2));
30643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Operations to check fence sync support
30653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.useFenceSync)
30663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
30673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::InitGLExtension("GL_OES_EGL_sync"));
30683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::InitGLExtension("GL_OES_EGL_sync"));
30693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
30703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (m_config.resourceType)
30733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
30743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TestConfig::RESOURCETYPE_BUFFER:
30753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addBufferOperations();
30763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
30773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TestConfig::RESOURCETYPE_TEXTURE:
30793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addTextureOperations();
30803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
30813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TestConfig::RESOURCETYPE_IMAGE:
30833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addImageOperations();
30843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
30853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TestConfig::RESOURCETYPE_VERTEX_SHADER:
30873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addShaderOperations(GL_VERTEX_SHADER);
30883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
30893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TestConfig::RESOURCETYPE_FRAGMENT_SHADER:
30913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addShaderOperations(GL_FRAGMENT_SHADER);
30923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
30933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TestConfig::RESOURCETYPE_PROGRAM:
30953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addProgramOperations();
30963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
30973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
30993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(false);
31003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
31013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Relaese contexts
31033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::MakeCurrent(*m_threads[0], m_eglDisplay, SharedPtr<GLES2ThreadTest::Surface>(), SharedPtr<GLES2ThreadTest::GLES2Context>()));
31043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[1]->addOperation(new GLES2ThreadTest::MakeCurrent(*m_threads[0], m_eglDisplay, SharedPtr<GLES2ThreadTest::Surface>(), SharedPtr<GLES2ThreadTest::GLES2Context>()));
31053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Destory context
31073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::DestroyContext(contex1));
31083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[1]->addOperation(new GLES2ThreadTest::DestroyContext(contex2));
31093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Destroy surfaces
31113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::DestroySurface(m_eglDisplay, surface1));
31123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[1]->addOperation(new GLES2ThreadTest::DestroySurface(m_eglDisplay, surface2));
31133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
31143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31153c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2ThreadedSharingTest::addBufferOperations (void)
31163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
31173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Add operations for verify
31183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Shader>	vertexShader;
31193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Shader>	fragmentShader;
31203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Program>	program;
31213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
31233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
31243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* vertexShaderSource =
31253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"attribute highp vec2 a_pos;\n"
31263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"varying mediump vec2 v_pos;\n"
31273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
31283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
31293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tv_pos = a_pos;\n"
31303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_Position = vec4(a_pos, 0.0, 1.0);\n"
31313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n";
31323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* fragmentShaderSource =
31343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"varying mediump vec2 v_pos;\n"
31353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
31363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
31373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_FragColor = vec4(v_pos, 0.5, 1.0);\n"
31383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n";
31393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_VERTEX_SHADER, vertexShader, m_config.useFenceSync, m_config.serverSync));
31413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(vertexShader, vertexShaderSource, m_config.useFenceSync, m_config.serverSync));
31423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(vertexShader, m_config.useFenceSync, m_config.serverSync));
31433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_FRAGMENT_SHADER, fragmentShader, m_config.useFenceSync, m_config.serverSync));
31453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(fragmentShader, fragmentShaderSource, m_config.useFenceSync, m_config.serverSync));
31463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(fragmentShader, m_config.useFenceSync, m_config.serverSync));
31473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateProgram(program, m_config.useFenceSync, m_config.serverSync));
31493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, fragmentShader, m_config.useFenceSync, m_config.serverSync));
31503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, vertexShader, m_config.useFenceSync, m_config.serverSync));
31513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::LinkProgram(program, m_config.useFenceSync, m_config.serverSync));
31533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
31543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Buffer> buffer;
31563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::CreateBuffer(buffer, m_config.useFenceSync, m_config.serverSync));
31583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.define)
31603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
31613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.modify || m_config.render)
31623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::BufferData(buffer, GL_ARRAY_BUFFER, 1024, GL_DYNAMIC_DRAW, m_config.useFenceSync, m_config.serverSync));
31633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
31643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::BufferData(buffer, GL_ARRAY_BUFFER, 1024, GL_DYNAMIC_DRAW, m_config.useFenceSync, m_config.serverSync));
31653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
31663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify)
31683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
31693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
31703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::BufferSubData(buffer, GL_ARRAY_BUFFER, 17, 17, m_config.useFenceSync, m_config.serverSync));
31713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
31723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::BufferSubData(buffer, GL_ARRAY_BUFFER, 17, 17, m_config.useFenceSync, m_config.serverSync));
31733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
31743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
31763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
31773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::RenderBuffer(program, buffer, m_config.useFenceSync, m_config.serverSync));
31783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::RenderBuffer(program, buffer, m_config.useFenceSync, m_config.serverSync));
31793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<tcu::ThreadUtil::DataBlock> pixels1;
31813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<tcu::ThreadUtil::DataBlock> pixels2;
31823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, pixels1, m_config.useFenceSync, m_config.serverSync));
31843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::ReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, pixels2, m_config.useFenceSync, m_config.serverSync));
31853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new tcu::ThreadUtil::CompareData(pixels1, pixels2));
31873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
31883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify || m_config.render)
31903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteBuffer(buffer, m_config.useFenceSync, m_config.serverSync));
31913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
31923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::DeleteBuffer(buffer, m_config.useFenceSync, m_config.serverSync));
31933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
31953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
31963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(vertexShader, m_config.useFenceSync, m_config.serverSync));
31973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(fragmentShader, m_config.useFenceSync, m_config.serverSync));
31983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteProgram(program, m_config.useFenceSync, m_config.serverSync));
31993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
32003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
32013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32023c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2ThreadedSharingTest::addTextureOperations (void)
32033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
32043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Add operations for verify
32053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Shader>	vertexShader;
32063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Shader>	fragmentShader;
32073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Program>	program;
32083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
32103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
32113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* vertexShaderSource =
32123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"attribute highp vec2 a_pos;\n"
32133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"varying mediump vec2 v_pos;\n"
32143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
32153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
32163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tv_pos = a_pos;\n"
32173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_Position = vec4(a_pos, 0.0, 1.0);\n"
32183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n";
32193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* fragmentShaderSource =
32213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"varying mediump vec2 v_pos;\n"
32223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"uniform sampler2D u_sampler;\n"
32233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
32243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
32253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_FragColor = texture2D(u_sampler, v_pos);\n"
32263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n";
32273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_VERTEX_SHADER, vertexShader, m_config.useFenceSync, m_config.serverSync));
32293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(vertexShader, vertexShaderSource, m_config.useFenceSync, m_config.serverSync));
32303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(vertexShader, m_config.useFenceSync, m_config.serverSync));
32313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_FRAGMENT_SHADER, fragmentShader, m_config.useFenceSync, m_config.serverSync));
32333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(fragmentShader, fragmentShaderSource, m_config.useFenceSync, m_config.serverSync));
32343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(fragmentShader, m_config.useFenceSync, m_config.serverSync));
32353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateProgram(program, m_config.useFenceSync, m_config.serverSync));
32373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, fragmentShader, m_config.useFenceSync, m_config.serverSync));
32383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, vertexShader, m_config.useFenceSync, m_config.serverSync));
32393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::LinkProgram(program, m_config.useFenceSync, m_config.serverSync));
32413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
32423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Texture> texture;
32443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::CreateTexture(texture, m_config.useFenceSync, m_config.serverSync));
32463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.define == 1)
32483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
32493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.modify || m_config.render)
32503c827367444ee418f129b2c238299f49d3264554Jarkko 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));
32513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
32523c827367444ee418f129b2c238299f49d3264554Jarkko 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));
32533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
32543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.define == 2)
32563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
32573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.modify || m_config.render)
32583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::CopyTexImage2D(texture, 0, GL_RGBA, 17, 17, 256, 256, 0, m_config.useFenceSync, m_config.serverSync));
32593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
32603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::CopyTexImage2D(texture, 0, GL_RGBA, 17, 17, 256, 256, 0, m_config.useFenceSync, m_config.serverSync));
32613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
32623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify == 1)
32643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
32653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
32663c827367444ee418f129b2c238299f49d3264554Jarkko 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));
32673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
32683c827367444ee418f129b2c238299f49d3264554Jarkko 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));
32693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
32703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify == 2)
32723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
32733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
32743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::CopyTexSubImage2D(texture, 0, 7, 7, 17, 17, 29, 29, m_config.useFenceSync, m_config.serverSync));
32753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
32763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::CopyTexSubImage2D(texture, 0, 7, 7, 17, 17, 29, 29, m_config.useFenceSync, m_config.serverSync));
32773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
32783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
32803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
32813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<tcu::ThreadUtil::DataBlock> pixels1;
32823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<tcu::ThreadUtil::DataBlock> pixels2;
32833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::RenderTexture(program, texture, m_config.useFenceSync, m_config.serverSync));
32853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::RenderTexture(program, texture, m_config.useFenceSync, m_config.serverSync));
32863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, pixels1, m_config.useFenceSync, m_config.serverSync));
32883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::ReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, pixels2, m_config.useFenceSync, m_config.serverSync));
32893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new tcu::ThreadUtil::CompareData(pixels1, pixels2));
32913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
32923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify || m_config.render)
32943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteTexture(texture, m_config.useFenceSync, m_config.serverSync));
32953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
32963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::DeleteTexture(texture, m_config.useFenceSync, m_config.serverSync));
32973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
32983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
32993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
33003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(vertexShader, m_config.useFenceSync, m_config.serverSync));
33013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(fragmentShader, m_config.useFenceSync, m_config.serverSync));
33023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteProgram(program, m_config.useFenceSync, m_config.serverSync));
33033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
33043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
33053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33063c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2ThreadedSharingTest::addImageOperations (void)
33073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
33083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Add operations for verify
33093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Shader>	vertexShader;
33103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Shader>	fragmentShader;
33113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Program>	program;
33123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::InitGLExtension("GL_OES_EGL_image"));
33143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[1]->addOperation(new GLES2ThreadTest::InitGLExtension("GL_OES_EGL_image"));
33153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
33173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
33183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* vertexShaderSource =
33193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"attribute highp vec2 a_pos;\n"
33203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"varying mediump vec2 v_pos;\n"
33213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
33223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
33233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tv_pos = a_pos;\n"
33243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_Position = vec4(a_pos, 0.0, 1.0);\n"
33253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n";
33263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* fragmentShaderSource =
33283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"varying mediump vec2 v_pos;\n"
33293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"uniform sampler2D u_sampler;\n"
33303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
33313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
33323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_FragColor = texture2D(u_sampler, v_pos);\n"
33333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n";
33343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_VERTEX_SHADER, vertexShader, m_config.useFenceSync, m_config.serverSync));
33363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(vertexShader, vertexShaderSource, m_config.useFenceSync, m_config.serverSync));
33373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(vertexShader, m_config.useFenceSync, m_config.serverSync));
33383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_FRAGMENT_SHADER, fragmentShader, m_config.useFenceSync, m_config.serverSync));
33403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(fragmentShader, fragmentShaderSource, m_config.useFenceSync, m_config.serverSync));
33413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(fragmentShader, m_config.useFenceSync, m_config.serverSync));
33423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateProgram(program, m_config.useFenceSync, m_config.serverSync));
33443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, fragmentShader, m_config.useFenceSync, m_config.serverSync));
33453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, vertexShader, m_config.useFenceSync, m_config.serverSync));
33463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::LinkProgram(program, m_config.useFenceSync, m_config.serverSync));
33483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
33493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Texture>		sourceTexture;
33513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Texture>		texture;
33523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::EGLImage>	image;
33533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::CreateTexture(sourceTexture, m_config.useFenceSync, m_config.serverSync));
33553c827367444ee418f129b2c238299f49d3264554Jarkko 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));
33563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.define == 1)
33583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
33593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.modify || m_config.render)
33603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::CreateImageFromTexture(image, sourceTexture, m_config.useFenceSync, m_config.serverSync));
33613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
33623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::CreateImageFromTexture(image, sourceTexture, m_config.useFenceSync, m_config.serverSync));
33633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
33643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.define == 2)
33663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
33673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateImageFromTexture(image, sourceTexture, m_config.useFenceSync, m_config.serverSync));
33683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateTexture(texture, m_config.useFenceSync, m_config.serverSync));
33693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.modify || m_config.render)
33713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::DefineTextureFromImage(texture, image, m_config.useFenceSync, m_config.serverSync));
33723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
33733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::DefineTextureFromImage(texture, image, m_config.useFenceSync, m_config.serverSync));
33743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
33753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::DeleteTexture(sourceTexture, m_config.useFenceSync, m_config.serverSync));
33773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify == 1)
33793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
33803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(m_config.define != 1);
33813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
33833c827367444ee418f129b2c238299f49d3264554Jarkko 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));
33843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
33853c827367444ee418f129b2c238299f49d3264554Jarkko 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));
33863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
33873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify == 2)
33893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
33903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(m_config.define != 1);
33913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
33933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::CopyTexSubImage2D(texture, 0, 7, 7, 17, 17, 29, 29, m_config.useFenceSync, m_config.serverSync));
33943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
33953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::CopyTexSubImage2D(texture, 0, 7, 7, 17, 17, 29, 29, m_config.useFenceSync, m_config.serverSync));
33963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
33973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify == 3)
33993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
34003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(m_config.define != 1);
34013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
34033c827367444ee418f129b2c238299f49d3264554Jarkko 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));
34043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
34053c827367444ee418f129b2c238299f49d3264554Jarkko 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));
34063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
34073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify == 4)
34093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
34103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(m_config.define != 1);
34113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
34133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::CopyTexImage2D(texture, 0, GL_RGBA, 7, 7, 256, 256, 0, m_config.useFenceSync, m_config.serverSync));
34143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
34153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::CopyTexImage2D(texture, 0, GL_RGBA, 7, 7, 256, 256, 0, m_config.useFenceSync, m_config.serverSync));
34163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
34173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
34193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
34203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(m_config.define != 1);
34213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<tcu::ThreadUtil::DataBlock> pixels1;
34233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SharedPtr<tcu::ThreadUtil::DataBlock> pixels2;
34243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::RenderTexture(program, texture, m_config.useFenceSync, m_config.serverSync));
34263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::RenderTexture(program, texture, m_config.useFenceSync, m_config.serverSync));
34273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, pixels1, m_config.useFenceSync, m_config.serverSync));
34293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::ReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, pixels2, m_config.useFenceSync, m_config.serverSync));
34303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new tcu::ThreadUtil::CompareData(pixels1, pixels2));
34323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
34333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (texture)
34353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
34363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.modify || m_config.render)
34373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::DeleteTexture(texture, m_config.useFenceSync, m_config.serverSync));
34383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
34393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::DeleteTexture(texture, m_config.useFenceSync, m_config.serverSync));
34403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
34413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify || m_config.render)
34433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DestroyImage(image, m_config.useFenceSync, m_config.serverSync));
34443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
34453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::DestroyImage(image, m_config.useFenceSync, m_config.serverSync));
34463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
34483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
34493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(vertexShader, m_config.useFenceSync, m_config.serverSync));
34503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(fragmentShader, m_config.useFenceSync, m_config.serverSync));
34513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteProgram(program, m_config.useFenceSync, m_config.serverSync));
34523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
34533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
34543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2ThreadedSharingTest::addShaderOperations (GLenum type)
34563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
34573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Shader> shader;
34583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(type, shader, m_config.useFenceSync, m_config.serverSync));
34603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.define)
34623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
34633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* vertexShaderSource =
34643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"attribute mediump vec4 a_pos;\n"
34653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
34663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
34673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_Position = a_pos;\n"
34683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}";
34693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* fragmentShaderSource =
34713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
34723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
34733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
34743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}";
34753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.modify || m_config.render)
34773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(shader, (type == GL_VERTEX_SHADER ? vertexShaderSource : fragmentShaderSource), m_config.useFenceSync, m_config.serverSync));
34783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
34793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::ShaderSource(shader, (type == GL_VERTEX_SHADER ? vertexShaderSource : fragmentShaderSource), m_config.useFenceSync, m_config.serverSync));
34803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
34813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify)
34833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
34843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
34853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(shader, m_config.useFenceSync, m_config.serverSync));
34863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
34873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::ShaderCompile(shader, m_config.useFenceSync, m_config.serverSync));
34883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
34893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(!m_config.render);
34913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify || m_config.render)
34933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(shader, m_config.useFenceSync, m_config.serverSync));
34943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
34953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::DeleteShader(shader, m_config.useFenceSync, m_config.serverSync));
34963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
34973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34983c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2ThreadedSharingTest::addProgramOperations (void)
34993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
35003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Add operations for verify
35013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Shader>	vertexShader;
35023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Shader>	fragmentShader;
35033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.define)
35053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
35063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* vertexShaderSource =
35073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"attribute highp vec2 a_pos;\n"
35083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"varying mediump vec2 v_pos;\n"
35093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
35103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
35113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tv_pos = a_pos;\n"
35123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_Position = vec4(a_pos, 0.0, 1.0);\n"
35133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n";
35143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* fragmentShaderSource =
35163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"varying mediump vec2 v_pos;\n"
35173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main(void)\n"
35183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
35193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"\tgl_FragColor = vec4(v_pos, 0.5, 1.0);\n"
35203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n";
35213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_VERTEX_SHADER, vertexShader, m_config.useFenceSync, m_config.serverSync));
35233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(vertexShader, vertexShaderSource, m_config.useFenceSync, m_config.serverSync));
35243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(vertexShader, m_config.useFenceSync, m_config.serverSync));
35253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_FRAGMENT_SHADER, fragmentShader, m_config.useFenceSync, m_config.serverSync));
35273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(fragmentShader, fragmentShaderSource, m_config.useFenceSync, m_config.serverSync));
35283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(fragmentShader, m_config.useFenceSync, m_config.serverSync));
35293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
35303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SharedPtr<GLES2ThreadTest::Program> program;
35323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads[0]->addOperation(new GLES2ThreadTest::CreateProgram(program, m_config.useFenceSync, m_config.serverSync));
35343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.define)
35363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
35373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Attach shaders
35383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.modify || m_config.render)
35393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
35403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, vertexShader, m_config.useFenceSync, m_config.serverSync));
35413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, fragmentShader, m_config.useFenceSync, m_config.serverSync));
35423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
35433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
35443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
35453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::AttachShader(program, vertexShader, m_config.useFenceSync, m_config.serverSync));
35463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::AttachShader(program, fragmentShader, m_config.useFenceSync, m_config.serverSync));
35473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
35483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
35493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify == 1)
35513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
35523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Link program
35533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
35543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::LinkProgram(program, m_config.useFenceSync, m_config.serverSync));
35553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
35563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::LinkProgram(program, m_config.useFenceSync, m_config.serverSync));
35573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
35583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify == 2)
35603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
35613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Link program
35623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_config.render)
35633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
35643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::DetachShader(program, GL_VERTEX_SHADER, m_config.useFenceSync, m_config.serverSync));
35653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[0]->addOperation(new GLES2ThreadTest::DetachShader(program, GL_FRAGMENT_SHADER, m_config.useFenceSync, m_config.serverSync));
35663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
35673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
35683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
35693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::DetachShader(program, GL_VERTEX_SHADER, m_config.useFenceSync, m_config.serverSync));
35703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[1]->addOperation(new GLES2ThreadTest::DetachShader(program, GL_FRAGMENT_SHADER, m_config.useFenceSync, m_config.serverSync));
35713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
35723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
35733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
35753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
35763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(false);
35773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
35783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.modify || m_config.render)
35803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteProgram(program, m_config.useFenceSync, m_config.serverSync));
35813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
35823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[1]->addOperation(new GLES2ThreadTest::DeleteProgram(program, m_config.useFenceSync, m_config.serverSync));
35833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.render)
35853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
35863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(vertexShader, m_config.useFenceSync, m_config.serverSync));
35873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(fragmentShader, m_config.useFenceSync, m_config.serverSync));
35883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
35893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
35903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35913c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2ThreadedSharingTest::deinit (void)
35923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
35933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
3594fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi	{
35953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		delete m_threads[threadNdx];
3596fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi		m_threads[threadNdx] = DE_NULL;
3597fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi	}
35983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
35993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_threads.clear();
36008e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos
36018e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos	if (m_eglDisplay != EGL_NO_DISPLAY)
36028e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos	{
36038e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos		m_eglTestCtx.getLibrary().terminate(m_eglDisplay);
36048e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos		m_eglDisplay = EGL_NO_DISPLAY;
36058e814ce14475b71be9d3e17db2f1d1c6a3fcc59fPyry Haulos	}
36063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TCU_CHECK(!m_requiresRestart);
36083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
36093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36103c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytcu::TestCase::IterateResult GLES2ThreadedSharingTest::iterate (void)
36113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
36123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!m_threadsStarted)
36133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
36143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_beginTimeUs = deGetMicroseconds();
36153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Execute threads
36173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
36183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_threads[threadNdx]->exec();
36193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threadsStarted = true;
36213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_threadsRunning = true;
36223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
36233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_threadsRunning)
36253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
36263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Wait threads to finish
36273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int readyThreads = 0;
36283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
36293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
36303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (m_threads[threadNdx]->getStatus() != tcu::ThreadUtil::Thread::THREADSTATUS_RUNNING)
36313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				readyThreads++;
36323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
36333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (readyThreads == (int)m_threads.size())
36353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
36363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
36373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_threads[threadNdx]->join();
36383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_executionReady	= true;
36403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_requiresRestart	= false;
36413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
36423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (deGetMicroseconds() - m_beginTimeUs > m_timeOutUs)
36443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
36453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
36463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
36473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (m_threads[threadNdx]->getStatus() != tcu::ThreadUtil::Thread::THREADSTATUS_RUNNING)
36483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					m_threads[threadNdx]->join();
36493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
36503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_executionReady	= true;
36513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_requiresRestart	= true;
36523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_timeOutTimeUs		= deGetMicroseconds();
36533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
36543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
36553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
36563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			deSleep(m_sleepTimeMs);
36573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
36583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
36593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_executionReady)
36613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
36623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		std::vector<int> indices(m_threads.size(), 0);
3663fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
3664fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi		if (m_timeOutTimeUs != 0)
3665fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			m_log << tcu::TestLog::Message << "Execution timeout limit reached. Trying to get per thread logs. This is potentially dangerous." << tcu::TestLog::EndMessage;
3666fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
36673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		while (true)
36683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3669fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			int 		firstThread = -1;
36703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// Find first thread with messages
36723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
36733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
36743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (m_threads[threadNdx]->getMessageCount() > indices[threadNdx])
36753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
36763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					firstThread = threadNdx;
36773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
36783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
36793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
36803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// No more messages
36823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (firstThread == -1)
36833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
36843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
36863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
36873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				// No more messages in this thread
36883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (m_threads[threadNdx]->getMessageCount() <= indices[threadNdx])
36893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					continue;
36903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
36913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if ((m_threads[threadNdx]->getMessage(indices[threadNdx]).getTime() - m_beginTimeUs) < (m_threads[firstThread]->getMessage(indices[firstThread]).getTime() - m_beginTimeUs))
36923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					firstThread = threadNdx;
36933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
36943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3695fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			tcu::ThreadUtil::Message message = m_threads[firstThread]->getMessage(indices[firstThread]);
3696fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
3697fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			m_log << tcu::TestLog::Message << "[" << (message.getTime() - m_beginTimeUs) << "] (" << firstThread << ") " << message.getMessage() << tcu::TestLog::EndMessage;
36983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			indices[firstThread]++;
36993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
37003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3701fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi		if (m_timeOutTimeUs != 0)
3702fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			m_log << tcu::TestLog::Message << "[" << (m_timeOutTimeUs - m_beginTimeUs) << "] Execution timeout limit reached" << tcu::TestLog::EndMessage;
3703fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
37043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool isOk = true;
37053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool notSupported = false;
37063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
37083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3709fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			const tcu::ThreadUtil::Thread::ThreadStatus status = m_threads[threadNdx]->getStatus();
3710fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
3711fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			switch (status)
37123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
3713fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_FAILED:
3714fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_INIT_FAILED:
3715fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_RUNNING:
3716fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					isOk = false;
3717fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					break;
37183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3719fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_NOT_SUPPORTED:
3720fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					notSupported = true;
3721fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					break;
3722fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
3723fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				case tcu::ThreadUtil::Thread::THREADSTATUS_READY:
3724fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					// Nothing
3725fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					break;
3726fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi
3727fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi				default:
3728fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					DE_ASSERT(false);
3729fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi					isOk = false;
3730fd41d5db179bcd04819c656c3100324a787a456fMika Isojärvi			};
37313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
37323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (notSupported)
37343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			throw tcu::NotSupportedError("Thread threw tcu::NotSupportedError", "", __FILE__, __LINE__);
37353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (isOk)
37373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
37383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
37393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
37403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return STOP;
37423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
37433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return CONTINUE;
37453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
37463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37473c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void addSimpleTests (EglTestContext& ctx, tcu::TestCaseGroup* group, bool useSync, bool serverSync)
37483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
37493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
37503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* bufferTests = new TestCaseGroup(ctx, "buffers", "Buffer management tests");
37513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
37533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
37543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_BUFFER;
37563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
37573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
37583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 0;
37593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
37603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
37613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bufferTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "gen_delete", "Generate and delete buffer"));
37623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
37633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
37653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
37663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_BUFFER;
37683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
37693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
37703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
37713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
37723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
37733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bufferTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "bufferdata", "Generate, set data and delete buffer"));
37743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
37753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
37773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
37783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_BUFFER;
37803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
37813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
37823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
37833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
37843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
37853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bufferTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "buffersubdata", "Generate, set data, update data and delete buffer"));
37863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
37873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
37893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
37903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
37913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_BUFFER;
37923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
37933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
37943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
37953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
37963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
37973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bufferTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "bufferdata_render", "Generate, set data, render and delete buffer"));
37983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
37993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
38013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
38023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_BUFFER;
38043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
38053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
38063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
38073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
38083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
38093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bufferTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "buffersubdata_render", "Generate, set data, update data, render and delete buffer"));
38103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
38113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(bufferTests);
38133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
38143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
38163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* textureTests = new TestCaseGroup(ctx, "textures", "Texture management tests");
38173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
38193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
38203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
38223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
38233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
38243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 0;
38253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
38263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
38273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "gen_delete", "Generate and delete texture"));
38283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
38293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
38313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
38323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
38343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
38353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
38363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
38373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
38383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
38393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d", "Generate, set data and delete texture"));
38403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
38413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
38433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
38443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
38463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
38473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
38483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
38493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
38503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
38513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d_texsubimage2d", "Generate, set data, update data and delete texture"));
38523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
38533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
38553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
38563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
38583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
38593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
38603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
38613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 2;
38623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
38633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d_copytexsubimage2d", "Generate, set data, update data and delete texture"));
38643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
38653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
38673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
38683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
38703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
38713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
38723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
38733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
38743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
38753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d_render", "Generate, set data, render and delete texture"));
38763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
38773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
38793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
38803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
38823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
38833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
38843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
38853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
38863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
38873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d_texsubimage2d_render", "Generate, set data, update data, render and delete texture"));
38883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
38893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
38913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
38923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
38933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
38943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
38953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
38963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
38973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 2;
38983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
38993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d_copytexsubimage2d_render", "Generate, set data, update data, render and delete texture"));
39003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
39013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
39033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
39043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
39063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
39073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
39083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
39093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
39103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
39113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d", "Generate, set data and delete texture"));
39123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
39133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
39153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
39163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
39183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
39193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
39203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
39213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
39223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
39233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d_texsubimage2d", "Generate, set data, update data and delete texture"));
39243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
39253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
39273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
39283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
39303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
39313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
39323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
39333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 2;
39343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
39353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d_copytexsubimage2d", "Generate, set data, update data and delete texture"));
39363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
39373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
39393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
39403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
39423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
39433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
39443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
39453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
39463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
39473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d_render", "Generate, set data, render and delete texture"));
39483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
39493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
39513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
39523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
39543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
39553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
39563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
39573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
39583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
39593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d_texsubimage2d_render", "Generate, set data, update data, render and delete texture"));
39603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
39613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
39633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
39643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
39663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
39673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
39683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
39693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 2;
39703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
39713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d_copytexsubimage2d_render", "Generate, set data, update data, render and delete texture"));
39723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
39733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(textureTests);
39753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
39763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
39783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* shaderTests = new TestCaseGroup(ctx, "shaders", "Shader management tests");
39793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
39813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
39823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_VERTEX_SHADER;
39843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
39853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
39863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 0;
39873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
39883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
39893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "vtx_create_destroy", "Create and delete shader"));
39903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
39913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
39933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
39943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_VERTEX_SHADER;
39963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
39973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
39983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
39993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
40003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
40013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "vtx_shadersource", "Create, set source and delete shader"));
40023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
40033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
40053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
40063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_VERTEX_SHADER;
40083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
40093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
40103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
40113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
40123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
40133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "vtx_compile", "Create, set source, compile and delete shader"));
40143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
40153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
40173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
40183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_FRAGMENT_SHADER;
40203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
40213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
40223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 0;
40233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
40243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
40253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "frag_create_destroy", "Create and delete shader"));
40263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
40273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
40293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
40303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_FRAGMENT_SHADER;
40323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
40333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
40343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
40353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
40363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
40373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "frag_shadersource", "Create, set source and delete shader"));
40383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
40393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
40413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
40423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_FRAGMENT_SHADER;
40443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
40453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
40463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
40473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
40483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
40493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "frag_compile", "Create, set source, compile and delete shader"));
40503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
40513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(shaderTests);
40533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
40543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
40563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* programTests = new TestCaseGroup(ctx, "programs", "Program management tests");
40573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
40593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
40603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_PROGRAM;
40623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
40633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
40643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 0;
40653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
40663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
40673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			programTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "create_destroy", "Create and delete program"));
40683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
40693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
40713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
40723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_PROGRAM;
40743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
40753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
40763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
40773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
40783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
40793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			programTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "attach", "Create, attach shaders and delete program"));
40803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
40813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
40833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
40843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_PROGRAM;
40863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
40873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
40883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
40893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
40903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
40913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			programTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "link", "Create, attach shaders, link and delete program"));
40923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
40933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(programTests);
40953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
40963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
40983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* imageTests = new TestCaseGroup(ctx, "images", "Image management tests");
40993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* textureSourceTests = new TestCaseGroup(ctx, "texture_source", "Image management tests with texture source.");
41013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
41023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
41033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
41053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
41063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
41073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 1;
41083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
41093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
41103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "create_destroy", "Create and destroy EGLImage."));
41113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
41123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
41143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
41153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
41173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
41183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
41193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
41203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
41213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
41223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "create_texture", "Create texture from image."));
41233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
41243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
41263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
41273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
41293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
41303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
41313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
41323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
41333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
41343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "texsubimage2d", "Modify texture created from image with glTexSubImage2D."));
41353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
41363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
41383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
41393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
41413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
41423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
41433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
41443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 2;
41453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
41463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copytexsubimage2d", "Modify texture created from image with glCopyTexSubImage2D."));
41473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
41483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
41503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
41513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
41533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
41543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
41553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
41563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 3;
41573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
41583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d", "Modify texture created from image with glTexImage2D."));
41593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
41603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
41623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
41633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
41653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
41663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
41673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
41683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 4;
41693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = false;
41703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d", "Modify texture created from image with glCopyTexImage2D."));
41713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
41723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
41743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
41753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
41773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
41783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
41793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
41803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 0;
41813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
41823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "create_texture_render", "Create texture from image and render."));
41833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
41843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
41863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
41873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
41893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
41903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
41913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
41923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 1;
41933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
41943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "texsubimage2d_render", "Modify texture created from image and render."));
41953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
41963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
41973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
41983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
41993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
42013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
42023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
42033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
42043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 2;
42053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
42063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copytexsubimage2d_render", "Modify texture created from image and render."));
42073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
42083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
42103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
42113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
42133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
42143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
42153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
42163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 3;
42173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
42183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d_render", "Modify texture created from image and render."));
42193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
42203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
42223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLES2ThreadedSharingTest::TestConfig config;
42233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
42253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.useFenceSync = useSync;
42263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.serverSync	= serverSync;
42273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.define = 2;
42283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.modify = 4;
42293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			config.render = true;
42303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d_render", "Modify texture created from image and render."));
42313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
42323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		imageTests->addChild(textureSourceTests);
42343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(imageTests);
42363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
42373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
42393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42403c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void addRandomTests (EglTestContext& ctx, tcu::TestCaseGroup* group, bool useSync, bool serverSync)
42413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
42423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
42433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* textureTests = new TestCaseGroup(ctx, "textures", "Texture management tests");
42443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
42463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* genTextureTests = new TestCaseGroup(ctx, "gen_delete", "Texture gen and delete tests");
42473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int textureTestNdx = 0; textureTestNdx < 20; textureTestNdx++)
42493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
42503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
42513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
42523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
42533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + textureTestNdx % 5;
42543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 30 + textureTestNdx;
42553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]				= 1.0f;
42573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.25f;
42593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]	= 0.75f;
42603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.5f;
42623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]	= 0.5f;
42633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(textureTestNdx);
42653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				genTextureTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
42663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
42673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(genTextureTests);
42693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
42703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
42723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texImage2DTests = new TestCaseGroup(ctx, "teximage2d", "Texture gen, delete and teximage2D tests");
42733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int textureTestNdx = 0; textureTestNdx < 20; textureTestNdx++)
42753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
42763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
42773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
42783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
42793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + textureTestNdx % 5;
42803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 40 + textureTestNdx;
42813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]				= 1.0f;
42833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.10f;
42853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]	= 0.10f;
42863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]		= 0.80f;
42873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.30f;
42893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]	= 0.40f;
42903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]		= 0.30f;
42913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]		= 0.40f;
42933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]		= 0.40f;
42943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]			= 0.20f;
42953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(textureTestNdx);
42973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
42983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
42993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(texImage2DTests);
43013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
43023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
43043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texSubImage2DTests = new TestCaseGroup(ctx, "texsubimage2d", "Texture gen, delete, teximage2D and texsubimage2d tests");
43053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int textureTestNdx = 0; textureTestNdx < 20; textureTestNdx++)
43073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
43083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
43093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
43103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
43113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + textureTestNdx % 5;
43123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 50 + textureTestNdx;
43133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]				= 1.0f;
43153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.05f;
43173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]	= 0.10f;
43183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]		= 0.80f;
43193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXSUBIMAGE2D]		= 0.05f;
43203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.30f;
43223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]	= 0.40f;
43233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]		= 0.20f;
43243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXSUBIMAGE2D]	= 0.10f;
43253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]		= 0.20f;
43273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]		= 0.20f;
43283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]			= 0.10f;
43293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXSUBIMAGE2D]			= 0.50f;
43303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.20f;
43323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]		= 0.25f;
43333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]			= 0.25f;
43343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_TEXSUBIMAGE2D]		= 0.30f;
43353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(textureTestNdx);
43373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
43383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
43393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(texSubImage2DTests);
43413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
43423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
43443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* copyTexImage2DTests = new TestCaseGroup(ctx, "copyteximage2d", "Texture gen, delete and copyteximage2d tests");
43453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int textureTestNdx = 0; textureTestNdx < 20; textureTestNdx++)
43473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
43483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
43493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
43503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
43513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + textureTestNdx % 5;
43523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 40 + textureTestNdx;
43533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]				= 1.0f;
43553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.10f;
43573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]	= 0.10f;
43583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_COPYTEXIMAGE2D]	= 0.80f;
43593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.30f;
43613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]	= 0.40f;
43623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_COPYTEXIMAGE2D]	= 0.30f;
43633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.40f;
43653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]	= 0.40f;
43663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_COPYTEXIMAGE2D]	= 0.20f;
43673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(textureTestNdx);
43703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				copyTexImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
43713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
43723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(copyTexImage2DTests);
43743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
43753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
43773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* copyTexSubImage2DTests = new TestCaseGroup(ctx, "copytexsubimage2d", "Texture gen, delete, teximage2D and copytexsubimage2d tests");
43783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int textureTestNdx = 0; textureTestNdx < 20; textureTestNdx++)
43803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
43813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
43823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
43833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
43843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + textureTestNdx % 5;
43853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 50 + textureTestNdx;
43863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]					= 1.0f;
43883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]		= 0.05f;
43903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]		= 0.10f;
43913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]			= 0.80f;
43923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_COPYTEXSUBIMAGE2D]		= 0.05f;
43933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]		= 0.30f;
43953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]		= 0.40f;
43963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]			= 0.20f;
43973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_COPYTEXSUBIMAGE2D]	= 0.10f;
43983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]			= 0.20f;
44003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]			= 0.20f;
44013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]				= 0.10f;
44023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_COPYTEXSUBIMAGE2D]			= 0.50f;
44033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]	= 0.20f;
44053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]		= 0.25f;
44063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]			= 0.25f;
44073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_COPYTEXSUBIMAGE2D]	= 0.30f;
44083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(textureTestNdx);
44113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				copyTexSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
44123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
44133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			textureTests->addChild(copyTexSubImage2DTests);
44153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
44163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(textureTests);
44183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* bufferTests = new TestCaseGroup(ctx, "buffers", "Buffer management tests");
44203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
44223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* genBufferTests = new TestCaseGroup(ctx, "gen_delete", "Buffer gen and delete tests");
44233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int bufferTestNdx = 0; bufferTestNdx < 20; bufferTestNdx++)
44253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
44263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
44273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
44283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
44293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + bufferTestNdx % 5;
44303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 30 + bufferTestNdx;
44313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_BUFFER]				= 1.0f;
44333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_DESTROY_BUFFER]		= 0.25f;
44353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_CREATE_BUFFER]		= 0.75f;
44363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_DESTROY_BUFFER]	= 0.5f;
44383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_CREATE_BUFFER]		= 0.5f;
44393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(bufferTestNdx);
44413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				genBufferTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
44423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
44433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bufferTests->addChild(genBufferTests);
44453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
44463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
44483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texImage2DTests = new TestCaseGroup(ctx, "bufferdata", "Buffer gen, delete and bufferdata tests");
44493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int bufferTestNdx = 0; bufferTestNdx < 20; bufferTestNdx++)
44513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
44523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
44533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
44543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
44553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + bufferTestNdx % 5;
44563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 40 + bufferTestNdx;
44573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_BUFFER]				= 1.0f;
44593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_DESTROY_BUFFER]		= 0.10f;
44613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_CREATE_BUFFER]		= 0.10f;
44623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_BUFFER_DATA]		= 0.80f;
44633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_DESTROY_BUFFER]	= 0.30f;
44653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_CREATE_BUFFER]		= 0.40f;
44663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_BUFFER_DATA]		= 0.30f;
44673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_DESTROY_BUFFER]		= 0.40f;
44693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_CREATE_BUFFER]		= 0.40f;
44703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_BUFFER_DATA]			= 0.20f;
44713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(bufferTestNdx);
44733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
44743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
44753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bufferTests->addChild(texImage2DTests);
44773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
44783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
44803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texSubImage2DTests = new TestCaseGroup(ctx, "buffersubdata", "Buffer gen, delete, bufferdata and bufferdata tests");
44813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int bufferTestNdx = 0; bufferTestNdx < 20; bufferTestNdx++)
44833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
44843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
44853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
44863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
44873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + bufferTestNdx % 5;
44883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 50 + bufferTestNdx;
44893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_BUFFER]				= 1.0f;
44913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_DESTROY_BUFFER]		= 0.05f;
44933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_CREATE_BUFFER]		= 0.10f;
44943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_BUFFER_DATA]		= 0.80f;
44953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_BUFFER_SUBDATA]		= 0.05f;
44963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
44973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_DESTROY_BUFFER]	= 0.30f;
44983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_CREATE_BUFFER]		= 0.40f;
44993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_BUFFER_DATA]		= 0.20f;
45003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_BUFFER_SUBDATA]	= 0.10f;
45013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_DESTROY_BUFFER]		= 0.20f;
45033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_CREATE_BUFFER]		= 0.20f;
45043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_BUFFER_DATA]			= 0.10f;
45053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_BUFFER_SUBDATA]		= 0.50f;
45063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_SUBDATA][THREADOPERATIONID_DESTROY_BUFFER]	= 0.20f;
45083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_SUBDATA][THREADOPERATIONID_CREATE_BUFFER]		= 0.25f;
45093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_SUBDATA][THREADOPERATIONID_BUFFER_DATA]		= 0.25f;
45103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_BUFFER_SUBDATA][THREADOPERATIONID_BUFFER_SUBDATA]	= 0.30f;
45113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(bufferTestNdx);
45133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
45143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
45153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bufferTests->addChild(texSubImage2DTests);
45173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
45183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(bufferTests);
45203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* shaderTests = new TestCaseGroup(ctx, "shaders", "Shader management tests");
45223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
45243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* createShaderTests = new TestCaseGroup(ctx, "create_destroy", "Shader create and destroy tests");
45253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int shaderTestNdx = 0; shaderTestNdx < 20; shaderTestNdx++)
45273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
45283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
45293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
45303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
45313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + shaderTestNdx % 5;
45323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 30 + shaderTestNdx;
45333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_VERTEX_SHADER]						= 0.5f;
45353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]						= 0.5f;
45363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_SHADER]				= 0.20f;
45383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.40f;
45393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]		= 0.40f;
45403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_SHADER]			= 0.20f;
45423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.40f;
45433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]	= 0.40f;
45443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_SHADER]					= 0.5f;
45463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.25f;
45473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.25f;
45483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(shaderTestNdx);
45503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				createShaderTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
45513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
45523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTests->addChild(createShaderTests);
45543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
45553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
45573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texImage2DTests = new TestCaseGroup(ctx, "source", "Shader create, destroy and source tests");
45583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int shaderTestNdx = 0; shaderTestNdx < 20; shaderTestNdx++)
45603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
45613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
45623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
45633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
45643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + shaderTestNdx % 5;
45653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 40 + shaderTestNdx;
45663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_VERTEX_SHADER]						= 0.5f;
45683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]						= 0.5f;
45693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_SHADER]				= 0.10f;
45713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.20f;
45723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]		= 0.20f;
45733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_SOURCE]				= 0.50f;
45743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_SHADER]			= 0.10f;
45763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.20f;
45773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]	= 0.20f;
45783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_SOURCE]				= 0.50f;
45793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_SHADER]					= 0.30f;
45813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.30f;
45823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.30f;
45833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_SOURCE]						= 0.10f;
45843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_DESTROY_SHADER]						= 0.20f;
45863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
45873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]				= 0.20f;
45883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_SOURCE]						= 0.40f;
45893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(shaderTestNdx);
45913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
45923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
45933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTests->addChild(texImage2DTests);
45953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
45963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
45973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
45983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texSubImage2DTests = new TestCaseGroup(ctx, "compile", "Shader create, destroy, source and compile tests");
45993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int shaderTestNdx = 0; shaderTestNdx < 20; shaderTestNdx++)
46013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
46023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
46033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
46043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
46053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + shaderTestNdx % 5;
46063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 50 + shaderTestNdx;
46073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_VERTEX_SHADER]						= 0.5f;
46093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]						= 0.5f;
46103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_SHADER]				= 0.10f;
46123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.15f;
46133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]		= 0.15f;
46143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_SOURCE]				= 0.50f;
46153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_COMPILE]				= 0.10f;
46163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_SHADER]			= 0.10f;
46183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.15f;
46193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]	= 0.15f;
46203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_SOURCE]				= 0.50f;
46213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_COMPILE]			= 0.10f;
46223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_SHADER]					= 0.30f;
46243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.25f;
46253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.25f;
46263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_SOURCE]						= 0.10f;
46273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_COMPILE]					= 0.10f;
46283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_DESTROY_SHADER]						= 0.10f;
46303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.10f;
46313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]				= 0.10f;
46323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_SOURCE]						= 0.20f;
46333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_COMPILE]						= 0.50f;
46343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_DESTROY_SHADER]					= 0.15f;
46363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.15f;
46373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.15f;
46383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_SHADER_SOURCE]						= 0.30f;
46393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_SHADER_COMPILE]					= 0.30f;
46403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(shaderTestNdx);
46423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
46433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
46443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTests->addChild(texSubImage2DTests);
46463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
46473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(shaderTests);
46493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* programTests = new TestCaseGroup(ctx, "programs", "Program management tests");
46513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
46533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* createProgramTests = new TestCaseGroup(ctx, "create_destroy", "Program create and destroy tests");
46543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int programTestNdx = 0; programTestNdx < 20; programTestNdx++)
46563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
46573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
46583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
46593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
46603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + programTestNdx % 5;
46613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 30 + programTestNdx;
46623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_PROGRAM]				= 1.0f;
46643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM]	= 0.25f;
46663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM]	= 0.75f;
46673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM]	= 0.5f;
46693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM]	= 0.5f;
46703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(programTestNdx);
46723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				createProgramTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
46733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
46743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			programTests->addChild(createProgramTests);
46763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
46773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
46793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texImage2DTests = new TestCaseGroup(ctx, "attach_detach", "Program create, destroy, attach and detach tests");
46803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int programTestNdx = 0; programTestNdx < 20; programTestNdx++)
46823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
46833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
46843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
46853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
46863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + programTestNdx % 5;
46873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 60 + programTestNdx;
46883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_VERTEX_SHADER]						= 0.35f;
46903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]						= 0.35f;
46913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_PROGRAM]								= 0.30f;
46923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_SHADER]				= 0.10f;
46943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.10f;
46953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]		= 0.10f;
46963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_SOURCE]				= 0.30f;
46973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_COMPILE]				= 0.10f;
46983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_PROGRAM]				= 0.10f;
46993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_PROGRAM]				= 0.05f;
47003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_ATTACH_SHADER]				= 0.15f;
47013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_SHADER]			= 0.10f;
47033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.10f;
47043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]	= 0.10f;
47053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_SOURCE]				= 0.30f;
47063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_COMPILE]			= 0.10f;
47073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_PROGRAM]			= 0.10f;
47083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_PROGRAM]			= 0.05f;
47093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_ATTACH_SHADER]				= 0.15f;
47103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_SHADER]					= 0.20f;
47123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
47133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.20f;
47143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_SOURCE]						= 0.10f;
47153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_COMPILE]					= 0.10f;
47163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_PROGRAM]					= 0.15f;
47173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.15f;
47183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_ATTACH_SHADER]						= 0.15f;
47193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_DESTROY_SHADER]						= 0.10f;
47213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.10f;
47223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]				= 0.10f;
47233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_SOURCE]						= 0.20f;
47243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_COMPILE]						= 0.50f;
47253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_PROGRAM]						= 0.10f;
47263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.10f;
47273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_ATTACH_SHADER]						= 0.25f;
47283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_DESTROY_SHADER]					= 0.15f;
47303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.15f;
47313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.15f;
47323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_SHADER_SOURCE]						= 0.30f;
47333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_SHADER_COMPILE]					= 0.30f;
47343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_PROGRAM]					= 0.10f;
47353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.10f;
47363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_ATTACH_SHADER]						= 0.35f;
47373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_DESTROY_SHADER]					= 0.10f;
47393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
47403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.20f;
47413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_SHADER_SOURCE]						= 0.05f;
47423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_SHADER_COMPILE]					= 0.05f;
47433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM]					= 0.15f;
47443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.05f;
47453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_ATTACH_SHADER]						= 0.40f;
47463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_DESTROY_SHADER]					= 0.20f;
47483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
47493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.20f;
47503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_SHADER_SOURCE]					= 0.10f;
47513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_SHADER_COMPILE]					= 0.10f;
47523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM]					= 0.20f;
47533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.15f;
47543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_ATTACH_SHADER]					= 0.10f;
47553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_DESTROY_SHADER]						= 0.20f;
47573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
47583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]				= 0.20f;
47593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_SHADER_SOURCE]						= 0.10f;
47603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_SHADER_COMPILE]						= 0.10f;
47613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_CREATE_PROGRAM]						= 0.15f;
47623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.15f;
47633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_ATTACH_SHADER]						= 0.30f;
47643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(programTestNdx);
47663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
47673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
47683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			programTests->addChild(texImage2DTests);
47703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
47713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
47733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texSubImage2DTests = new TestCaseGroup(ctx, "link", "Program create, destroy, attach and link tests");
47743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int programTestNdx = 0; programTestNdx < 20; programTestNdx++)
47763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
47773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
47783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
47793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
47803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + programTestNdx % 5;
47813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 70 + programTestNdx;
47823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_VERTEX_SHADER]						= 0.35f;
47843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]						= 0.35f;
47853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_PROGRAM]								= 0.30f;
47863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_SHADER]				= 0.10f;
47883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.10f;
47893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]		= 0.10f;
47903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_SOURCE]				= 0.30f;
47913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_COMPILE]				= 0.10f;
47923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_PROGRAM]				= 0.10f;
47933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_PROGRAM]				= 0.05f;
47943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_ATTACH_SHADER]				= 0.15f;
47953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_LINK_PROGRAM]				= 0.10f;
47963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_SHADER]			= 0.10f;
47983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]		= 0.10f;
47993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]	= 0.10f;
48003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_SOURCE]				= 0.30f;
48013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_COMPILE]			= 0.10f;
48023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_PROGRAM]			= 0.10f;
48033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_PROGRAM]			= 0.05f;
48043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_ATTACH_SHADER]				= 0.15f;
48053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_LINK_PROGRAM]				= 0.10f;
48063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_SHADER]					= 0.20f;
48083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
48093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.20f;
48103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_SOURCE]						= 0.10f;
48113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_COMPILE]					= 0.10f;
48123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_PROGRAM]					= 0.15f;
48133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.15f;
48143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_ATTACH_SHADER]						= 0.15f;
48153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_LINK_PROGRAM]						= 0.10f;
48163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_DESTROY_SHADER]						= 0.10f;
48183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.10f;
48193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]				= 0.10f;
48203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_SOURCE]						= 0.20f;
48213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_COMPILE]						= 0.50f;
48223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_PROGRAM]						= 0.10f;
48233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.10f;
48243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_ATTACH_SHADER]						= 0.25f;
48253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_LINK_PROGRAM]						= 0.20f;
48263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_DESTROY_SHADER]					= 0.15f;
48283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.15f;
48293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.15f;
48303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_SHADER_SOURCE]						= 0.30f;
48313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_SHADER_COMPILE]					= 0.30f;
48323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_PROGRAM]					= 0.10f;
48333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.10f;
48343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_ATTACH_SHADER]						= 0.35f;
48353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_LINK_PROGRAM]						= 0.20f;
48363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_DESTROY_SHADER]					= 0.10f;
48383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
48393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.20f;
48403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_SHADER_SOURCE]						= 0.05f;
48413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_SHADER_COMPILE]					= 0.05f;
48423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM]					= 0.15f;
48433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.05f;
48443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_ATTACH_SHADER]						= 0.40f;
48453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_LINK_PROGRAM]						= 0.05f;
48463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_DESTROY_SHADER]					= 0.20f;
48483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
48493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]			= 0.20f;
48503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_SHADER_SOURCE]					= 0.10f;
48513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_SHADER_COMPILE]					= 0.10f;
48523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM]					= 0.20f;
48533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.15f;
48543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_ATTACH_SHADER]					= 0.10f;
48553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_LINK_PROGRAM]						= 0.05f;
48563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_DESTROY_SHADER]						= 0.20f;
48583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
48593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]				= 0.20f;
48603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_SHADER_SOURCE]						= 0.10f;
48613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_SHADER_COMPILE]						= 0.10f;
48623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_CREATE_PROGRAM]						= 0.15f;
48633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_DESTROY_PROGRAM]					= 0.15f;
48643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_ATTACH_SHADER]						= 0.30f;
48653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_LINK_PROGRAM]						= 0.30f;
48663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_DESTROY_SHADER]						= 0.20f;
48683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_CREATE_VERTEX_SHADER]				= 0.20f;
48693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]				= 0.20f;
48703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_SHADER_SOURCE]						= 0.10f;
48713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_SHADER_COMPILE]						= 0.10f;
48723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM]						= 0.20f;
48733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM]						= 0.15f;
48743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_ATTACH_SHADER]						= 0.10f;
48753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_LINK_PROGRAM]						= 0.05f;
48763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(programTestNdx);
48783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
48793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
48803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			programTests->addChild(texSubImage2DTests);
48823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
48833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(programTests);
48853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* imageTests = new TestCaseGroup(ctx, "images", "Image management tests");
48873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
48893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texImage2DTests = new TestCaseGroup(ctx, "create_destroy", "Image gen, delete and teximage2D tests");
48903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int imageTestNdx = 0; imageTestNdx < 20; imageTestNdx++)
48923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
48933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
48943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
48953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
48963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + imageTestNdx % 5;
48973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 70 + imageTestNdx;
48983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useImages		= true;
48993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]									= 1.0f;
49013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.10f;
49033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.15f;
49043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.40f;
49053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.35f;
49063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]							= 0.30f;
49073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.15f;
49093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.20f;
49103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.40f;
49113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.35f;
49123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]							= 0.15f;
49133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]			= 0.25f;
49153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]				= 0.25f;
49163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]	= 0.40f;
49173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]				= 0.35f;
49183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]					= 0.15f;
49193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.25f;
49213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
49223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.40f;
49233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.35f;
49243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXIMAGE2D]								= 0.15f;
49253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]							= 0.25f;
49273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
49283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]					= 0.40f;
49293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE]								= 0.35f;
49303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]								= 0.15f;
49313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]					= 0.25f;
49333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]					= 0.25f;
49343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.30f;
49353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.15f;
49363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXIMAGE2D]						= 0.15f;
49373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(imageTestNdx);
49393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
49403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
49413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			imageTests->addChild(texImage2DTests);
49433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
49443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
49463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texImage2DTests = new TestCaseGroup(ctx, "teximage2d", "Image gen, delete and teximage2D tests");
49473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int imageTestNdx = 0; imageTestNdx < 20; imageTestNdx++)
49493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
49503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
49513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
49523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
49533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + imageTestNdx % 5;
49543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 70 + imageTestNdx;
49553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useImages		= true;
49563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]									= 1.0f;
49583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.10f;
49603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.15f;
49613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.20f;
49623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.15f;
49633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]							= 0.30f;
49643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.20f;
49653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.15f;
49673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.20f;
49683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.15f;
49693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.15f;
49703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]							= 0.15f;
49713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.15f;
49723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]			= 0.25f;
49743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]				= 0.25f;
49753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]	= 0.25f;
49763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]				= 0.25f;
49773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]					= 0.15f;
49783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]			= 0.15f;
49793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.25f;
49813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
49823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.25f;
49833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.25f;
49843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXIMAGE2D]								= 0.15f;
49853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]						= 0.15f;
49863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]							= 0.25f;
49883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
49893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]					= 0.25f;
49903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE]								= 0.25f;
49913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]								= 0.15f;
49923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXTURE_FROM_IMAGE]						= 0.15f;
49933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
49943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]					= 0.25f;
49953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]					= 0.25f;
49963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.25f;
49973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.25f;
49983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXIMAGE2D]						= 0.15f;
49993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]				= 0.15f;
50003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(imageTestNdx);
50023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
50033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
50043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			imageTests->addChild(texImage2DTests);
50063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
50073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
50093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* texSubImage2DTests = new TestCaseGroup(ctx, "texsubimage2d", "Image gen, delete, teximage2D and texsubimage2d tests");
50103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int imageTestNdx = 0; imageTestNdx < 20; imageTestNdx++)
50123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
50133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
50143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
50153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
50163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + imageTestNdx % 5;
50173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 70 + imageTestNdx;
50183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useImages		= true;
50193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]									= 1.0f;
50213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.10f;
50233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.15f;
50243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.20f;
50253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.15f;
50263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]							= 0.30f;
50273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.20f;
50283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXSUBIMAGE2D]							= 0.10f;
50293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.15f;
50313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.20f;
50323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.15f;
50333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.15f;
50343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]							= 0.15f;
50353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.15f;
50363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXSUBIMAGE2D]						= 0.10f;
50373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]			= 0.25f;
50393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]				= 0.25f;
50403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]	= 0.25f;
50413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]				= 0.25f;
50423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]					= 0.15f;
50433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]			= 0.15f;
50443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXSUBIMAGE2D]				= 0.10f;
50453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.25f;
50473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
50483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.25f;
50493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.25f;
50503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXIMAGE2D]								= 0.15f;
50513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]						= 0.15f;
50523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXSUBIMAGE2D]							= 0.10f;
50533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]							= 0.25f;
50553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
50563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]					= 0.25f;
50573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE]								= 0.25f;
50583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]								= 0.15f;
50593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXTURE_FROM_IMAGE]						= 0.15f;
50603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXSUBIMAGE2D]								= 0.10f;
50613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]					= 0.25f;
50633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]					= 0.25f;
50643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.25f;
50653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.25f;
50663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXIMAGE2D]						= 0.15f;
50673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]				= 0.15f;
50683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXSUBIMAGE2D]						= 0.10f;
50693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.25f;
50713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
50723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.25f;
50733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE]							= 0.25f;
50743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]								= 0.15f;
50753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_TEXTURE_FROM_IMAGE]						= 0.15f;
50763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_TEXSUBIMAGE2D]							= 0.10f;
50773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(imageTestNdx);
50793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				texSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
50803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
50813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			imageTests->addChild(texSubImage2DTests);
50833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
50843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
50863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* copyTexImage2DTests = new TestCaseGroup(ctx, "copyteximage2d", "Image gen, delete and copyteximage2d tests");
50873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int imageTestNdx = 0; imageTestNdx < 20; imageTestNdx++)
50893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
50903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
50913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
50923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
50933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + imageTestNdx % 5;
50943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 70 + imageTestNdx;
50953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useImages		= true;
50963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]									= 1.0f;
50983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.10f;
51003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.15f;
51013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.20f;
51023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.15f;
51033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_COPYTEXIMAGE2D]						= 0.30f;
51043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.20f;
51053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.15f;
51073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.20f;
51083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.15f;
51093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.15f;
51103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_COPYTEXIMAGE2D]						= 0.15f;
51113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.15f;
51123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]			= 0.25f;
51143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]				= 0.25f;
51153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]	= 0.25f;
51163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]				= 0.25f;
51173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_COPYTEXIMAGE2D]				= 0.15f;
51183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]			= 0.15f;
51193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.25f;
51213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
51223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.25f;
51233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.25f;
51243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_COPYTEXIMAGE2D]							= 0.15f;
51253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]						= 0.15f;
51263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.25f;
51283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]						= 0.25f;
51293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.25f;
51303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE]							= 0.25f;
51313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_COPYTEXIMAGE2D]						= 0.15f;
51323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.15f;
51333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]					= 0.25f;
51353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]					= 0.25f;
51363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.25f;
51373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.25f;
51383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_COPYTEXIMAGE2D]					= 0.15f;
51393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]				= 0.15f;
51403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(imageTestNdx);
51423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				copyTexImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
51433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
51443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			imageTests->addChild(copyTexImage2DTests);
51463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
51473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
51493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCaseGroup* copyTexSubImage2DTests = new TestCaseGroup(ctx, "copytexsubimage2d", "Image gen, delete, teximage2D and copytexsubimage2d tests");
51503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int imageTestNdx = 0; imageTestNdx < 20; imageTestNdx++)
51523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
51533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLES2SharingRandomTest::TestConfig config;
51543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useFenceSync		= useSync;
51553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.serverSync		= serverSync;
51563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.threadCount		= 2 + imageTestNdx % 5;
51573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.operationCount	= 70 + imageTestNdx;
51583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.useImages		= true;
51593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE]									= 1.0f;
51613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.10f;
51633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.15f;
51643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.20f;
51653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.15f;
51663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]							= 0.30f;
51673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.20f;
51683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_COPYTEXSUBIMAGE2D]						= 0.10f;
51693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.15f;
51713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]						= 0.20f;
51723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.15f;
51733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.15f;
51743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]							= 0.15f;
51753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.15f;
51763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_COPYTEXSUBIMAGE2D]					= 0.10f;
51773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE]			= 0.25f;
51793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE]				= 0.25f;
51803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]	= 0.25f;
51813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE]				= 0.25f;
51823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXIMAGE2D]					= 0.15f;
51833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]			= 0.15f;
51843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_COPYTEXSUBIMAGE2D]			= 0.10f;
51853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]						= 0.25f;
51873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
51883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]				= 0.25f;
51893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]							= 0.25f;
51903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXIMAGE2D]								= 0.15f;
51913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]						= 0.15f;
51923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_COPYTEXSUBIMAGE2D]						= 0.10f;
51933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]							= 0.25f;
51953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]							= 0.25f;
51963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]					= 0.25f;
51973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE]								= 0.25f;
51983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]								= 0.15f;
51993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXTURE_FROM_IMAGE]						= 0.15f;
52003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_COPYTEXSUBIMAGE2D]							= 0.10f;
52013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE]					= 0.25f;
52033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_TEXTURE]					= 0.25f;
52043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.25f;
52053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_IMAGE]						= 0.25f;
52063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXIMAGE2D]						= 0.15f;
52073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE]				= 0.15f;
52083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_COPYTEXSUBIMAGE2D]					= 0.10f;
52093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE]					= 0.25f;
52113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE]						= 0.25f;
52123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]			= 0.25f;
52133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE]						= 0.25f;
52143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_TEXIMAGE2D]							= 0.15f;
52153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_TEXTURE_FROM_IMAGE]					= 0.15f;
52163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_COPYTEXSUBIMAGE2D]					= 0.10f;
52173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				std::string	name = de::toString(imageTestNdx);
52203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				copyTexSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
52213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
52223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			imageTests->addChild(copyTexSubImage2DTests);
52243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
52253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(imageTests);
52273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
52283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
52293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52303c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGLES2SharingThreadedTests::GLES2SharingThreadedTests (EglTestContext& eglTestCtx)
52313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup(eglTestCtx, "multithread", "EGL GLES2 sharing multithread tests")
52323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
52333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
52343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52353c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GLES2SharingThreadedTests::init (void)
52363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
52373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::TestCaseGroup* simpleTests = new TestCaseGroup(m_eglTestCtx, "simple", "Simple multithreaded tests");
52383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addSimpleTests(m_eglTestCtx, simpleTests, false, false);
52393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(simpleTests);
52403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestCaseGroup* randomTests = new TestCaseGroup(m_eglTestCtx, "random", "Random tests");
52423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addRandomTests(m_eglTestCtx, randomTests, false, false);
52433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(randomTests);
52443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::TestCaseGroup* simpleTestsSync = new TestCaseGroup(m_eglTestCtx, "simple_egl_sync", "Simple multithreaded tests with EGL_KHR_fence_sync");
52463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addSimpleTests(m_eglTestCtx, simpleTestsSync, true, false);
52473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(simpleTestsSync);
52483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestCaseGroup* randomTestsSync = new TestCaseGroup(m_eglTestCtx, "random_egl_sync", "Random tests with EGL_KHR_fence_sync");
52503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addRandomTests(m_eglTestCtx, randomTestsSync, true, false);
52513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(randomTestsSync);
52523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52533c827367444ee418f129b2c238299f49d3264554Jarkko 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");
52543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addSimpleTests(m_eglTestCtx, simpleTestsServerSync, true, true);
52553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(simpleTestsServerSync);
52563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestCaseGroup* randomTestsServerSync = new TestCaseGroup(m_eglTestCtx, "random_egl_server_sync", "Random tests with EGL_KHR_fence_sync and EGL_KHR_wait_sync");
52583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addRandomTests(m_eglTestCtx, randomTestsServerSync, true, true);
52593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(randomTestsServerSync);
52603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
52613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
52623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // egl
52633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
5264