1 /*------------------------------------------------------------------------- 2 * drawElements Quality Program OpenGL ES 3.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 Fragment Pipe API tests. 22 *//*--------------------------------------------------------------------*/ 23 24 #include "es3fNegativeFragmentApiTests.hpp" 25 #include "es3fApiCase.hpp" 26 27 #include "glwDefs.hpp" 28 #include "glwEnums.hpp" 29 30 using namespace glw; // GL types 31 32 namespace deqp 33 { 34 namespace gles3 35 { 36 namespace Functional 37 { 38 39 using tcu::TestLog; 40 41 NegativeFragmentApiTests::NegativeFragmentApiTests (Context& context) 42 : TestCaseGroup(context, "fragment", "Negative Fragment API Cases") 43 { 44 } 45 46 NegativeFragmentApiTests::~NegativeFragmentApiTests (void) 47 { 48 } 49 50 void NegativeFragmentApiTests::init (void) 51 { 52 ES3F_ADD_API_CASE(scissor, "Invalid glScissor() usage", 53 { 54 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if either width or height is negative."); 55 glScissor(0, 0, -1, 0); 56 expectError(GL_INVALID_VALUE); 57 glScissor(0, 0, 0, -1); 58 expectError(GL_INVALID_VALUE); 59 glScissor(0, 0, -1, -1); 60 expectError(GL_INVALID_VALUE); 61 m_log << TestLog::EndSection; 62 }); 63 ES3F_ADD_API_CASE(depth_func, "Invalid glDepthFunc() usage", 64 { 65 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if func is not an accepted value."); 66 glDepthFunc(-1); 67 expectError(GL_INVALID_ENUM); 68 m_log << TestLog::EndSection; 69 }); 70 ES3F_ADD_API_CASE(viewport, "Invalid glViewport() usage", 71 { 72 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if either width or height is negative."); 73 glViewport(0, 0, -1, 1); 74 expectError(GL_INVALID_VALUE); 75 glViewport(0, 0, 1, -1); 76 expectError(GL_INVALID_VALUE); 77 glViewport(0, 0, -1, -1); 78 expectError(GL_INVALID_VALUE); 79 m_log << TestLog::EndSection; 80 }); 81 82 // Stencil functions 83 84 ES3F_ADD_API_CASE(stencil_func, "Invalid glStencilFunc() usage", 85 { 86 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if func is not one of the eight accepted values."); 87 glStencilFunc(-1, 0, 1); 88 expectError(GL_INVALID_ENUM); 89 m_log << TestLog::EndSection; 90 }); 91 ES3F_ADD_API_CASE(stencil_func_separate, "Invalid glStencilFuncSeparate() usage", 92 { 93 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if face is not GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK."); 94 glStencilFuncSeparate(-1, GL_NEVER, 0, 1); 95 expectError(GL_INVALID_ENUM); 96 m_log << TestLog::EndSection; 97 98 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if func is not one of the eight accepted values."); 99 glStencilFuncSeparate(GL_FRONT, -1, 0, 1); 100 expectError(GL_INVALID_ENUM); 101 m_log << TestLog::EndSection; 102 }); 103 ES3F_ADD_API_CASE(stencil_op, "Invalid glStencilOp() usage", 104 { 105 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if sfail, dpfail, or dppass is any value other than the defined symbolic constant values."); 106 glStencilOp(-1, GL_ZERO, GL_REPLACE); 107 expectError(GL_INVALID_ENUM); 108 glStencilOp(GL_KEEP, -1, GL_REPLACE); 109 expectError(GL_INVALID_ENUM); 110 glStencilOp(GL_KEEP, GL_ZERO, -1); 111 expectError(GL_INVALID_ENUM); 112 m_log << TestLog::EndSection; 113 }); 114 ES3F_ADD_API_CASE(stencil_op_separate, "Invalid glStencilOpSeparate() usage", 115 { 116 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if face is any value other than GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK."); 117 glStencilOpSeparate(-1, GL_KEEP, GL_ZERO, GL_REPLACE); 118 expectError(GL_INVALID_ENUM); 119 m_log << TestLog::EndSection; 120 121 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if sfail, dpfail, or dppass is any value other than the eight defined symbolic constant values."); 122 glStencilOpSeparate(GL_FRONT, -1, GL_ZERO, GL_REPLACE); 123 expectError(GL_INVALID_ENUM); 124 glStencilOpSeparate(GL_FRONT, GL_KEEP, -1, GL_REPLACE); 125 expectError(GL_INVALID_ENUM); 126 glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_ZERO, -1); 127 expectError(GL_INVALID_ENUM); 128 m_log << TestLog::EndSection; 129 }); 130 ES3F_ADD_API_CASE(stencil_mask_separate, "Invalid glStencilMaskSeparate() usage", 131 { 132 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if face is not GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK."); 133 glStencilMaskSeparate(-1, 0); 134 expectError(GL_INVALID_ENUM); 135 m_log << TestLog::EndSection; 136 }); 137 138 // Blend functions 139 140 ES3F_ADD_API_CASE(blend_equation, "Invalid glBlendEquation() usage", 141 { 142 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MAX or GL_MIN."); 143 glBlendEquation(-1); 144 expectError(GL_INVALID_ENUM); 145 m_log << TestLog::EndSection; 146 }); 147 ES3F_ADD_API_CASE(blend_equation_separate, "Invalid glBlendEquationSeparate() usage", 148 { 149 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if modeRGB is not GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MAX or GL_MIN."); 150 glBlendEquationSeparate(-1, GL_FUNC_ADD); 151 expectError(GL_INVALID_ENUM); 152 m_log << TestLog::EndSection; 153 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if modeAlpha is not GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MAX or GL_MIN."); 154 glBlendEquationSeparate(GL_FUNC_ADD, -1); 155 expectError(GL_INVALID_ENUM); 156 m_log << TestLog::EndSection; 157 }); 158 ES3F_ADD_API_CASE(blend_func, "Invalid glBlendFunc() usage", 159 { 160 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if either sfactor or dfactor is not an accepted value."); 161 glBlendFunc(-1, GL_ONE); 162 expectError(GL_INVALID_ENUM); 163 glBlendFunc(GL_ONE, -1); 164 expectError(GL_INVALID_ENUM); 165 m_log << TestLog::EndSection; 166 }); 167 ES3F_ADD_API_CASE(blend_func_separate, "Invalid glBlendFuncSeparate() usage", 168 { 169 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if srcRGB, dstRGB, srcAlpha, or dstAlpha is not an accepted value."); 170 glBlendFuncSeparate(-1, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR); 171 expectError(GL_INVALID_ENUM); 172 glBlendFuncSeparate(GL_ZERO, -1, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR); 173 expectError(GL_INVALID_ENUM); 174 glBlendFuncSeparate(GL_ZERO, GL_ONE, -1, GL_ONE_MINUS_SRC_COLOR); 175 expectError(GL_INVALID_ENUM); 176 glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_SRC_COLOR, -1); 177 expectError(GL_INVALID_ENUM); 178 m_log << TestLog::EndSection; 179 }); 180 181 // Rasterization API functions 182 183 ES3F_ADD_API_CASE(cull_face, "Invalid glCullFace() usage", 184 { 185 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value."); 186 glCullFace(-1); 187 expectError(GL_INVALID_ENUM); 188 m_log << TestLog::EndSection; 189 }); 190 ES3F_ADD_API_CASE(front_face, "Invalid glFrontFace() usage", 191 { 192 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value."); 193 glFrontFace(-1); 194 expectError(GL_INVALID_ENUM); 195 m_log << TestLog::EndSection; 196 }); 197 ES3F_ADD_API_CASE(line_width, "Invalid glLineWidth() usage", 198 { 199 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width is less than or equal to 0."); 200 glLineWidth(0); 201 expectError(GL_INVALID_VALUE); 202 glLineWidth(-1); 203 expectError(GL_INVALID_VALUE); 204 m_log << TestLog::EndSection; 205 }); 206 207 // Asynchronous queries 208 209 ES3F_ADD_API_CASE(gen_queries, "Invalid glGenQueries() usage", 210 { 211 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative."); 212 GLuint ids; 213 glGenQueries (-1, &ids); 214 expectError (GL_INVALID_VALUE); 215 m_log << TestLog::EndSection; 216 }); 217 ES3F_ADD_API_CASE(begin_query, "Invalid glBeginQuery() usage", 218 { 219 GLuint ids[3]; 220 glGenQueries (3, ids); 221 222 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not one of the accepted tokens."); 223 glBeginQuery (-1, ids[0]); 224 expectError (GL_INVALID_ENUM); 225 m_log << TestLog::EndSection; 226 227 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if glBeginQuery is executed while a query object of the same target is already active."); 228 glBeginQuery (GL_ANY_SAMPLES_PASSED, ids[0]); 229 expectError (GL_NO_ERROR); 230 glBeginQuery (GL_ANY_SAMPLES_PASSED, ids[1]); 231 expectError (GL_INVALID_OPERATION); 232 // \note GL_ANY_SAMPLES_PASSED and GL_ANY_SAMPLES_PASSED_CONSERVATIVE alias to the same target for the purposes of this error. 233 glBeginQuery (GL_ANY_SAMPLES_PASSED_CONSERVATIVE, ids[1]); 234 expectError (GL_INVALID_OPERATION); 235 glBeginQuery (GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[1]); 236 expectError (GL_NO_ERROR); 237 glBeginQuery (GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[2]); 238 expectError (GL_INVALID_OPERATION); 239 glEndQuery (GL_ANY_SAMPLES_PASSED); 240 glEndQuery (GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN); 241 expectError (GL_NO_ERROR); 242 m_log << TestLog::EndSection; 243 244 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if id is 0."); 245 glBeginQuery (GL_ANY_SAMPLES_PASSED, 0); 246 expectError (GL_INVALID_OPERATION); 247 m_log << TestLog::EndSection; 248 249 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if id not a name returned from a previous call to glGenQueries, or if such a name has since been deleted with glDeleteQueries."); 250 glBeginQuery (GL_ANY_SAMPLES_PASSED, -1); 251 expectError (GL_INVALID_OPERATION); 252 glDeleteQueries (1, &ids[2]); 253 expectError (GL_NO_ERROR); 254 glBeginQuery (GL_ANY_SAMPLES_PASSED, ids[2]); 255 expectError (GL_INVALID_OPERATION); 256 m_log << TestLog::EndSection; 257 258 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if id is the name of an already active query object."); 259 glBeginQuery (GL_ANY_SAMPLES_PASSED, ids[0]); 260 expectError (GL_NO_ERROR); 261 glBeginQuery (GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[0]); 262 expectError (GL_INVALID_OPERATION); 263 m_log << TestLog::EndSection; 264 265 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if id refers to an existing query object whose type does not does not match target."); 266 glEndQuery (GL_ANY_SAMPLES_PASSED); 267 expectError (GL_NO_ERROR); 268 glBeginQuery (GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[0]); 269 expectError (GL_INVALID_OPERATION); 270 m_log << TestLog::EndSection; 271 272 glDeleteQueries (2, &ids[0]); 273 expectError (GL_NO_ERROR); 274 }); 275 ES3F_ADD_API_CASE(end_query, "Invalid glEndQuery() usage", 276 { 277 GLuint id; 278 glGenQueries (1, &id); 279 280 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not one of the accepted tokens."); 281 glEndQuery (-1); 282 expectError (GL_INVALID_ENUM); 283 m_log << TestLog::EndSection; 284 285 m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if glEndQuery is executed when a query object of the same target is not active."); 286 glEndQuery (GL_ANY_SAMPLES_PASSED); 287 expectError (GL_INVALID_OPERATION); 288 glBeginQuery (GL_ANY_SAMPLES_PASSED, id); 289 expectError (GL_NO_ERROR); 290 glEndQuery (GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN); 291 expectError (GL_INVALID_OPERATION); 292 glEndQuery (GL_ANY_SAMPLES_PASSED); 293 expectError (GL_NO_ERROR); 294 m_log << TestLog::EndSection; 295 296 glDeleteQueries (1, &id); 297 expectError (GL_NO_ERROR); 298 }); 299 ES3F_ADD_API_CASE(delete_queries, "Invalid glDeleteQueries() usage", 300 { 301 GLuint id; 302 glGenQueries (1, &id); 303 304 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative."); 305 glDeleteQueries (-1, &id); 306 expectError (GL_INVALID_VALUE); 307 m_log << TestLog::EndSection; 308 309 glDeleteQueries (1, &id); 310 }); 311 312 // Sync objects 313 314 ES3F_ADD_API_CASE(fence_sync, "Invalid glFenceSync() usage", 315 { 316 m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if condition is not GL_SYNC_GPU_COMMANDS_COMPLETE."); 317 glFenceSync(-1, 0); 318 expectError(GL_INVALID_ENUM); 319 m_log << TestLog::EndSection; 320 321 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if flags is not zero."); 322 glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0x0010); 323 expectError(GL_INVALID_VALUE); 324 m_log << TestLog::EndSection; 325 }); 326 ES3F_ADD_API_CASE(wait_sync, "Invalid glWaitSync() usage", 327 { 328 GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); 329 330 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if sync is not the name of a sync object."); 331 glWaitSync(0, 0, GL_TIMEOUT_IGNORED); 332 expectError(GL_INVALID_VALUE); 333 m_log << TestLog::EndSection; 334 335 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if flags is not zero."); 336 glWaitSync(sync, 0x0010, GL_TIMEOUT_IGNORED); 337 expectError(GL_INVALID_VALUE); 338 m_log << TestLog::EndSection; 339 340 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if timeout is not GL_TIMEOUT_IGNORED."); 341 glWaitSync(sync, 0, 0); 342 expectError(GL_INVALID_VALUE); 343 m_log << TestLog::EndSection; 344 345 glDeleteSync(sync); 346 }); 347 ES3F_ADD_API_CASE(client_wait_sync, "Invalid glClientWaitSync() usage", 348 { 349 GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); 350 351 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if sync is not the name of an existing sync object."); 352 glClientWaitSync (0, 0, 10000); 353 expectError(GL_INVALID_VALUE); 354 m_log << TestLog::EndSection; 355 356 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if flags contains any unsupported flag."); 357 glClientWaitSync(sync, 0x00000004, 10000); 358 expectError(GL_INVALID_VALUE); 359 m_log << TestLog::EndSection; 360 361 glDeleteSync(sync); 362 }); 363 ES3F_ADD_API_CASE(delete_sync, "Invalid glDeleteSync() usage", 364 { 365 m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if sync is neither zero or the name of a sync object."); 366 glDeleteSync((GLsync)1); 367 expectError(GL_INVALID_VALUE); 368 glDeleteSync(0); 369 expectError(GL_NO_ERROR); 370 m_log << TestLog::EndSection; 371 }); 372 } 373 374 375 } // Functional 376 } // gles3 377 } // deqp 378