Add CTS_KHR_no_error test implementation

This is CTS_KHR_no_error implementation commit.
CONTEXT_NO_ERROR flag is added into framework.

Affects:
KHR-NoContext.*.no_error.*

Components: Framework, OpenGL

VK-GL-CTS issue: 5

Change-Id: Ie37d37ad974bbf5e8687f56f774c85498847299c
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/mustpass.xml b/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/mustpass.xml
new file mode 100644
index 0000000..f61d5a7
--- /dev/null
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/mustpass.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Mustpass version="4.5.5.x">
+	<!--/*     Copyright (C) 2016-2017 The Khronos Group Inc
+ *
+ *     Licensed under the Apache License, Version 2.0 (the "License");
+ *     you may not use this file except in compliance with the License.
+ *     You may obtain a copy of the License at
+ *
+ *          http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+*/-->
+	<!--/* WARNING: This is auto-generated file. Do not modify, since changes will
+ * be lost! Modify the generating script instead.
+ */-->
+	<TestPackage name="Khronos Mustpass GL NoContext">
+		<Configuration caseListFile="noctx-khr-master.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=64 --deqp-surface-height=64 --deqp-base-seed=1 --deqp-watchdog=disable" name="khr-master" os="any" useForFirstEGLConfig="True"/>
+		<Configuration caseListFile="noctx-khr-master.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=113 --deqp-surface-height=47 --deqp-base-seed=2 --deqp-watchdog=disable" name="khr-master" os="any" useForFirstEGLConfig="True"/>
+	</TestPackage>
+</Mustpass>
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/noctx-khr-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/noctx-khr-master.txt
new file mode 100644
index 0000000..ead6f7c
--- /dev/null
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/noctx-khr-master.txt
@@ -0,0 +1 @@
+KHR-NoContext.gl30.no_error.create_context
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/src/noctx-khr-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/src/noctx-khr-master.txt
new file mode 100644
index 0000000..706eb29
--- /dev/null
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/src/noctx-khr-master.txt
@@ -0,0 +1 @@
+KHR-NoContext.gl*
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/mustpass.xml b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/mustpass.xml
new file mode 100644
index 0000000..56b29ce
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/mustpass.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Mustpass version="3.2.4.x">
+	<!--/*     Copyright (C) 2016-2017 The Khronos Group Inc
+ *
+ *     Licensed under the Apache License, Version 2.0 (the "License");
+ *     you may not use this file except in compliance with the License.
+ *     You may obtain a copy of the License at
+ *
+ *          http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+*/-->
+	<!--/* WARNING: This is auto-generated file. Do not modify, since changes will
+ * be lost! Modify the generating script instead.
+ */-->
+	<TestPackage name="Khronos Mustpass ES NoContext">
+		<Configuration caseListFile="noctx-khr-master.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=64 --deqp-surface-height=64 --deqp-base-seed=1 --deqp-watchdog=disable" name="khr-master" os="any" useForFirstEGLConfig="True"/>
+		<Configuration caseListFile="noctx-khr-master.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=113 --deqp-surface-height=47 --deqp-base-seed=2 --deqp-watchdog=disable" name="khr-master" os="any" useForFirstEGLConfig="True"/>
+	</TestPackage>
+</Mustpass>
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/noctx-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/noctx-khr-master.txt
new file mode 100644
index 0000000..e363547
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/noctx-khr-master.txt
@@ -0,0 +1 @@
+KHR-NoContext.es2.no_error.create_context
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/src/noctx-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/src/noctx-khr-master.txt
new file mode 100644
index 0000000..8b3a676
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/src/noctx-khr-master.txt
@@ -0,0 +1 @@
+KHR-NoContext.es*
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/mustpass.xml b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/mustpass.xml
new file mode 100644
index 0000000..6c41041
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/mustpass.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Mustpass version="master">
+	<!--/*     Copyright (C) 2016-2017 The Khronos Group Inc
+ *
+ *     Licensed under the Apache License, Version 2.0 (the "License");
+ *     you may not use this file except in compliance with the License.
+ *     You may obtain a copy of the License at
+ *
+ *          http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+*/-->
+	<!--/* WARNING: This is auto-generated file. Do not modify, since changes will
+ * be lost! Modify the generating script instead.
+ */-->
+	<TestPackage name="Khronos Mustpass ES NoContext">
+		<Configuration caseListFile="noctx-khr-master.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=64 --deqp-surface-height=64 --deqp-base-seed=1 --deqp-watchdog=disable" name="khr-master" os="any" useForFirstEGLConfig="True"/>
+		<Configuration caseListFile="noctx-khr-master.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=113 --deqp-surface-height=47 --deqp-base-seed=2 --deqp-watchdog=disable" name="khr-master" os="any" useForFirstEGLConfig="True"/>
+	</TestPackage>
+</Mustpass>
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/noctx-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/noctx-khr-master.txt
new file mode 100644
index 0000000..e363547
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/noctx-khr-master.txt
@@ -0,0 +1 @@
+KHR-NoContext.es2.no_error.create_context
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/src/noctx-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/src/noctx-khr-master.txt
new file mode 100644
index 0000000..8b3a676
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/src/noctx-khr-master.txt
@@ -0,0 +1 @@
+KHR-NoContext.es*
diff --git a/external/openglcts/modules/CMakeLists.txt b/external/openglcts/modules/CMakeLists.txt
index 9a79996..84850e2 100644
--- a/external/openglcts/modules/CMakeLists.txt
+++ b/external/openglcts/modules/CMakeLists.txt
@@ -41,6 +41,7 @@
 	)
 
 set(GLCTS_LIBS
+	glcts-common-nocontext-package
 	glcts-gl
 	glcts-es2
 	glcts-es3
diff --git a/external/openglcts/modules/common/CMakeLists.txt b/external/openglcts/modules/common/CMakeLists.txt
index 6d1528b..aaf8c6b 100644
--- a/external/openglcts/modules/common/CMakeLists.txt
+++ b/external/openglcts/modules/common/CMakeLists.txt
@@ -24,8 +24,8 @@
 	glcFragDepthTests.hpp
 	glcInfoTests.cpp
 	glcInfoTests.hpp
-	glcNoDefaultContextPackage.cpp
-	glcNoDefaultContextPackage.hpp
+	glcNoErrorTests.cpp
+	glcNoErrorTests.hpp
 	glcRobustBufferAccessBehaviorTests.cpp
 	glcRobustBufferAccessBehaviorTests.hpp
 	glcShaderIndexingTests.cpp
@@ -78,3 +78,9 @@
 
 add_library(glcts-common STATIC ${GLCTS_COMMON_SRCS})
 target_link_libraries(glcts-common ${GLCTS_COMMON_LIBS})
+
+set(GLCTS_COMMON_NOCONTEXTPACKAGE_SRCS
+	glcNoDefaultContextPackage.cpp
+	glcNoDefaultContextPackage.hpp
+	)
+add_library(glcts-common-nocontext-package STATIC ${GLCTS_COMMON_NOCONTEXTPACKAGE_SRCS})
diff --git a/external/openglcts/modules/common/glcNoDefaultContextPackage.cpp b/external/openglcts/modules/common/glcNoDefaultContextPackage.cpp
index a91a13b..f26498f 100644
--- a/external/openglcts/modules/common/glcNoDefaultContextPackage.cpp
+++ b/external/openglcts/modules/common/glcNoDefaultContextPackage.cpp
@@ -22,6 +22,7 @@
  */ /*-------------------------------------------------------------------*/
 
 #include "glcNoDefaultContextPackage.hpp"
+#include "glcNoErrorTests.hpp"
 #include "gluRenderContext.hpp"
 
 namespace glcts
@@ -79,4 +80,14 @@
 	return new nodefaultcontext::TestCaseWrapper();
 }
 
+void NoDefaultContextPackage::init(void)
+{
+	tcu::TestCaseGroup* gl30Group = new tcu::TestCaseGroup(getTestContext(), "gl30", "");
+	gl30Group->addChild(new glcts::NoErrorTests(getTestContext(), glu::ApiType::core(3, 0)));
+	addChild(gl30Group);
+	tcu::TestCaseGroup* es2Group = new tcu::TestCaseGroup(getTestContext(), "es2", "");
+	es2Group->addChild(new glcts::NoErrorTests(getTestContext(), glu::ApiType::es(2, 0)));
+	addChild(es2Group);
+}
+
 } // glcts
diff --git a/external/openglcts/modules/common/glcNoDefaultContextPackage.hpp b/external/openglcts/modules/common/glcNoDefaultContextPackage.hpp
index 17506d2..ca916c5 100644
--- a/external/openglcts/modules/common/glcNoDefaultContextPackage.hpp
+++ b/external/openglcts/modules/common/glcNoDefaultContextPackage.hpp
@@ -34,9 +34,7 @@
 	NoDefaultContextPackage(tcu::TestContext& testCtx, const char* name);
 	virtual ~NoDefaultContextPackage(void);
 
-	virtual void init(void)
-	{
-	}
+	void init(void);
 
 	tcu::Archive* getArchive(void)
 	{
diff --git a/external/openglcts/modules/common/glcNoErrorTests.cpp b/external/openglcts/modules/common/glcNoErrorTests.cpp
new file mode 100644
index 0000000..d024c1e
--- /dev/null
+++ b/external/openglcts/modules/common/glcNoErrorTests.cpp
@@ -0,0 +1,132 @@
+/*-------------------------------------------------------------------------
+ * OpenGL Conformance Test Suite
+ * -----------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */ /*!
+ * \file
+ * \brief
+ */ /*-------------------------------------------------------------------*/
+
+/**
+ */ /*!
+ * \file  glcNoErrorTests.cpp
+ * \brief Conformance tests for the GL_KHR_no_error functionality.
+ */ /*--------------------------------------------------------------------*/
+
+#include "glcNoErrorTests.hpp"
+#include "gluContextInfo.hpp"
+#include "gluDefs.hpp"
+#include "glwEnums.hpp"
+#include "glwFunctions.hpp"
+#include "tcuCommandLine.hpp"
+#include "tcuTestLog.hpp"
+
+using namespace glu;
+
+namespace glcts
+{
+
+/** Constructor.
+	 *
+	 *  @param context     Rendering context
+	 *  @param name        Test name
+	 *  @param description Test description
+	 *  @param apiType     API version
+	 */
+NoErrorContextTest::NoErrorContextTest(tcu::TestContext& testCtx, glu::ApiType apiType)
+	: tcu::TestCase(testCtx, "create_context", "Test verifies if it is possible to create context with "
+											   "CONTEXT_FLAG_NO_ERROR_BIT_KHR flag set in CONTEXT_FLAGS")
+	, m_ApiType(apiType)
+{
+	/* Left blank intentionally */
+}
+
+/** Tears down any GL objects set up to run the test. */
+void NoErrorContextTest::deinit(void)
+{
+}
+
+/** Stub init method */
+void NoErrorContextTest::init(void)
+{
+}
+
+/** Veriffy if no error context can be successfully created.
+	 * @return True when no error context was successfully created.
+	 */
+bool NoErrorContextTest::verifyNoErrorContext(void)
+{
+	RenderConfig renderCfg(glu::ContextType(m_ApiType, glu::CONTEXT_NO_ERROR));
+
+	const tcu::CommandLine& commandLine = m_testCtx.getCommandLine();
+	glu::parseRenderConfig(&renderCfg, commandLine);
+
+	if (commandLine.getSurfaceType() != tcu::SURFACETYPE_WINDOW)
+		throw tcu::NotSupportedError("Test not supported in non-windowed context");
+
+	RenderContext* noErrorContext = createRenderContext(m_testCtx.getPlatform(), commandLine, renderCfg);
+	bool		   contextCreated = (noErrorContext != NULL);
+	delete noErrorContext;
+
+	return contextCreated;
+}
+
+/** Executes test iteration.
+	 *
+	 *  @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
+	 */
+tcu::TestNode::IterateResult NoErrorContextTest::iterate(void)
+{
+	{
+		deqp::Context context(m_testCtx, glu::ContextType(m_ApiType));
+
+		bool noErrorExtensionExists = context.getContextInfo().isExtensionSupported("GL_KHR_no_error");
+
+		if (!noErrorExtensionExists)
+		{
+			m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "GL_KHR_no_error extension not supported");
+			return STOP;
+		}
+	} // at this point intermediate context used to query the GL_KHR_no_error extension should be destroyed
+
+	if (verifyNoErrorContext())
+	{
+		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
+		return STOP;
+	}
+
+	m_testCtx.getLog() << tcu::TestLog::Message << "Failed to create No Error context" << tcu::TestLog::EndMessage;
+	m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
+	return STOP;
+}
+
+/** Constructor.
+	 *
+	 *  @param context Rendering context.
+	 */
+NoErrorTests::NoErrorTests(tcu::TestContext& testCtx, glu::ApiType apiType)
+	: tcu::TestCaseGroup(testCtx, "no_error", "Verify conformance of GL_KHR_no_error implementation")
+	, m_ApiType(apiType)
+{
+}
+
+/** Initializes the test group contents. */
+void NoErrorTests::init(void)
+{
+	addChild(new NoErrorContextTest(m_testCtx, m_ApiType));
+}
+} /* glcts namespace */
diff --git a/external/openglcts/modules/common/glcNoErrorTests.hpp b/external/openglcts/modules/common/glcNoErrorTests.hpp
new file mode 100644
index 0000000..aa35ef7
--- /dev/null
+++ b/external/openglcts/modules/common/glcNoErrorTests.hpp
@@ -0,0 +1,76 @@
+#ifndef _GLCNOERRORTESTS_HPP
+#define _GLCNOERRORTESTS_HPP
+/*-------------------------------------------------------------------------
+ * OpenGL Conformance Test Suite
+ * -----------------------------
+ *
+ * Copyright (c) 2017 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */ /*!
+ * \file
+ * \brief
+ */ /*-------------------------------------------------------------------*/
+
+/**
+ */ /*!
+ * \file  glcNoErrorTests.hpp
+ * \brief Conformance tests for the GL_KHR_no_error functionality.
+ */ /*--------------------------------------------------------------------*/
+
+#include "glcTestCase.hpp"
+#include "glwDefs.hpp"
+#include "tcuDefs.hpp"
+
+namespace glcts
+{
+/** Test verifies if it is possible to create context with
+	 *  CONTEXT_FLAG_NO_ERROR_BIT_KHR flag set in CONTEXT_FLAGS.
+	 */
+class NoErrorContextTest : public tcu::TestCase
+{
+public:
+	/* Public methods */
+	NoErrorContextTest(tcu::TestContext& testCtx, glu::ApiType apiType);
+
+	void						 deinit(void);
+	void						 init(void);
+	tcu::TestNode::IterateResult iterate(void);
+
+private:
+	/* Private methods */
+	bool verifyNoErrorContext(void);
+	/* Private members */
+	glu::ApiType m_ApiType;
+};
+
+/** Test group which encapsulates all sparse buffer conformance tests */
+class NoErrorTests : public tcu::TestCaseGroup
+{
+public:
+	/* Public methods */
+	NoErrorTests(tcu::TestContext& testCtx, glu::ApiType apiType);
+
+	void init(void);
+
+private:
+	NoErrorTests(const NoErrorTests& other);
+	NoErrorTests& operator=(const NoErrorTests& other);
+
+	/* Private members */
+	glu::ApiType m_ApiType;
+};
+} /* glcts namespace */
+
+#endif // _GLCNOERRORTESTS_HPP
diff --git a/external/openglcts/modules/glcTestPackageRegistry.cpp b/external/openglcts/modules/glcTestPackageRegistry.cpp
index f58a4e3..1719b52 100644
--- a/external/openglcts/modules/glcTestPackageRegistry.cpp
+++ b/external/openglcts/modules/glcTestPackageRegistry.cpp
@@ -54,6 +54,8 @@
 #include "gl3cTestPackages.hpp"
 #include "gl4cTestPackages.hpp"
 
+#include "glcNoDefaultContextPackage.hpp"
+
 #if defined(DEQP_GTF_AVAILABLE)
 #include "gtfGL30TestPackage.hpp"
 #include "gtfGL31TestPackage.hpp"
@@ -147,6 +149,11 @@
 	return new es32cts::ES32TestPackage(testCtx, "KHR-GLES32");
 }
 
+static tcu::TestPackage* createNoDefaultCustomContextPackage(tcu::TestContext& testCtx)
+{
+	return new glcts::NoDefaultContextPackage(testCtx, "KHR-NoContext");
+}
+
 static tcu::TestPackage* createGL30Package(tcu::TestContext& testCtx)
 {
 	return new gl3cts::GL30TestPackage(testCtx, "KHR-GL30");
@@ -272,6 +279,8 @@
 
 	registry->registerPackage("KHR-GLES32", createES32Package);
 
+	registry->registerPackage("KHR-NoContext", createNoDefaultCustomContextPackage);
+
 	registry->registerPackage("KHR-GL30", createGL30Package);
 	registry->registerPackage("KHR-GL31", createGL31Package);
 	registry->registerPackage("KHR-GL32", createGL32Package);
diff --git a/external/openglcts/modules/runner/glcAospMustpassEgl.hpp b/external/openglcts/modules/runner/glcAospMustpassEgl.hpp
index 47c0723..e08d324 100644
--- a/external/openglcts/modules/runner/glcAospMustpassEgl.hpp
+++ b/external/openglcts/modules/runner/glcAospMustpassEgl.hpp
@@ -19,19 +19,7 @@
  * be lost! Modify the generating script instead.
  */
 
-const string mustpassDir = "gl_cts/data/mustpass/egl/aosp_mustpass/3.2.4.x/";
-
-struct RunParams
-{
-	glu::ApiType apiType;
-	const string configName;
-	const char*  glConfigName;
-	const string screenRotation;
-	int			 baseSeed;
-	const char*  fboConfig;
-	int			 surfaceWidth;
-	int			 surfaceHeight;
-};
+const char* mustpassDir = "gl_cts/data/mustpass/egl/aosp_mustpass/3.2.4.x/";
 
 static const RunParams aosp_mustpass_egl_first_cfg[] = {
 	{ glu::ApiType(), "master", "rgba8888d24s8ms0", "unspecified", -1, DE_NULL, 256, 256 },
diff --git a/external/openglcts/modules/runner/glcAospMustpassEs.hpp b/external/openglcts/modules/runner/glcAospMustpassEs.hpp
index 9d4636a..25663c5 100644
--- a/external/openglcts/modules/runner/glcAospMustpassEs.hpp
+++ b/external/openglcts/modules/runner/glcAospMustpassEs.hpp
@@ -19,19 +19,7 @@
  * be lost! Modify the generating script instead.
  */
 
-const string mustpassDir = "gl_cts/data/mustpass/gles/aosp_mustpass/3.2.4.x/";
-
-struct RunParams
-{
-	glu::ApiType apiType;
-	const string configName;
-	const char*  glConfigName;
-	const string screenRotation;
-	int			 baseSeed;
-	const char*  fboConfig;
-	int			 surfaceWidth;
-	int			 surfaceHeight;
-};
+const char* mustpassDir = "gl_cts/data/mustpass/gles/aosp_mustpass/3.2.4.x/";
 
 static const RunParams aosp_mustpass_es_first_cfg[] = {
 	{ glu::ApiType::es(2, 0), "master", "rgba8888d24s8ms0", "unspecified", -1, DE_NULL, 256, 256 },
diff --git a/external/openglcts/modules/runner/glcKhronosMustpassEs.hpp b/external/openglcts/modules/runner/glcKhronosMustpassEs.hpp
index 8187891..7b4fe17 100644
--- a/external/openglcts/modules/runner/glcKhronosMustpassEs.hpp
+++ b/external/openglcts/modules/runner/glcKhronosMustpassEs.hpp
@@ -19,19 +19,7 @@
  * be lost! Modify the generating script instead.
  */
 
-const string mustpassDir = "gl_cts/data/mustpass/gles/khronos_mustpass/3.2.4.x/";
-
-struct RunParams
-{
-	glu::ApiType apiType;
-	const string configName;
-	const char*  glConfigName;
-	const string screenRotation;
-	int			 baseSeed;
-	const char*  fboConfig;
-	int			 surfaceWidth;
-	int			 surfaceHeight;
-};
+const char* mustpassDir = "gl_cts/data/mustpass/gles/khronos_mustpass/3.2.4.x/";
 
 static const RunParams khronos_mustpass_es_first_cfg[] = {
 	{ glu::ApiType::es(2, 0), "khr-master", DE_NULL, "unspecified", 1, DE_NULL, 64, 64 },
diff --git a/external/openglcts/modules/runner/glcKhronosMustpassEsNocontext.hpp b/external/openglcts/modules/runner/glcKhronosMustpassEsNocontext.hpp
new file mode 100644
index 0000000..4b61afa
--- /dev/null
+++ b/external/openglcts/modules/runner/glcKhronosMustpassEsNocontext.hpp
@@ -0,0 +1,29 @@
+#ifndef _GLCKHRONOSMUSTPASSESNOCONTEXT_HPP
+#define _GLCKHRONOSMUSTPASSESNOCONTEXT_HPP
+/*     Copyright (C) 2016-2017 The Khronos Group Inc
+ *
+ *     Licensed under the Apache License, Version 2.0 (the "License");
+ *     you may not use this file except in compliance with the License.
+ *     You may obtain a copy of the License at
+ *
+ *          http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+*/
+
+/* WARNING: This is auto-generated file. Do not modify, since changes will
+ * be lost! Modify the generating script instead.
+ */
+
+const char* mustpassDir = "gl_cts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/";
+
+static const RunParams khronos_mustpass_es_nocontext_first_cfg[] = {
+	{ glu::ApiType(), "khr-master", DE_NULL, "unspecified", 1, DE_NULL, 64, 64 },
+	{ glu::ApiType(), "khr-master", DE_NULL, "unspecified", 2, DE_NULL, 113, 47 },
+};
+
+#endif // _GLCKHRONOSMUSTPASSESNOCONTEXT_HPP
diff --git a/external/openglcts/modules/runner/glcKhronosMustpassGl.hpp b/external/openglcts/modules/runner/glcKhronosMustpassGl.hpp
index f3bc02d..2d30c8a 100644
--- a/external/openglcts/modules/runner/glcKhronosMustpassGl.hpp
+++ b/external/openglcts/modules/runner/glcKhronosMustpassGl.hpp
@@ -19,19 +19,7 @@
  * be lost! Modify the generating script instead.
  */
 
-const string mustpassDir = "gl_cts/data/mustpass/gl/khronos_mustpass/4.5.5.x/";
-
-struct RunParams
-{
-	glu::ApiType apiType;
-	const string configName;
-	const char*  glConfigName;
-	const string screenRotation;
-	int			 baseSeed;
-	const char*  fboConfig;
-	int			 surfaceWidth;
-	int			 surfaceHeight;
-};
+const char* mustpassDir = "gl_cts/data/mustpass/gl/khronos_mustpass/4.5.5.x/";
 
 static const RunParams khronos_mustpass_gl_first_cfg[] = {
 	{ glu::ApiType::core(4, 5), "master", DE_NULL, "unspecified", 1, DE_NULL, 64, 64 },
diff --git a/external/openglcts/modules/runner/glcKhronosMustpassGlNocontext.hpp b/external/openglcts/modules/runner/glcKhronosMustpassGlNocontext.hpp
new file mode 100644
index 0000000..2a51d14
--- /dev/null
+++ b/external/openglcts/modules/runner/glcKhronosMustpassGlNocontext.hpp
@@ -0,0 +1,29 @@
+#ifndef _GLCKHRONOSMUSTPASSGLNOCONTEXT_HPP
+#define _GLCKHRONOSMUSTPASSGLNOCONTEXT_HPP
+/*     Copyright (C) 2016-2017 The Khronos Group Inc
+ *
+ *     Licensed under the Apache License, Version 2.0 (the "License");
+ *     you may not use this file except in compliance with the License.
+ *     You may obtain a copy of the License at
+ *
+ *          http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+*/
+
+/* WARNING: This is auto-generated file. Do not modify, since changes will
+ * be lost! Modify the generating script instead.
+ */
+
+const char* mustpassDir = "gl_cts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/";
+
+static const RunParams khronos_mustpass_gl_nocontext_first_cfg[] = {
+	{ glu::ApiType(), "khr-master", DE_NULL, "unspecified", 1, DE_NULL, 64, 64 },
+	{ glu::ApiType(), "khr-master", DE_NULL, "unspecified", 2, DE_NULL, 113, 47 },
+};
+
+#endif // _GLCKHRONOSMUSTPASSGLNOCONTEXT_HPP
diff --git a/external/openglcts/modules/runner/glcTestRunner.cpp b/external/openglcts/modules/runner/glcTestRunner.cpp
index 3bacaf1..afbd316 100644
--- a/external/openglcts/modules/runner/glcTestRunner.cpp
+++ b/external/openglcts/modules/runner/glcTestRunner.cpp
@@ -194,7 +194,7 @@
 	return cfgInfo;
 }
 
-static string getApiName(glu::ApiType apiType)
+static const char* getApiName(glu::ApiType apiType)
 {
 	if (apiType == glu::ApiType::es(2, 0))
 		return "gles2";
@@ -228,7 +228,7 @@
 		throw std::runtime_error("Unknown context type");
 }
 
-static const string getCaseListFileOption(const string mustpassDir, const string apiName, const string mustpassName)
+static const string getCaseListFileOption(const char* mustpassDir, const char* apiName, const char* mustpassName)
 {
 #if DE_OS == DE_OS_ANDROID
 	const string case_list_option = "--deqp-caselist-resource=";
@@ -238,7 +238,7 @@
 	return case_list_option + mustpassDir + apiName + "-" + mustpassName + ".txt";
 }
 
-static const string getLogFileName(const string apiName, const string configName, const int iterId, const int runId,
+static const string getLogFileName(const char* apiName, const char* configName, const int iterId, const int runId,
 								   const int width, const int height, const int seed)
 {
 	string res = string("config-") + apiName + "-" + configName + "-cfg-" + de::toString(iterId) + "-run-" +
@@ -252,8 +252,8 @@
 	return res;
 }
 
-static void getBaseOptions(std::vector<std::string>& args, const string mustpassDir, const string apiName,
-						   const string configName, const string screenRotation, int width, int height)
+static void getBaseOptions(std::vector<std::string>& args, const char* mustpassDir, const char* apiName,
+						   const char* configName, const char* screenRotation, int width, int height)
 {
 	args.push_back(getCaseListFileOption(mustpassDir, apiName, configName));
 	args.push_back(string("--deqp-screen-rotation=") + screenRotation);
@@ -294,7 +294,8 @@
 			continue;
 		}
 
-		string	apiName = "egl";
+		const char* apiName = "egl";
+
 		const int width   = aosp_mustpass_egl_first_cfg[i].surfaceWidth;
 		const int height  = aosp_mustpass_egl_first_cfg[i].surfaceHeight;
 
@@ -339,7 +340,8 @@
 			return;
 		}
 
-		string	apiName = getApiName(aosp_mustpass_es_first_cfg[i].apiType);
+		const char* apiName = getApiName(aosp_mustpass_es_first_cfg[i].apiType);
+
 		const int width   = aosp_mustpass_es_first_cfg[i].surfaceWidth;
 		const int height  = aosp_mustpass_es_first_cfg[i].surfaceHeight;
 
@@ -361,10 +363,45 @@
 	}
 }
 
+static void getTestRunsForNoContext(vector<TestRunParams>& runs, const ConfigList& configs, const RunParams* runParams,
+									const int numRunParams, const char* mustpassDir)
+{
+	vector<Config>::const_iterator cfgIter = configs.configs.begin();
+
+	for (int i = 0; i < numRunParams; ++i)
+	{
+		const char* apiName = "noctx";
+
+		const int width  = runParams[i].surfaceWidth;
+		const int height = runParams[i].surfaceHeight;
+		const int seed   = runParams[i].baseSeed;
+
+		TestRunParams params;
+		params.logFilename = getLogFileName(apiName, runParams[i].configName, 1, i, width, height, seed);
+
+		getBaseOptions(params.args, mustpassDir, apiName, runParams[i].configName, runParams[i].screenRotation, width,
+					   height);
+
+		params.args.push_back(string("--deqp-base-seed=") + de::toString(seed));
+
+		appendConfigArgs(*cfgIter, params.args, runParams[i].fboConfig);
+
+		runs.push_back(params);
+	}
+}
+
+static void getTestRunsForNoContextES(vector<TestRunParams>& runs, const ConfigList& configs)
+{
+#include "glcKhronosMustpassEsNocontext.hpp"
+	getTestRunsForNoContext(runs, configs, khronos_mustpass_es_nocontext_first_cfg,
+							DE_LENGTH_OF_ARRAY(khronos_mustpass_es_nocontext_first_cfg), mustpassDir);
+}
+
 static void getTestRunsForES(glu::ApiType type, const ConfigList& configs, vector<TestRunParams>& runs)
 {
 	getTestRunsForAOSPEGL(runs, configs);
 	getTestRunsForAOSPES(runs, configs, type);
+	getTestRunsForNoContextES(runs, configs);
 
 #include "glcKhronosMustpassEs.hpp"
 
@@ -380,7 +417,8 @@
 			if (!glu::contextSupports(glu::ContextType(type), runParams[runNdx].apiType))
 				continue;
 
-			string	apiName = getApiName(runParams[runNdx].apiType);
+			const char* apiName = getApiName(runParams[runNdx].apiType);
+
 			const int width   = runParams[runNdx].surfaceWidth;
 			const int height  = runParams[runNdx].surfaceHeight;
 			const int seed	= runParams[runNdx].baseSeed;
@@ -401,8 +439,16 @@
 	}
 }
 
+static void getTestRunsForNoContextGL(vector<TestRunParams>& runs, const ConfigList& configs)
+{
+#include "glcKhronosMustpassGlNocontext.hpp"
+	getTestRunsForNoContext(runs, configs, khronos_mustpass_gl_nocontext_first_cfg,
+							DE_LENGTH_OF_ARRAY(khronos_mustpass_gl_nocontext_first_cfg), mustpassDir);
+}
+
 static void getTestRunsForGL(glu::ApiType type, const ConfigList& configs, vector<TestRunParams>& runs)
 {
+	getTestRunsForNoContextGL(runs, configs);
 #include "glcKhronosMustpassGl.hpp"
 
 	for (vector<Config>::const_iterator cfgIter = configs.configs.begin(); cfgIter != configs.configs.end(); ++cfgIter)
@@ -417,7 +463,8 @@
 			if (type != runParams[runNdx].apiType)
 				continue;
 
-			string	apiName = getApiName(runParams[runNdx].apiType);
+			const char* apiName = getApiName(runParams[runNdx].apiType);
+
 			const int width   = runParams[runNdx].surfaceWidth;
 			const int height  = runParams[runNdx].surfaceHeight;
 			const int seed	= runParams[runNdx].baseSeed;
diff --git a/external/openglcts/modules/runner/glcTestRunner.hpp b/external/openglcts/modules/runner/glcTestRunner.hpp
index be59095..4ae9a61 100644
--- a/external/openglcts/modules/runner/glcTestRunner.hpp
+++ b/external/openglcts/modules/runner/glcTestRunner.hpp
@@ -42,6 +42,18 @@
 
 struct Config;
 
+struct RunParams
+{
+	glu::ApiType apiType;
+	const char*  configName;
+	const char*  glConfigName;
+	const char*  screenRotation;
+	int			 baseSeed;
+	const char*  fboConfig;
+	int			 surfaceWidth;
+	int			 surfaceHeight;
+};
+
 struct TestRunParams
 {
 	std::vector<std::string> args;
diff --git a/external/openglcts/scripts/build_caselists.py b/external/openglcts/scripts/build_caselists.py
index d716a99..0bcbb31 100644
--- a/external/openglcts/scripts/build_caselists.py
+++ b/external/openglcts/scripts/build_caselists.py
@@ -51,6 +51,7 @@
 	Module("GTF-GLES2",		"GLES2" ),
 	Module("GTF-GLES3",		"GLES3" ),
 	Module("GTF-GLES31",	"GLES31"),
+	Module("KHR-NoContext",	"NOCTX"),
 	Module("KHR-GL45",		"GL45"),
 	Module("KHR-GL44",		"GL44"),
 	Module("KHR-GL43",		"GL43"),
diff --git a/external/openglcts/scripts/build_mustpass.py b/external/openglcts/scripts/build_mustpass.py
index 3930675..813d95b 100644
--- a/external/openglcts/scripts/build_mustpass.py
+++ b/external/openglcts/scripts/build_mustpass.py
@@ -73,6 +73,12 @@
 
 CTS_AOSP_MP_EGL_PROJECT			= Project(name = "AOSP Mustpass EGL", path = CTS_AOSP_MP_EGL_DATA_DIR, incpath = CTS_MP_INC_DIR, devicepath = CTS_AOSP_MP_EGL_DEVICE_DIR, copyright = COPYRIGHT_DECLARATION)
 
+CTS_KHR_MP_NOCTX_DATA_DIR		= os.path.join(DEQP_DIR, "external", "openglcts", "data", "mustpass", "gles", "khronos_mustpass_noctx")
+
+CTS_KHR_MP_NOCTX_DEVICE_DIR		= "gl_cts/data/mustpass/gles/khronos_mustpass_noctx"
+
+CTS_KHR_MP_NOCTX_ES_PROJECT		= Project(name = "Khronos Mustpass ES NoContext", path = CTS_KHR_MP_NOCTX_DATA_DIR, incpath = CTS_MP_INC_DIR, devicepath = CTS_KHR_MP_NOCTX_DEVICE_DIR, copyright = COPYRIGHT_DECLARATION)
+
 EGL_MODULE						= getModuleByName("dEQP-EGL")
 ES2CTS_MODULE					= getModuleByName("dEQP-GLES2")
 ES3CTS_MODULE					= getModuleByName("dEQP-GLES3")
@@ -82,6 +88,7 @@
 ES3KHR_MODULE					= getModuleByName("KHR-GLES3")
 ES31KHR_MODULE					= getModuleByName("KHR-GLES31")
 ES32KHR_MODULE					= getModuleByName("KHR-GLES32")
+NOCTXKHR_MODULE					= getModuleByName("KHR-NoContext")
 
 ES2GTF_MODULE					= getModuleByName("GTF-GLES2")
 ES3GTF_MODULE					= getModuleByName("GTF-GLES3")
@@ -844,6 +851,20 @@
 					filters			= [include("gles32-khr-master.txt")]),
 	])
 
+GLCTS_NOCTX_KHR_PKG_1CFG			= Package(module = NOCTXKHR_MODULE, configurations = [
+		# Master
+		Configuration(name			= "khr-master",
+					surfacewidth	= "64",
+					surfaceheight	= "64",
+					baseseed		= "1",
+					filters			= [include("noctx-khr-master.txt")]),
+		Configuration(name			= "khr-master",
+					surfacewidth	= "113",
+					surfaceheight	= "47",
+					baseseed		= "2",
+					filters			= [include("noctx-khr-master.txt")]),
+	])
+
 ES_MUSTPASS_LISTS		= [
 	# 3.2.2.x
 	Mustpass(project = CTS_KHR_MP_ES_PROJECT,	version = "3.2.2.x", isCurrent=False,
@@ -908,6 +929,10 @@
 						GLCTS_3_2_3_GLES32_KHR_PKG_N1CFG,
 						]),
 
+
+	Mustpass(project = CTS_KHR_MP_NOCTX_ES_PROJECT, version = "3.2.4.x", isCurrent=True,
+			packages = [GLCTS_NOCTX_KHR_PKG_1CFG]),
+
 	Mustpass(project = CTS_AOSP_MP_ES_PROJECT, version = "3.2.4.x", isCurrent=True,
 			packages = [GLCTS_3_2_3_GLES2_PKG, GLCTS_3_2_3_GLES3_PKG, GLCTS_3_2_3_GLES31_PKG]),
 
@@ -927,6 +952,9 @@
 						GLCTS_GLES32_KHR_PKG_N1CFG,
 						]),
 
+	Mustpass(project = CTS_KHR_MP_NOCTX_ES_PROJECT, version = "master", isCurrent=False,
+			packages = [GLCTS_NOCTX_KHR_PKG_1CFG]),
+
 	Mustpass(project = CTS_AOSP_MP_ES_PROJECT, version = "master", isCurrent=False,
 			packages = [MASTER_GLES2_PKG, MASTER_GLES3_PKG, MASTER_GLES31_PKG]),
 
@@ -947,27 +975,33 @@
 
 GL_CTS_KHR_MP_PROJECT				= Project(name = "Khronos Mustpass GL", path = GL_CTS_KHR_MP_DATA_DIR, incpath = GL_CTS_MP_INC_DIR, devicepath = GL_CTS_KHR_MP_DEVICE_DIR, copyright = COPYRIGHT_DECLARATION)
 
+GL_CTS_KHR_MP_NOCTX_DATA_DIR		= os.path.join(DEQP_DIR, "external", "openglcts", "data", "mustpass", "gl", "khronos_mustpass_noctx")
+
+GL_CTS_KHR_MP_NOCTX_DEVICE_DIR		= "gl_cts/data/mustpass/gl/khronos_mustpass_noctx"
+
+GL_CTS_NOCTX_PROJECT				= Project(name = "Khronos Mustpass GL NoContext", path = GL_CTS_KHR_MP_NOCTX_DATA_DIR, incpath = GL_CTS_MP_INC_DIR, devicepath = GL_CTS_KHR_MP_NOCTX_DEVICE_DIR, copyright = COPYRIGHT_DECLARATION)
+
 GL_MODULES							= OrderedDict([
-			('KHR-GL45', ['master',		[include('gl45-master.txt')]]),
-			('KHR-GL44', ['master',		[include('gl44-master.txt')]]),
-			('KHR-GL43', ['master',		[include('gl43-master.txt')]]),
-			('KHR-GL42', ['master',		[include('gl42-master.txt')]]),
-			('KHR-GL41', ['master',		[include('gl41-master.txt')]]),
-			('KHR-GL40', ['master',		[include('gl40-master.txt')]]),
-			('KHR-GL33', ['master',		[include('gl33-master.txt')]]),
-			('KHR-GL32', ['master',		[include('gl32-master.txt')]]),
-			('KHR-GL31', ['master',		[include('gl31-master.txt')]]),
-			('KHR-GL30', ['master',		[include('gl30-master.txt')]]),
-			('GTF-GL45', ['gtf-master',	[include('gl45-gtf-master.txt')]]),
-			('GTF-GL44', ['gtf-master',	[include('gl44-gtf-master.txt')]]),
-			('GTF-GL43', ['gtf-master',	[include('gl43-gtf-master.txt')]]),
-			('GTF-GL42', ['gtf-master',	[include('gl42-gtf-master.txt')]]),
-			('GTF-GL41', ['gtf-master',	[include('gl41-gtf-master.txt')]]),
-			('GTF-GL40', ['gtf-master',	[include('gl40-gtf-master.txt')]]),
-			('GTF-GL33', ['gtf-master',	[include('gl33-gtf-master.txt')]]),
-			('GTF-GL32', ['gtf-master',	[include('gl32-gtf-master.txt')]]),
-			('GTF-GL31', ['gtf-master',	[include('gl31-gtf-master.txt')]]),
-			('GTF-GL30', ['gtf-master',	[include('gl30-gtf-master.txt')]])
+			('KHR-GL45',		['master',		[include('gl45-master.txt')]]),
+			('KHR-GL44',		['master',		[include('gl44-master.txt')]]),
+			('KHR-GL43',		['master',		[include('gl43-master.txt')]]),
+			('KHR-GL42',		['master',		[include('gl42-master.txt')]]),
+			('KHR-GL41',		['master',		[include('gl41-master.txt')]]),
+			('KHR-GL40',		['master',		[include('gl40-master.txt')]]),
+			('KHR-GL33',		['master',		[include('gl33-master.txt')]]),
+			('KHR-GL32',		['master',		[include('gl32-master.txt')]]),
+			('KHR-GL31',		['master',		[include('gl31-master.txt')]]),
+			('KHR-GL30',		['master',		[include('gl30-master.txt')]]),
+			('GTF-GL45',		['gtf-master',	[include('gl45-gtf-master.txt')]]),
+			('GTF-GL44',		['gtf-master',	[include('gl44-gtf-master.txt')]]),
+			('GTF-GL43',		['gtf-master',	[include('gl43-gtf-master.txt')]]),
+			('GTF-GL42',		['gtf-master',	[include('gl42-gtf-master.txt')]]),
+			('GTF-GL41',		['gtf-master',	[include('gl41-gtf-master.txt')]]),
+			('GTF-GL40',		['gtf-master',	[include('gl40-gtf-master.txt')]]),
+			('GTF-GL33',		['gtf-master',	[include('gl33-gtf-master.txt')]]),
+			('GTF-GL32',		['gtf-master',	[include('gl32-gtf-master.txt')]]),
+			('GTF-GL31',		['gtf-master',	[include('gl31-gtf-master.txt')]]),
+			('GTF-GL30',		['gtf-master',	[include('gl30-gtf-master.txt')]])
 		])
 
 def generateGLMustpass():
@@ -980,14 +1014,14 @@
 			config_w64		= Configuration(name = cfgName, surfacewidth = "64", surfaceheight = "-1", baseseed = "3", fboconfig = "rgba8888d24s8", filters = cfgFilter)
 			config_h64		= Configuration(name = cfgName, surfacewidth = "-1", surfaceheight = "64", baseseed = "3", fboconfig = "rgba8888d24s8", filters = cfgFilter)
 
-			pgkModule		= getModuleByName(packageName)
-			pkg0			= Package(module = pgkModule,
+			pkgModule		= getModuleByName(packageName)
+			pkg0			= Package(module = pkgModule,
 										useforfirsteglconfig = True,
 										configurations = [
 											config_w64xh64, config_w113xh47, config_w64, config_h64
 										]
 									)
-			pkg1			= Package(module = pgkModule,
+			pkg1			= Package(module = pkgModule,
 										useforfirsteglconfig = False,
 										configurations = [
 											config_w64xh64, config_w113xh47,
@@ -996,7 +1030,9 @@
 			gl_packages.append(pkg0)
 			gl_packages.append(pkg1)
 
-		mustpass = [Mustpass(project = GL_CTS_KHR_MP_PROJECT, version = "4.5.5.x", isCurrent=True, packages = gl_packages)]
+		mustpass = [Mustpass(project = GL_CTS_KHR_MP_PROJECT, version = "4.5.5.x", isCurrent=True, packages = gl_packages),
+					Mustpass(project = GL_CTS_NOCTX_PROJECT, version = "4.5.5.x", isCurrent=True, packages = [GLCTS_NOCTX_KHR_PKG_1CFG]),
+					]
 		return mustpass
 
 GL_BUILD_CONFIG					= BuildConfig(buildPath, "Debug", ["-DDEQP_TARGET=%s" % DEFAULT_TARGET, "-DGLCTS_GTF_TARGET=gl"])
diff --git a/external/openglcts/scripts/mustpass.py b/external/openglcts/scripts/mustpass.py
index b97ceaa..c8292c8 100644
--- a/external/openglcts/scripts/mustpass.py
+++ b/external/openglcts/scripts/mustpass.py
@@ -285,7 +285,7 @@
 		return "glu::ApiType::core(3, 1)"
 	if apiName == "GL30":
 		return "glu::ApiType::core(3, 0)"
-	if apiName == "EGL":
+	if apiName == "EGL" or apiName == "NOCTX":
 		return "glu::ApiType()"
 
 	raise Exception("Unknown API %s" % apiName)
@@ -313,19 +313,7 @@
 	fileBody += "\n\n"
 	fileBody += GENERATED_FILE_WARNING
 	fileBody += "\n\n"
-	fileBody += 'const string mustpassDir = "' + mustpass.project.devicepath + '/' + mustpass.version + '/";\n\n'
-	fileBody += "struct RunParams\n"
-	fileBody += "{\n"
-	fileBody += "\tglu::ApiType apiType;\n"
-	fileBody += "\tconst string configName;\n"
-	fileBody += "\tconst char*  glConfigName;\n"
-	fileBody += "\tconst string screenRotation;\n"
-	fileBody += "\tint\t\t\t baseSeed;\n"
-	fileBody += "\tconst char*  fboConfig;\n"
-	fileBody += "\tint\t\t\t surfaceWidth;\n"
-	fileBody += "\tint\t\t\t surfaceHeight;\n"
-	fileBody += "};\n"
-	fileBody += "\n"
+	fileBody += 'const char* mustpassDir = "' + mustpass.project.devicepath + '/' + mustpass.version + '/";\n\n'
 
 	gtf_wrapper_open = "#if defined(DEQP_GTF_AVAILABLE)\n"
 	gtf_wrapper_close = "#endif // defined(DEQP_GTF_AVAILABLE)\n"
diff --git a/framework/egl/egluGLUtil.cpp b/framework/egl/egluGLUtil.cpp
index 4584cd4..cca5681 100644
--- a/framework/egl/egluGLUtil.cpp
+++ b/framework/egl/egluGLUtil.cpp
@@ -82,9 +82,10 @@
 							const glu::ContextType&			contextType,
 							glu::ResetNotificationStrategy	resetNotificationStrategy)
 {
-	const bool			khrCreateContextSupported	= hasExtension(egl, display, "EGL_KHR_create_context");
-	EGLContext			context						= EGL_NO_CONTEXT;
-	EGLenum				api							= EGL_NONE;
+	const bool			khrCreateContextSupported			= hasExtension(egl, display, "EGL_KHR_create_context");
+	const bool			khrCreateContextNoErrorSupported	= hasExtension(egl, display, "EGL_KHR_create_context_no_error");
+	EGLContext			context								= EGL_NO_CONTEXT;
+	EGLenum				api									= EGL_NONE;
 	vector<EGLint>		attribList;
 
 	if (glu::isContextTypeES(contextType))
@@ -149,6 +150,17 @@
 				flags |= EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR;
 		}
 
+		if ((contextType.getFlags() & glu::CONTEXT_NO_ERROR) != 0)
+		{
+			if (khrCreateContextNoErrorSupported)
+			{
+				attribList.push_back(EGL_CONTEXT_OPENGL_NO_ERROR_KHR);
+				attribList.push_back(EGL_TRUE);
+			}
+			else
+				throw tcu::NotSupportedError("EGL_KHR_create_context_no_error is required for creating no-error contexts");
+		}
+
 		if ((contextType.getFlags() & glu::CONTEXT_FORWARD_COMPATIBLE) != 0)
 		{
 			if (!glu::isContextTypeGLCore(contextType))
diff --git a/framework/egl/wrapper/eglwEnums.inl b/framework/egl/wrapper/eglwEnums.inl
index 1822da9..6d0cef4 100644
--- a/framework/egl/wrapper/eglwEnums.inl
+++ b/framework/egl/wrapper/eglwEnums.inl
@@ -228,6 +228,7 @@
 #define EGL_CONTEXT_OPENGL_DEBUG							0x31B0
 #define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE				0x31B1
 #define EGL_CONTEXT_OPENGL_ROBUST_ACCESS					0x31B2
+#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR						0x31B3
 #define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR	0x31BD
 #define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR	0x31BD
 #define EGL_NO_RESET_NOTIFICATION							0x31BE
diff --git a/framework/egl/wrapper/eglwEnumsC.inl b/framework/egl/wrapper/eglwEnumsC.inl
index c3ab2ef..6552ff1 100644
--- a/framework/egl/wrapper/eglwEnumsC.inl
+++ b/framework/egl/wrapper/eglwEnumsC.inl
@@ -228,6 +228,7 @@
 #define EGL_CONTEXT_OPENGL_DEBUG							0x31B0
 #define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE				0x31B1
 #define EGL_CONTEXT_OPENGL_ROBUST_ACCESS					0x31B2
+#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR						0x31B3
 #define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR	0x31BD
 #define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR	0x31BD
 #define EGL_NO_RESET_NOTIFICATION							0x31BE
diff --git a/framework/opengl/gluRenderContext.hpp b/framework/opengl/gluRenderContext.hpp
index 7f896e3..0c6871c 100644
--- a/framework/opengl/gluRenderContext.hpp
+++ b/framework/opengl/gluRenderContext.hpp
@@ -61,7 +61,8 @@
 {
 	CONTEXT_ROBUST				= (1<<0),	//!< Robust context
 	CONTEXT_DEBUG				= (1<<1),	//!< Debug context
-	CONTEXT_FORWARD_COMPATIBLE	= (1<<2)	//!< Forward-compatible context
+	CONTEXT_FORWARD_COMPATIBLE	= (1<<2),	//!< Forward-compatible context
+	CONTEXT_NO_ERROR			= (1<<3)    //!< No error context
 };
 
 inline ContextFlags	operator| (ContextFlags a, ContextFlags b)	{ return ContextFlags((deUint32)a|(deUint32)b);	}
@@ -158,7 +159,7 @@
 
 	enum
 	{
-		FLAGS_BITS			= 3,
+		FLAGS_BITS			= 4,
 		TOTAL_CONTEXT_BITS	= TOTAL_API_BITS+FLAGS_BITS,
 		FLAGS_SHIFT			= TOTAL_API_BITS
 	};
diff --git a/framework/opengl/wrapper/glwEnums.inl b/framework/opengl/wrapper/glwEnums.inl
index 60711f7..2df4c82 100644
--- a/framework/opengl/wrapper/glwEnums.inl
+++ b/framework/opengl/wrapper/glwEnums.inl
@@ -10,6 +10,7 @@
 #define GL_CONTEXT_FLAG_DEBUG_BIT										0x00000002
 #define GL_CONTEXT_FLAG_DEBUG_BIT_KHR									0x00000002
 #define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT								0x00000004
+#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR								0x00000008
 #define GL_CONTEXT_CORE_PROFILE_BIT										0x00000001
 #define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT							0x00000002
 #define GL_MAP_READ_BIT													0x0001
diff --git a/framework/platform/lnx/X11/tcuLnxX11GlxPlatform.cpp b/framework/platform/lnx/X11/tcuLnxX11GlxPlatform.cpp
index df0fda5..297be76 100644
--- a/framework/platform/lnx/X11/tcuLnxX11GlxPlatform.cpp
+++ b/framework/platform/lnx/X11/tcuLnxX11GlxPlatform.cpp
@@ -26,6 +26,7 @@
 #include "tcuRenderTarget.hpp"
 #include "glwInitFunctions.hpp"
 #include "deUniquePtr.hpp"
+#include "glwEnums.hpp"
 
 #include <sstream>
 #include <iterator>
@@ -353,6 +354,17 @@
 		if ((contextType.getFlags() & glu::CONTEXT_ROBUST) != 0)
 			flags |= GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB;
 
+		if ((contextType.getFlags() & glu::CONTEXT_NO_ERROR) != 0)
+		{
+			if (m_display.isGlxExtensionSupported("GLX_ARB_create_context_no_error"))
+			{
+				attribs.push_back(GLX_CONTEXT_OPENGL_NO_ERROR_ARB);
+				attribs.push_back(True);
+			}
+			else
+				TCU_THROW(NotSupportedError, "GLX_ARB_create_context_no_error is required for creating no-error contexts");
+		}
+
 		if (flags != 0)
 		{
 			attribs.push_back(GLX_CONTEXT_FLAGS_ARB);
diff --git a/framework/platform/win32/tcuWGL.cpp b/framework/platform/win32/tcuWGL.cpp
index bc1819c..a142a4d 100644
--- a/framework/platform/win32/tcuWGL.cpp
+++ b/framework/platform/win32/tcuWGL.cpp
@@ -28,8 +28,12 @@
 #include "deStringUtil.hpp"
 #include "tcuFormatUtil.hpp"
 #include "gluRenderConfig.hpp"
+#include "glwEnums.hpp"
 
 #include <map>
+#include <sstream>
+#include <iterator>
+#include <set>
 
 #include <WinGDI.h>
 
@@ -111,22 +115,26 @@
 #define WGL_NO_RESET_NOTIFICATION_ARB				0x8261
 #define WGL_LOSE_CONTEXT_ON_RESET_ARB				0x8252
 
+// WGL ARB_create_context_no_error
+#define WGL_CONTEXT_OPENGL_NO_ERROR_ARB				0x31B3
+
 DE_BEGIN_EXTERN_C
 
 // WGL core
-typedef HGLRC	(WINAPI* wglCreateContextFunc)				(HDC hdc);
-typedef BOOL	(WINAPI* wglDeleteContextFunc)				(HGLRC hglrc);
-typedef BOOL	(WINAPI* wglMakeCurrentFunc)				(HDC hdc, HGLRC hglrc);
-typedef PROC	(WINAPI* wglGetProcAddressFunc)				(LPCSTR lpszProc);
-typedef BOOL	(WINAPI* wglSwapLayerBuffersFunc)			(HDC dhc, UINT fuPlanes);
+typedef HGLRC		(WINAPI* wglCreateContextFunc)				(HDC hdc);
+typedef BOOL		(WINAPI* wglDeleteContextFunc)				(HGLRC hglrc);
+typedef BOOL		(WINAPI* wglMakeCurrentFunc)				(HDC hdc, HGLRC hglrc);
+typedef PROC		(WINAPI* wglGetProcAddressFunc)				(LPCSTR lpszProc);
+typedef BOOL		(WINAPI* wglSwapLayerBuffersFunc)			(HDC dhc, UINT fuPlanes);
 
 // WGL_ARB_pixel_format
-typedef BOOL	(WINAPI* wglGetPixelFormatAttribivARBFunc)	(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues);
-typedef BOOL	(WINAPI* wglGetPixelFormatAttribfvARBFunc)	(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues);
-typedef BOOL	(WINAPI* wglChoosePixelFormatARBFunc)		(HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
+typedef BOOL		(WINAPI* wglGetPixelFormatAttribivARBFunc)	(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues);
+typedef BOOL		(WINAPI* wglGetPixelFormatAttribfvARBFunc)	(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues);
+typedef BOOL		(WINAPI* wglChoosePixelFormatARBFunc)		(HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
 
 // WGL_ARB_create_context
-typedef HGLRC	(WINAPI* wglCreateContextAttribsARBFunc)	(HDC hdc, HGLRC hshareContext, const int* attribList);
+typedef HGLRC		(WINAPI* wglCreateContextAttribsARBFunc)	(HDC hdc, HGLRC hshareContext, const int* attribList);
+typedef const char*	(WINAPI* wglGetExtensionsStringARBFunc)		(HDC hdc);
 
 DE_END_EXTERN_C
 
@@ -153,6 +161,7 @@
 
 	// WGL_ARB_create_context
 	wglCreateContextAttribsARBFunc		createContextAttribsARB;
+	wglGetExtensionsStringARBFunc		getExtensionsStringARB;
 
 	Functions (void)
 		: createContext				(DE_NULL)
@@ -164,6 +173,7 @@
 		, getPixelFormatAttribfvARB	(DE_NULL)
 		, choosePixelFormatARB		(DE_NULL)
 		, createContextAttribsARB	(DE_NULL)
+		, getExtensionsStringARB	(DE_NULL)
 	{
 	}
 };
@@ -178,10 +188,12 @@
 
 	const Functions&			getFunctions	(void) const	{ return m_functions;	}
 	const de::DynamicLibrary&	getGLLibrary	(void) const	{ return m_library;		}
+	bool						isWglExtensionSupported (const char* extName) const;
 
 private:
 	de::DynamicLibrary			m_library;
 	Functions					m_functions;
+	std::set<std::string>		m_extensions;
 };
 
 Library::Library (HINSTANCE instance)
@@ -235,6 +247,7 @@
 
 	// WGL_ARB_create_context
 	m_functions.createContextAttribsARB		= (wglCreateContextAttribsARBFunc)m_functions.getProcAddress("wglCreateContextAttribsARB");
+	m_functions.getExtensionsStringARB		= (wglGetExtensionsStringARBFunc)m_functions.getProcAddress("wglGetExtensionsStringARB");
 
 	m_functions.makeCurrent(tmpWindow.getDeviceContext(), NULL);
 	m_functions.deleteContext(tmpCtx);
@@ -242,14 +255,25 @@
 	if (!m_functions.getPixelFormatAttribivARB	||
 		!m_functions.getPixelFormatAttribfvARB	||
 		!m_functions.choosePixelFormatARB		||
-		!m_functions.createContextAttribsARB)
+		!m_functions.createContextAttribsARB	||
+		!m_functions.getExtensionsStringARB)
 		throw ResourceError("Failed to load WGL extension functions");
+
+	const char* extensions = m_functions.getExtensionsStringARB(tmpWindow.getDeviceContext());
+	std::istringstream extStream(extensions);
+	m_extensions = std::set<std::string>(std::istream_iterator<std::string>(extStream),
+										 std::istream_iterator<std::string>());
 }
 
 Library::~Library (void)
 {
 }
 
+bool Library::isWglExtensionSupported (const char* extName) const
+{
+	return m_extensions.find(extName) != m_extensions.end();
+}
+
 // Core
 
 Core::Core (HINSTANCE instance)
@@ -439,6 +463,17 @@
 		if ((ctxType.getFlags() & glu::CONTEXT_ROBUST) != 0)
 			flags |= WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB;
 
+		if ((ctxType.getFlags() & glu::CONTEXT_NO_ERROR) != 0)
+		{
+			if (core->getLibrary()->isWglExtensionSupported("WGL_ARB_create_context_no_error"))
+			{
+				attribList.push_back(WGL_CONTEXT_OPENGL_NO_ERROR_ARB);
+				attribList.push_back(1);
+			}
+			else
+				TCU_THROW(NotSupportedError, "WGL_ARB_create_context_no_error is required for creating no-error contexts");
+		}
+
 		if (flags != 0)
 		{
 			attribList.push_back(WGL_CONTEXT_FLAGS_ARB);
@@ -477,7 +512,7 @@
 	attribList.push_back(0);
 
 	// Create context
-    m_context = wgl.createContextAttribsARB(deviceCtx, (HGLRC)0, &attribList[0]);
+	m_context = wgl.createContextAttribsARB(deviceCtx, (HGLRC)0, &attribList[0]);
 
 	if (!m_context)
 		TCU_THROW(ResourceError, "Failed to create WGL context");
diff --git a/scripts/egl/common.py b/scripts/egl/common.py
index 552d5cb..e0cf276 100644
--- a/scripts/egl/common.py
+++ b/scripts/egl/common.py
@@ -48,6 +48,7 @@
 EXTENSIONS			= [
 	# \todo [2014-12-05 pyry] Use 1.5 core functions/enums instead
 	"EGL_KHR_create_context",
+	"EGL_KHR_create_context_no_error",
 	"EGL_KHR_lock_surface",
 	"EGL_KHR_image_base",
 	"EGL_KHR_fence_sync",
diff --git a/scripts/opengl/src_util.py b/scripts/opengl/src_util.py
index 3a2bf34..efc29df 100644
--- a/scripts/opengl/src_util.py
+++ b/scripts/opengl/src_util.py
@@ -47,6 +47,7 @@
 	'GL_KHR_blend_equation_advanced_coherent',
 	'GL_KHR_debug',
 	'GL_KHR_robustness',
+	'GL_KHR_no_error',
 	'GL_EXT_bgra',
 	'GL_EXT_geometry_point_size',
 	'GL_EXT_tessellation_shader',