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 Simple context construction test for EGL_KHR_create_context.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "teglCreateContextExtTests.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestLog.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluNativeDisplay.hpp"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluNativeWindow.hpp"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluNativePixmap.hpp"
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluConfigFilter.hpp"
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluStrUtil.hpp"
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluUtil.hpp"
343c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "egluUnique.hpp"
353c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
363c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "eglwLibrary.hpp"
373c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "eglwEnums.hpp"
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluDefs.hpp"
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluRenderConfig.hpp"
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwFunctions.hpp"
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp"
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deStringUtil.hpp"
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deUniquePtr.hpp"
473c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "deSTLUtil.hpp"
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <string>
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <vector>
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <set>
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <sstream>
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <cstring>
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::set;
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::string;
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::vector;
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::TestLog;
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
613c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosusing namespace eglw;
623c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
633c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos// Make sure KHR / core values match to those in GL_ARB_robustness and GL_EXT_robustness
643c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry HaulosDE_STATIC_ASSERT(GL_RESET_NOTIFICATION_STRATEGY	== 0x8256);
653c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry HaulosDE_STATIC_ASSERT(GL_LOSE_CONTEXT_ON_RESET		== 0x8252);
663c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry HaulosDE_STATIC_ASSERT(GL_NO_RESET_NOTIFICATION		== 0x8261);
673c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
683c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#if !defined(GL_CONTEXT_ROBUST_ACCESS)
693c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#	define GL_CONTEXT_ROBUST_ACCESS		0x90F3
703c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#endif
713c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace egl
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyrysize_t getAttribListLength (const EGLint* attribList)
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	size_t size = 0;
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	while (attribList[size] != EGL_NONE)
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		size++;
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return size + 1;
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystring eglContextFlagsToString (EGLint flags)
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::ostringstream	stream;
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (flags == 0)
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		stream << "<None>";
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool first = true;
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if ((flags & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0)
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (!first)
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				stream << "|";
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			first = false;
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			stream << "EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR";
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if ((flags & EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR) != 0)
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (!first)
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				stream << "|";
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			first = false;
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			stream << "EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR";
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if ((flags & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) != 0)
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (!first)
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				stream << "|";
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			stream << "EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR";
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return stream.str();
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystring eglProfileMaskToString (EGLint mask)
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::ostringstream	stream;
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (mask == 0)
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		stream << "<None>";
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool first = true;
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if ((mask & EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR) != 0)
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (!first)
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				stream << "|";
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			first = false;
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			stream << "EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR";
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if ((mask & EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR) != 0)
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (!first)
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				stream << "|";
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			stream << "EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR";
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return stream.str();
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* eglResetNotificationStrategyToString (EGLint strategy)
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (strategy)
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case EGL_NO_RESET_NOTIFICATION_KHR:		return "EGL_NO_RESET_NOTIFICATION_KHR";
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case EGL_LOSE_CONTEXT_ON_RESET_KHR:		return "EGL_LOSE_CONTEXT_ON_RESET_KHR";
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "<Unknown>";
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass CreateContextExtCase : public TestCase
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								CreateContextExtCase	(EglTestContext& eglTestCtx, EGLenum api, const EGLint* attribList, const eglu::FilterList& filter, const char* name, const char* description);
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								~CreateContextExtCase	(void);
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1813c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	void						executeForSurface		(EGLConfig config, EGLSurface surface);
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void						init					(void);
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void						deinit					(void);
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	IterateResult				iterate					(void);
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void						checkRequiredExtensions	(void);
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void						logAttribList			(void);
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool						validateCurrentContext	(const glw::Functions& gl);
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool						m_isOk;
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int							m_iteration;
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const eglu::FilterList		m_filter;
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<EGLint>				m_attribList;
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const EGLenum				m_api;
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1993c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLDisplay					m_display;
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<EGLConfig>			m_configs;
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::ContextType			m_glContextType;
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyryglu::ContextType attribListToContextType (EGLenum api, const EGLint* attribList)
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLint				majorVersion	= 1;
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLint				minorVersion	= 0;
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::ContextFlags	flags			= glu::ContextFlags(0);
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::Profile		profile			= api == EGL_OPENGL_ES_API ? glu::PROFILE_ES : glu::PROFILE_CORE;
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const EGLint*		iter			= attribList;
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2123c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	while ((*iter) != EGL_NONE)
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		switch (*iter)
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_MAJOR_VERSION_KHR:
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				majorVersion = (*iter);
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_MINOR_VERSION_KHR:
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				minorVersion = (*iter);
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_FLAGS_KHR:
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if ((*iter & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) != 0)
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					flags = flags | glu::CONTEXT_ROBUST;
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if ((*iter & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0)
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					flags = flags | glu::CONTEXT_DEBUG;
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if ((*iter & EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR) != 0)
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					flags = flags | glu::CONTEXT_FORWARD_COMPATIBLE;
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR:
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (*iter == EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR)
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					profile = glu::PROFILE_COMPATIBILITY;
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else if (*iter != EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR)
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					throw tcu::InternalError("Indeterminate OpenGL profile");
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR:
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter += 2;
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT:
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter += 2;
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT:
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter += 2;
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			default:
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				DE_ASSERT(DE_FALSE);
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return glu::ContextType(majorVersion, minorVersion, profile, flags);
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2743c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCreateContextExtCase::CreateContextExtCase (EglTestContext& eglTestCtx, EGLenum api, const EGLint* attribList, const eglu::FilterList& filter, const char* name, const char* description)
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCase			(eglTestCtx, name, description)
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_isOk			(true)
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_iteration		(0)
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_filter			(filter)
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_attribList		(attribList, attribList + getAttribListLength(attribList))
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_api				(api)
2813c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	, m_display			(EGL_NO_DISPLAY)
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_glContextType	(attribListToContextType(api, attribList))
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2863c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCreateContextExtCase::~CreateContextExtCase (void)
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deinit();
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid CreateContextExtCase::init (void)
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2933c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	m_display	= eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay());
2943c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	m_configs	= eglu::chooseConfigs(m_eglTestCtx.getLibrary(), m_display, m_filter);
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid CreateContextExtCase::deinit (void)
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2993c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	m_attribList.clear();
3003c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	m_configs.clear();
3013c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
3023c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	if (m_display != EGL_NO_DISPLAY)
3033c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	{
3043c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		m_eglTestCtx.getLibrary().terminate(m_display);
3053c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		m_display = EGL_NO_DISPLAY;
3063c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	}
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid CreateContextExtCase::logAttribList (void)
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const EGLint*		iter = &(m_attribList[0]);
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::ostringstream	attribListString;
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	while ((*iter) != EGL_NONE)
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		switch (*iter)
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_MAJOR_VERSION_KHR:
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				attribListString << "EGL_CONTEXT_MAJOR_VERSION_KHR(EGL_CONTEXT_CLIENT_VERSION), " << (*iter) << ", ";
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_MINOR_VERSION_KHR:
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				attribListString << "EGL_CONTEXT_MINOR_VERSION_KHR, " << (*iter) << ", ";
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_FLAGS_KHR:
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				attribListString << "EGL_CONTEXT_FLAGS_KHR, " << eglContextFlagsToString(*iter) << ", ";
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR:
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				attribListString << "EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR, " << eglProfileMaskToString(*iter) << ", ";
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR:
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				attribListString << "EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR, " << eglResetNotificationStrategyToString(*iter) << ", ";
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT:
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				attribListString << "EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, ";
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
352e9f851b0fe18a2d834bce827564b3a8d4d128438Jarkko Pöyry				if (*iter == EGL_FALSE || *iter == EGL_TRUE)
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					attribListString << (*iter ? "EGL_TRUE" : "EGL_FALSE");
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					attribListString << (*iter);
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			default:
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				DE_ASSERT(DE_FALSE);
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	attribListString << "EGL_NONE";
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_testCtx.getLog() << TestLog::Message << "EGL attrib list: { " << attribListString.str() << " }" << TestLog::EndMessage;
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid CreateContextExtCase::checkRequiredExtensions (void)
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool			isOk = true;
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	set<string>		requiredExtensions;
3722f4e6d98746307432f4d82b8d4885116805d7f98Mika Isojärvi	vector<string>	extensions			= eglu::getDisplayExtensions(m_eglTestCtx.getLibrary(), m_display);
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const EGLint* iter = &(m_attribList[0]);
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		while ((*iter) != EGL_NONE)
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			switch (*iter)
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case EGL_CONTEXT_MAJOR_VERSION_KHR:
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					iter++;
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					iter++;
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case EGL_CONTEXT_MINOR_VERSION_KHR:
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					iter++;
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					requiredExtensions.insert("EGL_KHR_create_context");
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					iter++;
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case EGL_CONTEXT_FLAGS_KHR:
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					iter++;
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					requiredExtensions.insert("EGL_KHR_create_context");
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					iter++;
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR:
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					iter++;
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					requiredExtensions.insert("EGL_KHR_create_context");
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					iter++;
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR:
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					iter++;
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					requiredExtensions.insert("EGL_KHR_create_context");
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					iter++;
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT:
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					iter++;
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					requiredExtensions.insert("EGL_EXT_create_context_robustness");
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					iter++;
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT:
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					iter++;
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					requiredExtensions.insert("EGL_EXT_create_context_robustness");
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					iter++;
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				default:
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					DE_ASSERT(DE_FALSE);
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (std::set<string>::const_iterator reqExt = requiredExtensions.begin(); reqExt != requiredExtensions.end(); ++reqExt)
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4303c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		if (!de::contains(extensions.begin(), extensions.end(), *reqExt))
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.getLog() << TestLog::Message << "Required extension '" << (*reqExt) << "' not supported" << TestLog::EndMessage;
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			isOk = false;
4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!isOk)
4383c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		TCU_THROW(NotSupportedError, "Required extensions not supported");
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyrybool checkVersionString (TestLog& log, const glw::Functions& gl, bool desktop, int major, int minor)
4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char* const	versionStr	= (const char*)gl.getString(GL_VERSION);
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char*			iter		= versionStr;
4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int majorVersion = 0;
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int minorVersion = 0;
4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Check embedded version prefixes
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!desktop)
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* prefix		= NULL;
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* prefixIter	= NULL;
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (major == 1)
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			prefix = "OpenGL ES-CM ";
4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			prefix = "OpenGL ES ";
4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		prefixIter = prefix;
4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		while (*prefixIter)
4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if ((*prefixIter) != (*iter))
4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				log << TestLog::Message << "Invalid version string prefix. Expected '" << prefix << "'." << TestLog::EndMessage;
4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return false;
4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			prefixIter++;
4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			iter++;
4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	while ((*iter) && (*iter) != '.')
4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int val = (*iter) - '0';
4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Not a number
4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (val < 0 || val > 9)
4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			log << TestLog::Message << "Failed to parse major version number. Not a number." << TestLog::EndMessage;
4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return false;
4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Leading zero
4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (majorVersion == 0 && val == 0)
4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			log << TestLog::Message << "Failed to parse major version number. Begins with zero." << TestLog::EndMessage;
4903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return false;
4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		majorVersion = majorVersion * 10 + val;
4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		iter++;
4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Invalid format
4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if ((*iter) != '.')
5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		log << TestLog::Message << "Failed to parse version. Expected '.' after major version number." << TestLog::EndMessage;
5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return false;
5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	iter++;
5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	while ((*iter) && (*iter) != ' ' && (*iter) != '.')
5083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int val = (*iter) - '0';
5103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Not a number
5123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (val < 0 || val > 9)
5133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			log << TestLog::Message << "Failed to parse minor version number. Not a number." << TestLog::EndMessage;
5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return false;
5163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
5173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Leading zero
5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (minorVersion == 0 && val == 0)
5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// Leading zeros in minor version
5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if ((*(iter + 1)) != ' ' && (*(iter + 1)) != '.' && (*(iter + 1)) != '\0')
5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				log << TestLog::Message << "Failed to parse minor version number. Leading zeros." << TestLog::EndMessage;
5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return false;
5263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		minorVersion = minorVersion * 10 + val;
5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		iter++;
5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Invalid format
5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if ((*iter) != ' ' && (*iter) != '.' && (*iter) != '\0')
5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return false;
5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (desktop)
5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (majorVersion < major)
5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			log << TestLog::Message << "Major version is less than required." << TestLog::EndMessage;
5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return false;
5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (majorVersion == major && minorVersion < minor)
5463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			log << TestLog::Message << "Minor version is less than required." << TestLog::EndMessage;
5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return false;
5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (majorVersion == major && minorVersion == minor)
5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return true;
5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (major < 3 || (major == 3 && minor == 0))
5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (majorVersion == 3 && minorVersion == 1)
5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
5571ba68362f2e13d7fdf7f1c3dc4a8eb3d517502b1Tobias Sargeant				if (glu::hasExtension(gl, glu::ApiType::core(3, 1), "GL_ARB_compatibility"))
5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					return true;
5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else
5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					log << TestLog::Message << "Required OpenGL 3.0 or earlier. Got OpenGL 3.1 without GL_ARB_compatibility." << TestLog::EndMessage;
5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					return false;
5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (majorVersion > 3 || (majorVersion == 3 && minorVersion >= minor))
5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				deInt32 profile = 0;
5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				gl.getIntegerv(GL_CONTEXT_PROFILE_MASK, &profile);
5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv()");
5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (profile == GL_CONTEXT_COMPATIBILITY_PROFILE_BIT)
5733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					return true;
5743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else
5753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
5763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					log << TestLog::Message << "Required OpenGL 3.0 or earlier. Got later version without compatibility profile." << TestLog::EndMessage;
5773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					return false;
5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
5813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				DE_ASSERT(false);
5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return false;
5843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (major == 3 && minor == 1)
5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (majorVersion > 3 || (majorVersion == 3 && minorVersion >= minor))
5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				deInt32 profile = 0;
5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				gl.getIntegerv(GL_CONTEXT_PROFILE_MASK, &profile);
5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv()");
5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (profile == GL_CONTEXT_CORE_PROFILE_BIT)
5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					return true;
5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else
5973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					log << TestLog::Message << "Required OpenGL 3.1. Got later version without core profile." << TestLog::EndMessage;
5993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					return false;
6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
6023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				DE_ASSERT(false);
6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return false;
6063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
6073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
6093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			log << TestLog::Message << "Couldn't do any further compatibilyt checks." << TestLog::EndMessage;
6103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return true;
6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (majorVersion < major)
6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
6173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			log << TestLog::Message << "Major version is less than required." << TestLog::EndMessage;
6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return false;
6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (majorVersion == major && minorVersion < minor)
6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			log << TestLog::Message << "Minor version is less than required." << TestLog::EndMessage;
6233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return false;
6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
6253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return true;
6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6303c827367444ee418f129b2c238299f49d3264554Jarkko Poyrybool checkVersionQueries (TestLog& log, const glw::Functions& gl, int major, int minor)
6313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deInt32 majorVersion = 0;
6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deInt32	minorVersion = 0;
6343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	gl.getIntegerv(GL_MAJOR_VERSION, &majorVersion);
6363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv()");
6373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	gl.getIntegerv(GL_MINOR_VERSION, &minorVersion);
6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv()");
6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (majorVersion < major || (majorVersion == major && minorVersion < minor))
6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (majorVersion < major)
6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			log << TestLog::Message << "glGetIntegerv(GL_MAJOR_VERSION) returned '" << majorVersion << "' expected at least '" << major << "'" << TestLog::EndMessage;
6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (majorVersion == major && minorVersion < minor)
6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			log << TestLog::Message << "glGetIntegerv(GL_MINOR_VERSION) returned '" << minorVersion << "' expected '" << minor << "'" << TestLog::EndMessage;
6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(false);
6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return false;
6513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
6533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return true;
6543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyrybool CreateContextExtCase::validateCurrentContext (const glw::Functions& gl)
6573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool				isOk					= true;
6593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestLog&			log						= m_testCtx.getLog();
6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const EGLint*		iter					= &(m_attribList[0]);
6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLint				majorVersion			= -1;
6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLint				minorVersion			= -1;
6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLint				contextFlags			= -1;
6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLint				profileMask				= -1;
6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLint				notificationStrategy	= -1;
6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLint				robustAccessExt			= -1;
6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLint				notificationStrategyExt	= -1;
6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	while ((*iter) != EGL_NONE)
6713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		switch (*iter)
6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_MAJOR_VERSION_KHR:
6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				majorVersion = (*iter);
6773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
6783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
6793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_MINOR_VERSION_KHR:
6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				minorVersion = (*iter);
6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_FLAGS_KHR:
6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				contextFlags = (*iter);
6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
6903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR:
6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				profileMask = (*iter);
6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
6963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR:
6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				notificationStrategy = (*iter);
7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT:
7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				robustAccessExt = *iter;
7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
7083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
7093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT:
7113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				notificationStrategyExt = *iter;
7133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				iter++;
7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			default:
7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				DE_ASSERT(DE_FALSE);
7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const string version = (const char*)gl.getString(GL_VERSION);
7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	log << TestLog::Message << "GL_VERSION: '" << version << "'" << TestLog::EndMessage;
7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (majorVersion == -1)
7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		majorVersion = 1;
7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (minorVersion == -1)
7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		minorVersion = 0;
7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_api == EGL_OPENGL_ES_API)
7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (!checkVersionString(log, gl, false, majorVersion, minorVersion))
7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			isOk = false;
7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (majorVersion == 3)
7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (!checkVersionQueries(log, gl, majorVersion, minorVersion))
7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				isOk = false;
7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (m_api == EGL_OPENGL_API)
7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (!checkVersionString(log, gl, true, majorVersion, minorVersion))
7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			isOk = false;
7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (majorVersion >= 3)
7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (!checkVersionQueries(log, gl, majorVersion, minorVersion))
7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				isOk = false;
7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(false);
7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (contextFlags != -1)
7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_api == EGL_OPENGL_API && (majorVersion > 3 || (majorVersion == 3 && minorVersion >= 1)))
7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			deInt32 contextFlagsGL;
7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(m_api == EGL_OPENGL_API);
7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (contextFlags == -1)
7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				contextFlags = 0;
7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			gl.getIntegerv(GL_CONTEXT_FLAGS, &contextFlagsGL);
7693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (contextFlags != contextFlagsGL)
7713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
7723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				log << TestLog::Message << "Invalid GL_CONTEXT_FLAGS. Expected '" << eglContextFlagsToString(contextFlags) << "' got '" << eglContextFlagsToString(contextFlagsGL) << "'" << TestLog::EndMessage;
7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				isOk = false;
7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
7753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
7763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (profileMask != -1 || (m_api == EGL_OPENGL_API && (majorVersion >= 3)))
7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (profileMask == -1)
7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			profileMask = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR;
7823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(m_api == EGL_OPENGL_API);
7843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (majorVersion < 3 || (majorVersion == 3 && minorVersion < 2))
7863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// \note Ignore profile masks. This is not an error
7883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
7893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
7903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			deInt32 profileMaskGL = 0;
7923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7930ef97d1d8255eea27a3191e3295b7ece83e13807Mika Isojärvi			gl.getIntegerv(GL_CONTEXT_PROFILE_MASK, &profileMaskGL);
7943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv()");
7953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (profileMask != profileMaskGL)
7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
7983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				log << TestLog::Message << "Invalid GL_CONTEXT_PROFILE_MASK. Expected '" << eglProfileMaskToString(profileMask) << "' got '" << eglProfileMaskToString(profileMaskGL) << "'" << TestLog::EndMessage;
7993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				isOk = false;
8003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
8013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
8023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8043c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	DE_ASSERT(notificationStrategy == -1 || notificationStrategyExt == -1);
8053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8063c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	if (notificationStrategy != -1 || notificationStrategyExt != -1)
8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8083c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		const deInt32	expected	= notificationStrategy != -1 ? notificationStrategy : notificationStrategyExt;
8093c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		deInt32			strategy	= 0;
8103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8113c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		gl.getIntegerv(GL_RESET_NOTIFICATION_STRATEGY, &strategy);
8123c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv()");
8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8143c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		if (expected == EGL_NO_RESET_NOTIFICATION && strategy != GL_NO_RESET_NOTIFICATION)
8153c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		{
8163c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			log << TestLog::Message << "glGetIntegerv(GL_RESET_NOTIFICATION_STRATEGY) returned '" << strategy << "', expected 'GL_NO_RESET_NOTIFICATION'" << TestLog::EndMessage;
8173c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			isOk = false;
8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
8193c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		else if (expected == EGL_LOSE_CONTEXT_ON_RESET && strategy != GL_LOSE_CONTEXT_ON_RESET)
8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8213c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			log << TestLog::Message << "glGetIntegerv(GL_RESET_NOTIFICATION_STRATEGY) returned '" << strategy << "', expected 'GL_LOSE_CONTEXT_ON_RESET'" << TestLog::EndMessage;
8223c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			isOk = false;
8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
8243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8253fdee359c9eee4d6c1d823b23f7f64631b5945f8Jarkko Pöyry
8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (robustAccessExt == EGL_TRUE)
8273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_api == EGL_OPENGL_API)
8293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8301ba68362f2e13d7fdf7f1c3dc4a8eb3d517502b1Tobias Sargeant			if (!glu::hasExtension(gl, glu::ApiType::core(majorVersion, minorVersion), "GL_ARB_robustness"))
8313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
8323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				log << TestLog::Message << "Created robustness context but it doesn't support GL_ARB_robustness." << TestLog::EndMessage;
8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				isOk = false;
8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
8363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (m_api == EGL_OPENGL_ES_API)
8373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8381ba68362f2e13d7fdf7f1c3dc4a8eb3d517502b1Tobias Sargeant			if (!glu::hasExtension(gl, glu::ApiType::es(majorVersion, minorVersion), "GL_EXT_robustness"))
8393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
8403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				log << TestLog::Message << "Created robustness context but it doesn't support GL_EXT_robustness." << TestLog::EndMessage;
8413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				isOk = false;
8423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
8433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
8443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_api == EGL_OPENGL_API && (majorVersion > 3 || (majorVersion == 3 && minorVersion >= 1)))
8463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			deInt32 contextFlagsGL;
8483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(m_api == EGL_OPENGL_API);
8503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			gl.getIntegerv(GL_CONTEXT_FLAGS, &contextFlagsGL);
8523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8533c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			if ((contextFlagsGL & GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT) != 0)
8543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
8553c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos				log << TestLog::Message << "Invalid GL_CONTEXT_FLAGS. GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT to be set, got '" << eglContextFlagsToString(contextFlagsGL) << "'" << TestLog::EndMessage;
8563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				isOk = false;
8573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
8593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (m_api == EGL_OPENGL_ES_API)
8603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			deUint8 robustAccessGL;
8623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8633c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			gl.getBooleanv(GL_CONTEXT_ROBUST_ACCESS, &robustAccessGL);
8643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetBooleanv()");
8653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (robustAccessGL != GL_TRUE)
8673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
8683c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos				log << TestLog::Message << "Invalid GL_CONTEXT_ROBUST_ACCESS returned by glGetBooleanv(). Got '" << robustAccessGL << "' expected GL_TRUE." << TestLog::EndMessage;
8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				isOk = false;
8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
8713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
8723fdee359c9eee4d6c1d823b23f7f64631b5945f8Jarkko Pöyry
8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return isOk;
8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8783c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTestCase::IterateResult CreateContextExtCase::iterate (void)
8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_iteration == 0)
8813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		logAttribList();
8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		checkRequiredExtensions();
8843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_iteration < (int)m_configs.size())
8873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8883c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		const Library&		egl				= m_eglTestCtx.getLibrary();
8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const EGLConfig		config			= m_configs[m_iteration];
8903c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		const EGLint		surfaceTypes	= eglu::getConfigAttribInt(egl, m_display, config, EGL_SURFACE_TYPE);
8913c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		const EGLint		configId		= eglu::getConfigAttribInt(egl, m_display, config, EGL_CONFIG_ID);
8923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if ((surfaceTypes & EGL_PBUFFER_BIT) != 0)
8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8953c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			tcu::ScopedLogSection	section			(m_testCtx.getLog(), ("EGLConfig ID: " + de::toString(configId) + " with PBuffer").c_str(), ("EGLConfig ID: " + de::toString(configId)).c_str());
8963c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			const EGLint			attribList[]	=
8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				EGL_WIDTH,	64,
8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				EGL_HEIGHT,	64,
9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				EGL_NONE
9013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			};
9023c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			eglu::UniqueSurface		surface			(egl, m_display, egl.createPbufferSurface(m_display, config, attribList));
9033c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			EGLU_CHECK_MSG(egl, "eglCreatePbufferSurface");
9043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9053c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			executeForSurface(config, *surface);
9063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
9073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if ((surfaceTypes & EGL_WINDOW_BIT) != 0)
9083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
909485844e764f2821545146b832726a36012f86238Mika Isojärvi			const eglu::NativeWindowFactory&	factory	= eglu::selectNativeWindowFactory(m_eglTestCtx.getNativeDisplayFactory(), m_testCtx.getCommandLine());
9103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
911485844e764f2821545146b832726a36012f86238Mika Isojärvi			de::UniquePtr<eglu::NativeWindow>	window	(factory.createWindow(&m_eglTestCtx.getNativeDisplay(), m_display, config, DE_NULL, eglu::WindowParams(256, 256, eglu::parseWindowVisibility(m_testCtx.getCommandLine()))));
9123c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			eglu::UniqueSurface					surface	(egl, m_display, eglu::createWindowSurface(m_eglTestCtx.getNativeDisplay(), *window, m_display, config, DE_NULL));
9133c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
9143c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			executeForSurface(config, *surface);
9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if ((surfaceTypes & EGL_PIXMAP_BIT) != 0)
9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
918485844e764f2821545146b832726a36012f86238Mika Isojärvi			const eglu::NativePixmapFactory&	factory	= eglu::selectNativePixmapFactory(m_eglTestCtx.getNativeDisplayFactory(), m_testCtx.getCommandLine());
9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
920485844e764f2821545146b832726a36012f86238Mika Isojärvi			de::UniquePtr<eglu::NativePixmap>	pixmap	(factory.createPixmap(&m_eglTestCtx.getNativeDisplay(), m_display, config, DE_NULL, 256, 256));
9213c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			eglu::UniqueSurface					surface	(egl, m_display, eglu::createPixmapSurface(m_eglTestCtx.getNativeDisplay(), *pixmap, m_display, config, DE_NULL));
9223c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
9233c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			executeForSurface(config, *surface);
9243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
9253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else // No supported surface type
9263c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			TCU_FAIL("Invalid or empty surface type bits");
9273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_iteration++;
9293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return CONTINUE;
9303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
9323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_configs.size() == 0)
9343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
9353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.getLog() << TestLog::Message << "No supported configs found" << TestLog::EndMessage;
9363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "No supported configs found");
9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
9383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (m_isOk)
9393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
9403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
9413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
9423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return STOP;
9443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9473c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid CreateContextExtCase::executeForSurface (EGLConfig config, EGLSurface surface)
9483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9493c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	const Library&	egl		= m_eglTestCtx.getLibrary();
9503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9513c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLU_CHECK_CALL(egl, bindAPI(m_api));
9523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	try
9543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9553c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		glw::Functions		gl;
9563c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		eglu::UniqueContext	context	(egl, m_display, egl.createContext(m_display, config, EGL_NO_CONTEXT, &m_attribList[0]));
9573c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		EGLU_CHECK_MSG(egl, "eglCreateContext");
9583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9593c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		EGLU_CHECK_CALL(egl, makeCurrent(m_display, surface, surface, *context));
9603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9613c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		m_eglTestCtx.initGLFunctions(&gl, m_glContextType.getAPI());
9623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (!validateCurrentContext(gl))
9643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_isOk = false;
9653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	catch (const eglu::Error& error)
9673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (error.getError() == EGL_BAD_MATCH)
9693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.getLog() << TestLog::Message << "Context creation failed with error EGL_BAD_CONTEXT. Config doesn't support api version." << TestLog::EndMessage;
9703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (error.getError() == EGL_BAD_CONFIG)
9713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.getLog() << TestLog::Message << "Context creation failed with error EGL_BAD_MATCH. Context attribute compination not supported." << TestLog::EndMessage;
9723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
9733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
9743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.getLog() << TestLog::Message << "Context creation failed with error " << eglu::getErrorStr(error.getError()) << ". Error is not result of unsupported api etc." << TestLog::EndMessage;
9753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_isOk = false;
9763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
9773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
978d2722f6ec95d6f745a9ee1bfa5f033574b91f235Mika Isojärvi
979d2722f6ec95d6f745a9ee1bfa5f033574b91f235Mika Isojärvi	EGLU_CHECK_CALL(egl, makeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
9803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9823c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass CreateContextExtGroup : public TestCaseGroup
9833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9843c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
9853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						CreateContextExtGroup	(EglTestContext& eglTestCtx, EGLenum api, EGLint apiBit, const EGLint* attribList, const char* name, const char* description);
9863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual				~CreateContextExtGroup	(void);
9873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				init					(void);
9893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9903c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
9913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const EGLenum		m_api;
9923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const EGLint		m_apiBit;
9933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<EGLint>		m_attribList;
9943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
9953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9963c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCreateContextExtGroup::CreateContextExtGroup (EglTestContext& eglTestCtx, EGLenum api, EGLint apiBit, const EGLint* attribList, const char* name, const char* description)
9973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup (eglTestCtx, name, description)
9983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_api			(api)
9993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_apiBit		(apiBit)
10003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_attribList	(attribList, attribList + getAttribListLength(attribList))
10013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10043c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCreateContextExtGroup::~CreateContextExtGroup (void)
10053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10083c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
10093c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulostemplate <int Red, int Green, int Blue, int Alpha>
10103c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosstatic bool colorBits (const eglu::CandidateConfig& c)
10113c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos{
10123c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	return c.redSize()		== Red		&&
10133c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		   c.greenSize()	== Green	&&
10143c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		   c.blueSize()		== Blue		&&
10153c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		   c.alphaSize()	== Alpha;
10163c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos}
10173c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
10183c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosstatic bool	hasDepth	(const eglu::CandidateConfig& c)	{ return c.depthSize() > 0;		}
10193c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosstatic bool	noDepth		(const eglu::CandidateConfig& c)	{ return c.depthSize() == 0;	}
10203c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosstatic bool	hasStencil	(const eglu::CandidateConfig& c)	{ return c.stencilSize() > 0;	}
10213c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosstatic bool	noStencil	(const eglu::CandidateConfig& c)	{ return c.stencilSize() == 0;	}
10223c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
10233c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulostemplate <deUint32 Type>
10243c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosstatic bool renderable (const eglu::CandidateConfig& c)
10253c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos{
10263c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	return (c.renderableType() & Type) == Type;
10273c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos}
10283c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
10293c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosstatic eglu::ConfigFilter getRenderableFilter (deUint32 bits)
10303c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos{
10313c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	switch (bits)
10323c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	{
10333c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		case EGL_OPENGL_ES2_BIT:	return renderable<EGL_OPENGL_ES2_BIT>;
10343c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		case EGL_OPENGL_ES3_BIT:	return renderable<EGL_OPENGL_ES3_BIT>;
10353c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		case EGL_OPENGL_BIT:		return renderable<EGL_OPENGL_BIT>;
10363c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		default:
10373c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			DE_ASSERT(false);
10383c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			return renderable<0>;
10393c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	}
10403c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos}
10413c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
10423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid CreateContextExtGroup::init (void)
10433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const struct
10453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*				name;
10473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*				description;
10483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10493c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		eglu::ConfigFilter		colorFilter;
10503c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		eglu::ConfigFilter		depthFilter;
10513c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		eglu::ConfigFilter		stencilFilter;
10523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} groups[] =
10533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1054653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos		{ "rgb565_no_depth_no_stencil",		"RGB565 configs without depth or stencil",		colorBits<5, 6, 5, 0>, noDepth,		noStencil	},
10553c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		{ "rgb565_no_depth_stencil",		"RGB565 configs with stencil and no depth",		colorBits<5, 6, 5, 0>, noDepth,		hasStencil	},
10563c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		{ "rgb565_depth_no_stencil",		"RGB565 configs with depth and no stencil",		colorBits<5, 6, 5, 0>, hasDepth,	noStencil	},
10573c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		{ "rgb565_depth_stencil",			"RGB565 configs with depth and stencil",		colorBits<5, 6, 5, 0>, hasDepth,	hasStencil	},
10583c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
1059653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos		{ "rgb888_no_depth_no_stencil",		"RGB888 configs without depth or stencil",		colorBits<8, 8, 8, 0>, noDepth,		noStencil	},
10603c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		{ "rgb888_no_depth_stencil",		"RGB888 configs with stencil and no depth",		colorBits<8, 8, 8, 0>, noDepth,		hasStencil	},
10613c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		{ "rgb888_depth_no_stencil",		"RGB888 configs with depth and no stencil",		colorBits<8, 8, 8, 0>, hasDepth,	noStencil	},
10623c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		{ "rgb888_depth_stencil",			"RGB888 configs with depth and stencil",		colorBits<8, 8, 8, 0>, hasDepth,	hasStencil	},
10633c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
1064653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos		{ "rgba4444_no_depth_no_stencil",	"RGBA4444 configs without depth or stencil",	colorBits<4, 4, 4, 4>, noDepth,		noStencil	},
10653c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		{ "rgba4444_no_depth_stencil",		"RGBA4444 configs with stencil and no depth",	colorBits<4, 4, 4, 4>, noDepth,		hasStencil	},
1066653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos		{ "rgba4444_depth_no_stencil",		"RGBA4444 configs with depth and no stencil",	colorBits<4, 4, 4, 4>, hasDepth,	noStencil	},
10673c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		{ "rgba4444_depth_stencil",			"RGBA4444 configs with depth and stencil",		colorBits<4, 4, 4, 4>, hasDepth,	hasStencil	},
10683c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
1069653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos		{ "rgba5551_no_depth_no_stencil",	"RGBA5551 configs without depth or stencil",	colorBits<5, 5, 5, 1>, noDepth,		noStencil	},
10703c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		{ "rgba5551_no_depth_stencil",		"RGBA5551 configs with stencil and no depth",	colorBits<5, 5, 5, 1>, noDepth,		hasStencil	},
10713c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		{ "rgba5551_depth_no_stencil",		"RGBA5551 configs with depth and no stencil",	colorBits<5, 5, 5, 1>, hasDepth,	noStencil	},
10723c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		{ "rgba5551_depth_stencil",			"RGBA5551 configs with depth and stencil",		colorBits<5, 5, 5, 1>, hasDepth,	hasStencil	},
10733c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
1074653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos		{ "rgba8888_no_depth_no_stencil",	"RGBA8888 configs without depth or stencil",	colorBits<8, 8, 8, 8>, noDepth,		noStencil	},
10753c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		{ "rgba8888_no_depth_stencil",		"RGBA8888 configs with stencil and no depth",	colorBits<8, 8, 8, 8>, noDepth,		hasStencil	},
10763c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		{ "rgba8888_depth_no_stencil",		"RGBA8888 configs with depth and no stencil",	colorBits<8, 8, 8, 8>, hasDepth,	noStencil	},
10773c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		{ "rgba8888_depth_stencil",			"RGBA8888 configs with depth and stencil",		colorBits<8, 8, 8, 8>, hasDepth,	hasStencil	}
10783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
10793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int groupNdx = 0; groupNdx < DE_LENGTH_OF_ARRAY(groups); groupNdx++)
10813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		eglu::FilterList filter;
10833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10843c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		filter << groups[groupNdx].colorFilter
10853c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			   << groups[groupNdx].depthFilter
10863c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			   << groups[groupNdx].stencilFilter
10873c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			   << getRenderableFilter(m_apiBit);
10883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(new CreateContextExtCase(m_eglTestCtx, m_api, &(m_attribList[0]), filter, groups[groupNdx].name, groups[groupNdx].description));
10903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// \todo [mika] Add other group
10923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // anonymous
10953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10963c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCreateContextExtTests::CreateContextExtTests (EglTestContext& eglTestCtx)
10973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup(eglTestCtx, "create_context_ext", "EGL_KHR_create_context tests.")
10983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11013c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCreateContextExtTests::~CreateContextExtTests (void)
11023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11053c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid CreateContextExtTests::init (void)
11063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const size_t	maxAttributeCount = 10;
11083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const struct
11093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	name;
11113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	description;
11123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGLenum		api;
11133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGLint		apiBit;
11143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		EGLint		attribList[maxAttributeCount];
11153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} groupList[] =
11163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if 0
11183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// \todo [mika] Not supported by glw
11193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// OpenGL ES 1.x
11203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "gles_10", "Create OpenGL ES 1.0 context", EGL_OPENGL_ES_API, EGL_OPENGL_ES_BIT,
11213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 1, EGL_CONTEXT_MINOR_VERSION_KHR, 0, EGL_NONE} },
11223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "gles_11", "Create OpenGL ES 1.1 context", EGL_OPENGL_ES_API, EGL_OPENGL_ES_BIT,
11233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 1, EGL_CONTEXT_MINOR_VERSION_KHR, 1, EGL_NONE } },
11243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif
11253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// OpenGL ES 2.x
11263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "gles_20", "Create OpenGL ES 2.0 context", EGL_OPENGL_ES_API, EGL_OPENGL_ES2_BIT,
11273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 2, EGL_CONTEXT_MINOR_VERSION_KHR, 0, EGL_NONE } },
11283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// OpenGL ES 3.x
11293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "gles_30", "Create OpenGL ES 3.0 context", EGL_OPENGL_ES_API, EGL_OPENGL_ES3_BIT_KHR,
11303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 3, EGL_CONTEXT_MINOR_VERSION_KHR, 0, EGL_NONE} },
11313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if 0
11323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// \todo [mika] Not supported by glw
11333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// \note [mika] Should we really test 1.x?
11343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "gl_10", "Create OpenGL 1.0 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 1, EGL_CONTEXT_MINOR_VERSION_KHR, 0, EGL_NONE} },
11363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "gl_11", "Create OpenGL 1.1 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 1, EGL_CONTEXT_MINOR_VERSION_KHR, 1, EGL_NONE } },
11383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// OpenGL 2.x
11403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "gl_20", "Create OpenGL 2.0 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 2, EGL_CONTEXT_MINOR_VERSION_KHR, 0, EGL_NONE } },
11423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "gl_21", "Create OpenGL 2.1 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 2, EGL_CONTEXT_MINOR_VERSION_KHR, 1, EGL_NONE } },
11443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif
11453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// OpenGL 3.x
11463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "gl_30", "Create OpenGL 3.0 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 3, EGL_CONTEXT_MINOR_VERSION_KHR, 0, EGL_NONE } },
11483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "robust_gl_30", "Create robust OpenGL 3.0 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 3, EGL_CONTEXT_MINOR_VERSION_KHR, 0, EGL_CONTEXT_FLAGS_KHR, EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR, EGL_NONE } },
11503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "gl_31", "Create OpenGL 3.1 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 3, EGL_CONTEXT_MINOR_VERSION_KHR, 1, EGL_NONE } },
11523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "robust_gl_31", "Create robust OpenGL 3.1 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 3, EGL_CONTEXT_MINOR_VERSION_KHR, 1, EGL_CONTEXT_FLAGS_KHR, EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR, EGL_NONE } },
11543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "gl_32", "Create OpenGL 3.2 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 3, EGL_CONTEXT_MINOR_VERSION_KHR, 2, EGL_NONE } },
11563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "robust_gl_32", "Create robust OpenGL 3.2 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 3, EGL_CONTEXT_MINOR_VERSION_KHR, 2, EGL_CONTEXT_FLAGS_KHR, EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR, EGL_NONE } },
11583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "gl_33", "Create OpenGL 3.3 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 3, EGL_CONTEXT_MINOR_VERSION_KHR, 3, EGL_NONE } },
11603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "robust_gl_33", "Create robust OpenGL 3.3 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 3, EGL_CONTEXT_MINOR_VERSION_KHR, 3, EGL_CONTEXT_FLAGS_KHR, EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR, EGL_NONE } },
11623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// OpenGL 4.x
11643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "gl_40", "Create OpenGL 4.0 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 4, EGL_CONTEXT_MINOR_VERSION_KHR, 0, EGL_NONE } },
11663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "robust_gl_40", "Create robust OpenGL 4.0 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 4, EGL_CONTEXT_MINOR_VERSION_KHR, 0, EGL_CONTEXT_FLAGS_KHR, EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR, EGL_NONE } },
11683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "gl_41", "Create OpenGL 4.1 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 4, EGL_CONTEXT_MINOR_VERSION_KHR, 1, EGL_NONE } },
11703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "robust_gl_41", "Create robust OpenGL 4.1 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 4, EGL_CONTEXT_MINOR_VERSION_KHR, 1, EGL_CONTEXT_FLAGS_KHR, EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR, EGL_NONE } },
11723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "gl_42", "Create OpenGL 4.2 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 4, EGL_CONTEXT_MINOR_VERSION_KHR, 2, EGL_NONE } },
11743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "robust_gl_42", "Create robust OpenGL 4.2 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 4, EGL_CONTEXT_MINOR_VERSION_KHR, 2, EGL_CONTEXT_FLAGS_KHR, EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR, EGL_NONE } },
11763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "gl_43", "Create OpenGL 4.3 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 4, EGL_CONTEXT_MINOR_VERSION_KHR, 3, EGL_NONE } },
11783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "robust_gl_43", "Create robust OpenGL 4.3 context", EGL_OPENGL_API, EGL_OPENGL_BIT,
11793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_MAJOR_VERSION_KHR, 4, EGL_CONTEXT_MINOR_VERSION_KHR, 3, EGL_CONTEXT_FLAGS_KHR, EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR, EGL_NONE } },
11803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Robust contexts with EGL_EXT_create_context_robustness
11823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "robust_gles_2_ext", "Create robust OpenGL ES 2.0 context with EGL_EXT_create_context_robustness.", EGL_OPENGL_ES_API, EGL_OPENGL_ES2_BIT,
11833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_CLIENT_VERSION, 2, EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_TRUE, EGL_NONE } },
11843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "robust_gles_3_ext", "Create robust OpenGL ES 3.0 context with EGL_EXT_create_context_robustness.", EGL_OPENGL_ES_API, EGL_OPENGL_ES3_BIT_KHR,
11853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_CLIENT_VERSION, 3, EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_TRUE, EGL_NONE } },
11863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if 0
11873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// glu/glw doesn't support any version of OpenGL and EGL doesn't allow use of EGL_CONTEXT_CLIENT_VERSION with OpenGL and doesn't define which OpenGL version should be returned.
11883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "robust_gl_ext", "Create robust OpenGL context with EGL_EXT_create_context_robustness.", EGL_OPENGL_API, EGL_OPENGL_BIT,
11893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{ EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_TRUE, EGL_NONE } }
11903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif
11913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
11923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int groupNdx = 0; groupNdx < DE_LENGTH_OF_ARRAY(groupList); groupNdx++)
11943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(new CreateContextExtGroup(m_eglTestCtx, groupList[groupNdx].api, groupList[groupNdx].apiBit, groupList[groupNdx].attribList, groupList[groupNdx].name, groupList[groupNdx].description));
11953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // egl
11983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
1199