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
31namespace glcts
32{
33
34class ContextFlagsCase : public tcu::TestCase
35{
36private:
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
44public:
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
61void 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
74void ContextFlagsCase::releaseContext(void)
75{
76	if (m_caseContext)
77	{
78		delete m_caseContext;
79		m_caseContext = NULL;
80	}
81}
82
83void ContextFlagsCase::deinit(void)
84{
85	releaseContext();
86}
87
88tcu::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
111ContextFlagsTests::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
117void 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