| /*------------------------------------------------------------------------- |
| * drawElements Quality Program OpenGL ES 3.0 Module |
| * ------------------------------------------------- |
| * |
| * Copyright 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| *//*! |
| * \file |
| * \brief String Query tests. |
| *//*--------------------------------------------------------------------*/ |
| |
| #include "es3fStringQueryTests.hpp" |
| #include "es3fApiCase.hpp" |
| #include "gluRenderContext.hpp" |
| #include "glwEnums.hpp" |
| #include "glwFunctions.hpp" |
| #include "deString.h" |
| |
| #include <algorithm> |
| #include <sstream> |
| #include <string> |
| |
| using namespace glw; // GLint and other GL types |
| |
| namespace deqp |
| { |
| namespace gles3 |
| { |
| namespace Functional |
| { |
| |
| StringQueryTests::StringQueryTests (Context& context) |
| : TestCaseGroup (context, "string", "String Query tests") |
| { |
| } |
| |
| StringQueryTests::~StringQueryTests (void) |
| { |
| } |
| |
| void StringQueryTests::init (void) |
| { |
| using tcu::TestLog; |
| |
| ES3F_ADD_API_CASE(renderer, "RENDERER", |
| { |
| const GLubyte* string = glGetString(GL_RENDERER); |
| if (string == NULL) |
| m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid string"); |
| }); |
| ES3F_ADD_API_CASE(vendor, "VENDOR", |
| { |
| const GLubyte* string = glGetString(GL_VENDOR); |
| if (string == NULL) |
| m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid string"); |
| }); |
| ES3F_ADD_API_CASE(version, "VERSION", |
| { |
| const char* string = (const char*)glGetString(GL_VERSION); |
| const char referenceString[] = "OpenGL ES 3."; |
| |
| if (string == NULL) |
| TCU_FAIL("Got invalid string"); |
| |
| if (!deStringBeginsWith(string, referenceString)) |
| TCU_FAIL("Got invalid string prefix"); |
| |
| { |
| std::string tmpString; |
| char versionDelimiter; |
| int glMajor = 0; |
| int glMinor = 0; |
| GLint stateVersionMinor = 0; |
| |
| std::istringstream versionStream(string); |
| versionStream >> tmpString; // OpenGL |
| versionStream >> tmpString; // ES |
| versionStream >> glMajor; // 3 |
| versionStream >> std::noskipws; |
| versionStream >> versionDelimiter; // . |
| versionStream >> glMinor; // x |
| |
| if (!versionStream) |
| TCU_FAIL("Got invalid string format"); |
| |
| glGetIntegerv(GL_MINOR_VERSION, &stateVersionMinor); |
| if (glMinor != stateVersionMinor) |
| { |
| m_testCtx.getLog() << TestLog::Message << "// ERROR: MINOR_VERSION is " << stateVersionMinor << TestLog::EndMessage; |
| m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid version."); |
| return; |
| } |
| } |
| }); |
| ES3F_ADD_API_CASE(shading_language_version, "SHADING_LANGUAGE_VERSION", |
| { |
| const char* string = (const char*)glGetString(GL_SHADING_LANGUAGE_VERSION); |
| const char referenceString[] = "OpenGL ES GLSL ES "; |
| |
| if (string == NULL) |
| TCU_FAIL("Got invalid string"); |
| |
| if (!deStringBeginsWith(string, referenceString)) |
| TCU_FAIL("Got invalid string prefix"); |
| |
| { |
| std::string tmpString; |
| char versionDelimiter; |
| int glslMajor = 0; |
| char glslMinorDigit1 = 0; |
| char glslMinorDigit2 = 0; |
| bool digitsAreValid; |
| |
| std::istringstream versionStream(string); |
| versionStream >> tmpString; // OpenGL |
| versionStream >> tmpString; // ES |
| versionStream >> tmpString; // GLSL |
| versionStream >> tmpString; // ES |
| versionStream >> glslMajor; // x |
| versionStream >> std::noskipws; |
| versionStream >> versionDelimiter; // . |
| versionStream >> glslMinorDigit1; // x |
| versionStream >> glslMinorDigit2; // x |
| |
| digitsAreValid = glslMinorDigit1 >= '0' && glslMinorDigit1 <= '9' && |
| glslMinorDigit2 >= '0' && glslMinorDigit2 <= '9'; |
| |
| if (!versionStream || !digitsAreValid) |
| TCU_FAIL("Got invalid string format"); |
| } |
| }); |
| ES3F_ADD_API_CASE(extensions, "EXTENSIONS", |
| { |
| const char* extensions_cstring = (const char*)glGetString(GL_EXTENSIONS); |
| if (extensions_cstring == NULL) |
| m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid string"); |
| |
| // split extensions_string at ' ' |
| |
| std::istringstream extensionStream((std::string)(extensions_cstring)); |
| std::vector<std::string> extensions; |
| |
| for (;;) |
| { |
| std::string extension; |
| if (std::getline(extensionStream, extension, ' ')) |
| extensions.push_back(extension); |
| else |
| break; |
| } |
| |
| GLint numExtensions = 0; |
| glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions); |
| expectError(GL_NO_ERROR); |
| |
| if (extensions.size() != (size_t)numExtensions) |
| { |
| m_testCtx.getLog() << TestLog::Message << "// ERROR: NUM_EXTENSIONS is " << numExtensions << "; got " << extensions.size() << " extensions" << TestLog::EndMessage; |
| if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS) |
| m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got non-consistent number of extensions"); |
| } |
| |
| // all in glGetStringi(GL_EXTENSIONS) in must be in glGetString |
| |
| for (int i = 0; i < numExtensions; ++i) |
| { |
| std::string extension((const char*)glGetStringi(GL_EXTENSIONS, i)); |
| |
| if (std::find(extensions.begin(), extensions.end(), extension) == extensions.end()) |
| { |
| m_testCtx.getLog() << TestLog::Message << "// ERROR: extension " << extension << " found with GetStringi was not found in glGetString(GL_EXTENSIONS)" << TestLog::EndMessage; |
| if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS) |
| m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Extension query methods are not consistent."); |
| } |
| } |
| |
| // only elements in glGetStringi(GL_EXTENSIONS) can be in glGetString |
| |
| for (int i = 0; i < numExtensions; ++i) |
| { |
| std::string extension((const char*)glGetStringi(GL_EXTENSIONS, i)); |
| |
| std::vector<std::string>::iterator it = std::find(extensions.begin(), extensions.end(), extension); |
| if (it != extensions.end()) |
| extensions.erase(it); |
| } |
| |
| if (!extensions.empty()) |
| { |
| for (size_t ndx = 0; ndx < extensions.size(); ++ndx) |
| m_testCtx.getLog() << TestLog::Message << "// ERROR: extension \"" << extensions[ndx] << "\" found with GetString was not found with GetStringi(GL_EXTENSIONS, ind)" << TestLog::EndMessage; |
| |
| if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS) |
| m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Extension query methods are not consistent."); |
| } |
| |
| }); |
| } |
| |
| } // Functional |
| } // gles3 |
| } // deqp |