199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi/*-------------------------------------------------------------------------
299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi * drawElements Quality Program EGL Module
399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi * ---------------------------------------
499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi *
599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi * Copyright 2016 The Android Open Source Project
699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi *
799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi * Licensed under the Apache License, Version 2.0 (the "License");
899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi * you may not use this file except in compliance with the License.
999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi * You may obtain a copy of the License at
1099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi *
1199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi *      http://www.apache.org/licenses/LICENSE-2.0
1299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi *
1399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi * Unless required by applicable law or agreed to in writing, software
1499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi * distributed under the License is distributed on an "AS IS" BASIS,
1599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi * See the License for the specific language governing permissions and
1799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi * limitations under the License.
1899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi *
1999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi *//*!
2099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi * \file
2199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi * \brief EGL thread clean up tests
2299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi *//*--------------------------------------------------------------------*/
2399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
2499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi#include "teglThreadCleanUpTests.hpp"
2599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
2699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi#include "egluUtil.hpp"
2799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi#include "egluUnique.hpp"
2899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi#include "egluConfigFilter.hpp"
2999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
3099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi#include "eglwLibrary.hpp"
3199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi#include "eglwEnums.hpp"
3299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
3399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi#include "tcuMaybe.hpp"
3499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi#include "tcuTestLog.hpp"
3599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
3699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi#include "deThread.hpp"
3799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
3899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvinamespace deqp
3999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi{
4099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvinamespace egl
4199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi{
4299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvinamespace
4399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi{
4499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
4599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärviusing namespace eglw;
4699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärviusing tcu::TestLog;
4799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
4899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvibool isES2Renderable (const eglu::CandidateConfig& c)
4999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi{
5099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	return (c.get(EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES2_BIT) == EGL_OPENGL_ES2_BIT;
5199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi}
5299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
5399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvibool isPBuffer (const eglu::CandidateConfig& c)
5499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi{
5599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	return (c.surfaceType() & EGL_PBUFFER_BIT) == EGL_PBUFFER_BIT;
5699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi}
5799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
5899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärviclass Thread : public de::Thread
5999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi{
6099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvipublic:
6199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	Thread (const Library& egl, EGLDisplay display, EGLSurface surface, EGLContext context, EGLConfig config, tcu::Maybe<eglu::Error>& error)
6299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		: m_egl		(egl)
6399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		, m_display	(display)
6499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		, m_surface	(surface)
6599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		, m_context	(context)
6699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		, m_config	(config)
6799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		, m_error	(error)
6899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	{
6999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	}
7099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
7199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	void testContext (EGLContext context)
7299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	{
7399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		if (m_surface != EGL_NO_SURFACE)
7499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		{
7599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			EGLU_CHECK_MSG(m_egl, "eglCreateContext");
7699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			m_egl.makeCurrent(m_display, m_surface, m_surface, context);
7799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			EGLU_CHECK_MSG(m_egl, "eglMakeCurrent");
7899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		}
7999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		else
8099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		{
8199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			const EGLint attribs[] =
8299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			{
8399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi				EGL_WIDTH, 32,
8499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi				EGL_HEIGHT, 32,
8599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi				EGL_NONE
8699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			};
8799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			const eglu::UniqueSurface surface (m_egl, m_display, m_egl.createPbufferSurface(m_display, m_config, attribs));
8899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
8999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			EGLU_CHECK_MSG(m_egl, "eglCreateContext");
9099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			m_egl.makeCurrent(m_display, *surface, *surface, context);
9199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			EGLU_CHECK_MSG(m_egl, "eglMakeCurrent");
9299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		}
9399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	}
9499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
9599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	void run (void)
9699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	{
9799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		try
9899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		{
99653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos			const EGLint	attribList[] =
10099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			{
10199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi				EGL_CONTEXT_CLIENT_VERSION, 2,
10299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi				EGL_NONE
10399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			};
10499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
10599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			m_egl.bindAPI(EGL_OPENGL_ES_API);
10699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
10799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			if (m_context == EGL_NO_CONTEXT)
10899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			{
10999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi				const eglu::UniqueContext context (m_egl, m_display, m_egl.createContext(m_display, m_config, EGL_NO_CONTEXT, attribList));
11099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
11199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi				testContext(*context);
11299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			}
11399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			else
11499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			{
11599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi				testContext(m_context);
11699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			}
11799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
11899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		}
11999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		catch (const eglu::Error& error)
12099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		{
12199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			m_error = error;
12299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		}
12399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	}
12499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
12599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärviprivate:
12699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	const Library&				m_egl;
12799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	const EGLDisplay			m_display;
12899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	const EGLSurface			m_surface;
12999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	const EGLContext			m_context;
13099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	const EGLConfig				m_config;
13199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	tcu::Maybe<eglu::Error>&	m_error;
13299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi};
13399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
13499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärviclass ThreadCleanUpTest : public TestCase
13599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi{
13699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvipublic:
13799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	enum ContextType
13899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	{
13999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		CONTEXTTYPE_SINGLE = 0,
14099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		CONTEXTTYPE_MULTI
14199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	};
14299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
14399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	enum SurfaceType
14499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	{
14599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		SURFACETYPE_SINGLE = 0,
14699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		SURFACETYPE_MULTI
14799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	};
14899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
14999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	static std::string testCaseName (ContextType contextType, SurfaceType surfaceType)
15099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	{
15199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		std::string name;
15299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
15399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		if (contextType == CONTEXTTYPE_SINGLE)
15499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			name += "single_context_";
15599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		else
15699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			name += "multi_context_";
15799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
15899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		if (surfaceType ==SURFACETYPE_SINGLE)
15999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			name += "single_surface";
16099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		else
16199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			name += "multi_surface";
16299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
16399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		return name;
16499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	}
16599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
16699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
16799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	ThreadCleanUpTest (EglTestContext& eglTestCtx, ContextType contextType, SurfaceType surfaceType)
16899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		: TestCase			(eglTestCtx, testCaseName(contextType, surfaceType).c_str(), "Simple thread context clean up test")
16999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		, m_contextType		(contextType)
17099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		, m_surfaceType		(surfaceType)
17199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		, m_iterCount		(250)
17299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		, m_iterNdx			(0)
17399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		, m_display			(EGL_NO_DISPLAY)
17499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		, m_config			(0)
17599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		, m_surface			(EGL_NO_SURFACE)
176e12d5fa7246dca6af962249786ec7396129945d1Pyry Haulos		, m_context			(EGL_NO_CONTEXT)
17799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	{
17899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	}
17999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
18099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	~ThreadCleanUpTest (void)
18199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	{
18299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		deinit();
18399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	}
18499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
18599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	void init (void)
18699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	{
18799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		const Library&	egl	= m_eglTestCtx.getLibrary();
18899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
18999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		m_display = eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay());
19099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
19199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		{
19299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			eglu::FilterList filters;
19399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			filters << isES2Renderable << isPBuffer;
19499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			m_config = eglu::chooseSingleConfig(egl, m_display, filters);
19599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		}
19699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
19799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		if (m_contextType == CONTEXTTYPE_SINGLE)
19899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		{
199653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos			const EGLint	attribList[] =
20099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			{
20199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi				EGL_CONTEXT_CLIENT_VERSION, 2,
20299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi				EGL_NONE
20399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			};
20499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
20599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			egl.bindAPI(EGL_OPENGL_ES_API);
20699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
20799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			m_context = egl.createContext(m_display, m_config, EGL_NO_CONTEXT, attribList);
20899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			EGLU_CHECK_MSG(egl, "Failed to create context");
20999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		}
21099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
21199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		if (m_surfaceType == SURFACETYPE_SINGLE)
21299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		{
21399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			const EGLint attribs[] =
21499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			{
21599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi				EGL_WIDTH, 32,
21699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi				EGL_HEIGHT, 32,
21799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi				EGL_NONE
21899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			};
21999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
22099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			m_surface = egl.createPbufferSurface(m_display, m_config, attribs);
22199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			EGLU_CHECK_MSG(egl, "Failed to create surface");
22299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		}
22399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	}
22499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
22599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	void deinit (void)
22699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	{
22799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		const Library& egl = m_eglTestCtx.getLibrary();
22899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
22999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		if (m_surface != EGL_NO_SURFACE)
23099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		{
23199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			egl.destroySurface(m_display, m_surface);
23299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			m_surface = EGL_NO_SURFACE;
23399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		}
23499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
23599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		if (m_context != EGL_NO_CONTEXT)
23699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		{
23799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			egl.destroyContext(m_display, m_context);
23899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			m_context = EGL_NO_CONTEXT;
23999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		}
24099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
24199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		if (m_display != EGL_NO_DISPLAY)
24299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		{
24399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			egl.terminate(m_display);
24499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			m_display = EGL_NO_DISPLAY;
24599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		}
24699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	}
24799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
24899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	IterateResult iterate (void)
24999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	{
25099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		if (m_iterNdx < m_iterCount)
25199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		{
25299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			tcu::Maybe<eglu::Error> error;
25399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
25499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			Thread thread (m_eglTestCtx.getLibrary(), m_display, m_surface, m_context, m_config, error);
25599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
25699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			thread.start();
25799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			thread.join();
25899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
25999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			if (error)
26099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			{
26199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi				m_testCtx.getLog() << TestLog::Message << "Failed. Got error: " << error->getMessage() << TestLog::EndMessage;
26299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, error->getMessage());
26399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi				return STOP;
26499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			}
26599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
26699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			m_iterNdx++;
26799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			return CONTINUE;
26899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		}
26999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		else
27099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		{
27199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
27299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi			return STOP;
27399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi		}
27499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	}
27599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
27699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärviprivate:
27799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	const ContextType	m_contextType;
27899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	const SurfaceType	m_surfaceType;
27999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	const size_t		m_iterCount;
28099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	size_t				m_iterNdx;
28199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	EGLDisplay			m_display;
28299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	EGLConfig			m_config;
28399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	EGLSurface			m_surface;
28499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	EGLContext			m_context;
28599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi};
28699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
28799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi} // anonymous
28899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
28999660c6a490c93776b69f23a05a1cd40a5d97d73Mika IsojärviTestCaseGroup* createThreadCleanUpTest (EglTestContext& eglTestCtx)
29099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi{
29199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	de::MovePtr<TestCaseGroup> group (new TestCaseGroup(eglTestCtx, "thread_cleanup", "Thread cleanup tests"));
29299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
29399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	group->addChild(new ThreadCleanUpTest(eglTestCtx, ThreadCleanUpTest::CONTEXTTYPE_SINGLE,	ThreadCleanUpTest::SURFACETYPE_SINGLE));
29499660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	group->addChild(new ThreadCleanUpTest(eglTestCtx, ThreadCleanUpTest::CONTEXTTYPE_MULTI,		ThreadCleanUpTest::SURFACETYPE_SINGLE));
29599660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
29699660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	group->addChild(new ThreadCleanUpTest(eglTestCtx, ThreadCleanUpTest::CONTEXTTYPE_SINGLE,	ThreadCleanUpTest::SURFACETYPE_MULTI));
29799660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	group->addChild(new ThreadCleanUpTest(eglTestCtx, ThreadCleanUpTest::CONTEXTTYPE_MULTI,		ThreadCleanUpTest::SURFACETYPE_MULTI));
29899660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
29999660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi	return group.release();
30099660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi}
30199660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi
30299660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi} // egl
30399660c6a490c93776b69f23a05a1cd40a5d97d73Mika Isojärvi} // deqp
304