13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 3.0 Module
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * -------------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief String Query tests.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es3fStringQueryTests.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es3fApiCase.hpp"
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluRenderContext.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwFunctions.hpp"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deString.h"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <algorithm>
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <sstream>
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <string>
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace glw; // GLint and other GL types
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles3
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
443c827367444ee418f129b2c238299f49d3264554Jarkko PoyryStringQueryTests::StringQueryTests (Context& context)
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup (context, "string", "String Query tests")
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
493c827367444ee418f129b2c238299f49d3264554Jarkko PoyryStringQueryTests::~StringQueryTests (void)
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid StringQueryTests::init (void)
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(renderer, "RENDERER",
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLubyte* string = glGetString(GL_RENDERER);
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (string == NULL)
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid string");
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	});
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(vendor, "VENDOR",
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLubyte* string = glGetString(GL_VENDOR);
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (string == NULL)
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid string");
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	});
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(version, "VERSION",
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* string				= (const char*)glGetString(GL_VERSION);
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char	referenceString[]	= "OpenGL ES 3.";
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (string == NULL)
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TCU_FAIL("Got invalid string");
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (!deStringBeginsWith(string, referenceString))
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TCU_FAIL("Got invalid string prefix");
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			std::string tmpString;
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			char		versionDelimiter;
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int			glMajor				= 0;
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int			glMinor				= 0;
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLint		stateVersionMinor	= 0;
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			std::istringstream versionStream(string);
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			versionStream >> tmpString;			// OpenGL
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			versionStream >> tmpString;			// ES
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			versionStream >> glMajor;			// 3
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			versionStream >> std::noskipws;
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			versionStream >> versionDelimiter;	// .
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			versionStream >> glMinor;			// x
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (!versionStream)
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				TCU_FAIL("Got invalid string format");
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGetIntegerv(GL_MINOR_VERSION, &stateVersionMinor);
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (glMinor != stateVersionMinor)
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_testCtx.getLog() << TestLog::Message << "// ERROR: MINOR_VERSION is " << stateVersionMinor << TestLog::EndMessage;
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid version.");
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return;
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	});
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(shading_language_version, "SHADING_LANGUAGE_VERSION",
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* string				= (const char*)glGetString(GL_SHADING_LANGUAGE_VERSION);
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char	referenceString[]	= "OpenGL ES GLSL ES ";
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (string == NULL)
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TCU_FAIL("Got invalid string");
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (!deStringBeginsWith(string, referenceString))
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TCU_FAIL("Got invalid string prefix");
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			std::string tmpString;
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			char		versionDelimiter;
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int			glslMajor			= 0;
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			char		glslMinorDigit1		= 0;
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			char		glslMinorDigit2		= 0;
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bool		digitsAreValid;
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			std::istringstream versionStream(string);
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			versionStream >> tmpString;			// OpenGL
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			versionStream >> tmpString;			// ES
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			versionStream >> tmpString;			// GLSL
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			versionStream >> tmpString;			// ES
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			versionStream >> glslMajor;			// x
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			versionStream >> std::noskipws;
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			versionStream >> versionDelimiter;	// .
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			versionStream >> glslMinorDigit1;	// x
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			versionStream >> glslMinorDigit2;	// x
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			digitsAreValid =	glslMinorDigit1 >= '0' && glslMinorDigit1 <= '9' &&
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								glslMinorDigit2 >= '0' && glslMinorDigit2 <= '9';
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (!versionStream || !digitsAreValid)
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				TCU_FAIL("Got invalid string format");
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	});
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(extensions, "EXTENSIONS",
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* extensions_cstring = (const char*)glGetString(GL_EXTENSIONS);
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (extensions_cstring == NULL)
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid string");
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// split extensions_string at ' '
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		std::istringstream extensionStream((std::string)(extensions_cstring));
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		std::vector<std::string> extensions;
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (;;)
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			std::string extension;
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (std::getline(extensionStream, extension, ' '))
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				extensions.push_back(extension);
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLint numExtensions = 0;
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions);
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (extensions.size() != (size_t)numExtensions)
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.getLog() << TestLog::Message << "// ERROR:  NUM_EXTENSIONS is " << numExtensions << "; got " << extensions.size() << " extensions" << TestLog::EndMessage;
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got non-consistent number of extensions");
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// all in glGetStringi(GL_EXTENSIONS) in must be in glGetString
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int i = 0; i < numExtensions; ++i)
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			std::string extension((const char*)glGetStringi(GL_EXTENSIONS, i));
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (std::find(extensions.begin(), extensions.end(), extension) == extensions.end())
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_testCtx.getLog() << TestLog::Message << "// ERROR: extension " << extension << " found with GetStringi was not found in glGetString(GL_EXTENSIONS)" << TestLog::EndMessage;
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Extension query methods are not consistent.");
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// only elements in glGetStringi(GL_EXTENSIONS) can be in glGetString
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int i = 0; i < numExtensions; ++i)
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			std::string extension((const char*)glGetStringi(GL_EXTENSIONS, i));
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			std::vector<std::string>::iterator it = std::find(extensions.begin(), extensions.end(), extension);
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (it != extensions.end())
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				extensions.erase(it);
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (!extensions.empty())
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (size_t ndx = 0; ndx < extensions.size(); ++ndx)
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_testCtx.getLog() << TestLog::Message << "// ERROR: extension \"" << extensions[ndx] << "\" found with GetString was not found with GetStringi(GL_EXTENSIONS, ind)" << TestLog::EndMessage;
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Extension query methods are not consistent.");
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	});
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles3
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
215