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 Base class for rendering tests.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "teglRenderCase.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "teglSimpleConfigCase.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluNativeDisplay.hpp"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluNativeWindow.hpp"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluNativePixmap.hpp"
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluUtil.hpp"
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuRenderTarget.hpp"
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestLog.hpp"
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuCommandLine.hpp"
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deStringUtil.hpp"
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deUniquePtr.hpp"
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <algorithm>
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <iterator>
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <memory>
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <set>
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <EGL/eglext.h>
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if !defined(EGL_OPENGL_ES3_BIT_KHR)
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#	define EGL_OPENGL_ES3_BIT_KHR	0x0040
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if !defined(EGL_CONTEXT_MAJOR_VERSION_KHR)
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#	define EGL_CONTEXT_MAJOR_VERSION_KHR EGL_CONTEXT_CLIENT_VERSION
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::string;
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::vector;
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::set;
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::TestLog;
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace egl
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// \todo [2013-04-24 pyry] Should we instead store surface bit somewhere?
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<class Derived, class Base>
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline bool instanceOf (Base& obj)
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return dynamic_cast<Derived*>(&obj) != DE_NULL;
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void postSurface (tcu::egl::Surface& surface)
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const bool	isWindow	= instanceOf<tcu::egl::WindowSurface>(surface);
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const bool	isPixmap	= instanceOf<tcu::egl::PixmapSurface>(surface);
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const bool	isPbuffer	= instanceOf<tcu::egl::PbufferSurface>(surface);
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT((isWindow?1:0) + (isPixmap?1:0) + (isPbuffer?1:0) == 1);
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (isWindow)
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tcu::egl::WindowSurface& window = static_cast<tcu::egl::WindowSurface&>(surface);
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		window.swapBuffers();
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (isPixmap)
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK_EGL_CALL(eglWaitClient());
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(isPbuffer);
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_UNREF(isPbuffer);
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK_EGL_CALL(eglWaitClient());
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// RenderCase
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
993c827367444ee418f129b2c238299f49d3264554Jarkko PoyryRenderCase::RenderCase (EglTestContext& eglTestCtx, const char* name, const char* description, EGLint apiMask, EGLint surfaceTypeMask, const vector<EGLint>& configIds)
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: SimpleConfigCase	(eglTestCtx, name, description, configIds)
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_apiMask			(apiMask)
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_surfaceTypeMask	(surfaceTypeMask)
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1063c827367444ee418f129b2c238299f49d3264554Jarkko PoyryRenderCase::~RenderCase (void)
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1103c827367444ee418f129b2c238299f49d3264554Jarkko PoyryEGLint RenderCase::getSupportedApis (void)
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLint apiMask = 0;
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if defined(DEQP_SUPPORT_GLES2)
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	apiMask |= EGL_OPENGL_ES2_BIT;
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if defined(DEQP_SUPPORT_GLES3)
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	apiMask |= EGL_OPENGL_ES3_BIT_KHR;
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if defined(DEQP_SUPPORT_GLES1)
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	apiMask |= EGL_OPENGL_ES_BIT;
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if defined(DEQP_SUPPORT_VG)
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	apiMask |= EGL_OPENVG_BIT;
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return apiMask;
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid RenderCase::executeForConfig (tcu::egl::Display& defaultDisplay, EGLConfig config)
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::TestLog&			log				= m_testCtx.getLog();
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						width			= 128;
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						height			= 128;
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLint					configId		= defaultDisplay.getConfigAttrib(config, EGL_CONFIG_ID);
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool					isOk			= true;
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	string					failReason		= "";
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_surfaceTypeMask & EGL_WINDOW_BIT)
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tcu::ScopedLogSection(log, (string("Config") + de::toString(configId) + "-Window").c_str(),
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry										(string("Config ID ") + de::toString(configId) + ", window surface").c_str());
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		try
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			tcu::egl::Display&					display		= m_eglTestCtx.getDisplay();
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			de::UniquePtr<eglu::NativeWindow>	window		(m_eglTestCtx.createNativeWindow(display.getEGLDisplay(), config, DE_NULL, width, height, eglu::parseWindowVisibility(m_testCtx.getCommandLine())));
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			EGLSurface							eglSurface	= createWindowSurface(m_eglTestCtx.getNativeDisplay(), *window, display.getEGLDisplay(), config, DE_NULL);
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			tcu::egl::WindowSurface				surface		(display, eglSurface);
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			executeForSurface(display, surface, config);
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		catch (const tcu::TestError& e)
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			log << e;
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			isOk = false;
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			failReason = e.what();
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_surfaceTypeMask & EGL_PIXMAP_BIT)
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tcu::ScopedLogSection(log, (string("Config") + de::toString(configId) + "-Pixmap").c_str(),
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry										(string("Config ID ") + de::toString(configId) + ", pixmap surface").c_str());
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		try
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			tcu::egl::Display&					display		= m_eglTestCtx.getDisplay();
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			std::auto_ptr<eglu::NativePixmap>	pixmap		(m_eglTestCtx.createNativePixmap(display.getEGLDisplay(), config, DE_NULL, width, height));
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			EGLSurface							eglSurface	= createPixmapSurface(m_eglTestCtx.getNativeDisplay(), *pixmap, display.getEGLDisplay(), config, DE_NULL);
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			tcu::egl::PixmapSurface				surface		(display, eglSurface);
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			executeForSurface(display, surface, config);
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		catch (const tcu::TestError& e)
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			log << e;
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			isOk = false;
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			failReason = e.what();
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_surfaceTypeMask & EGL_PBUFFER_BIT)
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tcu::ScopedLogSection(log, (string("Config") + de::toString(configId) + "-Pbuffer").c_str(),
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry										(string("Config ID ") + de::toString(configId) + ", pbuffer surface").c_str());
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		try
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			EGLint surfaceAttribs[] =
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				EGL_WIDTH,	width,
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				EGL_HEIGHT,	height,
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				EGL_NONE
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			};
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			tcu::egl::PbufferSurface surface(defaultDisplay, config, surfaceAttribs);
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			executeForSurface(defaultDisplay, surface, config);
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		catch (const tcu::TestError& e)
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			log << e;
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			isOk = false;
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			failReason = e.what();
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!isOk && m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, failReason.c_str());
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// SingleContextRenderCase
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2173c827367444ee418f129b2c238299f49d3264554Jarkko PoyrySingleContextRenderCase::SingleContextRenderCase (EglTestContext& eglTestCtx, const char* name, const char* description, EGLint apiMask, EGLint surfaceTypeMask, const std::vector<EGLint>& configIds)
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: RenderCase(eglTestCtx, name, description, apiMask, surfaceTypeMask, configIds)
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2223c827367444ee418f129b2c238299f49d3264554Jarkko PoyrySingleContextRenderCase::~SingleContextRenderCase (void)
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid SingleContextRenderCase::executeForSurface (tcu::egl::Display& display, tcu::egl::Surface& surface, EGLConfig config)
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLint				supportedApis	= getSupportedApis();
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const EGLint		apis[]			= { EGL_OPENGL_ES2_BIT, EGL_OPENGL_ES3_BIT_KHR, EGL_OPENGL_ES_BIT, EGL_OPENVG_BIT };
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::TestLog&		log				= m_testCtx.getLog();
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Check if case is supported
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if ((m_apiMask & supportedApis) != m_apiMask)
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		throw tcu::NotSupportedError("Client APIs not supported", "", __FILE__, __LINE__);
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int apiNdx = 0; apiNdx < DE_LENGTH_OF_ARRAY(apis); apiNdx++)
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGLint apiBit = apis[apiNdx];
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if ((apiBit & m_apiMask) == 0)
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			continue; // Skip this api.
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGLint			api		= EGL_NONE;
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*		apiName	= DE_NULL;
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		vector<EGLint>	contextAttribs;
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Select api enum and build context attributes.
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		switch (apiBit)
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_OPENGL_ES2_BIT:
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				api		= EGL_OPENGL_ES_API;
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				apiName	= "OpenGL ES 2.x";
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				contextAttribs.push_back(EGL_CONTEXT_CLIENT_VERSION);
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				contextAttribs.push_back(2);
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_OPENGL_ES3_BIT_KHR:
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				api		= EGL_OPENGL_ES_API;
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				apiName	= "OpenGL ES 3.x";
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				contextAttribs.push_back(EGL_CONTEXT_MAJOR_VERSION_KHR);
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				contextAttribs.push_back(3);
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_OPENGL_ES_BIT:
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				api		= EGL_OPENGL_ES_API;
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				apiName	= "OpenGL ES 1.x";
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				contextAttribs.push_back(EGL_CONTEXT_CLIENT_VERSION);
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				contextAttribs.push_back(1);
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_OPENVG_BIT:
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				api		= EGL_OPENVG_API;
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				apiName	= "OpenVG";
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			default:
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				DE_ASSERT(DE_FALSE);
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		contextAttribs.push_back(EGL_NONE);
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		log << TestLog::Message << apiName << TestLog::EndMessage;
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tcu::egl::Context context(display, config, &contextAttribs[0], api);
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		context.makeCurrent(surface, surface);
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		executeForContext(display, context, surface, apiBit);
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Call SwapBuffers() / WaitClient() to finish rendering
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		postSurface(surface);
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// MultiContextRenderCase
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2963c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMultiContextRenderCase::MultiContextRenderCase (EglTestContext& eglTestCtx, const char* name, const char* description, EGLint api, EGLint surfaceType, const vector<EGLint>& configIds, int numContextsPerApi)
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: RenderCase			(eglTestCtx, name, description, api, surfaceType, configIds)
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_numContextsPerApi	(numContextsPerApi)
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3023c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMultiContextRenderCase::~MultiContextRenderCase (void)
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MultiContextRenderCase::executeForSurface (tcu::egl::Display& display, tcu::egl::Surface& surface, EGLConfig config)
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<std::pair<EGLint, tcu::egl::Context*> > contexts;
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	contexts.reserve(3*m_numContextsPerApi); // 3 types of contexts at maximum.
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	try
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Create contexts that will participate in rendering.
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int ndx = 0; ndx < m_numContextsPerApi; ndx++)
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (m_apiMask & EGL_OPENGL_ES2_BIT)
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				static const EGLint attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				contexts.push_back(std::make_pair(EGL_OPENGL_ES2_BIT, new tcu::egl::Context(display, config, &attribs[0], EGL_OPENGL_ES_API)));
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (m_apiMask & EGL_OPENGL_ES3_BIT_KHR)
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				static const EGLint attribs[] = { EGL_CONTEXT_MAJOR_VERSION_KHR, 3, EGL_NONE };
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				contexts.push_back(std::make_pair(EGL_OPENGL_ES3_BIT_KHR, new tcu::egl::Context(display, config, &attribs[0], EGL_OPENGL_ES_API)));
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (m_apiMask & EGL_OPENGL_ES_BIT)
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				static const EGLint attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 1, EGL_NONE };
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				contexts.push_back(std::make_pair(EGL_OPENGL_ES_BIT, new tcu::egl::Context(display, config, &attribs[0], EGL_OPENGL_ES_API)));
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (m_apiMask & EGL_OPENVG_BIT)
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				static const EGLint attribs[] = { EGL_NONE };
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				contexts.push_back(std::make_pair(EGL_OPENVG_BIT, new tcu::egl::Context(display, config, &attribs[0], EGL_OPENVG_API)));
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Execute for contexts.
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		executeForContexts(display, surface, config, contexts);
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	catch (const std::exception&)
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Make sure all contexts have been destroyed.
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (vector<std::pair<EGLint, tcu::egl::Context*> >::iterator i = contexts.begin(); i != contexts.end(); i++)
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			delete i->second;
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		throw;
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Destroy contexts.
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (vector<std::pair<EGLint, tcu::egl::Context*> >::iterator i = contexts.begin(); i != contexts.end(); i++)
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		delete i->second;
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Utilities
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid addRenderConfigIdSet (
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<RenderConfigIdSet>&			configSets,
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const vector<eglu::ConfigInfo>&		configInfos,
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const eglu::FilterList&				baseFilters,
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char*							name,
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::RGBA							colorBits,
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLint								surfaceType)
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	eglu::FilterList filters = baseFilters;
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	filters << (eglu::ConfigColorBits() == colorBits) << (eglu::ConfigSurfaceType() & surfaceType);
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<EGLint> matchingConfigs;
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (vector<eglu::ConfigInfo>::const_iterator configIter = configInfos.begin(); configIter != configInfos.end(); configIter++)
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (!filters.match(*configIter))
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			continue;
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		matchingConfigs.push_back(configIter->configId);
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	configSets.push_back(RenderConfigIdSet(name, "", matchingConfigs, surfaceType));
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid addRenderConfigIdSet (
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<RenderConfigIdSet>&			configSets,
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const vector<eglu::ConfigInfo>&		configInfos,
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const eglu::FilterList&				baseFilters,
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char*							name,
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::RGBA							colorBits)
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addRenderConfigIdSet(configSets, configInfos, baseFilters, (string(name) + "_window").c_str(),	colorBits, EGL_WINDOW_BIT);
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addRenderConfigIdSet(configSets, configInfos, baseFilters, (string(name) + "_pixmap").c_str(),	colorBits, EGL_PIXMAP_BIT);
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addRenderConfigIdSet(configSets, configInfos, baseFilters, (string(name) + "_pbuffer").c_str(),	colorBits, EGL_PBUFFER_BIT);
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid getDefaultRenderConfigIdSets (vector<RenderConfigIdSet>& configSets, const vector<eglu::ConfigInfo>& configInfos, const eglu::FilterList& baseFilters)
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::RGBA;
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addRenderConfigIdSet(configSets, configInfos, baseFilters, "rgb565",	RGBA(5, 6, 5, 0));
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addRenderConfigIdSet(configSets, configInfos, baseFilters, "rgb888",	RGBA(8, 8, 8, 0));
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addRenderConfigIdSet(configSets, configInfos, baseFilters, "rgba4444",	RGBA(4, 4, 4, 4));
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addRenderConfigIdSet(configSets, configInfos, baseFilters, "rgba5551",	RGBA(5, 5, 5, 1));
4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addRenderConfigIdSet(configSets, configInfos, baseFilters, "rgba8888",	RGBA(8, 8, 8, 8));
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Add other config ids to "other" set
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		set<EGLint>		usedConfigs;
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		vector<EGLint>	otherCfgSet;
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (vector<RenderConfigIdSet>::const_iterator setIter = configSets.begin(); setIter != configSets.end(); setIter++)
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const vector<EGLint>& setCfgs = setIter->getConfigIds();
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (vector<EGLint>::const_iterator i = setCfgs.begin(); i != setCfgs.end(); i++)
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				usedConfigs.insert(*i);
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (vector<eglu::ConfigInfo>::const_iterator cfgIter = configInfos.begin(); cfgIter != configInfos.end(); cfgIter++)
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (!baseFilters.match(*cfgIter))
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				continue;
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			EGLint id = cfgIter->configId;
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (usedConfigs.find(id) == usedConfigs.end())
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				otherCfgSet.push_back(id);
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		configSets.push_back(RenderConfigIdSet("other", "", otherCfgSet, EGL_WINDOW_BIT|EGL_PIXMAP_BIT|EGL_PBUFFER_BIT));
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // egl
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
434