1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 3.0 Module
3*35238bceSAndroid Build Coastguard Worker * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker *
5*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker *
11*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker *
19*35238bceSAndroid Build Coastguard Worker *//*!
20*35238bceSAndroid Build Coastguard Worker * \file
21*35238bceSAndroid Build Coastguard Worker * \brief String Query tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es3fStringQueryTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "es3fApiCase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "deString.h"
30*35238bceSAndroid Build Coastguard Worker
31*35238bceSAndroid Build Coastguard Worker #include <algorithm>
32*35238bceSAndroid Build Coastguard Worker #include <sstream>
33*35238bceSAndroid Build Coastguard Worker #include <string>
34*35238bceSAndroid Build Coastguard Worker
35*35238bceSAndroid Build Coastguard Worker using namespace glw; // GLint and other GL types
36*35238bceSAndroid Build Coastguard Worker
37*35238bceSAndroid Build Coastguard Worker namespace deqp
38*35238bceSAndroid Build Coastguard Worker {
39*35238bceSAndroid Build Coastguard Worker namespace gles3
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker namespace Functional
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker
StringQueryTests(Context & context)44*35238bceSAndroid Build Coastguard Worker StringQueryTests::StringQueryTests(Context &context) : TestCaseGroup(context, "string", "String Query tests")
45*35238bceSAndroid Build Coastguard Worker {
46*35238bceSAndroid Build Coastguard Worker }
47*35238bceSAndroid Build Coastguard Worker
~StringQueryTests(void)48*35238bceSAndroid Build Coastguard Worker StringQueryTests::~StringQueryTests(void)
49*35238bceSAndroid Build Coastguard Worker {
50*35238bceSAndroid Build Coastguard Worker }
51*35238bceSAndroid Build Coastguard Worker
init(void)52*35238bceSAndroid Build Coastguard Worker void StringQueryTests::init(void)
53*35238bceSAndroid Build Coastguard Worker {
54*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
55*35238bceSAndroid Build Coastguard Worker
56*35238bceSAndroid Build Coastguard Worker ES3F_ADD_API_CASE(renderer, "RENDERER", {
57*35238bceSAndroid Build Coastguard Worker const GLubyte *string = glGetString(GL_RENDERER);
58*35238bceSAndroid Build Coastguard Worker if (string == NULL)
59*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid string");
60*35238bceSAndroid Build Coastguard Worker });
61*35238bceSAndroid Build Coastguard Worker ES3F_ADD_API_CASE(vendor, "VENDOR", {
62*35238bceSAndroid Build Coastguard Worker const GLubyte *string = glGetString(GL_VENDOR);
63*35238bceSAndroid Build Coastguard Worker if (string == NULL)
64*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid string");
65*35238bceSAndroid Build Coastguard Worker });
66*35238bceSAndroid Build Coastguard Worker ES3F_ADD_API_CASE(version, "VERSION", {
67*35238bceSAndroid Build Coastguard Worker bool isES = glu::isContextTypeES(m_context.getRenderContext().getType());
68*35238bceSAndroid Build Coastguard Worker
69*35238bceSAndroid Build Coastguard Worker const char *string = (const char *)glGetString(GL_VERSION);
70*35238bceSAndroid Build Coastguard Worker const char *referenceString = isES ? "OpenGL ES 3." : "4.";
71*35238bceSAndroid Build Coastguard Worker
72*35238bceSAndroid Build Coastguard Worker if (string == NULL)
73*35238bceSAndroid Build Coastguard Worker TCU_FAIL("Got invalid string");
74*35238bceSAndroid Build Coastguard Worker
75*35238bceSAndroid Build Coastguard Worker if (!deStringBeginsWith(string, referenceString))
76*35238bceSAndroid Build Coastguard Worker TCU_FAIL("Got invalid string prefix");
77*35238bceSAndroid Build Coastguard Worker
78*35238bceSAndroid Build Coastguard Worker {
79*35238bceSAndroid Build Coastguard Worker std::string tmpString;
80*35238bceSAndroid Build Coastguard Worker char versionDelimiter;
81*35238bceSAndroid Build Coastguard Worker int glMajor = 0;
82*35238bceSAndroid Build Coastguard Worker int glMinor = 0;
83*35238bceSAndroid Build Coastguard Worker GLint stateVersionMinor = 0;
84*35238bceSAndroid Build Coastguard Worker
85*35238bceSAndroid Build Coastguard Worker std::istringstream versionStream(string);
86*35238bceSAndroid Build Coastguard Worker
87*35238bceSAndroid Build Coastguard Worker if (isES)
88*35238bceSAndroid Build Coastguard Worker {
89*35238bceSAndroid Build Coastguard Worker versionStream >> tmpString; // OpenGL
90*35238bceSAndroid Build Coastguard Worker versionStream >> tmpString; // ES
91*35238bceSAndroid Build Coastguard Worker }
92*35238bceSAndroid Build Coastguard Worker
93*35238bceSAndroid Build Coastguard Worker versionStream >> glMajor; // 3
94*35238bceSAndroid Build Coastguard Worker versionStream >> std::noskipws;
95*35238bceSAndroid Build Coastguard Worker versionStream >> versionDelimiter; // .
96*35238bceSAndroid Build Coastguard Worker versionStream >> glMinor; // x
97*35238bceSAndroid Build Coastguard Worker
98*35238bceSAndroid Build Coastguard Worker if (!versionStream)
99*35238bceSAndroid Build Coastguard Worker TCU_FAIL("Got invalid string format");
100*35238bceSAndroid Build Coastguard Worker
101*35238bceSAndroid Build Coastguard Worker glGetIntegerv(GL_MINOR_VERSION, &stateVersionMinor);
102*35238bceSAndroid Build Coastguard Worker if (glMinor != stateVersionMinor)
103*35238bceSAndroid Build Coastguard Worker {
104*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << "// ERROR: MINOR_VERSION is " << stateVersionMinor
105*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
106*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid version.");
107*35238bceSAndroid Build Coastguard Worker return;
108*35238bceSAndroid Build Coastguard Worker }
109*35238bceSAndroid Build Coastguard Worker }
110*35238bceSAndroid Build Coastguard Worker });
111*35238bceSAndroid Build Coastguard Worker ES3F_ADD_API_CASE(shading_language_version, "SHADING_LANGUAGE_VERSION", {
112*35238bceSAndroid Build Coastguard Worker bool isES = glu::isContextTypeES(m_context.getRenderContext().getType());
113*35238bceSAndroid Build Coastguard Worker
114*35238bceSAndroid Build Coastguard Worker const char *string = (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION);
115*35238bceSAndroid Build Coastguard Worker const char *referenceString = isES ? "OpenGL ES GLSL ES " : "4.";
116*35238bceSAndroid Build Coastguard Worker
117*35238bceSAndroid Build Coastguard Worker if (string == NULL)
118*35238bceSAndroid Build Coastguard Worker TCU_FAIL("Got invalid string");
119*35238bceSAndroid Build Coastguard Worker
120*35238bceSAndroid Build Coastguard Worker if (!deStringBeginsWith(string, referenceString))
121*35238bceSAndroid Build Coastguard Worker TCU_FAIL("Got invalid string prefix");
122*35238bceSAndroid Build Coastguard Worker
123*35238bceSAndroid Build Coastguard Worker {
124*35238bceSAndroid Build Coastguard Worker std::string tmpString;
125*35238bceSAndroid Build Coastguard Worker char versionDelimiter;
126*35238bceSAndroid Build Coastguard Worker int glslMajor = 0;
127*35238bceSAndroid Build Coastguard Worker char glslMinorDigit1 = 0;
128*35238bceSAndroid Build Coastguard Worker char glslMinorDigit2 = 0;
129*35238bceSAndroid Build Coastguard Worker bool digitsAreValid;
130*35238bceSAndroid Build Coastguard Worker
131*35238bceSAndroid Build Coastguard Worker std::istringstream versionStream(string);
132*35238bceSAndroid Build Coastguard Worker
133*35238bceSAndroid Build Coastguard Worker if (isES)
134*35238bceSAndroid Build Coastguard Worker {
135*35238bceSAndroid Build Coastguard Worker versionStream >> tmpString; // OpenGL
136*35238bceSAndroid Build Coastguard Worker versionStream >> tmpString; // ES
137*35238bceSAndroid Build Coastguard Worker versionStream >> tmpString; // GLSL
138*35238bceSAndroid Build Coastguard Worker versionStream >> tmpString; // ES
139*35238bceSAndroid Build Coastguard Worker }
140*35238bceSAndroid Build Coastguard Worker
141*35238bceSAndroid Build Coastguard Worker versionStream >> glslMajor; // x
142*35238bceSAndroid Build Coastguard Worker versionStream >> std::noskipws;
143*35238bceSAndroid Build Coastguard Worker versionStream >> versionDelimiter; // .
144*35238bceSAndroid Build Coastguard Worker versionStream >> glslMinorDigit1; // x
145*35238bceSAndroid Build Coastguard Worker versionStream >> glslMinorDigit2; // x
146*35238bceSAndroid Build Coastguard Worker
147*35238bceSAndroid Build Coastguard Worker digitsAreValid =
148*35238bceSAndroid Build Coastguard Worker glslMinorDigit1 >= '0' && glslMinorDigit1 <= '9' && glslMinorDigit2 >= '0' && glslMinorDigit2 <= '9';
149*35238bceSAndroid Build Coastguard Worker
150*35238bceSAndroid Build Coastguard Worker if (!versionStream || !digitsAreValid)
151*35238bceSAndroid Build Coastguard Worker TCU_FAIL("Got invalid string format");
152*35238bceSAndroid Build Coastguard Worker }
153*35238bceSAndroid Build Coastguard Worker });
154*35238bceSAndroid Build Coastguard Worker ES3F_ADD_API_CASE(extensions, "EXTENSIONS", {
155*35238bceSAndroid Build Coastguard Worker const char *extensions_cstring = (const char *)glGetString(GL_EXTENSIONS);
156*35238bceSAndroid Build Coastguard Worker if (extensions_cstring == NULL)
157*35238bceSAndroid Build Coastguard Worker {
158*35238bceSAndroid Build Coastguard Worker bool isES = glu::isContextTypeES(m_context.getRenderContext().getType());
159*35238bceSAndroid Build Coastguard Worker
160*35238bceSAndroid Build Coastguard Worker // GL_EXTENSIONS has been deprecated on desktop GL
161*35238bceSAndroid Build Coastguard Worker if (!isES)
162*35238bceSAndroid Build Coastguard Worker {
163*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Got NULL string for deprecated enum");
164*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_ENUM);
165*35238bceSAndroid Build Coastguard Worker return;
166*35238bceSAndroid Build Coastguard Worker }
167*35238bceSAndroid Build Coastguard Worker
168*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid string");
169*35238bceSAndroid Build Coastguard Worker return;
170*35238bceSAndroid Build Coastguard Worker }
171*35238bceSAndroid Build Coastguard Worker
172*35238bceSAndroid Build Coastguard Worker // split extensions_string at ' '
173*35238bceSAndroid Build Coastguard Worker
174*35238bceSAndroid Build Coastguard Worker std::istringstream extensionStream((std::string)(extensions_cstring));
175*35238bceSAndroid Build Coastguard Worker std::vector<std::string> extensions;
176*35238bceSAndroid Build Coastguard Worker
177*35238bceSAndroid Build Coastguard Worker for (;;)
178*35238bceSAndroid Build Coastguard Worker {
179*35238bceSAndroid Build Coastguard Worker std::string extension;
180*35238bceSAndroid Build Coastguard Worker if (std::getline(extensionStream, extension, ' '))
181*35238bceSAndroid Build Coastguard Worker extensions.push_back(extension);
182*35238bceSAndroid Build Coastguard Worker else
183*35238bceSAndroid Build Coastguard Worker break;
184*35238bceSAndroid Build Coastguard Worker }
185*35238bceSAndroid Build Coastguard Worker
186*35238bceSAndroid Build Coastguard Worker GLint numExtensions = 0;
187*35238bceSAndroid Build Coastguard Worker glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions);
188*35238bceSAndroid Build Coastguard Worker expectError(GL_NO_ERROR);
189*35238bceSAndroid Build Coastguard Worker
190*35238bceSAndroid Build Coastguard Worker if (extensions.size() != (size_t)numExtensions)
191*35238bceSAndroid Build Coastguard Worker {
192*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << "// ERROR: NUM_EXTENSIONS is " << numExtensions << "; got "
193*35238bceSAndroid Build Coastguard Worker << extensions.size() << " extensions" << TestLog::EndMessage;
194*35238bceSAndroid Build Coastguard Worker if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
195*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got non-consistent number of extensions");
196*35238bceSAndroid Build Coastguard Worker }
197*35238bceSAndroid Build Coastguard Worker
198*35238bceSAndroid Build Coastguard Worker // all in glGetStringi(GL_EXTENSIONS) in must be in glGetString
199*35238bceSAndroid Build Coastguard Worker
200*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < numExtensions; ++i)
201*35238bceSAndroid Build Coastguard Worker {
202*35238bceSAndroid Build Coastguard Worker std::string extension((const char *)glGetStringi(GL_EXTENSIONS, i));
203*35238bceSAndroid Build Coastguard Worker
204*35238bceSAndroid Build Coastguard Worker if (std::find(extensions.begin(), extensions.end(), extension) == extensions.end())
205*35238bceSAndroid Build Coastguard Worker {
206*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << "// ERROR: extension " << extension
207*35238bceSAndroid Build Coastguard Worker << " found with GetStringi was not found in glGetString(GL_EXTENSIONS)"
208*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
209*35238bceSAndroid Build Coastguard Worker if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
210*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Extension query methods are not consistent.");
211*35238bceSAndroid Build Coastguard Worker }
212*35238bceSAndroid Build Coastguard Worker }
213*35238bceSAndroid Build Coastguard Worker
214*35238bceSAndroid Build Coastguard Worker // only elements in glGetStringi(GL_EXTENSIONS) can be in glGetString
215*35238bceSAndroid Build Coastguard Worker
216*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < numExtensions; ++i)
217*35238bceSAndroid Build Coastguard Worker {
218*35238bceSAndroid Build Coastguard Worker std::string extension((const char *)glGetStringi(GL_EXTENSIONS, i));
219*35238bceSAndroid Build Coastguard Worker
220*35238bceSAndroid Build Coastguard Worker std::vector<std::string>::iterator it = std::find(extensions.begin(), extensions.end(), extension);
221*35238bceSAndroid Build Coastguard Worker if (it != extensions.end())
222*35238bceSAndroid Build Coastguard Worker extensions.erase(it);
223*35238bceSAndroid Build Coastguard Worker }
224*35238bceSAndroid Build Coastguard Worker
225*35238bceSAndroid Build Coastguard Worker if (!extensions.empty())
226*35238bceSAndroid Build Coastguard Worker {
227*35238bceSAndroid Build Coastguard Worker for (size_t ndx = 0; ndx < extensions.size(); ++ndx)
228*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << "// ERROR: extension \"" << extensions[ndx]
229*35238bceSAndroid Build Coastguard Worker << "\" found with GetString was not found with GetStringi(GL_EXTENSIONS, ind)"
230*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
231*35238bceSAndroid Build Coastguard Worker
232*35238bceSAndroid Build Coastguard Worker if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
233*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Extension query methods are not consistent.");
234*35238bceSAndroid Build Coastguard Worker }
235*35238bceSAndroid Build Coastguard Worker });
236*35238bceSAndroid Build Coastguard Worker }
237*35238bceSAndroid Build Coastguard Worker
238*35238bceSAndroid Build Coastguard Worker } // namespace Functional
239*35238bceSAndroid Build Coastguard Worker } // namespace gles3
240*35238bceSAndroid Build Coastguard Worker } // namespace deqp
241