1 /*-------------------------------------------------------------------------
2  * OpenGL Conformance Test Suite
3  * -----------------------------
4  *
5  * Copyright (c) 2016 Google Inc.
6  * Copyright (c) 2016 The Khronos Group Inc.
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */ /*!
21  * \file
22  * \brief OpenGL Test Case Wrapper.
23  */ /*-------------------------------------------------------------------*/
24 
25 #include "glcTestCaseWrapper.hpp"
26 #include "gluStateReset.hpp"
27 #include "glwEnums.hpp"
28 #include "glwFunctions.hpp"
29 #include "tcuTestLog.hpp"
30 
31 namespace deqp
32 {
33 
34 using tcu::TestLog;
35 
TestCaseWrapper(Context & context)36 TestCaseWrapper::TestCaseWrapper(Context& context) : m_testCtx(context.getTestContext()), m_context(context)
37 {
38 }
39 
~TestCaseWrapper(void)40 TestCaseWrapper::~TestCaseWrapper(void)
41 {
42 }
43 
initTestCase(tcu::TestCase * testCase)44 bool TestCaseWrapper::initTestCase(tcu::TestCase* testCase)
45 {
46 	TestLog& log	 = m_testCtx.getLog();
47 	bool	 success = false;
48 
49 	try
50 	{
51 		// Clear state to defaults
52 		glu::resetState(m_context.getRenderContext(), m_context.getContextInfo());
53 	}
54 	catch (const std::exception& e)
55 	{
56 		log << e;
57 		log << TestLog::Message << "Error in state reset, test program will terminate." << TestLog::EndMessage;
58 		return false;
59 	}
60 
61 	try
62 	{
63 		testCase->init();
64 		success = true;
65 	}
66 	catch (const std::bad_alloc&)
67 	{
68 		DE_ASSERT(!success);
69 		m_testCtx.setTestResult(QP_TEST_RESULT_RESOURCE_ERROR, "Failed to allocate memory in test case init");
70 	}
71 	catch (const tcu::ResourceError& e)
72 	{
73 		DE_ASSERT(!success);
74 		m_testCtx.setTestResult(QP_TEST_RESULT_RESOURCE_ERROR, "Resource error in test case init");
75 		log << e;
76 	}
77 	catch (const tcu::NotSupportedError& e)
78 	{
79 		DE_ASSERT(!success);
80 		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not supported");
81 		log << e;
82 	}
83 	catch (const tcu::InternalError& e)
84 	{
85 		DE_ASSERT(!success);
86 		m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Internal error in test case init");
87 		log << e;
88 	}
89 	catch (const tcu::Exception& e)
90 	{
91 		DE_ASSERT(!success);
92 		log << e;
93 	}
94 
95 	if (!success)
96 	{
97 		if (m_testCtx.getTestResult() == QP_TEST_RESULT_LAST)
98 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Error in test case init");
99 		return false;
100 	}
101 
102 	return true;
103 }
104 
deinitTestCase(tcu::TestCase * testCase)105 bool TestCaseWrapper::deinitTestCase(tcu::TestCase* testCase)
106 {
107 	TestLog& log = m_testCtx.getLog();
108 
109 	try
110 	{
111 		testCase->deinit();
112 	}
113 	catch (const tcu::Exception& e)
114 	{
115 		log << e;
116 		log << TestLog::Message << "Error in test case deinit, test program will terminate." << TestLog::EndMessage;
117 		return false;
118 	}
119 
120 	try
121 	{
122 		// Clear state to defaults
123 		glu::resetState(m_context.getRenderContext(), m_context.getContextInfo());
124 	}
125 	catch (const std::exception& e)
126 	{
127 		log << e;
128 		log << TestLog::Message << "Error in state reset, test program will terminate." << TestLog::EndMessage;
129 		return false;
130 	}
131 
132 	return true;
133 }
134 
iterateTestCase(tcu::TestCase * testCase)135 tcu::TestNode::IterateResult TestCaseWrapper::iterateTestCase(tcu::TestCase* testCase)
136 {
137 	// Iterate the sub-case.
138 	TestLog&					 log		   = m_testCtx.getLog();
139 	tcu::TestCase::IterateResult iterateResult = tcu::TestCase::STOP;
140 
141 	try
142 	{
143 		iterateResult = testCase->iterate();
144 	}
145 	catch (const std::bad_alloc&)
146 	{
147 		m_testCtx.setTestResult(QP_TEST_RESULT_RESOURCE_ERROR, "Failed to allocate memory during test execution");
148 	}
149 	catch (const tcu::ResourceError& e)
150 	{
151 		log << e;
152 		m_testCtx.setTestResult(QP_TEST_RESULT_RESOURCE_ERROR, "Resource error during test execution");
153 	}
154 	catch (const tcu::NotSupportedError& e)
155 	{
156 		log << e;
157 		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not supported");
158 	}
159 	catch (const tcu::InternalError& e)
160 	{
161 		log << e;
162 		m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Internal error in test execution");
163 	}
164 	catch (const tcu::Exception& e)
165 	{
166 		log << e;
167 		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Error in test execution");
168 	}
169 
170 	// Clear buffers
171 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
172 	gl.clearColor(0.f, 0.f, 0.f, 1.f);
173 	gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
174 
175 	tcu::TestCase::IterateResult result = iterateResult;
176 
177 	// Call implementation specific post-iterate routine (usually handles native events and swaps buffers)
178 	try
179 	{
180 		m_context.getRenderContext().postIterate();
181 	}
182 	catch (const std::exception& e)
183 	{
184 		m_testCtx.getLog() << e;
185 		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Error in context post-iteration routine");
186 		return tcu::TestNode::STOP;
187 	}
188 
189 	return result;
190 }
191 
192 } // deqp
193