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 Negative Vertex Array API tests.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es3fNegativeVertexArrayApiTests.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es3fApiCase.hpp"
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluShaderProgram.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluContextInfo.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deString.h"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwDefs.hpp"
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp"
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace glw; // GL types
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles3
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const char* vertexShaderSource		=	"#version 300 es\n"
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry												"void main (void)\n"
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry												"{\n"
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry												"	gl_Position = vec4(0.0);\n"
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry												"}\n\0";
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const char* fragmentShaderSource		=	"#version 300 es\n"
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry												"layout(location = 0) out mediump vec4 fragColor;"
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry												"void main (void)\n"
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry												"{\n"
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry												"	fragColor = vec4(0.0);\n"
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry												"}\n\0";
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::TestLog;
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
573c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNegativeVertexArrayApiTests::NegativeVertexArrayApiTests (Context& context)
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup(context, "vertex_array", "Negative Vertex Array API Cases")
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
623c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNegativeVertexArrayApiTests::~NegativeVertexArrayApiTests (void)
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid NegativeVertexArrayApiTests::init (void)
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(vertex_attribf, "Invalid glVertexAttrib{1234}f() usage",
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int maxVertexAttribs = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS);
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttrib1f(maxVertexAttribs, 0.0f);
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttrib2f(maxVertexAttribs, 0.0f, 0.0f);
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttrib3f(maxVertexAttribs, 0.0f, 0.0f, 0.0f);
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttrib4f(maxVertexAttribs, 0.0f, 0.0f, 0.0f, 0.0f);
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(vertex_attribfv, "Invalid glVertexAttrib{1234}fv() usage",
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int maxVertexAttribs = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS);
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float v[4] = {0.0f};
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttrib1fv(maxVertexAttribs, &v[0]);
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttrib2fv(maxVertexAttribs, &v[0]);
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttrib3fv(maxVertexAttribs, &v[0]);
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttrib4fv(maxVertexAttribs, &v[0]);
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(vertex_attribi4, "Invalid glVertexAttribI4{i|ui}f() usage",
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int maxVertexAttribs	= m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS);
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLint valInt			= 0;
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint valUint			= 0;
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribI4i(maxVertexAttribs, valInt, valInt, valInt, valInt);
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribI4ui(maxVertexAttribs, valUint, valUint, valUint, valUint);
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(vertex_attribi4v, "Invalid glVertexAttribI4{i|ui}fv() usage",
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int maxVertexAttribs	= m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS);
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLint valInt[4]			= { 0 };
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint valUint[4]		= { 0 };
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribI4iv(maxVertexAttribs, &valInt[0]);
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribI4uiv(maxVertexAttribs, &valUint[0]);
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(vertex_attrib_pointer, "Invalid glVertexAttribPointer() usage",
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not an accepted value.");
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribPointer(0, 1, 0, GL_TRUE, 0, 0);
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int maxVertexAttribs = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS);
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribPointer(maxVertexAttribs, 1, GL_BYTE, GL_TRUE, 0, 0);
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if size is not 1, 2, 3, or 4.");
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribPointer(0, 0, GL_BYTE, GL_TRUE, 0, 0);
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if stride is negative.");
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribPointer(0, 1, GL_BYTE, GL_TRUE, -1, 0);
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if type is GL_INT_2_10_10_10_REV or GL_UNSIGNED_INT_2_10_10_10_REV and size is not 4.");
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribPointer(0, 2, GL_INT_2_10_10_10_REV, GL_TRUE, 0, 0);
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_OPERATION);
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribPointer(0, 2, GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE, 0, 0);
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_OPERATION);
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribPointer(0, 4, GL_INT_2_10_10_10_REV, GL_TRUE, 0, 0);
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribPointer(0, 4, GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE, 0, 0);
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated a non-zero vertex array object is bound, zero is bound to the GL_ARRAY_BUFFER buffer object binding point and the pointer argument is not NULL.");
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint vao;
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLbyte offset = 1;
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenVertexArrays(1, &vao);
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindVertexArray(vao);
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindBuffer(GL_ARRAY_BUFFER, 0);
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribPointer(0, 1, GL_BYTE, GL_TRUE, 0, &offset);
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_OPERATION);
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindVertexArray(0);
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteVertexArrays(1, &vao);
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(vertex_attrib_i_pointer, "Invalid glVertexAttribPointer() usage",
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not an accepted value.");
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribIPointer(0, 1, 0, 0, 0);
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribIPointer(0, 4, GL_INT_2_10_10_10_REV, 0, 0);
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribIPointer(0, 4, GL_UNSIGNED_INT_2_10_10_10_REV, 0, 0);
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int maxVertexAttribs = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS);
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribIPointer(maxVertexAttribs, 1, GL_BYTE, 0, 0);
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if size is not 1, 2, 3, or 4.");
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribIPointer(0, 0, GL_BYTE, 0, 0);
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if stride is negative.");
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribIPointer(0, 1, GL_BYTE, -1, 0);
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated a non-zero vertex array object is bound, zero is bound to the GL_ARRAY_BUFFER buffer object binding point and the pointer argument is not NULL.");
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint vao;
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLbyte offset = 1;
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenVertexArrays(1, &vao);
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindVertexArray(vao);
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindBuffer(GL_ARRAY_BUFFER, 0);
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribIPointer(0, 1, GL_BYTE, 0, &offset);
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_OPERATION);
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindVertexArray(0);
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteVertexArrays(1, &vao);
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(enable_vertex_attrib_array, "Invalid glEnableVertexAttribArray() usage",
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int maxVertexAttribs = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS);
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glEnableVertexAttribArray(maxVertexAttribs);
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(disable_vertex_attrib_array, "Invalid glDisableVertexAttribArray() usage",
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int maxVertexAttribs = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS);
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDisableVertexAttribArray(maxVertexAttribs);
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(gen_vertex_arrays, "Invalid glGenVertexArrays() usage",
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint arrays;
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenVertexArrays(-1, &arrays);
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(bind_vertex_array, "Invalid glBindVertexArray() usage",
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if array is not zero or the name of an existing vertex array object.");
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindVertexArray(-1);
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_OPERATION);
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(delete_vertex_arrays, "Invalid glDeleteVertexArrays() usage",
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteVertexArrays(-1, 0);
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(vertex_attrib_divisor, "Invalid glVertexAttribDivisor() usage",
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int maxVertexAttribs = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS);
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribDivisor(maxVertexAttribs, 0);
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_arrays, "Invalid glDrawArrays() usage",
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(program.getProgram());
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArrays(-1, 0, 1);
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArrays(GL_POINTS, 0, -1);
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArrays(GL_POINTS, 0, 1);
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_arrays_invalid_program, "Invalid glDrawArrays() usage",
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArrays(-1, 0, 1);
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArrays(GL_POINTS, 0, -1);
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArrays(GL_POINTS, 0, 1);
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_arrays_incomplete_primitive, "Invalid glDrawArrays() usage",
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(program.getProgram());
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArrays(-1, 0, 1);
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArrays(GL_TRIANGLES, 0, -1);
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArrays(GL_TRIANGLES, 0, 1);
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_elements, "Invalid glDrawElements() usage",
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(program.getProgram());
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint buf;
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint tfID;
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLfloat vertices[1];
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices);
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not one of the accepted values.");
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_POINTS, 1, -1, vertices);
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_POINTS, 1, GL_FLOAT, vertices);
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices);
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
379271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry			if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
380271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry			{
381271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
382271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				const char* tfVarying		= "gl_Position";
383271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry
384271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glGenBuffers				(1, &buf);
385271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glGenTransformFeedbacks		(1, &tfID);
386271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry
387271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glUseProgram				(program.getProgram());
388271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
389271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glLinkProgram				(program.getProgram());
390271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
391271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
392271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
393271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
394271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBeginTransformFeedback	(GL_POINTS);
395271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_NO_ERROR);
396271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry
397271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDrawElements				(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
398271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_INVALID_OPERATION);
399271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry
400271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glPauseTransformFeedback();
401271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDrawElements				(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
402271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_NO_ERROR);
403271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry
404271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glEndTransformFeedback		();
405271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDeleteBuffers				(1, &buf);
406271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDeleteTransformFeedbacks	(1, &tfID);
407271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_NO_ERROR);
408271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				m_log << tcu::TestLog::EndSection;
409271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry			}
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_elements_invalid_program, "Invalid glDrawElements() usage",
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLfloat vertices[1];
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices);
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not one of the accepted values.");
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_POINTS, 1, -1, vertices);
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_POINTS, 1, GL_FLOAT, vertices);
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices);
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_elements_incomplete_primitive, "Invalid glDrawElements() usage",
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(program.getProgram());
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint buf;
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint tfID;
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLfloat vertices[1];
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices);
4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not one of the accepted values.");
4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_TRIANGLES, 1, -1, vertices);
4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_TRIANGLES, 1, GL_FLOAT, vertices);
4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_TRIANGLES, -1, GL_UNSIGNED_BYTE, vertices);
4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices);
4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
482271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry			if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
483271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry			{
484271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
485271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				const char* tfVarying		= "gl_Position";
4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
487271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glGenBuffers				(1, &buf);
488271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glGenTransformFeedbacks		(1, &tfID);
4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
490271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glUseProgram				(program.getProgram());
491271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
492271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glLinkProgram				(program.getProgram());
493271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
494271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
495271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
496271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
497271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBeginTransformFeedback	(GL_TRIANGLES);
498271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_NO_ERROR);
4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
500271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDrawElements				(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices);
501271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_INVALID_OPERATION);
5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
503271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glPauseTransformFeedback();
504271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDrawElements				(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices);
505271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_NO_ERROR);
5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
507271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glEndTransformFeedback		();
508271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDeleteBuffers				(1, &buf);
509271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDeleteTransformFeedbacks	(1, &tfID);
510271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_NO_ERROR);
511271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				m_log << tcu::TestLog::EndSection;
512271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry			}
5133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
5163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_arrays_instanced, "Invalid glDrawArraysInstanced() usage",
5173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(program.getProgram());
5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribDivisor(0, 1);
5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(-1, 0, 1, 1);
5263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count or primcount are negative.");
5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(GL_POINTS, 0, -1, 1);
5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(GL_POINTS, 0, 1, -1);
5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(GL_POINTS, 0, 1, 1);
5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_arrays_instanced_invalid_program, "Invalid glDrawArraysInstanced() usage",
5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribDivisor(0, 1);
5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(-1, 0, 1, 1);
5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count or primcount are negative.");
5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(GL_POINTS, 0, -1, 1);
5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(GL_POINTS, 0, 1, -1);
5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(GL_POINTS, 0, 1, 1);
5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
5733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
5743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
5753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
5763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
5773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_arrays_instanced_incomplete_primitive, "Invalid glDrawArraysInstanced() usage",
5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(program.getProgram());
5813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribDivisor(0, 1);
5833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
5843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(-1, 0, 1, 1);
5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count or primcount are negative.");
5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(GL_TRIANGLES, 0, -1, 1);
5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(GL_TRIANGLES, 0, 1, -1);
5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
5993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(GL_TRIANGLES, 0, 1, 1);
6023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
6063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
6093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_elements_instanced, "Invalid glDrawElementsInstanced() usage",
6103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(program.getProgram());
6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint buf;
6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint tfID;
6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLfloat vertices[1];
6173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribDivisor(0, 1);
6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(-1, 1, GL_UNSIGNED_BYTE, vertices, 1);
6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
6233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not one of the accepted values.");
6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, 1, -1, vertices, 1);
6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, 1, GL_FLOAT, vertices, 1);
6293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
6303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
6313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count or primcount are negative.");
6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices, 1);
6343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, 11, GL_UNSIGNED_BYTE, vertices, -1);
6363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
6373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
6433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
649271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry			if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
650271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry			{
651271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
652271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				const char* tfVarying		= "gl_Position";
6533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
654271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glGenBuffers				(1, &buf);
655271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glGenTransformFeedbacks		(1, &tfID);
6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
657271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glUseProgram				(program.getProgram());
658271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
659271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glLinkProgram				(program.getProgram());
660271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
661271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
662271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
663271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
664271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBeginTransformFeedback	(GL_POINTS);
665271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_NO_ERROR);
6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
667271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDrawElementsInstanced		(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
668271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_INVALID_OPERATION);
6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
670271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glPauseTransformFeedback();
671271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDrawElementsInstanced		(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
672271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_NO_ERROR);
6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
674271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glEndTransformFeedback		();
675271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDeleteBuffers				(1, &buf);
676271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDeleteTransformFeedbacks	(1, &tfID);
677271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_NO_ERROR);
678271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				m_log << tcu::TestLog::EndSection;
679271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry			}
6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_elements_instanced_invalid_program, "Invalid glDrawElementsInstanced() usage",
6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLfloat vertices[1];
6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribDivisor(0, 1);
6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
6903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(-1, 1, GL_UNSIGNED_BYTE, vertices, 1);
6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not one of the accepted values.");
6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, 1, -1, vertices, 1);
6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, 1, GL_FLOAT, vertices, 1);
7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count or primcount are negative.");
7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices, 1);
7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, 11, GL_UNSIGNED_BYTE, vertices, -1);
7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
7083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
7093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
7113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
7133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_elements_instanced_incomplete_primitive, "Invalid glDrawElementsInstanced() usage",
7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(program.getProgram());
7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint buf;
7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint tfID;
7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLfloat vertices[1];
7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribDivisor(0, 1);
7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(-1, 1, GL_UNSIGNED_BYTE, vertices, 1);
7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not one of the accepted values.");
7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_TRIANGLES, 1, -1, vertices, 1);
7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_TRIANGLES, 1, GL_FLOAT, vertices, 1);
7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count or primcount are negative.");
7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_TRIANGLES, -1, GL_UNSIGNED_BYTE, vertices, 1);
7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_TRIANGLES, 11, GL_UNSIGNED_BYTE, vertices, -1);
7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices, 1);
7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
760271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry			if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
761271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry			{
762271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
763271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				const char* tfVarying		= "gl_Position";
7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
765271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glGenBuffers				(1, &buf);
766271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glGenTransformFeedbacks		(1, &tfID);
7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
768271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glUseProgram				(program.getProgram());
769271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
770271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glLinkProgram				(program.getProgram());
771271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
772271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
773271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
774271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
775271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBeginTransformFeedback	(GL_TRIANGLES);
776271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_NO_ERROR);
7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
778271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDrawElementsInstanced		(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices, 1);
779271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_INVALID_OPERATION);
7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
781271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glPauseTransformFeedback();
782271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDrawElementsInstanced		(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices, 1);
783271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_NO_ERROR);
7843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
785271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glEndTransformFeedback		();
786271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDeleteBuffers				(1, &buf);
787271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDeleteTransformFeedbacks	(1, &tfID);
788271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_NO_ERROR);
789271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				m_log << tcu::TestLog::EndSection;
790271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry			}
7913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
7933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
7943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_range_elements, "Invalid glDrawRangeElements() usage",
7953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(program.getProgram());
7983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
7993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint buf;
8003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint tfID;
801a47a27a6e1a943e25debe217b809b1697db870a3Olli Etuaho			deUint32 vertices[1];
802a47a27a6e1a943e25debe217b809b1697db870a3Olli Etuaho			vertices[0] = 0xffffffffu;
8033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
8053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(-1, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
8063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
8083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not one of the accepted values.");
8103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 0, 1, 1, -1, vertices);
8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
8123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_FLOAT, vertices);
8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
8143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 0, 1, -1, GL_UNSIGNED_BYTE, vertices);
8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
8193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if end < start.");
8223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 1, 0, 1, GL_UNSIGNED_BYTE, vertices);
8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
8243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
8253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
8273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
8293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
8303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
8313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
8323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
836271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry			if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
837271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry			{
838271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
839271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				const char* tfVarying		= "gl_Position";
840a47a27a6e1a943e25debe217b809b1697db870a3Olli Etuaho				deUint32 verticesInRange[1];
841653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos				verticesInRange[0]			= 0;
8423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
843271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glGenBuffers				(1, &buf);
844271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glGenTransformFeedbacks		(1, &tfID);
8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
846271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glUseProgram				(program.getProgram());
847271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
848271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glLinkProgram				(program.getProgram());
849271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
850271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
851271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
852271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
853271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBeginTransformFeedback	(GL_POINTS);
854271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_NO_ERROR);
8553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
856271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDrawRangeElements			(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
857271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_INVALID_OPERATION);
8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
859271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glPauseTransformFeedback();
860a47a27a6e1a943e25debe217b809b1697db870a3Olli Etuaho				glDrawRangeElements			(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, verticesInRange);
861271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_NO_ERROR);
8623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
863271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glEndTransformFeedback		();
864271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDeleteBuffers				(1, &buf);
865271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDeleteTransformFeedbacks	(1, &tfID);
866271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_NO_ERROR);
867271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				m_log << tcu::TestLog::EndSection;
868271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry			}
8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
8713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_range_elements_invalid_program, "Invalid glDrawRangeElements() usage",
8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
876a47a27a6e1a943e25debe217b809b1697db870a3Olli Etuaho			deUint32 vertices[1];
877a47a27a6e1a943e25debe217b809b1697db870a3Olli Etuaho			vertices[0] = 0xffffffffu;
8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
8803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(-1, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
8813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
8823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not one of the accepted values.");
8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 0, 1, 1, -1, vertices);
8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
8873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_FLOAT, vertices);
8883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
8903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
8923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 0, 1, -1, GL_UNSIGNED_BYTE, vertices);
8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
8953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if end < start.");
8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 1, 0, 1, GL_UNSIGNED_BYTE, vertices);
8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
9023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
9033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
9043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
9063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
9073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
9083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
9093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
9103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
9113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_range_elements_incomplete_primitive, "Invalid glDrawRangeElements() usage",
9123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
9133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
9143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(program.getProgram());
9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint buf;
9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint tfID;
918a47a27a6e1a943e25debe217b809b1697db870a3Olli Etuaho			deUint32 vertices[1];
919a47a27a6e1a943e25debe217b809b1697db870a3Olli Etuaho			vertices[0] = 0xffffffffu;
9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(-1, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
9243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
9253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not one of the accepted values.");
9273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, -1, vertices);
9283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
9293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, GL_FLOAT, vertices);
9303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
9313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
9323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
9343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_TRIANGLES, 0, 1, -1, GL_UNSIGNED_BYTE, vertices);
9353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
9363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if end < start.");
9393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_TRIANGLES, 1, 0, 1, GL_UNSIGNED_BYTE, vertices);
9403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
9413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
9423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
9443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
9453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
9463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
9473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
9483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
9493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
9503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
9513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
9523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
953271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry			if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
954271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry			{
955271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
956271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				const char* tfVarying		= "gl_Position";
957a47a27a6e1a943e25debe217b809b1697db870a3Olli Etuaho				deUint32 verticesInRange[1];
958653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos				verticesInRange[0]			= 0;
959271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry
960271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glGenBuffers				(1, &buf);
961271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glGenTransformFeedbacks		(1, &tfID);
962271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry
963271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glUseProgram				(program.getProgram());
964271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
965271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glLinkProgram				(program.getProgram());
966271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
967271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
968271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
969271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
970271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glBeginTransformFeedback	(GL_TRIANGLES);
971271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_NO_ERROR);
972271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry
973271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDrawRangeElements			(GL_TRIANGLES, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
974271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_INVALID_OPERATION);
975271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry
976271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glPauseTransformFeedback();
977a47a27a6e1a943e25debe217b809b1697db870a3Olli Etuaho				glDrawRangeElements			(GL_TRIANGLES, 0, 1, 1, GL_UNSIGNED_BYTE, verticesInRange);
978271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_NO_ERROR);
979271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry
980271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glEndTransformFeedback		();
981271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDeleteBuffers				(1, &buf);
982271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				glDeleteTransformFeedbacks	(1, &tfID);
983271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				expectError					(GL_NO_ERROR);
984271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry				m_log << tcu::TestLog::EndSection;
985271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry			}
9863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
9883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
9893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional
9923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles3
9933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
994