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