1 /*-------------------------------------------------------------------------
2 * OpenGL Conformance Test Suite
3 * -----------------------------
4 *
5 * Copyright (c) 2017 The Khronos Group Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 */ /*!
20 * \file glcContextFlagsTests.cpp
21 * \brief Tests veryfing glGetIntegerv(GL_CONTEXT_FLAGS).
22 */ /*-------------------------------------------------------------------*/
23
24 #include "glcContextFlagsTests.hpp"
25 #include "gluRenderContext.hpp"
26 #include "glwEnums.hpp"
27 #include "glwFunctions.hpp"
28 #include "tcuCommandLine.hpp"
29 #include "tcuTestLog.hpp"
30
31 namespace glcts
32 {
33
34 class ContextFlagsCase : public tcu::TestCase
35 {
36 private:
37 glu::RenderContext* m_caseContext;
38 glu::ContextFlags m_passedFlags;
39 glw::GLint m_expectedResult;
40 glu::ApiType m_ApiType;
41
42 void createContext();
43
44 public:
ContextFlagsCase(tcu::TestContext & testCtx,glu::ContextFlags passedFlags,glw::GLint expectedResult,const char * name,const char * description,glu::ApiType apiType)45 ContextFlagsCase(tcu::TestContext& testCtx, glu::ContextFlags passedFlags, glw::GLint expectedResult,
46 const char* name, const char* description, glu::ApiType apiType)
47 : tcu::TestCase(testCtx, name, description)
48 , m_caseContext(NULL)
49 , m_passedFlags(passedFlags)
50 , m_expectedResult(expectedResult)
51 , m_ApiType(apiType)
52 {
53 }
54
55 void releaseContext(void);
56
57 virtual void deinit(void);
58 virtual IterateResult iterate(void);
59 };
60
createContext()61 void ContextFlagsCase::createContext()
62 {
63 glu::RenderConfig renderCfg(glu::ContextType(m_ApiType, m_passedFlags));
64
65 const tcu::CommandLine& commandLine = m_testCtx.getCommandLine();
66 glu::parseRenderConfig(&renderCfg, commandLine);
67
68 if (commandLine.getSurfaceType() != tcu::SURFACETYPE_WINDOW)
69 throw tcu::NotSupportedError("Test not supported in non-windowed context");
70
71 m_caseContext = glu::createRenderContext(m_testCtx.getPlatform(), commandLine, renderCfg);
72 }
73
releaseContext(void)74 void ContextFlagsCase::releaseContext(void)
75 {
76 if (m_caseContext)
77 {
78 delete m_caseContext;
79 m_caseContext = NULL;
80 }
81 }
82
deinit(void)83 void ContextFlagsCase::deinit(void)
84 {
85 releaseContext();
86 }
87
iterate(void)88 tcu::TestNode::IterateResult ContextFlagsCase::iterate(void)
89 {
90 createContext();
91
92 glw::GLint flags = 0;
93 const glw::Functions& gl = m_caseContext->getFunctions();
94 gl.getIntegerv(GL_CONTEXT_FLAGS, &flags);
95 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv");
96
97 if (flags != m_expectedResult)
98 {
99 m_testCtx.getLog() << tcu::TestLog::Message << "Test failed! glGet returned wrong value " << flags
100 << ", expected " << m_expectedResult << "]." << tcu::TestLog::EndMessage;
101
102 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
103 }
104 else
105 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
106
107 releaseContext();
108 return STOP;
109 }
110
ContextFlagsTests(tcu::TestContext & testCtx,glu::ApiType apiType)111 ContextFlagsTests::ContextFlagsTests(tcu::TestContext& testCtx, glu::ApiType apiType)
112 : tcu::TestCaseGroup(testCtx, "context_flags", "Verifies if context flags query results are as expected.")
113 , m_ApiType(apiType)
114 {
115 }
116
init()117 void ContextFlagsTests::init()
118 {
119 tcu::TestCaseGroup::init();
120
121 try
122 {
123 addChild(new ContextFlagsCase(m_testCtx, glu::ContextFlags(0), 0, "no_flags_set_case",
124 "Verifies no flags case.", m_ApiType));
125 addChild(new ContextFlagsCase(m_testCtx, glu::CONTEXT_DEBUG, GL_CONTEXT_FLAG_DEBUG_BIT, "debug_flag_set_case",
126 "Verifies debug flag case..", m_ApiType));
127 addChild(new ContextFlagsCase(m_testCtx, glu::CONTEXT_ROBUST, GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT,
128 "robust_flag_set_case", "Verifies robust access flag case.", m_ApiType));
129
130 addChild(new ContextFlagsCase(m_testCtx, glu::CONTEXT_DEBUG | glu::CONTEXT_ROBUST,
131 GL_CONTEXT_FLAG_DEBUG_BIT | GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT,
132 "all_flags_set_case", "Verifies both debug and robust access flags case.",
133 m_ApiType));
134 }
135 catch (...)
136 {
137 // Destroy context.
138 tcu::TestCaseGroup::deinit();
139 throw;
140 }
141 }
142
143 } // glcts namespace
144