es3fNegativeVertexArrayApiTests.cpp revision 3c827367444ee418f129b2c238299f49d3264554
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
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const char* tfVarying		= "gl_Position";
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenBuffers				(1, &buf);
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenTransformFeedbacks		(1, &tfID);
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram				(program.getProgram());
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glLinkProgram				(program.getProgram());
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBeginTransformFeedback	(GL_POINTS);
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_NO_ERROR);
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements				(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_INVALID_OPERATION);
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glPauseTransformFeedback();
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements				(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_NO_ERROR);
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glEndTransformFeedback		();
4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteBuffers				(1, &buf);
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteTransformFeedbacks	(1, &tfID);
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_NO_ERROR);
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_elements_invalid_program, "Invalid glDrawElements() usage",
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLfloat vertices[1];
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices);
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not one of the accepted values.");
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_POINTS, 1, -1, vertices);
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_POINTS, 1, GL_FLOAT, vertices);
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices);
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_elements_incomplete_primitive, "Invalid glDrawElements() usage",
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(program.getProgram());
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint buf;
4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint tfID;
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLfloat vertices[1];
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices);
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not one of the accepted values.");
4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_TRIANGLES, 1, -1, vertices);
4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_TRIANGLES, 1, GL_FLOAT, vertices);
4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_TRIANGLES, -1, GL_UNSIGNED_BYTE, vertices);
4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices);
4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const char* tfVarying		= "gl_Position";
4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenBuffers				(1, &buf);
4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenTransformFeedbacks		(1, &tfID);
4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram				(program.getProgram());
4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glLinkProgram				(program.getProgram());
4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
4903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBeginTransformFeedback	(GL_TRIANGLES);
4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_NO_ERROR);
4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements				(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices);
4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_INVALID_OPERATION);
4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glPauseTransformFeedback();
4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElements				(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices);
5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_NO_ERROR);
5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glEndTransformFeedback		();
5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteBuffers				(1, &buf);
5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteTransformFeedbacks	(1, &tfID);
5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_NO_ERROR);
5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
5073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
5103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_arrays_instanced, "Invalid glDrawArraysInstanced() usage",
5113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
5133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(program.getProgram());
5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribDivisor(0, 1);
5163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
5173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(-1, 0, 1, 1);
5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count or primcount are negative.");
5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(GL_POINTS, 0, -1, 1);
5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
5263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(GL_POINTS, 0, 1, -1);
5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(GL_POINTS, 0, 1, 1);
5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_arrays_instanced_invalid_program, "Invalid glDrawArraysInstanced() usage",
5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
5463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribDivisor(0, 1);
5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(-1, 0, 1, 1);
5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count or primcount are negative.");
5553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(GL_POINTS, 0, -1, 1);
5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(GL_POINTS, 0, 1, -1);
5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(GL_POINTS, 0, 1, 1);
5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_arrays_instanced_incomplete_primitive, "Invalid glDrawArraysInstanced() usage",
5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
5743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(program.getProgram());
5753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
5763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribDivisor(0, 1);
5773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(-1, 0, 1, 1);
5813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
5833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count or primcount are negative.");
5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(GL_TRIANGLES, 0, -1, 1);
5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(GL_TRIANGLES, 0, 1, -1);
5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawArraysInstanced(GL_TRIANGLES, 0, 1, 1);
5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
5973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
5993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
6023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_elements_instanced, "Invalid glDrawElementsInstanced() usage",
6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
6063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(program.getProgram());
6073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint buf;
6093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint tfID;
6103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLfloat vertices[1];
6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribDivisor(0, 1);
6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(-1, 1, GL_UNSIGNED_BYTE, vertices, 1);
6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
6173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not one of the accepted values.");
6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, 1, -1, vertices, 1);
6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, 1, GL_FLOAT, vertices, 1);
6233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
6253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count or primcount are negative.");
6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices, 1);
6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
6293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, 11, GL_UNSIGNED_BYTE, vertices, -1);
6303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
6313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
6323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
6343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
6373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const char* tfVarying		= "gl_Position";
6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenBuffers				(1, &buf);
6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenTransformFeedbacks		(1, &tfID);
6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram				(program.getProgram());
6503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
6513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glLinkProgram				(program.getProgram());
6523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
6533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
6543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
6553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBeginTransformFeedback	(GL_POINTS);
6573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_NO_ERROR);
6583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced		(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_INVALID_OPERATION);
6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glPauseTransformFeedback();
6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced		(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_NO_ERROR);
6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glEndTransformFeedback		();
6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteBuffers				(1, &buf);
6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteTransformFeedbacks	(1, &tfID);
6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_NO_ERROR);
6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
6713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_elements_instanced_invalid_program, "Invalid glDrawElementsInstanced() usage",
6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
6773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
6783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLfloat vertices[1];
6793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribDivisor(0, 1);
6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(-1, 1, GL_UNSIGNED_BYTE, vertices, 1);
6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not one of the accepted values.");
6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, 1, -1, vertices, 1);
6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
6903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, 1, GL_FLOAT, vertices, 1);
6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count or primcount are negative.");
6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices, 1);
6963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, 11, GL_UNSIGNED_BYTE, vertices, -1);
6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
7083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
7093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
7103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
7113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_elements_instanced_incomplete_primitive, "Invalid glDrawElementsInstanced() usage",
7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(program.getProgram());
7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint buf;
7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint tfID;
7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLfloat vertices[1];
7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glVertexAttribDivisor(0, 1);
7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(-1, 1, GL_UNSIGNED_BYTE, vertices, 1);
7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not one of the accepted values.");
7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_TRIANGLES, 1, -1, vertices, 1);
7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_TRIANGLES, 1, GL_FLOAT, vertices, 1);
7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count or primcount are negative.");
7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_TRIANGLES, -1, GL_UNSIGNED_BYTE, vertices, 1);
7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_TRIANGLES, 11, GL_UNSIGNED_BYTE, vertices, -1);
7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices, 1);
7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const char* tfVarying		= "gl_Position";
7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenBuffers				(1, &buf);
7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenTransformFeedbacks		(1, &tfID);
7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram				(program.getProgram());
7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glLinkProgram				(program.getProgram());
7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBeginTransformFeedback	(GL_TRIANGLES);
7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_NO_ERROR);
7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced		(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices, 1);
7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_INVALID_OPERATION);
7693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glPauseTransformFeedback();
7713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawElementsInstanced		(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices, 1);
7723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_NO_ERROR);
7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glEndTransformFeedback		();
7753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteBuffers				(1, &buf);
7763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteTransformFeedbacks	(1, &tfID);
7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_NO_ERROR);
7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
7823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_range_elements, "Invalid glDrawRangeElements() usage",
7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(program.getProgram());
7863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint buf;
7883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint tfID;
7893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLfloat vertices[1];
7903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
7923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(-1, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
7933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
7943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
7953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not one of the accepted values.");
7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 0, 1, 1, -1, vertices);
7983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
7993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_FLOAT, vertices);
8003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
8013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
8023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
8043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 0, 1, -1, GL_UNSIGNED_BYTE, vertices);
8053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
8063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if end < start.");
8093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 1, 0, 1, GL_UNSIGNED_BYTE, vertices);
8103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
8123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
8143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
8163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
8193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
8223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
8243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const char* tfVarying		= "gl_Position";
8253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenBuffers				(1, &buf);
8273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenTransformFeedbacks		(1, &tfID);
8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram				(program.getProgram());
8303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
8313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glLinkProgram				(program.getProgram());
8323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
8363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBeginTransformFeedback	(GL_POINTS);
8373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_NO_ERROR);
8383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements			(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
8403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_INVALID_OPERATION);
8413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glPauseTransformFeedback();
8433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements			(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
8443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_NO_ERROR);
8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glEndTransformFeedback		();
8473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteBuffers				(1, &buf);
8483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteTransformFeedbacks	(1, &tfID);
8493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_NO_ERROR);
8503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
8513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
8533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
8543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_range_elements_invalid_program, "Invalid glDrawRangeElements() usage",
8553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
8573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLfloat vertices[1];
8593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
8613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(-1, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
8623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
8633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
8643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not one of the accepted values.");
8663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 0, 1, 1, -1, vertices);
8673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
8683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_FLOAT, vertices);
8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
8713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 0, 1, -1, GL_UNSIGNED_BYTE, vertices);
8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if end < start.");
8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 1, 0, 1, GL_UNSIGNED_BYTE, vertices);
8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
8803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
8813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
8843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
8873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
8883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
8903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
8923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ES3F_ADD_API_CASE(draw_range_elements_incomplete_primitive, "Invalid glDrawRangeElements() usage",
8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
8953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(program.getProgram());
8963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint fbo;
8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint buf;
8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint tfID;
8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLfloat vertices[1];
9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
9023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(-1, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
9033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
9043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not one of the accepted values.");
9073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, -1, vertices);
9083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
9093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, GL_FLOAT, vertices);
9103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_ENUM);
9113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
9123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
9143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_TRIANGLES, 0, 1, -1, GL_UNSIGNED_BYTE, vertices);
9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if end < start.");
9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_TRIANGLES, 1, 0, 1, GL_UNSIGNED_BYTE, vertices);
9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_VALUE);
9213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
9243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenFramebuffers(1, &fbo);
9253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
9263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCheckFramebufferStatus(GL_FRAMEBUFFER);
9273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
9283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
9293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindFramebuffer(GL_FRAMEBUFFER, 0);
9303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteFramebuffers(1, &fbo);
9313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
9323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
9343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const char* tfVarying		= "gl_Position";
9353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenBuffers				(1, &buf);
9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenTransformFeedbacks		(1, &tfID);
9383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram				(program.getProgram());
9403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glTransformFeedbackVaryings	(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
9413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glLinkProgram				(program.getProgram());
9423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindTransformFeedback		(GL_TRANSFORM_FEEDBACK, tfID);
9433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindBuffer				(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
9443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBufferData				(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
9453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindBufferBase			(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
9463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBeginTransformFeedback	(GL_TRIANGLES);
9473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_NO_ERROR);
9483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements			(GL_TRIANGLES, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
9503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_INVALID_OPERATION);
9513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glPauseTransformFeedback();
9533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDrawRangeElements			(GL_TRIANGLES, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
9543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_NO_ERROR);
9553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glEndTransformFeedback		();
9573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteBuffers				(1, &buf);
9583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteTransformFeedbacks	(1, &tfID);
9593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError					(GL_NO_ERROR);
9603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::EndSection;
9613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(0);
9633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
9643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional
9673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles3
9683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
969