1/*-------------------------------------------------------------------------
2 * OpenGL Conformance Test Suite
3 * -----------------------------
4 *
5 * Copyright (c) 2016 Google Inc.
6 * Copyright (c) 2016-2019 The Khronos Group Inc.
7 * Copyright (c) 2019 NVIDIA Corporation.
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 *      http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 *
21 */ /*!
22 * \file
23 * \brief OpenGL/OpenGL ES Test Package that only gets run in a single config
24 */ /*-------------------------------------------------------------------*/
25
26#include "glcSingleConfigTestPackage.hpp"
27#include "gluStateReset.hpp"
28#include "glwEnums.hpp"
29#include "glwFunctions.hpp"
30#include "tcuTestLog.hpp"
31#include "tcuWaiverUtil.hpp"
32
33#include "glcSubgroupsTests.hpp"
34#include "gl4cEnhancedLayoutsTests.hpp"
35#include "../gles31/es31cArrayOfArraysTests.hpp"
36
37namespace glcts
38{
39
40class TestCaseWrapper : public tcu::TestCaseExecutor
41{
42public:
43	TestCaseWrapper(deqp::TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism);
44	~TestCaseWrapper(void);
45
46	void init(tcu::TestCase* testCase, const std::string& path);
47	void deinit(tcu::TestCase* testCase);
48	tcu::TestNode::IterateResult iterate(tcu::TestCase* testCase);
49
50private:
51	deqp::TestPackage& m_testPackage;
52	de::SharedPtr<tcu::WaiverUtil> m_waiverMechanism;
53};
54
55TestCaseWrapper::TestCaseWrapper(deqp::TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism)
56	: m_testPackage(package)
57	, m_waiverMechanism(waiverMechanism)
58{
59}
60
61TestCaseWrapper::~TestCaseWrapper(void)
62{
63}
64
65void TestCaseWrapper::init(tcu::TestCase* testCase, const std::string& path)
66{
67	if (m_waiverMechanism->isOnWaiverList(path))
68		throw tcu::TestException("Waived test", QP_TEST_RESULT_WAIVER);
69
70	testCase->init();
71}
72
73void TestCaseWrapper::deinit(tcu::TestCase* testCase)
74{
75	testCase->deinit();
76
77	glu::resetState(m_testPackage.getContext().getRenderContext(), m_testPackage.getContext().getContextInfo());
78}
79
80tcu::TestNode::IterateResult TestCaseWrapper::iterate(tcu::TestCase* testCase)
81{
82	tcu::TestContext&			 testCtx   = m_testPackage.getContext().getTestContext();
83	glu::RenderContext&			 renderCtx = m_testPackage.getContext().getRenderContext();
84	tcu::TestCase::IterateResult result;
85
86	// Clear to surrender-blue
87	{
88		const glw::Functions& gl = renderCtx.getFunctions();
89		gl.clearColor(0.0f, 0.0f, 0.0f, 1.f);
90		gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
91	}
92
93	result = testCase->iterate();
94
95	// Call implementation specific post-iterate routine (usually handles native events and swaps buffers)
96	try
97	{
98		renderCtx.postIterate();
99		return result;
100	}
101	catch (const tcu::ResourceError&)
102	{
103		testCtx.getLog().endCase(QP_TEST_RESULT_RESOURCE_ERROR, "Resource error in context post-iteration routine");
104		testCtx.setTerminateAfter(true);
105		return tcu::TestNode::STOP;
106	}
107	catch (const std::exception&)
108	{
109		testCtx.getLog().endCase(QP_TEST_RESULT_FAIL, "Error in context post-iteration routine");
110		return tcu::TestNode::STOP;
111	}
112}
113
114SingleConfigGL43TestPackage::SingleConfigGL43TestPackage(tcu::TestContext& testCtx, const char* packageName, const char* description,
115												 glu::ContextType renderContextType)
116	: deqp::TestPackage(testCtx, packageName, description, renderContextType, "gl_cts/data/")
117{
118}
119
120SingleConfigGL43TestPackage::~SingleConfigGL43TestPackage(void)
121{
122
123}
124
125void SingleConfigGL43TestPackage::init(void)
126{
127	// Call init() in parent - this creates context.
128	deqp::TestPackage::init();
129
130	try
131	{
132		// Add main test groups
133		addChild(new glcts::ArrayOfArraysTestGroupGL(getContext()));
134	}
135	catch (...)
136	{
137		// Destroy context.
138		deqp::TestPackage::deinit();
139		throw;
140	}
141}
142
143tcu::TestCaseExecutor* SingleConfigGL43TestPackage::createExecutor(void) const
144{
145	return new TestCaseWrapper(const_cast<SingleConfigGL43TestPackage&>(*this), m_waiverMechanism);
146}
147
148SingleConfigGL44TestPackage::SingleConfigGL44TestPackage(tcu::TestContext& testCtx, const char* packageName, const char* description,
149												 glu::ContextType renderContextType)
150	: SingleConfigGL43TestPackage(testCtx, packageName, description, renderContextType)
151{
152}
153
154SingleConfigGL44TestPackage::~SingleConfigGL44TestPackage(void)
155{
156
157}
158
159void SingleConfigGL44TestPackage::init(void)
160{
161	// Call init() in parent - this creates context.
162	SingleConfigGL43TestPackage::init();
163
164	try
165	{
166		// Add main test groups
167		addChild(new gl4cts::EnhancedLayoutsTests(getContext()));
168	}
169	catch (...)
170	{
171		// Destroy context.
172		deqp::TestPackage::deinit();
173		throw;
174	}
175}
176
177SingleConfigGL45TestPackage::SingleConfigGL45TestPackage(tcu::TestContext& testCtx, const char* packageName, const char* description,
178												 glu::ContextType renderContextType)
179	: SingleConfigGL44TestPackage(testCtx, packageName, description, renderContextType)
180{
181}
182
183SingleConfigGL45TestPackage::~SingleConfigGL45TestPackage(void)
184{
185
186}
187
188void SingleConfigGL45TestPackage::init(void)
189{
190	// Call init() in parent - this creates context.
191	SingleConfigGL44TestPackage::init();
192
193	try
194	{
195		// Add main test groups
196		addChild(new glc::subgroups::GlSubgroupTests(getContext()));
197	}
198	catch (...)
199	{
200		// Destroy context.
201		deqp::TestPackage::deinit();
202		throw;
203	}
204}
205
206SingleConfigGL46TestPackage::SingleConfigGL46TestPackage(tcu::TestContext& testCtx, const char* packageName, const char* description,
207												 glu::ContextType renderContextType)
208	: SingleConfigGL45TestPackage(testCtx, packageName, description, renderContextType)
209{
210}
211
212SingleConfigGL46TestPackage::~SingleConfigGL46TestPackage(void)
213{
214
215}
216
217void SingleConfigGL46TestPackage::init(void)
218{
219	// Call init() in parent - this creates context.
220	SingleConfigGL45TestPackage::init();
221
222	try
223	{
224		// Add main test groups
225	}
226	catch (...)
227	{
228		// Destroy context.
229		deqp::TestPackage::deinit();
230		throw;
231	}
232}
233
234SingleConfigES32TestPackage::SingleConfigES32TestPackage(tcu::TestContext& testCtx, const char* packageName, const char* description,
235												 glu::ContextType renderContextType)
236	: deqp::TestPackage(testCtx, packageName, description, renderContextType, "gl_cts/data/")
237{
238}
239
240SingleConfigES32TestPackage::~SingleConfigES32TestPackage(void)
241{
242
243}
244
245void SingleConfigES32TestPackage::init(void)
246{
247	// Call init() in parent - this creates context.
248	deqp::TestPackage::init();
249
250	try
251	{
252		// Add main test groups
253		addChild(new glc::subgroups::GlSubgroupTests(getContext()));
254	}
255	catch (...)
256	{
257		// Destroy context.
258		deqp::TestPackage::deinit();
259		throw;
260	}
261}
262
263tcu::TestCaseExecutor* SingleConfigES32TestPackage::createExecutor(void) const
264{
265	return new TestCaseWrapper(const_cast<SingleConfigES32TestPackage&>(*this), m_waiverMechanism);
266}
267
268} // glcts
269