From: Adam Czupryna Date: Mon, 27 Feb 2017 10:01:06 +0000 (+0100) Subject: Add CTS_KHR_no_error test implementation X-Git-Tag: upstream/0.1.0~234 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f06134c65f55a009bbe284d2b7c0e56dee0f70cd;p=platform%2Fupstream%2FVK-GL-CTS.git 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 @@ + + + + + + + + + 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 @@ + + + + + + + + + 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 @@ + + + + + + + + + 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_SRCS ) 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 @@ set(GLCTS_COMMON_SRCS glcFragDepthTests.hpp glcInfoTests.cpp glcInfoTests.hpp - glcNoDefaultContextPackage.cpp - glcNoDefaultContextPackage.hpp + glcNoErrorTests.cpp + glcNoErrorTests.hpp glcRobustBufferAccessBehaviorTests.cpp glcRobustBufferAccessBehaviorTests.hpp glcShaderIndexingTests.cpp @@ -78,3 +78,9 @@ set(GLCTS_COMMON_LIBS 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 @@ tcu::TestCaseExecutor* NoDefaultContextPackage::createExecutor(void) const 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 @@ public: 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 @@ static tcu::TestPackage* createES32Package(tcu::TestContext& testCtx) 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 @@ void registerPackages(void) 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 @@ static configInfo parseConfigBitsFromName(const char* configName) 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 @@ static string getApiName(glu::ApiType apiType) 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 @@ static const string getCaseListFileOption(const string mustpassDir, const string 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 @@ static const string getLogFileName(const string apiName, const string configName return res; } -static void getBaseOptions(std::vector& args, const string mustpassDir, const string apiName, - const string configName, const string screenRotation, int width, int height) +static void getBaseOptions(std::vector& 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 @@ static void getTestRunsForAOSPEGL(vector& runs, const ConfigList& 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 @@ static void getTestRunsForAOSPES(vector& runs, const ConfigList& 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 getTestRunsForAOSPES(vector& runs, const ConfigList& } } +static void getTestRunsForNoContext(vector& runs, const ConfigList& configs, const RunParams* runParams, + const int numRunParams, const char* mustpassDir) +{ + vector::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& 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& runs) { getTestRunsForAOSPEGL(runs, configs); getTestRunsForAOSPES(runs, configs, type); + getTestRunsForNoContextES(runs, configs); #include "glcKhronosMustpassEs.hpp" @@ -380,7 +417,8 @@ static void getTestRunsForES(glu::ApiType type, const ConfigList& configs, vecto 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 getTestRunsForES(glu::ApiType type, const ConfigList& configs, vecto } } +static void getTestRunsForNoContextGL(vector& 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& runs) { + getTestRunsForNoContextGL(runs, configs); #include "glcKhronosMustpassGl.hpp" for (vector::const_iterator cfgIter = configs.configs.begin(); cfgIter != configs.configs.end(); ++cfgIter) @@ -417,7 +463,8 @@ static void getTestRunsForGL(glu::ApiType type, const ConfigList& configs, vecto 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 @@ namespace glcts 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 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 @@ MODULES = [ 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_DATA_DIR = os.path.join(DEQP_DIR, "external", "openglcts", "dat 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 @@ ES2KHR_MODULE = getModuleByName("KHR-GLES2") 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 @@ GLCTS_GLES32_KHR_PKG_N1CFG = Package(module = ES32KHR_MODULE, useforfirsteglco 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 @@ ES_MUSTPASS_LISTS = [ 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 @@ ES_MUSTPASS_LISTS = [ 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_DEVICE_DIR = "gl_cts/data/mustpass/gl/khronos_mustpass" 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 @@ def generateGLMustpass(): 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 @@ def generateGLMustpass(): 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 @@ def getApiType(apiName): 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 @@ def genSpecCPPIncludeFile (specFilename, mustpass): 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 @@ EGLContext createGLContext (const Library& egl, 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 attribList; if (glu::isContextTypeES(contextType)) @@ -149,6 +150,17 @@ EGLContext createGLContext (const Library& egl, 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 @@ enum ContextFlags { 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 @@ protected: 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 #include @@ -353,6 +354,17 @@ GLXContext GlxVisual::createContext (const GlxContextFactory& factory, 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 +#include +#include +#include #include @@ -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 @@ struct Functions // WGL_ARB_create_context wglCreateContextAttribsARBFunc createContextAttribsARB; + wglGetExtensionsStringARBFunc getExtensionsStringARB; Functions (void) : createContext (DE_NULL) @@ -164,6 +173,7 @@ struct Functions , getPixelFormatAttribfvARB (DE_NULL) , choosePixelFormatARB (DE_NULL) , createContextAttribsARB (DE_NULL) + , getExtensionsStringARB (DE_NULL) { } }; @@ -178,10 +188,12 @@ public: 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 m_extensions; }; Library::Library (HINSTANCE instance) @@ -235,6 +247,7 @@ Library::Library (HINSTANCE instance) // 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 @@ Library::Library (HINSTANCE instance) 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::istream_iterator(extStream), + std::istream_iterator()); } 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 @@ Context::Context (const Core* core, 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 @@ Context::Context (const Core* core, 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 @@ VERSION = '1.5' 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 @@ EXTENSIONS = [ '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',