1/*------------------------------------------------------------------------- 2 * drawElements Quality Program OpenGL ES 2.0 Module 3 * ------------------------------------------------- 4 * 5 * Copyright 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief Negative Vertex Array API tests. 22 *//*--------------------------------------------------------------------*/ 23 24#include "es2fNegativeVertexArrayApiTests.hpp" 25#include "es2fApiCase.hpp" 26#include "gluShaderProgram.hpp" 27#include "gluContextInfo.hpp" 28#include "deString.h" 29 30#include "glwEnums.hpp" 31#include "glwDefs.hpp" 32 33using namespace glw; // GL types 34 35namespace deqp 36{ 37namespace gles2 38{ 39namespace Functional 40{ 41 42static const char* vertexShaderSource = "void main (void) { gl_Position = vec4(0.0); }\n\0"; 43static const char* fragmentShaderSource = "void main (void) { gl_FragColor = vec4(0.0); }\n\0"; 44 45using tcu::TestLog; 46 47NegativeVertexArrayApiTests::NegativeVertexArrayApiTests (Context& context) 48 : TestCaseGroup(context, "vertex_array", "Negative Vertex Array API Cases") 49{ 50} 51 52NegativeVertexArrayApiTests::~NegativeVertexArrayApiTests (void) 53{ 54} 55 56void NegativeVertexArrayApiTests::init (void) 57{ 58 ES2F_ADD_API_CASE(vertex_attrib, "Invalid glVertexAttrib() usage", 59 { 60 m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS."); 61 int maxVertexAttribs = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS); 62 glVertexAttrib1f(maxVertexAttribs, 0.0f); 63 expectError(GL_INVALID_VALUE); 64 glVertexAttrib2f(maxVertexAttribs, 0.0f, 0.0f); 65 expectError(GL_INVALID_VALUE); 66 glVertexAttrib3f(maxVertexAttribs, 0.0f, 0.0f, 0.0f); 67 expectError(GL_INVALID_VALUE); 68 glVertexAttrib4f(maxVertexAttribs, 0.0f, 0.0f, 0.0f, 0.0f); 69 expectError(GL_INVALID_VALUE); 70 m_log << tcu::TestLog::EndSection; 71 }); 72 ES2F_ADD_API_CASE(vertex_attribv, "Invalid glVertexAttribv() usage", 73 { 74 m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS."); 75 int maxVertexAttribs = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS); 76 float v[4] = {0.0f}; 77 glVertexAttrib1fv(maxVertexAttribs, &v[0]); 78 expectError(GL_INVALID_VALUE); 79 glVertexAttrib2fv(maxVertexAttribs, &v[0]); 80 expectError(GL_INVALID_VALUE); 81 glVertexAttrib3fv(maxVertexAttribs, &v[0]); 82 expectError(GL_INVALID_VALUE); 83 glVertexAttrib4fv(maxVertexAttribs, &v[0]); 84 expectError(GL_INVALID_VALUE); 85 m_log << tcu::TestLog::EndSection; 86 }); 87 ES2F_ADD_API_CASE(vertex_attrib_pointer, "Invalid glVertexAttribPointer() usage", 88 { 89 m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not an accepted value."); 90 glVertexAttribPointer(0, 1, 0, GL_TRUE, 0, 0); 91 expectError(GL_INVALID_ENUM); 92 m_log << tcu::TestLog::EndSection; 93 94 m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS."); 95 int maxVertexAttribs = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS); 96 glVertexAttribPointer(maxVertexAttribs, 1, GL_BYTE, GL_TRUE, 0, 0); 97 expectError(GL_INVALID_VALUE); 98 m_log << tcu::TestLog::EndSection; 99 100 m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if size is not 1, 2, 3, or 4."); 101 glVertexAttribPointer(0, 0, GL_BYTE, GL_TRUE, 0, 0); 102 expectError(GL_INVALID_VALUE); 103 m_log << tcu::TestLog::EndSection; 104 105 m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if stride is negative."); 106 glVertexAttribPointer(0, 1, GL_BYTE, GL_TRUE, -1, 0); 107 expectError(GL_INVALID_VALUE); 108 m_log << tcu::TestLog::EndSection; 109 }); 110 ES2F_ADD_API_CASE(enable_vertex_attrib_array, "Invalid glEnableVertexAttribArray() usage", 111 { 112 m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS."); 113 int maxVertexAttribs = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS); 114 glEnableVertexAttribArray(maxVertexAttribs); 115 expectError(GL_INVALID_VALUE); 116 m_log << tcu::TestLog::EndSection; 117 }); 118 ES2F_ADD_API_CASE(disable_vertex_attrib_array, "Invalid glDisableVertexAttribArray() usage", 119 { 120 m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS."); 121 int maxVertexAttribs = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS); 122 glDisableVertexAttribArray(maxVertexAttribs); 123 expectError(GL_INVALID_VALUE); 124 m_log << tcu::TestLog::EndSection; 125 }); 126 ES2F_ADD_API_CASE(draw_arrays, "Invalid glDrawArrays() usage", 127 { 128 glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource)); 129 glUseProgram(program.getProgram()); 130 131 m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value."); 132 glDrawArrays(-1, 0, 1); 133 expectError(GL_INVALID_ENUM); 134 m_log << tcu::TestLog::EndSection; 135 136 m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative."); 137 glDrawArrays(GL_POINTS, 0, -1); 138 expectError(GL_INVALID_VALUE); 139 m_log << tcu::TestLog::EndSection; 140 141 m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete."); 142 GLuint fbo; 143 glGenFramebuffers(1, &fbo); 144 glBindFramebuffer(GL_FRAMEBUFFER, fbo); 145 glCheckFramebufferStatus(GL_FRAMEBUFFER); 146 glDrawArrays(GL_POINTS, 0, 1); 147 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 148 glBindFramebuffer(GL_FRAMEBUFFER, 0); 149 glDeleteFramebuffers(1, &fbo); 150 m_log << tcu::TestLog::EndSection; 151 152 glUseProgram(0); 153 }); 154 ES2F_ADD_API_CASE(draw_arrays_invalid_program, "Invalid glDrawArrays() usage", 155 { 156 glUseProgram(0); 157 158 m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value."); 159 glDrawArrays(-1, 0, 1); 160 expectError(GL_INVALID_ENUM); 161 m_log << tcu::TestLog::EndSection; 162 163 m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative."); 164 glDrawArrays(GL_POINTS, 0, -1); 165 expectError(GL_INVALID_VALUE); 166 m_log << tcu::TestLog::EndSection; 167 168 m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete."); 169 GLuint fbo; 170 glGenFramebuffers(1, &fbo); 171 glBindFramebuffer(GL_FRAMEBUFFER, fbo); 172 glCheckFramebufferStatus(GL_FRAMEBUFFER); 173 glDrawArrays(GL_POINTS, 0, 1); 174 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 175 glBindFramebuffer(GL_FRAMEBUFFER, 0); 176 glDeleteFramebuffers(1, &fbo); 177 m_log << tcu::TestLog::EndSection; 178 }); 179 ES2F_ADD_API_CASE(draw_arrays_incomplete_primitive, "Invalid glDrawArrays() usage", 180 { 181 glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource)); 182 glUseProgram(program.getProgram()); 183 184 m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value."); 185 glDrawArrays(-1, 0, 1); 186 expectError(GL_INVALID_ENUM); 187 m_log << tcu::TestLog::EndSection; 188 189 m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative."); 190 glDrawArrays(GL_TRIANGLES, 0, -1); 191 expectError(GL_INVALID_VALUE); 192 m_log << tcu::TestLog::EndSection; 193 194 m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete."); 195 GLuint fbo; 196 glGenFramebuffers(1, &fbo); 197 glBindFramebuffer(GL_FRAMEBUFFER, fbo); 198 glCheckFramebufferStatus(GL_FRAMEBUFFER); 199 glDrawArrays(GL_TRIANGLES, 0, 1); 200 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 201 glBindFramebuffer(GL_FRAMEBUFFER, 0); 202 glDeleteFramebuffers(1, &fbo); 203 m_log << tcu::TestLog::EndSection; 204 205 glUseProgram(0); 206 }); 207 ES2F_ADD_API_CASE(draw_elements, "Invalid glDrawElements() usage", 208 { 209 glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource)); 210 glUseProgram(program.getProgram()); 211 GLfloat vertices[1] = { 0.0f }; 212 213 m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value."); 214 glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices); 215 expectError(GL_INVALID_ENUM); 216 m_log << tcu::TestLog::EndSection; 217 218 m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not GL_UNSIGNED_BYTE or GL_UNSIGNED_SHORT."); 219 glDrawElements(GL_POINTS, 1, -1, vertices); 220 expectError(GL_INVALID_ENUM); 221 m_log << tcu::TestLog::EndSection; 222 223 m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative."); 224 glDrawElements(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices); 225 expectError(GL_INVALID_VALUE); 226 m_log << tcu::TestLog::EndSection; 227 228 m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete."); 229 GLuint fbo; 230 glGenFramebuffers(1, &fbo); 231 glBindFramebuffer(GL_FRAMEBUFFER, fbo); 232 glCheckFramebufferStatus(GL_FRAMEBUFFER); 233 glDrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices); 234 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 235 glBindFramebuffer(GL_FRAMEBUFFER, 0); 236 glDeleteFramebuffers(1, &fbo); 237 m_log << tcu::TestLog::EndSection; 238 239 glUseProgram(0); 240 }); 241 ES2F_ADD_API_CASE(draw_elements_invalid_program, "Invalid glDrawElements() usage", 242 { 243 glUseProgram(0); 244 GLfloat vertices[1] = { 0.0f }; 245 246 m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value."); 247 glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices); 248 expectError(GL_INVALID_ENUM); 249 m_log << tcu::TestLog::EndSection; 250 251 m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not GL_UNSIGNED_BYTE or GL_UNSIGNED_SHORT."); 252 glDrawElements(GL_POINTS, 1, -1, vertices); 253 expectError(GL_INVALID_ENUM); 254 m_log << tcu::TestLog::EndSection; 255 256 m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative."); 257 glDrawElements(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices); 258 expectError(GL_INVALID_VALUE); 259 m_log << tcu::TestLog::EndSection; 260 261 m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete."); 262 GLuint fbo; 263 glGenFramebuffers(1, &fbo); 264 glBindFramebuffer(GL_FRAMEBUFFER, fbo); 265 glCheckFramebufferStatus(GL_FRAMEBUFFER); 266 glDrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices); 267 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 268 glBindFramebuffer(GL_FRAMEBUFFER, 0); 269 glDeleteFramebuffers(1, &fbo); 270 m_log << tcu::TestLog::EndSection; 271 }); 272 ES2F_ADD_API_CASE(draw_elements_incomplete_primitive, "Invalid glDrawElements() usage", 273 { 274 glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource)); 275 glUseProgram(program.getProgram()); 276 GLfloat vertices[1] = { 0.0f }; 277 278 m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value."); 279 glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices); 280 expectError(GL_INVALID_ENUM); 281 m_log << tcu::TestLog::EndSection; 282 283 m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not GL_UNSIGNED_BYTE or GL_UNSIGNED_SHORT."); 284 glDrawElements(GL_TRIANGLES, 1, -1, vertices); 285 expectError(GL_INVALID_ENUM); 286 m_log << tcu::TestLog::EndSection; 287 288 m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative."); 289 glDrawElements(GL_TRIANGLES, -1, GL_UNSIGNED_BYTE, vertices); 290 expectError(GL_INVALID_VALUE); 291 m_log << tcu::TestLog::EndSection; 292 293 m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete."); 294 GLuint fbo; 295 glGenFramebuffers(1, &fbo); 296 glBindFramebuffer(GL_FRAMEBUFFER, fbo); 297 glCheckFramebufferStatus(GL_FRAMEBUFFER); 298 glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices); 299 expectError(GL_INVALID_FRAMEBUFFER_OPERATION); 300 glBindFramebuffer(GL_FRAMEBUFFER, 0); 301 glDeleteFramebuffers(1, &fbo); 302 m_log << tcu::TestLog::EndSection; 303 304 glUseProgram(0); 305 }); 306} 307 308} // Functional 309} // gles2 310} // deqp 311