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