xref: /aosp_15_r20/external/deqp/modules/gles3/functional/es3fStringQueryTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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