• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program EGL Module
3  * ---------------------------------------
4  *
5  * Copyright 2014 The Android Open Source Project
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
21  * \brief EGL Implementation Information Tests
22  *//*--------------------------------------------------------------------*/
23 
24 #include "teglInfoTests.hpp"
25 #include "teglConfigList.hpp"
26 #include "tcuTestLog.hpp"
27 
28 #include <vector>
29 #include <string>
30 #include <sstream>
31 
32 #include <EGL/egl.h>
33 
34 using std::vector;
35 using std::string;
36 
37 using tcu::TestLog;
38 
39 namespace deqp
40 {
41 namespace egl
42 {
43 
split(const std::string & str,const std::string & delim=" ")44 static std::vector<std::string> split(const std::string& str, const std::string& delim = " ")
45 {
46 	std::vector<std::string>	out;
47 	if (str.length() == 0) return out;
48 
49 	size_t	start	= 0;
50 	size_t	end		= string::npos;
51 
52 	while ((end = str.find(delim, start)) != string::npos)
53 	{
54 		out.push_back(str.substr(start, end-start));
55 		start = end + delim.length();
56 	}
57 
58 	if (start < end)
59 		out.push_back(str.substr(start, end-start));
60 
61 	return out;
62 }
63 
toInt(std::string str)64 static int toInt(std::string str)
65 {
66 	std::istringstream strStream(str);
67 
68 	int out;
69 	strStream >> out;
70 	return out;
71 }
72 
73 class QueryStringCase : public TestCase
74 {
75 public:
QueryStringCase(EglTestContext & eglTestCtx,const char * name,const char * description,EGLint query)76 	QueryStringCase (EglTestContext& eglTestCtx, const char* name, const char* description, EGLint query)
77 		: TestCase	(eglTestCtx, name, description)
78 		, m_query	(query)
79 	{
80 	}
81 
validateString(const std::string & result)82 	void validateString (const std::string& result)
83 	{
84 		tcu::TestLog&				log		= m_testCtx.getLog();
85 		std::vector<std::string>	tokens	= split(result);
86 
87 		if (m_query == EGL_VERSION)
88 		{
89 			const tcu::egl::Display&		display			= m_eglTestCtx.getDisplay();
90 			const int						dispMajor		= display.getEGLMajorVersion();
91 			const int						dispMinor		= display.getEGLMinorVersion();
92 
93 			const std::vector<std::string>	versionTokens	= split(tokens[0], ".");
94 
95 			if (versionTokens.size() < 2)
96 			{
97 				log << TestLog::Message << "  Fail, first part of the string must be in the format <major_version.minor_version>" << TestLog::EndMessage;
98 				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid version string");
99 			}
100 			else
101 			{
102 				const	int	stringMajor	= toInt(versionTokens[0]);
103 				const	int	stringMinor	= toInt(versionTokens[1]);
104 
105 				if (stringMajor != dispMajor || stringMinor != dispMinor)
106 				{
107 					log << TestLog::Message << "  Fail, version numer (" << stringMajor << "." << stringMinor
108 						<< ") does not match the one reported by eglInitialize (" << dispMajor << "." << dispMinor << ")" << TestLog::EndMessage;
109 					m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Version number mismatch");
110 				}
111 			}
112 		}
113 	}
114 
iterate(void)115 	IterateResult iterate (void)
116 	{
117 		const char* result = eglQueryString(m_eglTestCtx.getDisplay().getEGLDisplay(), m_query);
118 		TCU_CHECK_EGL_MSG("eglQueryString() failed");
119 
120 		m_testCtx.getLog() << tcu::TestLog::Message << result << tcu::TestLog::EndMessage;
121 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
122 
123 		validateString(result);
124 
125 		return STOP;
126 	}
127 
128 private:
129 	EGLint m_query;
130 };
131 
132 class QueryExtensionsCase : public TestCase
133 {
134 public:
QueryExtensionsCase(EglTestContext & eglTestCtx)135 	QueryExtensionsCase (EglTestContext& eglTestCtx)
136 		: TestCase	(eglTestCtx, "extensions", "Supported Extensions")
137 	{
138 	}
139 
iterate(void)140 	IterateResult iterate (void)
141 	{
142 		vector<string> extensions;
143 		m_eglTestCtx.getDisplay().getExtensions(extensions);
144 
145 		for (vector<string>::const_iterator i = extensions.begin(); i != extensions.end(); i++)
146 			m_testCtx.getLog() << tcu::TestLog::Message << *i << tcu::TestLog::EndMessage;
147 
148 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
149 
150 		return STOP;
151 	}
152 };
153 
InfoTests(EglTestContext & eglTestCtx)154 InfoTests::InfoTests (EglTestContext& eglTestCtx)
155 	: TestCaseGroup(eglTestCtx, "info", "Platform Information")
156 {
157 }
158 
~InfoTests(void)159 InfoTests::~InfoTests (void)
160 {
161 }
162 
init(void)163 void InfoTests::init (void)
164 {
165 	addChild(new QueryStringCase(m_eglTestCtx, "version",		"EGL Version",				EGL_VERSION));
166 	addChild(new QueryStringCase(m_eglTestCtx, "vendor",		"EGL Vendor",				EGL_VENDOR));
167 	addChild(new QueryStringCase(m_eglTestCtx, "client_apis",	"Supported client APIs",	EGL_CLIENT_APIS));
168 	addChild(new QueryExtensionsCase(m_eglTestCtx));
169 	addChild(new ConfigList(m_eglTestCtx));
170 }
171 
172 } // egl
173 } // deqp
174