1e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
2e5c31af7Sopenharmony_ci * drawElements Quality Program EGL Module
3e5c31af7Sopenharmony_ci * ---------------------------------------
4e5c31af7Sopenharmony_ci *
5e5c31af7Sopenharmony_ci * Copyright 2014 The Android Open Source Project
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
10e5c31af7Sopenharmony_ci *
11e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
17e5c31af7Sopenharmony_ci * limitations under the License.
18e5c31af7Sopenharmony_ci *
19e5c31af7Sopenharmony_ci *//*!
20e5c31af7Sopenharmony_ci * \file
21e5c31af7Sopenharmony_ci * \brief Extension function pointer query tests.
22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
23e5c31af7Sopenharmony_ci
24e5c31af7Sopenharmony_ci#include "teglGetProcAddressTests.hpp"
25e5c31af7Sopenharmony_ci#include "teglTestCase.hpp"
26e5c31af7Sopenharmony_ci#include "egluCallLogWrapper.hpp"
27e5c31af7Sopenharmony_ci#include "egluStrUtil.hpp"
28e5c31af7Sopenharmony_ci#include "egluUtil.hpp"
29e5c31af7Sopenharmony_ci#include "eglwLibrary.hpp"
30e5c31af7Sopenharmony_ci#include "eglwEnums.hpp"
31e5c31af7Sopenharmony_ci#include "tcuTestLog.hpp"
32e5c31af7Sopenharmony_ci#include "deSTLUtil.hpp"
33e5c31af7Sopenharmony_ci#include "deStringUtil.hpp"
34e5c31af7Sopenharmony_ci
35e5c31af7Sopenharmony_cinamespace deqp
36e5c31af7Sopenharmony_ci{
37e5c31af7Sopenharmony_cinamespace egl
38e5c31af7Sopenharmony_ci{
39e5c31af7Sopenharmony_ci
40e5c31af7Sopenharmony_cinamespace
41e5c31af7Sopenharmony_ci{
42e5c31af7Sopenharmony_ci
43e5c31af7Sopenharmony_ci#define EGL_MAKE_VERSION(major, minor) (((major) << 12) | (minor))
44e5c31af7Sopenharmony_ci
45e5c31af7Sopenharmony_ciusing tcu::TestLog;
46e5c31af7Sopenharmony_ciusing namespace eglw;
47e5c31af7Sopenharmony_ci
48e5c31af7Sopenharmony_ci// Function name strings generated from API headers
49e5c31af7Sopenharmony_ci
50e5c31af7Sopenharmony_ci#include "teglGetProcAddressTests.inl"
51e5c31af7Sopenharmony_ci
52e5c31af7Sopenharmony_cistruct FunctionNames
53e5c31af7Sopenharmony_ci{
54e5c31af7Sopenharmony_ci	int					numFunctions;
55e5c31af7Sopenharmony_ci	const char* const*	functions;
56e5c31af7Sopenharmony_ci
57e5c31af7Sopenharmony_ci	FunctionNames (int numFunctions_, const char* const* functions_)
58e5c31af7Sopenharmony_ci		: numFunctions	(numFunctions_)
59e5c31af7Sopenharmony_ci		, functions		(functions_)
60e5c31af7Sopenharmony_ci	{
61e5c31af7Sopenharmony_ci	}
62e5c31af7Sopenharmony_ci};
63e5c31af7Sopenharmony_ci
64e5c31af7Sopenharmony_ciFunctionNames getExtFunctionNames (const std::string& extName)
65e5c31af7Sopenharmony_ci{
66e5c31af7Sopenharmony_ci	for (int ndx = 0; ndx <= DE_LENGTH_OF_ARRAY(s_extensions); ndx++)
67e5c31af7Sopenharmony_ci	{
68e5c31af7Sopenharmony_ci		if (extName == s_extensions[ndx].name)
69e5c31af7Sopenharmony_ci			return FunctionNames(s_extensions[ndx].numFunctions, s_extensions[ndx].functions);
70e5c31af7Sopenharmony_ci	}
71e5c31af7Sopenharmony_ci
72e5c31af7Sopenharmony_ci	DE_ASSERT(false);
73e5c31af7Sopenharmony_ci	return FunctionNames(0, DE_NULL);
74e5c31af7Sopenharmony_ci}
75e5c31af7Sopenharmony_ci
76e5c31af7Sopenharmony_ci} // anonymous
77e5c31af7Sopenharmony_ci
78e5c31af7Sopenharmony_ci// Base class for eglGetProcAddress() test cases
79e5c31af7Sopenharmony_ci
80e5c31af7Sopenharmony_ciclass GetProcAddressCase : public TestCase, protected eglu::CallLogWrapper
81e5c31af7Sopenharmony_ci{
82e5c31af7Sopenharmony_cipublic:
83e5c31af7Sopenharmony_ci								GetProcAddressCase		(EglTestContext& eglTestCtx, const char* name, const char* description);
84e5c31af7Sopenharmony_ci	virtual						~GetProcAddressCase		(void);
85e5c31af7Sopenharmony_ci
86e5c31af7Sopenharmony_ci	void						init					(void);
87e5c31af7Sopenharmony_ci	void						deinit					(void);
88e5c31af7Sopenharmony_ci	IterateResult				iterate					(void);
89e5c31af7Sopenharmony_ci
90e5c31af7Sopenharmony_ci	bool						isSupported				(const std::string& extName);
91e5c31af7Sopenharmony_ci
92e5c31af7Sopenharmony_ci	virtual void				executeTest				(void) = 0;
93e5c31af7Sopenharmony_ci
94e5c31af7Sopenharmony_ciprotected:
95e5c31af7Sopenharmony_ci	EGLDisplay					m_display;
96e5c31af7Sopenharmony_ci	int							m_eglVersion;
97e5c31af7Sopenharmony_ci
98e5c31af7Sopenharmony_ciprivate:
99e5c31af7Sopenharmony_ci	std::vector<std::string>	m_supported;
100e5c31af7Sopenharmony_ci};
101e5c31af7Sopenharmony_ci
102e5c31af7Sopenharmony_ciGetProcAddressCase::GetProcAddressCase (EglTestContext& eglTestCtx, const char* name, const char* description)
103e5c31af7Sopenharmony_ci	: TestCase			(eglTestCtx, name, description)
104e5c31af7Sopenharmony_ci	, CallLogWrapper	(eglTestCtx.getLibrary(), eglTestCtx.getTestContext().getLog())
105e5c31af7Sopenharmony_ci	, m_display			(EGL_NO_DISPLAY)
106e5c31af7Sopenharmony_ci{
107e5c31af7Sopenharmony_ci}
108e5c31af7Sopenharmony_ci
109e5c31af7Sopenharmony_ciGetProcAddressCase::~GetProcAddressCase (void)
110e5c31af7Sopenharmony_ci{
111e5c31af7Sopenharmony_ci}
112e5c31af7Sopenharmony_ci
113e5c31af7Sopenharmony_civoid GetProcAddressCase::init (void)
114e5c31af7Sopenharmony_ci{
115e5c31af7Sopenharmony_ci	try
116e5c31af7Sopenharmony_ci	{
117e5c31af7Sopenharmony_ci		m_supported = eglu::getClientExtensions(m_eglTestCtx.getLibrary());
118e5c31af7Sopenharmony_ci	}
119e5c31af7Sopenharmony_ci	catch (const tcu::NotSupportedError&)
120e5c31af7Sopenharmony_ci	{
121e5c31af7Sopenharmony_ci		// Ignore case where EGL client extensions are not supported
122e5c31af7Sopenharmony_ci		// that's okay for these tests.
123e5c31af7Sopenharmony_ci	}
124e5c31af7Sopenharmony_ci
125e5c31af7Sopenharmony_ci	DE_ASSERT(m_display == EGL_NO_DISPLAY);
126e5c31af7Sopenharmony_ci
127e5c31af7Sopenharmony_ci	m_display = eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay());
128e5c31af7Sopenharmony_ci
129e5c31af7Sopenharmony_ci	// The EGL_VERSION string is laid out as follows:
130e5c31af7Sopenharmony_ci	// major_version.minor_version space vendor_specific_info
131e5c31af7Sopenharmony_ci	// Split version from vendor_specific_info
132e5c31af7Sopenharmony_ci	std::vector<std::string> tokens = de::splitString(eglQueryString(m_display, EGL_VERSION), ' ');
133e5c31af7Sopenharmony_ci	// split version into major & minor
134e5c31af7Sopenharmony_ci	std::vector<std::string> values = de::splitString(tokens[0], '.');
135e5c31af7Sopenharmony_ci	m_eglVersion = EGL_MAKE_VERSION(atoi(values[0].c_str()), atoi(values[1].c_str()));
136e5c31af7Sopenharmony_ci
137e5c31af7Sopenharmony_ci	{
138e5c31af7Sopenharmony_ci		const std::vector<std::string> displayExtensios = eglu::getDisplayExtensions(m_eglTestCtx.getLibrary(), m_display);
139e5c31af7Sopenharmony_ci		m_supported.insert(m_supported.end(), displayExtensios.begin(), displayExtensios.end());
140e5c31af7Sopenharmony_ci	}
141e5c31af7Sopenharmony_ci
142e5c31af7Sopenharmony_ci	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
143e5c31af7Sopenharmony_ci}
144e5c31af7Sopenharmony_ci
145e5c31af7Sopenharmony_civoid GetProcAddressCase::deinit (void)
146e5c31af7Sopenharmony_ci{
147e5c31af7Sopenharmony_ci	m_eglTestCtx.getLibrary().terminate(m_display);
148e5c31af7Sopenharmony_ci	m_display = EGL_NO_DISPLAY;
149e5c31af7Sopenharmony_ci}
150e5c31af7Sopenharmony_ci
151e5c31af7Sopenharmony_citcu::TestNode::IterateResult GetProcAddressCase::iterate (void)
152e5c31af7Sopenharmony_ci{
153e5c31af7Sopenharmony_ci	enableLogging(true);
154e5c31af7Sopenharmony_ci
155e5c31af7Sopenharmony_ci	executeTest();
156e5c31af7Sopenharmony_ci
157e5c31af7Sopenharmony_ci	enableLogging(false);
158e5c31af7Sopenharmony_ci
159e5c31af7Sopenharmony_ci	return STOP;
160e5c31af7Sopenharmony_ci}
161e5c31af7Sopenharmony_ci
162e5c31af7Sopenharmony_cibool GetProcAddressCase::isSupported (const std::string& extName)
163e5c31af7Sopenharmony_ci{
164e5c31af7Sopenharmony_ci	return de::contains(m_supported.begin(), m_supported.end(), extName);
165e5c31af7Sopenharmony_ci}
166e5c31af7Sopenharmony_ci
167e5c31af7Sopenharmony_ci// Test by extension
168e5c31af7Sopenharmony_ci
169e5c31af7Sopenharmony_ciclass GetProcAddressExtensionCase : public GetProcAddressCase
170e5c31af7Sopenharmony_ci{
171e5c31af7Sopenharmony_cipublic:
172e5c31af7Sopenharmony_ci	GetProcAddressExtensionCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::string& extName)
173e5c31af7Sopenharmony_ci		: GetProcAddressCase	(eglTestCtx, name, description)
174e5c31af7Sopenharmony_ci		, m_extName				(extName)
175e5c31af7Sopenharmony_ci	{
176e5c31af7Sopenharmony_ci	}
177e5c31af7Sopenharmony_ci
178e5c31af7Sopenharmony_ci	virtual ~GetProcAddressExtensionCase (void)
179e5c31af7Sopenharmony_ci	{
180e5c31af7Sopenharmony_ci	}
181e5c31af7Sopenharmony_ci
182e5c31af7Sopenharmony_ci	void executeTest (void)
183e5c31af7Sopenharmony_ci	{
184e5c31af7Sopenharmony_ci		TestLog&				log			= m_testCtx.getLog();
185e5c31af7Sopenharmony_ci		bool					supported	= isSupported(m_extName);
186e5c31af7Sopenharmony_ci		const FunctionNames		funcNames	= getExtFunctionNames(m_extName);
187e5c31af7Sopenharmony_ci
188e5c31af7Sopenharmony_ci		DE_ASSERT(funcNames.numFunctions > 0);
189e5c31af7Sopenharmony_ci
190e5c31af7Sopenharmony_ci		log << TestLog::Message << m_extName << ": " << (supported ? "supported" : "not supported") << TestLog::EndMessage;
191e5c31af7Sopenharmony_ci		log << TestLog::Message << TestLog::EndMessage;
192e5c31af7Sopenharmony_ci
193e5c31af7Sopenharmony_ci		for (int funcNdx = 0; funcNdx < funcNames.numFunctions; funcNdx++)
194e5c31af7Sopenharmony_ci		{
195e5c31af7Sopenharmony_ci			const char*	funcName		= funcNames.functions[funcNdx];
196e5c31af7Sopenharmony_ci			void		(*funcPtr)(void);
197e5c31af7Sopenharmony_ci
198e5c31af7Sopenharmony_ci			funcPtr = eglGetProcAddress(funcName);
199e5c31af7Sopenharmony_ci			eglu::checkError(eglGetError(), "eglGetProcAddress()", __FILE__, __LINE__);
200e5c31af7Sopenharmony_ci
201e5c31af7Sopenharmony_ci			if (supported && funcPtr == 0)
202e5c31af7Sopenharmony_ci			{
203e5c31af7Sopenharmony_ci				log << TestLog::Message << "Fail, received null pointer for supported extension function: " << funcName << TestLog::EndMessage;
204e5c31af7Sopenharmony_ci				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Unexpected null pointer");
205e5c31af7Sopenharmony_ci			}
206e5c31af7Sopenharmony_ci		}
207e5c31af7Sopenharmony_ci	}
208e5c31af7Sopenharmony_ci
209e5c31af7Sopenharmony_ciprivate:
210e5c31af7Sopenharmony_ci	std::string	m_extName;
211e5c31af7Sopenharmony_ci};
212e5c31af7Sopenharmony_ci
213e5c31af7Sopenharmony_ci// Test core functions
214e5c31af7Sopenharmony_ci
215e5c31af7Sopenharmony_ciclass GetProcAddressCoreFunctionsCase : public GetProcAddressCase
216e5c31af7Sopenharmony_ci{
217e5c31af7Sopenharmony_cipublic:
218e5c31af7Sopenharmony_ci	enum ApiType
219e5c31af7Sopenharmony_ci	{
220e5c31af7Sopenharmony_ci		EGL14,
221e5c31af7Sopenharmony_ci		EGL15,
222e5c31af7Sopenharmony_ci		GLES,
223e5c31af7Sopenharmony_ci		GLES2,
224e5c31af7Sopenharmony_ci		GLES3
225e5c31af7Sopenharmony_ci	};
226e5c31af7Sopenharmony_ci
227e5c31af7Sopenharmony_ci	GetProcAddressCoreFunctionsCase (EglTestContext& eglTestCtx, const char* name, const char* description, const ApiType apiType)
228e5c31af7Sopenharmony_ci		: GetProcAddressCase	(eglTestCtx, name, description)
229e5c31af7Sopenharmony_ci		, m_apiType				(apiType)
230e5c31af7Sopenharmony_ci	{
231e5c31af7Sopenharmony_ci	}
232e5c31af7Sopenharmony_ci
233e5c31af7Sopenharmony_ci	virtual ~GetProcAddressCoreFunctionsCase (void)
234e5c31af7Sopenharmony_ci	{
235e5c31af7Sopenharmony_ci	}
236e5c31af7Sopenharmony_ci
237e5c31af7Sopenharmony_ci	EGLint RenderableType (ApiType type)
238e5c31af7Sopenharmony_ci	{
239e5c31af7Sopenharmony_ci		EGLint	renderableType = EGL_OPENGL_ES_BIT;
240e5c31af7Sopenharmony_ci		switch (type) {
241e5c31af7Sopenharmony_ci			case EGL14:
242e5c31af7Sopenharmony_ci			case EGL15:
243e5c31af7Sopenharmony_ci			case GLES:
244e5c31af7Sopenharmony_ci				renderableType = EGL_OPENGL_ES_BIT;
245e5c31af7Sopenharmony_ci				break;
246e5c31af7Sopenharmony_ci			case GLES2:
247e5c31af7Sopenharmony_ci				renderableType = EGL_OPENGL_ES2_BIT;
248e5c31af7Sopenharmony_ci				break;
249e5c31af7Sopenharmony_ci			case GLES3:
250e5c31af7Sopenharmony_ci				renderableType = EGL_OPENGL_ES3_BIT_KHR;
251e5c31af7Sopenharmony_ci				break;
252e5c31af7Sopenharmony_ci		}
253e5c31af7Sopenharmony_ci		return renderableType;
254e5c31af7Sopenharmony_ci	}
255e5c31af7Sopenharmony_ci
256e5c31af7Sopenharmony_ci	bool isApiSupported (void)
257e5c31af7Sopenharmony_ci	{
258e5c31af7Sopenharmony_ci		EGLint	renderableType = EGL_OPENGL_ES_BIT;
259e5c31af7Sopenharmony_ci		switch (m_apiType) {
260e5c31af7Sopenharmony_ci			case EGL14:
261e5c31af7Sopenharmony_ci				return m_eglVersion >= EGL_MAKE_VERSION(1, 4);
262e5c31af7Sopenharmony_ci			case EGL15:
263e5c31af7Sopenharmony_ci				// With Android Q, EGL 1.5 entry points must have valid
264e5c31af7Sopenharmony_ci				// GetProcAddress.
265e5c31af7Sopenharmony_ci				return m_eglVersion >= EGL_MAKE_VERSION(1, 5);
266e5c31af7Sopenharmony_ci			case GLES:
267e5c31af7Sopenharmony_ci			case GLES2:
268e5c31af7Sopenharmony_ci			case GLES3:
269e5c31af7Sopenharmony_ci				renderableType = RenderableType(m_apiType);
270e5c31af7Sopenharmony_ci				break;
271e5c31af7Sopenharmony_ci		}
272e5c31af7Sopenharmony_ci		return (eglu::getRenderableAPIsMask(m_eglTestCtx.getLibrary(), m_display) & renderableType) == renderableType;
273e5c31af7Sopenharmony_ci	}
274e5c31af7Sopenharmony_ci
275e5c31af7Sopenharmony_ci	FunctionNames getCoreFunctionNames (EGLint apiType)
276e5c31af7Sopenharmony_ci	{
277e5c31af7Sopenharmony_ci		switch (apiType)
278e5c31af7Sopenharmony_ci		{
279e5c31af7Sopenharmony_ci			case EGL14:				return FunctionNames(DE_LENGTH_OF_ARRAY(s_EGL14),	s_EGL14);
280e5c31af7Sopenharmony_ci			case EGL15:				return FunctionNames(DE_LENGTH_OF_ARRAY(s_EGL15),	s_EGL15);
281e5c31af7Sopenharmony_ci			case GLES	:			return FunctionNames(DE_LENGTH_OF_ARRAY(s_GLES10),	s_GLES10);
282e5c31af7Sopenharmony_ci			case GLES2:				return FunctionNames(DE_LENGTH_OF_ARRAY(s_GLES20),	s_GLES20);
283e5c31af7Sopenharmony_ci			case GLES3:			return FunctionNames(DE_LENGTH_OF_ARRAY(s_GLES30),	s_GLES30);
284e5c31af7Sopenharmony_ci			default:
285e5c31af7Sopenharmony_ci				DE_ASSERT(false);
286e5c31af7Sopenharmony_ci		}
287e5c31af7Sopenharmony_ci
288e5c31af7Sopenharmony_ci		return FunctionNames(0, DE_NULL);
289e5c31af7Sopenharmony_ci	}
290e5c31af7Sopenharmony_ci
291e5c31af7Sopenharmony_ci	void executeTest (void)
292e5c31af7Sopenharmony_ci	{
293e5c31af7Sopenharmony_ci		TestLog&				log					= m_testCtx.getLog();
294e5c31af7Sopenharmony_ci		const bool				funcPtrSupported	= isSupported("EGL_KHR_get_all_proc_addresses");
295e5c31af7Sopenharmony_ci		const bool				apiSupported		= isApiSupported();
296e5c31af7Sopenharmony_ci		const FunctionNames		funcNames			= getCoreFunctionNames(m_apiType);
297e5c31af7Sopenharmony_ci
298e5c31af7Sopenharmony_ci		log << TestLog::Message << "EGL_KHR_get_all_proc_addresses: " << (funcPtrSupported ? "supported" : "not supported") << TestLog::EndMessage;
299e5c31af7Sopenharmony_ci		log << TestLog::Message << TestLog::EndMessage;
300e5c31af7Sopenharmony_ci
301e5c31af7Sopenharmony_ci		if (!apiSupported)
302e5c31af7Sopenharmony_ci		{
303e5c31af7Sopenharmony_ci			switch (m_apiType)
304e5c31af7Sopenharmony_ci			{
305e5c31af7Sopenharmony_ci				case EGL14:
306e5c31af7Sopenharmony_ci					log << TestLog::Message << " EGL not supported by any available configuration." << TestLog::EndMessage;
307e5c31af7Sopenharmony_ci					break;
308e5c31af7Sopenharmony_ci				case EGL15:
309e5c31af7Sopenharmony_ci					log << TestLog::Message << " EGL 1.5 not supported by any available configuration." << TestLog::EndMessage;
310e5c31af7Sopenharmony_ci					break;
311e5c31af7Sopenharmony_ci				case GLES:
312e5c31af7Sopenharmony_ci				case GLES2:
313e5c31af7Sopenharmony_ci				case GLES3:
314e5c31af7Sopenharmony_ci					log << TestLog::Message << eglu::getConfigAttribValueStr(EGL_RENDERABLE_TYPE, RenderableType(m_apiType)) << " not supported by any available configuration." << TestLog::EndMessage;
315e5c31af7Sopenharmony_ci					break;
316e5c31af7Sopenharmony_ci			}
317e5c31af7Sopenharmony_ci			log << TestLog::Message << TestLog::EndMessage;
318e5c31af7Sopenharmony_ci		}
319e5c31af7Sopenharmony_ci
320e5c31af7Sopenharmony_ci		for (int funcNdx = 0; funcNdx < funcNames.numFunctions; funcNdx++)
321e5c31af7Sopenharmony_ci		{
322e5c31af7Sopenharmony_ci			const char*	funcName			= funcNames.functions[funcNdx];
323e5c31af7Sopenharmony_ci			void		(*funcPtr)(void);
324e5c31af7Sopenharmony_ci
325e5c31af7Sopenharmony_ci			funcPtr = eglGetProcAddress(funcName);
326e5c31af7Sopenharmony_ci			eglu::checkError(eglGetError(), "eglGetProcAddress()", __FILE__, __LINE__);
327e5c31af7Sopenharmony_ci
328e5c31af7Sopenharmony_ci			if (apiSupported && funcPtrSupported && (funcPtr == 0))
329e5c31af7Sopenharmony_ci			{
330e5c31af7Sopenharmony_ci				log << TestLog::Message << "Fail, received null pointer for supported function: " << funcName << TestLog::EndMessage;
331e5c31af7Sopenharmony_ci				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Unexpected null pointer");
332e5c31af7Sopenharmony_ci			}
333e5c31af7Sopenharmony_ci			else if (!apiSupported && (funcPtr != 0))
334e5c31af7Sopenharmony_ci			{
335e5c31af7Sopenharmony_ci				log << TestLog::Message << "Warning, received non-null value for unsupported function: " << funcName << TestLog::EndMessage;
336e5c31af7Sopenharmony_ci				m_testCtx.setTestResult(QP_TEST_RESULT_QUALITY_WARNING, "Non-null value for unsupported function");
337e5c31af7Sopenharmony_ci			}
338e5c31af7Sopenharmony_ci		}
339e5c31af7Sopenharmony_ci	}
340e5c31af7Sopenharmony_ci
341e5c31af7Sopenharmony_ciprivate:
342e5c31af7Sopenharmony_ci	const ApiType	m_apiType;
343e5c31af7Sopenharmony_ci};
344e5c31af7Sopenharmony_ci
345e5c31af7Sopenharmony_ciGetProcAddressTests::GetProcAddressTests (EglTestContext& eglTestCtx)
346e5c31af7Sopenharmony_ci	: TestCaseGroup(eglTestCtx, "get_proc_address", "eglGetProcAddress() tests")
347e5c31af7Sopenharmony_ci{
348e5c31af7Sopenharmony_ci}
349e5c31af7Sopenharmony_ci
350e5c31af7Sopenharmony_ciGetProcAddressTests::~GetProcAddressTests (void)
351e5c31af7Sopenharmony_ci{
352e5c31af7Sopenharmony_ci}
353e5c31af7Sopenharmony_ci
354e5c31af7Sopenharmony_civoid GetProcAddressTests::init (void)
355e5c31af7Sopenharmony_ci{
356e5c31af7Sopenharmony_ci	// extensions
357e5c31af7Sopenharmony_ci	{
358e5c31af7Sopenharmony_ci		tcu::TestCaseGroup* extensionsGroup = new tcu::TestCaseGroup(m_testCtx, "extension", "Test EGL extensions");
359e5c31af7Sopenharmony_ci		addChild(extensionsGroup);
360e5c31af7Sopenharmony_ci
361e5c31af7Sopenharmony_ci		for (int extNdx = 0; extNdx < DE_LENGTH_OF_ARRAY(s_extensions); extNdx++)
362e5c31af7Sopenharmony_ci		{
363e5c31af7Sopenharmony_ci			const std::string&		extName		= s_extensions[extNdx].name;
364e5c31af7Sopenharmony_ci			std::string				testName	(extName);
365e5c31af7Sopenharmony_ci
366e5c31af7Sopenharmony_ci			for (size_t ndx = 0; ndx < extName.length(); ndx++)
367e5c31af7Sopenharmony_ci				testName[ndx] = de::toLower(extName[ndx]);
368e5c31af7Sopenharmony_ci
369e5c31af7Sopenharmony_ci			extensionsGroup->addChild(new GetProcAddressExtensionCase(m_eglTestCtx, testName.c_str(), ("Test " + extName).c_str(), extName));
370e5c31af7Sopenharmony_ci		}
371e5c31af7Sopenharmony_ci	}
372e5c31af7Sopenharmony_ci
373e5c31af7Sopenharmony_ci	// core functions
374e5c31af7Sopenharmony_ci	{
375e5c31af7Sopenharmony_ci		tcu::TestCaseGroup* coreFuncGroup = new tcu::TestCaseGroup(m_testCtx, "core", "Test core functions");
376e5c31af7Sopenharmony_ci		addChild(coreFuncGroup);
377e5c31af7Sopenharmony_ci
378e5c31af7Sopenharmony_ci		coreFuncGroup->addChild(new GetProcAddressCoreFunctionsCase	(m_eglTestCtx,	"egl",		"Test EGL core functions",			GetProcAddressCoreFunctionsCase::EGL14));
379e5c31af7Sopenharmony_ci
380e5c31af7Sopenharmony_ci		coreFuncGroup->addChild(new GetProcAddressCoreFunctionsCase	(m_eglTestCtx,	"egl15",	"Test EGL 1.5 functions",			GetProcAddressCoreFunctionsCase::EGL15));
381e5c31af7Sopenharmony_ci		coreFuncGroup->addChild(new GetProcAddressCoreFunctionsCase	(m_eglTestCtx,	"gles",		"Test OpenGL ES core functions",	GetProcAddressCoreFunctionsCase::GLES));
382e5c31af7Sopenharmony_ci		coreFuncGroup->addChild(new GetProcAddressCoreFunctionsCase	(m_eglTestCtx,	"gles2",	"Test OpenGL ES 2 core functions",	GetProcAddressCoreFunctionsCase::GLES2));
383e5c31af7Sopenharmony_ci		coreFuncGroup->addChild(new GetProcAddressCoreFunctionsCase	(m_eglTestCtx,	"gles3",	"Test OpenGL ES 3 core functions",	GetProcAddressCoreFunctionsCase::GLES3));
384e5c31af7Sopenharmony_ci	}
385e5c31af7Sopenharmony_ci}
386e5c31af7Sopenharmony_ci
387e5c31af7Sopenharmony_ci} // egl
388e5c31af7Sopenharmony_ci} // deqp
389