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