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 Redundant state change performance tests. 22 *//*--------------------------------------------------------------------*/ 23 24 #include "es2pRedundantStateChangeTests.hpp" 25 #include "glsStateChangePerfTestCases.hpp" 26 #include "gluShaderProgram.hpp" 27 #include "glwFunctions.hpp" 28 #include "glwEnums.hpp" 29 30 namespace deqp 31 { 32 namespace gles2 33 { 34 namespace Performance 35 { 36 37 using namespace glw; // GL types 38 39 namespace 40 { 41 42 enum 43 { 44 VIEWPORT_WIDTH = 24, 45 VIEWPORT_HEIGHT = 24 46 }; 47 48 class RedundantStateChangeCase : public gls::StateChangePerformanceCase 49 { 50 public: 51 RedundantStateChangeCase (Context& context, int drawCallCount, int triangleCount, bool drawArrays, bool useIndexBuffer, const char* name, const char* description); 52 ~RedundantStateChangeCase (void); 53 54 protected: 55 virtual void renderTest (const glw::Functions& gl); 56 virtual void renderReference (const glw::Functions& gl); 57 virtual void changeState (const glw::Functions& gl) = 0; 58 }; 59 60 RedundantStateChangeCase::RedundantStateChangeCase (Context& context, int drawCallCount, int triangleCount, bool drawArrays, bool useIndexBuffer, const char* name, const char* description) 61 : gls::StateChangePerformanceCase(context.getTestContext(), context.getRenderContext(), name, description, 62 (useIndexBuffer ? DRAWTYPE_INDEXED_BUFFER : 63 drawArrays ? DRAWTYPE_NOT_INDEXED : 64 DRAWTYPE_INDEXED_USER_PTR), drawCallCount, triangleCount) 65 { 66 DE_ASSERT(!useIndexBuffer || !drawArrays); 67 } 68 69 RedundantStateChangeCase::~RedundantStateChangeCase (void) 70 { 71 } 72 73 void RedundantStateChangeCase::renderTest (const glw::Functions& gl) 74 { 75 for (int callNdx = 0; callNdx < m_callCount; callNdx++) 76 { 77 changeState(gl); 78 callDraw(gl); 79 } 80 } 81 82 void RedundantStateChangeCase::renderReference (const glw::Functions& gl) 83 { 84 changeState(gl); 85 86 for (int callNdx = 0; callNdx < m_callCount; callNdx++) 87 callDraw(gl); 88 } 89 90 } // anonymous 91 92 RedundantStateChangeTests::RedundantStateChangeTests (Context& context) 93 : TestCaseGroup(context, "redundant_state_change_draw", "Test performance with redundant sate changes between rendering.") 94 { 95 } 96 97 RedundantStateChangeTests::~RedundantStateChangeTests (void) 98 { 99 } 100 101 #define MACRO_BLOCK(...) __VA_ARGS__ 102 103 #define ADD_TESTCASE(NAME, DESC, DRAWARRAYS, INDEXBUFFER, INIT_FUNC, CHANGE_FUNC)\ 104 do {\ 105 class RedundantStateChangeCase_ ## NAME : public RedundantStateChangeCase\ 106 {\ 107 public:\ 108 RedundantStateChangeCase_ ## NAME (Context& context, int drawCallCount, int triangleCount, const char* name, const char* description)\ 109 : RedundantStateChangeCase(context, drawCallCount, triangleCount, (DRAWARRAYS), (INDEXBUFFER), name, description)\ 110 {}\ 111 virtual void setupInitialState (const glw::Functions& gl)\ 112 {\ 113 INIT_FUNC\ 114 }\ 115 virtual void changeState (const glw::Functions& gl)\ 116 {\ 117 CHANGE_FUNC\ 118 }\ 119 };\ 120 manySmallCallsGroup->addChild (new RedundantStateChangeCase_ ## NAME (m_context,1000,2,#NAME,(DESC)));\ 121 fewBigCallsGroup->addChild (new RedundantStateChangeCase_ ## NAME (m_context,10,200,#NAME,(DESC)));\ 122 } while (0); 123 124 void RedundantStateChangeTests::init (void) 125 { 126 tcu::TestCaseGroup* const manySmallCallsGroup = new tcu::TestCaseGroup(m_testCtx, "many_small_calls", "1000 calls, 2 triangles in each"); 127 tcu::TestCaseGroup* const fewBigCallsGroup = new tcu::TestCaseGroup(m_testCtx, "few_big_calls", "10 calls, 200 triangles in each"); 128 129 addChild(manySmallCallsGroup); 130 addChild(fewBigCallsGroup); 131 132 ADD_TESTCASE(blend, "Enable/Disable blending.", 133 true, 134 false, 135 MACRO_BLOCK({ 136 requireCoordBuffers(1); 137 requireTextures(1); 138 requirePrograms(1); 139 140 gl.useProgram(m_programs[0]->getProgram()); 141 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 142 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 143 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 144 145 gl.enableVertexAttribArray(coordLoc); 146 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 147 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 148 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 149 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 150 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 151 152 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 153 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 154 155 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 156 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 157 158 gl.uniform1i(samplerLoc, 0); 159 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 160 161 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 162 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 163 }), 164 MACRO_BLOCK({ 165 gl.enable(GL_BLEND); 166 }) 167 ) 168 169 ADD_TESTCASE(depth_test, "Enable/Disable depth test.", 170 true, 171 false, 172 MACRO_BLOCK({ 173 requireCoordBuffers(1); 174 requireTextures(1); 175 requirePrograms(1); 176 177 gl.useProgram(m_programs[0]->getProgram()); 178 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 179 180 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 181 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 182 183 gl.enableVertexAttribArray(coordLoc); 184 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 185 186 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 187 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 188 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 189 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 190 191 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 192 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 193 194 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 195 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 196 197 gl.uniform1i(samplerLoc, 0); 198 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 199 200 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 201 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 202 203 gl.depthFunc(GL_LEQUAL); 204 GLU_EXPECT_NO_ERROR(gl.getError(), "glDepthFunc()"); 205 }), 206 MACRO_BLOCK({ 207 gl.enable(GL_DEPTH_TEST); 208 }) 209 ) 210 211 ADD_TESTCASE(stencil_test, "Enable/Disable stencil test.", 212 true, 213 false, 214 MACRO_BLOCK({ 215 requireCoordBuffers(1); 216 requireTextures(1); 217 requirePrograms(1); 218 219 gl.useProgram(m_programs[0]->getProgram()); 220 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 221 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 222 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 223 224 gl.enableVertexAttribArray(coordLoc); 225 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 226 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 227 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 228 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 229 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 230 231 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 232 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 233 234 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 235 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 236 237 gl.uniform1i(samplerLoc, 0); 238 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 239 240 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 241 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 242 243 gl.stencilFunc(GL_LEQUAL, 0, 0); 244 GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilFunc()"); 245 246 gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE); 247 GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilOp()"); 248 249 gl.clearStencil(0); 250 GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()"); 251 gl.clear(GL_STENCIL_BUFFER_BIT); 252 253 GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()"); 254 }), 255 MACRO_BLOCK({ 256 gl.enable(GL_STENCIL_TEST); 257 }) 258 ) 259 260 ADD_TESTCASE(scissor_test, "Enable/Disable scissor test.", 261 true, 262 false, 263 MACRO_BLOCK({ 264 requireCoordBuffers(1); 265 requireTextures(1); 266 requirePrograms(1); 267 268 gl.useProgram(m_programs[0]->getProgram()); 269 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 270 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 271 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 272 273 gl.enableVertexAttribArray(coordLoc); 274 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 275 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 276 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 277 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 278 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 279 280 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 281 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 282 283 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 284 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 285 286 gl.uniform1i(samplerLoc, 0); 287 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 288 289 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 290 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 291 292 gl.scissor(2, 3, 12, 13); 293 GLU_EXPECT_NO_ERROR(gl.getError(), "glScissor()"); 294 }), 295 MACRO_BLOCK({ 296 gl.enable(GL_SCISSOR_TEST); 297 }) 298 ) 299 300 ADD_TESTCASE(dither, "Enable/Disable dithering.", 301 true, 302 false, 303 MACRO_BLOCK({ 304 requireCoordBuffers(1); 305 requireTextures(1); 306 requirePrograms(1); 307 308 gl.useProgram(m_programs[0]->getProgram()); 309 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 310 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 311 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 312 313 gl.enableVertexAttribArray(coordLoc); 314 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 315 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 316 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 317 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 318 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 319 320 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 321 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 322 323 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 324 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 325 326 gl.uniform1i(samplerLoc, 0); 327 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 328 329 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 330 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 331 }), 332 MACRO_BLOCK({ 333 gl.enable(GL_DITHER); 334 }) 335 ) 336 337 ADD_TESTCASE(culling, "Enable/Disable culling.", 338 true, 339 false, 340 MACRO_BLOCK({ 341 requireCoordBuffers(1); 342 requireTextures(1); 343 requirePrograms(1); 344 345 gl.useProgram(m_programs[0]->getProgram()); 346 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 347 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 348 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 349 350 gl.enableVertexAttribArray(coordLoc); 351 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 352 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 353 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 354 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 355 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 356 357 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 358 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 359 360 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 361 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 362 363 gl.uniform1i(samplerLoc, 0); 364 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 365 366 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 367 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 368 369 gl.frontFace(GL_CW); 370 GLU_EXPECT_NO_ERROR(gl.getError(), "glFrontFace()"); 371 372 gl.cullFace(GL_FRONT); 373 GLU_EXPECT_NO_ERROR(gl.getError(), "glCullFace()"); 374 }), 375 MACRO_BLOCK({ 376 gl.enable(GL_CULL_FACE); 377 }) 378 ) 379 380 ADD_TESTCASE(depth_func, "Change depth func.", 381 true, 382 false, 383 MACRO_BLOCK({ 384 requireCoordBuffers(1); 385 requireTextures(1); 386 requirePrograms(1); 387 388 gl.useProgram(m_programs[0]->getProgram()); 389 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 390 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 391 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 392 393 gl.enableVertexAttribArray(coordLoc); 394 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 395 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 396 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 397 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 398 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 399 400 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 401 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 402 403 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 404 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 405 406 gl.uniform1i(samplerLoc, 0); 407 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 408 409 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 410 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 411 412 gl.enable(GL_DEPTH_TEST); 413 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 414 }), 415 MACRO_BLOCK({ 416 gl.depthFunc(GL_GEQUAL); 417 }) 418 ) 419 420 421 ADD_TESTCASE(depth_mask, "Toggle depth mask.", 422 true, 423 false, 424 MACRO_BLOCK({ 425 requireCoordBuffers(1); 426 requireTextures(1); 427 requirePrograms(1); 428 429 gl.useProgram(m_programs[0]->getProgram()); 430 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 431 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 432 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 433 434 gl.enableVertexAttribArray(coordLoc); 435 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 436 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 437 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 438 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 439 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 440 441 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 442 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 443 444 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 445 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 446 447 gl.uniform1i(samplerLoc, 0); 448 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 449 450 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 451 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 452 453 gl.enable(GL_DEPTH_TEST); 454 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 455 456 gl.depthFunc(GL_LEQUAL); 457 GLU_EXPECT_NO_ERROR(gl.getError(), "glDepthFunc()"); 458 }), 459 MACRO_BLOCK({ 460 gl.depthMask(GL_FALSE); 461 }) 462 ) 463 464 ADD_TESTCASE(depth_rangef, "Change depth range.", 465 true, 466 false, 467 MACRO_BLOCK({ 468 requireCoordBuffers(1); 469 requireTextures(1); 470 requirePrograms(1); 471 472 gl.useProgram(m_programs[0]->getProgram()); 473 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 474 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 475 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 476 477 gl.enableVertexAttribArray(coordLoc); 478 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 479 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 480 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 481 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 482 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 483 484 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 485 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 486 487 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 488 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 489 490 gl.uniform1i(samplerLoc, 0); 491 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 492 493 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 494 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 495 }), 496 MACRO_BLOCK({ 497 gl.depthRangef(0.0f, 1.0f); 498 }) 499 ) 500 501 ADD_TESTCASE(blend_equation, "Change blend equation.", 502 true, 503 false, 504 MACRO_BLOCK({ 505 requireCoordBuffers(1); 506 requireTextures(1); 507 requirePrograms(1); 508 509 gl.useProgram(m_programs[0]->getProgram()); 510 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 511 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 512 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 513 514 gl.enableVertexAttribArray(coordLoc); 515 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 516 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 517 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 518 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 519 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 520 521 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 522 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 523 524 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 525 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 526 527 gl.uniform1i(samplerLoc, 0); 528 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 529 530 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 531 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 532 533 gl.enable(GL_BLEND); 534 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 535 }), 536 MACRO_BLOCK({ 537 gl.blendEquation(GL_FUNC_SUBTRACT); 538 }) 539 ) 540 541 ADD_TESTCASE(blend_func, "Change blend function.", 542 true, 543 false, 544 MACRO_BLOCK({ 545 requireCoordBuffers(1); 546 requireTextures(1); 547 requirePrograms(1); 548 549 gl.useProgram(m_programs[0]->getProgram()); 550 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 551 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 552 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 553 554 gl.enableVertexAttribArray(coordLoc); 555 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 556 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 557 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 558 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 559 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 560 561 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 562 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 563 564 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 565 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 566 567 gl.uniform1i(samplerLoc, 0); 568 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 569 570 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 571 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 572 573 gl.enable(GL_BLEND); 574 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 575 }), 576 MACRO_BLOCK({ 577 gl.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 578 }) 579 ) 580 581 ADD_TESTCASE(polygon_offset, "Change polygon offset.", 582 true, 583 false, 584 MACRO_BLOCK({ 585 requireCoordBuffers(1); 586 requireTextures(1); 587 requirePrograms(1); 588 589 gl.useProgram(m_programs[0]->getProgram()); 590 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 591 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 592 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 593 594 gl.enableVertexAttribArray(coordLoc); 595 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 596 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 597 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 598 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 599 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 600 601 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 602 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 603 604 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 605 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 606 607 gl.uniform1i(samplerLoc, 0); 608 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 609 610 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 611 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 612 613 gl.enable(GL_POLYGON_OFFSET_FILL); 614 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 615 }), 616 MACRO_BLOCK({ 617 gl.polygonOffset(0.0f, 0.0f); 618 }) 619 ) 620 621 ADD_TESTCASE(sample_coverage, "Sample coverage.", 622 true, 623 false, 624 MACRO_BLOCK({ 625 requireCoordBuffers(1); 626 requireTextures(1); 627 requirePrograms(1); 628 629 gl.useProgram(m_programs[0]->getProgram()); 630 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 631 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 632 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 633 634 gl.enableVertexAttribArray(coordLoc); 635 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 636 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 637 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 638 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 639 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 640 641 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 642 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 643 644 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 645 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 646 647 gl.uniform1i(samplerLoc, 0); 648 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 649 650 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 651 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 652 }), 653 MACRO_BLOCK({ 654 gl.sampleCoverage(0.25f, GL_TRUE); 655 }) 656 ) 657 658 ADD_TESTCASE(viewport, "Change viewport.", 659 true, 660 false, 661 MACRO_BLOCK({ 662 requireCoordBuffers(1); 663 requireTextures(1); 664 requirePrograms(1); 665 666 gl.useProgram(m_programs[0]->getProgram()); 667 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 668 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 669 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 670 671 gl.enableVertexAttribArray(coordLoc); 672 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 673 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 674 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 675 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 676 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 677 678 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 679 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 680 681 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 682 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 683 684 gl.uniform1i(samplerLoc, 0); 685 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 686 687 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 688 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 689 }), 690 MACRO_BLOCK({ 691 gl.viewport(10, 11, 5, 6); 692 }) 693 ) 694 695 ADD_TESTCASE(scissor, "Change scissor box.", 696 true, 697 false, 698 MACRO_BLOCK({ 699 requireCoordBuffers(1); 700 requireTextures(1); 701 requirePrograms(1); 702 703 gl.useProgram(m_programs[0]->getProgram()); 704 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 705 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 706 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 707 708 gl.enableVertexAttribArray(coordLoc); 709 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 710 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 711 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 712 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 713 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 714 715 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 716 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 717 718 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 719 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 720 721 gl.uniform1i(samplerLoc, 0); 722 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 723 724 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 725 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 726 727 gl.enable(GL_SCISSOR_TEST); 728 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 729 }), 730 MACRO_BLOCK({ 731 gl.scissor(17, 13, 5, 8); 732 }) 733 ) 734 735 ADD_TESTCASE(color_mask, "Change color mask.", 736 true, 737 false, 738 MACRO_BLOCK({ 739 requireCoordBuffers(1); 740 requireTextures(1); 741 requirePrograms(1); 742 743 gl.useProgram(m_programs[0]->getProgram()); 744 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 745 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 746 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 747 748 gl.enableVertexAttribArray(coordLoc); 749 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 750 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 751 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 752 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 753 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 754 755 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 756 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 757 758 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 759 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 760 761 gl.uniform1i(samplerLoc, 0); 762 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 763 764 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 765 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 766 }), 767 MACRO_BLOCK({ 768 gl.colorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_FALSE); 769 }) 770 ) 771 772 ADD_TESTCASE(cull_face, "Change culling mode.", 773 true, 774 false, 775 MACRO_BLOCK({ 776 requireCoordBuffers(1); 777 requireTextures(1); 778 requirePrograms(1); 779 780 gl.useProgram(m_programs[0]->getProgram()); 781 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 782 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 783 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 784 785 gl.enableVertexAttribArray(coordLoc); 786 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 787 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 788 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 789 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 790 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 791 792 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 793 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 794 795 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 796 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 797 798 gl.uniform1i(samplerLoc, 0); 799 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 800 801 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 802 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 803 804 gl.enable(GL_CULL_FACE); 805 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 806 }), 807 MACRO_BLOCK({ 808 gl.cullFace(GL_FRONT); 809 }) 810 ) 811 812 ADD_TESTCASE(front_face, "Change front face.", 813 true, 814 false, 815 MACRO_BLOCK({ 816 requireCoordBuffers(1); 817 requireTextures(1); 818 requirePrograms(1); 819 820 gl.useProgram(m_programs[0]->getProgram()); 821 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 822 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 823 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 824 825 gl.enableVertexAttribArray(coordLoc); 826 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 827 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 828 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 829 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 830 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 831 832 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 833 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 834 835 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 836 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 837 838 gl.uniform1i(samplerLoc, 0); 839 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 840 841 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 842 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 843 844 gl.enable(GL_CULL_FACE); 845 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 846 }), 847 MACRO_BLOCK({ 848 gl.frontFace(GL_CCW); 849 }) 850 ) 851 852 ADD_TESTCASE(stencil_mask, "Change stencil mask.", 853 true, 854 false, 855 MACRO_BLOCK({ 856 requireCoordBuffers(1); 857 requireTextures(1); 858 requirePrograms(1); 859 860 gl.useProgram(m_programs[0]->getProgram()); 861 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 862 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 863 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 864 865 gl.enableVertexAttribArray(coordLoc); 866 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 867 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 868 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 869 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 870 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 871 872 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 873 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 874 875 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 876 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 877 878 gl.uniform1i(samplerLoc, 0); 879 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 880 881 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 882 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 883 884 gl.enable(GL_STENCIL_TEST); 885 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 886 887 gl.stencilFunc(GL_LEQUAL, 0, 0); 888 GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilFunc()"); 889 890 gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE); 891 GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilOp()"); 892 893 gl.clearStencil(0); 894 GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()"); 895 gl.clear(GL_STENCIL_BUFFER_BIT); 896 GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()"); 897 }), 898 MACRO_BLOCK({ 899 gl.stencilMask(0xDD); 900 }) 901 ) 902 903 ADD_TESTCASE(stencil_func, "Change stencil func.", 904 true, 905 false, 906 MACRO_BLOCK({ 907 requireCoordBuffers(1); 908 requireTextures(1); 909 requirePrograms(1); 910 911 gl.useProgram(m_programs[0]->getProgram()); 912 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 913 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 914 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 915 916 gl.enableVertexAttribArray(coordLoc); 917 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 918 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 919 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 920 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 921 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 922 923 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 924 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 925 926 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 927 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 928 929 gl.uniform1i(samplerLoc, 0); 930 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 931 932 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 933 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 934 935 gl.enable(GL_STENCIL_TEST); 936 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 937 938 gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE); 939 GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilOp()"); 940 gl.clearStencil(0); 941 GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()"); 942 gl.clear(GL_STENCIL_BUFFER_BIT); 943 GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()"); 944 }), 945 MACRO_BLOCK({ 946 gl.stencilFunc(GL_LEQUAL, 0, 0xFF); 947 }) 948 ) 949 950 ADD_TESTCASE(stencil_op, "Change stencil op.", 951 true, 952 false, 953 MACRO_BLOCK({ 954 requireCoordBuffers(1); 955 requireTextures(1); 956 requirePrograms(1); 957 958 gl.useProgram(m_programs[0]->getProgram()); 959 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 960 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 961 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 962 963 gl.enableVertexAttribArray(coordLoc); 964 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 965 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 966 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 967 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 968 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 969 970 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 971 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 972 973 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 974 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 975 976 gl.uniform1i(samplerLoc, 0); 977 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 978 979 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 980 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 981 982 gl.enable(GL_STENCIL_TEST); 983 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 984 985 gl.stencilFunc(GL_LEQUAL, 0, 0); 986 GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilFunc()"); 987 988 gl.clearStencil(0); 989 GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()"); 990 991 gl.clear(GL_STENCIL_BUFFER_BIT); 992 GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()"); 993 }), 994 MACRO_BLOCK({ 995 gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE); 996 }) 997 ) 998 999 ADD_TESTCASE(bind_array_buffer, "Change array buffer and refresh vertex attrib pointer.", 1000 true, 1001 false, 1002 MACRO_BLOCK({ 1003 requireCoordBuffers(1); 1004 requireTextures(1); 1005 requirePrograms(1); 1006 1007 gl.bindAttribLocation(m_programs[0]->getProgram(), 0, "a_coord"); 1008 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindAttribLocation()"); 1009 gl.linkProgram(m_programs[0]->getProgram()); 1010 GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram()"); 1011 1012 gl.useProgram(m_programs[0]->getProgram()); 1013 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1014 1015 gl.enableVertexAttribArray(0); 1016 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1017 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1018 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1019 gl.vertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1020 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1021 1022 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1023 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1024 1025 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1026 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1027 1028 gl.uniform1i(samplerLoc, 0); 1029 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1030 1031 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1032 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1033 }), 1034 MACRO_BLOCK({ 1035 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1036 gl.vertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1037 }) 1038 ) 1039 1040 ADD_TESTCASE(element_array_buffer, "Change element array buffer.", 1041 false, 1042 true, 1043 MACRO_BLOCK({ 1044 requireCoordBuffers(1); 1045 requireIndexBuffers(1); 1046 requireTextures(1); 1047 requirePrograms(1); 1048 1049 gl.useProgram(m_programs[0]->getProgram()); 1050 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1051 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1052 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1053 1054 gl.enableVertexAttribArray(coordLoc); 1055 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1056 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1057 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1058 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1059 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1060 1061 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1062 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1063 1064 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1065 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1066 1067 gl.uniform1i(samplerLoc, 0); 1068 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1069 1070 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1071 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1072 1073 gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffers[0]); 1074 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1075 }), 1076 MACRO_BLOCK({ 1077 gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffers[0]); 1078 }) 1079 ) 1080 1081 ADD_TESTCASE(bind_texture, "Change texture binding.", 1082 true, 1083 false, 1084 MACRO_BLOCK({ 1085 requireCoordBuffers(1); 1086 requireTextures(1); 1087 requirePrograms(1); 1088 1089 gl.useProgram(m_programs[0]->getProgram()); 1090 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1091 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1092 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1093 1094 gl.enableVertexAttribArray(coordLoc); 1095 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1096 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1097 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1098 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1099 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1100 1101 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1102 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1103 1104 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1105 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1106 1107 gl.uniform1i(samplerLoc, 0); 1108 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1109 1110 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1111 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1112 }), 1113 MACRO_BLOCK({ 1114 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1115 }) 1116 ) 1117 1118 ADD_TESTCASE(use_program, "Change used program.", 1119 true, 1120 false, 1121 MACRO_BLOCK({ 1122 requireCoordBuffers(1); 1123 requireTextures(1); 1124 requirePrograms(1); 1125 1126 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1127 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1128 1129 gl.enableVertexAttribArray(coordLoc); 1130 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1131 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1132 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1133 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1134 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1135 1136 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1137 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1138 1139 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1140 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1141 gl.useProgram(m_programs[0]->getProgram()); 1142 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1143 gl.uniform1i(samplerLoc, 0); 1144 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1145 1146 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1147 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1148 }), 1149 MACRO_BLOCK({ 1150 gl.useProgram(m_programs[0]->getProgram()); 1151 }) 1152 ) 1153 1154 ADD_TESTCASE(tex_parameter_min_filter, "Change texture parameter min filter.", 1155 true, 1156 false, 1157 MACRO_BLOCK({ 1158 requireCoordBuffers(1); 1159 requireTextures(1); 1160 requirePrograms(1); 1161 1162 gl.useProgram(m_programs[0]->getProgram()); 1163 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1164 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1165 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1166 1167 gl.enableVertexAttribArray(coordLoc); 1168 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1169 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1170 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1171 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1172 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1173 1174 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1175 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1176 1177 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1178 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1179 1180 gl.uniform1i(samplerLoc, 0); 1181 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1182 1183 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1184 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1185 }), 1186 MACRO_BLOCK({ 1187 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 1188 }) 1189 ) 1190 1191 ADD_TESTCASE(tex_parameter_mag_filter, "Change texture parameter mag filter.", 1192 true, 1193 false, 1194 MACRO_BLOCK({ 1195 requireCoordBuffers(1); 1196 requireTextures(1); 1197 requirePrograms(1); 1198 1199 gl.useProgram(m_programs[0]->getProgram()); 1200 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1201 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1202 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1203 1204 gl.enableVertexAttribArray(coordLoc); 1205 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1206 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1207 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1208 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1209 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1210 1211 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1212 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1213 1214 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1215 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1216 1217 gl.uniform1i(samplerLoc, 0); 1218 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1219 1220 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1221 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1222 }), 1223 MACRO_BLOCK({ 1224 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1225 }) 1226 ) 1227 1228 ADD_TESTCASE(tex_parameter_wrap, "Change texture parameter wrap filter.", 1229 true, 1230 false, 1231 MACRO_BLOCK({ 1232 requireCoordBuffers(1); 1233 requireTextures(1); 1234 requirePrograms(1); 1235 1236 gl.useProgram(m_programs[0]->getProgram()); 1237 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1238 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1239 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1240 1241 gl.enableVertexAttribArray(coordLoc); 1242 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1243 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1244 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1245 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1246 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1247 1248 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1249 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1250 1251 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1252 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1253 1254 gl.uniform1i(samplerLoc, 0); 1255 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1256 1257 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1258 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1259 }), 1260 MACRO_BLOCK({ 1261 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 1262 }) 1263 ) 1264 1265 ADD_TESTCASE(bind_framebuffer, "Change framebuffer.", 1266 true, 1267 false, 1268 MACRO_BLOCK({ 1269 requireCoordBuffers(1); 1270 requireTextures(1); 1271 requireFramebuffers(1); 1272 requirePrograms(1); 1273 1274 gl.useProgram(m_programs[0]->getProgram()); 1275 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1276 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1277 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1278 1279 gl.enableVertexAttribArray(coordLoc); 1280 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1281 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1282 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1283 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1284 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1285 1286 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1287 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1288 1289 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1290 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1291 1292 gl.uniform1i(samplerLoc, 0); 1293 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1294 1295 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1296 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1297 1298 gl.bindFramebuffer(GL_FRAMEBUFFER, m_framebuffers[0]); 1299 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer()"); 1300 }), 1301 MACRO_BLOCK({ 1302 gl.bindFramebuffer(GL_FRAMEBUFFER, m_framebuffers[0]); 1303 }) 1304 ) 1305 1306 ADD_TESTCASE(blend_color, "Change blend color.", 1307 true, 1308 false, 1309 MACRO_BLOCK({ 1310 requireCoordBuffers(1); 1311 requireTextures(1); 1312 requirePrograms(1); 1313 1314 gl.useProgram(m_programs[0]->getProgram()); 1315 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1316 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1317 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1318 1319 gl.enableVertexAttribArray(coordLoc); 1320 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1321 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1322 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1323 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1324 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1325 1326 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1327 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1328 1329 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1330 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1331 1332 gl.uniform1i(samplerLoc, 0); 1333 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1334 1335 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1336 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1337 1338 gl.enable(GL_BLEND); 1339 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 1340 1341 gl.blendFunc(GL_CONSTANT_COLOR, GL_CONSTANT_COLOR); 1342 GLU_EXPECT_NO_ERROR(gl.getError(), "glBlendFunc()"); 1343 }), 1344 MACRO_BLOCK({ 1345 gl.blendColor(0.75f, 0.75f, 0.75f, 0.75f); 1346 }) 1347 ) 1348 } 1349 1350 } // Performance 1351 } // gles2 1352 } // deqp 1353