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 State change performance tests. 22 *//*--------------------------------------------------------------------*/ 23 24 #include "es3pStateChangeTests.hpp" 25 #include "glsStateChangePerfTestCases.hpp" 26 #include "gluShaderProgram.hpp" 27 #include "glwFunctions.hpp" 28 #include "glwEnums.hpp" 29 30 namespace deqp 31 { 32 namespace gles3 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 StateChangeCase : public gls::StateChangePerformanceCase 49 { 50 public: 51 StateChangeCase (Context& context, int drawCallCount, int triangleCount, bool drawArrays, bool useIndexBuffer, const char* name, const char* description); 52 ~StateChangeCase (void); 53 54 protected: 55 virtual void renderTest (const glw::Functions& gl); 56 virtual void renderReference (const glw::Functions& gl); 57 58 virtual void changeState (const glw::Functions& gl, int stateId) = 0; 59 }; 60 61 StateChangeCase::StateChangeCase (Context& context, int drawCallCount, int triangleCount, bool drawArrays, bool useIndexBuffer, const char* name, const char* description) 62 : gls::StateChangePerformanceCase(context.getTestContext(), context.getRenderContext(), name, description, 63 (useIndexBuffer ? DRAWTYPE_INDEXED_BUFFER : 64 drawArrays ? DRAWTYPE_NOT_INDEXED : 65 DRAWTYPE_INDEXED_USER_PTR), drawCallCount, triangleCount) 66 { 67 DE_ASSERT(!useIndexBuffer || !drawArrays); 68 } 69 70 StateChangeCase::~StateChangeCase (void) 71 { 72 } 73 74 void StateChangeCase::renderTest (const glw::Functions& gl) 75 { 76 for (int callNdx = 0; callNdx < m_callCount; callNdx++) 77 { 78 changeState(gl, 0); 79 callDraw(gl); 80 81 changeState(gl, 1); 82 callDraw(gl); 83 } 84 } 85 86 void StateChangeCase::renderReference (const glw::Functions& gl) 87 { 88 changeState(gl, 0); 89 90 for (int callNdx = 0; callNdx < m_callCount; callNdx++) 91 callDraw(gl); 92 93 changeState(gl, 1); 94 95 for (int callNdx = 0; callNdx < m_callCount; callNdx++) 96 callDraw(gl); 97 } 98 99 } // anonymous 100 101 StateChangeTests::StateChangeTests (Context& context) 102 : TestCaseGroup(context, "state_change_draw", "Test state change perfomance with draw calls.") 103 { 104 } 105 106 StateChangeTests::~StateChangeTests (void) 107 { 108 } 109 110 #define MACRO_BLOCK(...) __VA_ARGS__ 111 112 #define ADD_TESTCASE(NAME, DESC, DRAWARRAYS, INDEXBUFFER, INIT_FUNC, CHANGE_FUNC)\ 113 do {\ 114 class StateChangeCase_ ## NAME : public StateChangeCase\ 115 {\ 116 public:\ 117 StateChangeCase_ ## NAME (Context& context, int drawCallCount, int triangleCount, const char* name, const char* description)\ 118 : StateChangeCase(context, drawCallCount, triangleCount, (DRAWARRAYS), (INDEXBUFFER), name, description)\ 119 {}\ 120 virtual void setupInitialState (const glw::Functions& gl)\ 121 {\ 122 INIT_FUNC\ 123 }\ 124 virtual void changeState (const glw::Functions& gl, int stateId)\ 125 {\ 126 CHANGE_FUNC\ 127 }\ 128 };\ 129 manySmallCallsGroup->addChild (new StateChangeCase_ ## NAME (m_context,1000,2,#NAME,(DESC)));\ 130 fewBigCallsGroup->addChild (new StateChangeCase_ ## NAME (m_context,10,200,#NAME,(DESC)));\ 131 } while (0); 132 133 void StateChangeTests::init (void) 134 { 135 tcu::TestCaseGroup* const manySmallCallsGroup = new tcu::TestCaseGroup(m_testCtx, "many_small_calls", "1000 calls, 2 triangles in each"); 136 tcu::TestCaseGroup* const fewBigCallsGroup = new tcu::TestCaseGroup(m_testCtx, "few_big_calls", "10 calls, 200 triangles in each"); 137 138 addChild(manySmallCallsGroup); 139 addChild(fewBigCallsGroup); 140 141 ADD_TESTCASE(blend, "Enable/Disable blending.", 142 true, 143 false, 144 MACRO_BLOCK({ 145 requireCoordBuffers(1); 146 requireTextures(1); 147 requirePrograms(1); 148 149 gl.useProgram(m_programs[0]->getProgram()); 150 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 151 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 152 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 153 154 gl.enableVertexAttribArray(coordLoc); 155 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 156 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 157 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 158 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 159 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 160 161 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 162 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 163 164 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 165 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 166 167 gl.uniform1i(samplerLoc, 0); 168 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 169 170 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 171 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 172 }), 173 MACRO_BLOCK({ 174 if (stateId == 0) 175 gl.enable(GL_BLEND); 176 else if (stateId == 1) 177 gl.disable(GL_BLEND); 178 else 179 DE_ASSERT(false); 180 }) 181 ) 182 183 ADD_TESTCASE(depth_test, "Enable/Disable depth test.", 184 true, 185 false, 186 MACRO_BLOCK({ 187 requireCoordBuffers(1); 188 requireTextures(1); 189 requirePrograms(1); 190 191 gl.useProgram(m_programs[0]->getProgram()); 192 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 193 194 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 195 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 196 197 gl.enableVertexAttribArray(coordLoc); 198 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 199 200 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 201 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 202 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 203 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 204 205 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 206 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 207 208 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 209 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 210 211 gl.uniform1i(samplerLoc, 0); 212 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 213 214 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 215 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 216 217 gl.depthFunc(GL_LEQUAL); 218 GLU_EXPECT_NO_ERROR(gl.getError(), "glDepthFunc()"); 219 }), 220 MACRO_BLOCK({ 221 if (stateId == 0) 222 gl.enable(GL_DEPTH_TEST); 223 else if (stateId == 1) 224 gl.disable(GL_DEPTH_TEST); 225 else 226 DE_ASSERT(false); 227 }) 228 ) 229 230 ADD_TESTCASE(stencil_test, "Enable/Disable stencil test.", 231 true, 232 false, 233 MACRO_BLOCK({ 234 requireCoordBuffers(1); 235 requireTextures(1); 236 requirePrograms(1); 237 238 gl.useProgram(m_programs[0]->getProgram()); 239 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 240 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 241 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 242 243 gl.enableVertexAttribArray(coordLoc); 244 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 245 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 246 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 247 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 248 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 249 250 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 251 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 252 253 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 254 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 255 256 gl.uniform1i(samplerLoc, 0); 257 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 258 259 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 260 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 261 262 gl.stencilFunc(GL_LEQUAL, 0, 0); 263 GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilFunc()"); 264 265 gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE); 266 GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilOp()"); 267 268 gl.clearStencil(0); 269 GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()"); 270 gl.clear(GL_STENCIL_BUFFER_BIT); 271 272 GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()"); 273 }), 274 MACRO_BLOCK({ 275 if (stateId == 0) 276 gl.enable(GL_STENCIL_TEST); 277 else if (stateId == 1) 278 gl.disable(GL_STENCIL_TEST); 279 else 280 DE_ASSERT(false); 281 }) 282 ) 283 284 ADD_TESTCASE(scissor_test, "Enable/Disable scissor test.", 285 true, 286 false, 287 MACRO_BLOCK({ 288 requireCoordBuffers(1); 289 requireTextures(1); 290 requirePrograms(1); 291 292 gl.useProgram(m_programs[0]->getProgram()); 293 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 294 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 295 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 296 297 gl.enableVertexAttribArray(coordLoc); 298 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 299 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 300 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 301 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 302 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 303 304 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 305 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 306 307 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 308 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 309 310 gl.uniform1i(samplerLoc, 0); 311 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 312 313 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 314 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 315 316 gl.scissor(2, 3, 12, 13); 317 GLU_EXPECT_NO_ERROR(gl.getError(), "glScissor()"); 318 }), 319 MACRO_BLOCK({ 320 if (stateId == 0) 321 gl.enable(GL_SCISSOR_TEST); 322 else if (stateId == 1) 323 gl.disable(GL_SCISSOR_TEST); 324 else 325 DE_ASSERT(false); 326 }) 327 ) 328 329 ADD_TESTCASE(dither, "Enable/Disable dithering.", 330 true, 331 false, 332 MACRO_BLOCK({ 333 requireCoordBuffers(1); 334 requireTextures(1); 335 requirePrograms(1); 336 337 gl.useProgram(m_programs[0]->getProgram()); 338 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 339 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 340 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 341 342 gl.enableVertexAttribArray(coordLoc); 343 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 344 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 345 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 346 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 347 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 348 349 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 350 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 351 352 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 353 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 354 355 gl.uniform1i(samplerLoc, 0); 356 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 357 358 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 359 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 360 }), 361 MACRO_BLOCK({ 362 if (stateId == 0) 363 gl.enable(GL_DITHER); 364 else if (stateId == 1) 365 gl.disable(GL_DITHER); 366 else 367 DE_ASSERT(false); 368 }) 369 ) 370 371 ADD_TESTCASE(culling, "Enable/Disable culling.", 372 true, 373 false, 374 MACRO_BLOCK({ 375 requireCoordBuffers(1); 376 requireTextures(1); 377 requirePrograms(1); 378 379 gl.useProgram(m_programs[0]->getProgram()); 380 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 381 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 382 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 383 384 gl.enableVertexAttribArray(coordLoc); 385 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 386 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 387 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 388 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 389 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 390 391 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 392 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 393 394 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 395 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 396 397 gl.uniform1i(samplerLoc, 0); 398 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 399 400 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 401 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 402 403 gl.frontFace(GL_CW); 404 GLU_EXPECT_NO_ERROR(gl.getError(), "glFrontFace()"); 405 406 gl.cullFace(GL_FRONT); 407 GLU_EXPECT_NO_ERROR(gl.getError(), "glCullFace()"); 408 }), 409 MACRO_BLOCK({ 410 if (stateId == 0) 411 gl.enable(GL_CULL_FACE); 412 else if (stateId == 1) 413 gl.disable(GL_CULL_FACE); 414 else 415 DE_ASSERT(false); 416 }) 417 ) 418 419 ADD_TESTCASE(rasterizer_discard, "Enable/Disable RASTERIZER_DISCARD.", 420 true, 421 false, 422 MACRO_BLOCK({ 423 requireCoordBuffers(1); 424 requireTextures(1); 425 requirePrograms(1); 426 427 gl.useProgram(m_programs[0]->getProgram()); 428 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 429 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 430 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 431 432 gl.enableVertexAttribArray(coordLoc); 433 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 434 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 435 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 436 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 437 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 438 439 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 440 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 441 442 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 443 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 444 445 gl.uniform1i(samplerLoc, 0); 446 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 447 448 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 449 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 450 }), 451 MACRO_BLOCK({ 452 if (stateId == 0) 453 gl.enable(GL_RASTERIZER_DISCARD); 454 else if (stateId == 1) 455 gl.disable(GL_RASTERIZER_DISCARD); 456 else 457 DE_ASSERT(false); 458 }) 459 ) 460 461 ADD_TESTCASE(primitive_restart_fixed_index, "Enable/Disable PRIMITIVE_RESTART_FIXED_INDEX.", 462 true, 463 false, 464 MACRO_BLOCK({ 465 requireCoordBuffers(1); 466 requireTextures(1); 467 requirePrograms(1); 468 469 gl.useProgram(m_programs[0]->getProgram()); 470 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 471 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 472 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 473 474 gl.enableVertexAttribArray(coordLoc); 475 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 476 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 477 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 478 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 479 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 480 481 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 482 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 483 484 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 485 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 486 487 gl.uniform1i(samplerLoc, 0); 488 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 489 490 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 491 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 492 }), 493 MACRO_BLOCK({ 494 if (stateId == 0) 495 gl.enable(GL_PRIMITIVE_RESTART_FIXED_INDEX); 496 else if (stateId == 1) 497 gl.disable(GL_PRIMITIVE_RESTART_FIXED_INDEX); 498 else 499 DE_ASSERT(false); 500 }) 501 ) 502 503 ADD_TESTCASE(depth_func, "Change depth func.", 504 true, 505 false, 506 MACRO_BLOCK({ 507 requireCoordBuffers(1); 508 requireTextures(1); 509 requirePrograms(1); 510 511 gl.useProgram(m_programs[0]->getProgram()); 512 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 513 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 514 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 515 516 gl.enableVertexAttribArray(coordLoc); 517 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 518 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 519 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 520 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 521 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 522 523 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 524 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 525 526 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 527 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 528 529 gl.uniform1i(samplerLoc, 0); 530 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 531 532 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 533 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 534 535 gl.enable(GL_DEPTH_TEST); 536 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 537 }), 538 MACRO_BLOCK({ 539 if (stateId == 0) 540 gl.depthFunc(GL_GEQUAL); 541 else if (stateId == 1) 542 gl.depthFunc(GL_LEQUAL); 543 else 544 DE_ASSERT(false); 545 }) 546 ) 547 548 549 ADD_TESTCASE(depth_mask, "Toggle depth mask.", 550 true, 551 false, 552 MACRO_BLOCK({ 553 requireCoordBuffers(1); 554 requireTextures(1); 555 requirePrograms(1); 556 557 gl.useProgram(m_programs[0]->getProgram()); 558 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 559 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 560 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 561 562 gl.enableVertexAttribArray(coordLoc); 563 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 564 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 565 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 566 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 567 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 568 569 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 570 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 571 572 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 573 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 574 575 gl.uniform1i(samplerLoc, 0); 576 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 577 578 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 579 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 580 581 gl.enable(GL_DEPTH_TEST); 582 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 583 584 gl.depthFunc(GL_LEQUAL); 585 GLU_EXPECT_NO_ERROR(gl.getError(), "glDepthFunc()"); 586 }), 587 MACRO_BLOCK({ 588 if (stateId == 0) 589 gl.depthMask(GL_FALSE); 590 else if (stateId == 1) 591 gl.depthMask(GL_TRUE); 592 else 593 DE_ASSERT(false); 594 }) 595 ) 596 597 ADD_TESTCASE(depth_rangef, "Change depth range.", 598 true, 599 false, 600 MACRO_BLOCK({ 601 requireCoordBuffers(1); 602 requireTextures(1); 603 requirePrograms(1); 604 605 gl.useProgram(m_programs[0]->getProgram()); 606 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 607 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 608 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 609 610 gl.enableVertexAttribArray(coordLoc); 611 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 612 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 613 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 614 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 615 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 616 617 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 618 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 619 620 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 621 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 622 623 gl.uniform1i(samplerLoc, 0); 624 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 625 626 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 627 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 628 }), 629 MACRO_BLOCK({ 630 if (stateId == 0) 631 gl.depthRangef(0.0f, 1.0f); 632 else if (stateId == 1) 633 gl.depthRangef(0.25f, 0.75f); 634 else 635 DE_ASSERT(false); 636 }) 637 ) 638 639 ADD_TESTCASE(blend_equation, "Change blend equation.", 640 true, 641 false, 642 MACRO_BLOCK({ 643 requireCoordBuffers(1); 644 requireTextures(1); 645 requirePrograms(1); 646 647 gl.useProgram(m_programs[0]->getProgram()); 648 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 649 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 650 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 651 652 gl.enableVertexAttribArray(coordLoc); 653 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 654 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 655 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 656 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 657 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 658 659 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 660 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 661 662 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 663 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 664 665 gl.uniform1i(samplerLoc, 0); 666 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 667 668 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 669 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 670 671 gl.enable(GL_BLEND); 672 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 673 }), 674 MACRO_BLOCK({ 675 if (stateId == 0) 676 gl.blendEquation(GL_FUNC_SUBTRACT); 677 else if (stateId == 1) 678 gl.blendEquation(GL_FUNC_ADD); 679 else 680 DE_ASSERT(false); 681 }) 682 ) 683 684 ADD_TESTCASE(blend_func, "Change blend function.", 685 true, 686 false, 687 MACRO_BLOCK({ 688 requireCoordBuffers(1); 689 requireTextures(1); 690 requirePrograms(1); 691 692 gl.useProgram(m_programs[0]->getProgram()); 693 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 694 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 695 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 696 697 gl.enableVertexAttribArray(coordLoc); 698 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 699 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 700 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 701 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 702 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 703 704 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 705 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 706 707 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 708 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 709 710 gl.uniform1i(samplerLoc, 0); 711 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 712 713 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 714 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 715 716 gl.enable(GL_BLEND); 717 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 718 }), 719 MACRO_BLOCK({ 720 if (stateId == 0) 721 gl.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 722 else if (stateId == 1) 723 gl.blendFunc(GL_ONE, GL_ONE); 724 else 725 DE_ASSERT(false); 726 }) 727 ) 728 729 ADD_TESTCASE(polygon_offset, "Change polygon offset.", 730 true, 731 false, 732 MACRO_BLOCK({ 733 requireCoordBuffers(1); 734 requireTextures(1); 735 requirePrograms(1); 736 737 gl.useProgram(m_programs[0]->getProgram()); 738 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 739 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 740 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 741 742 gl.enableVertexAttribArray(coordLoc); 743 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 744 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 745 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 746 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 747 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 748 749 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 750 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 751 752 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 753 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 754 755 gl.uniform1i(samplerLoc, 0); 756 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 757 758 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 759 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 760 761 gl.enable(GL_POLYGON_OFFSET_FILL); 762 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 763 }), 764 MACRO_BLOCK({ 765 if (stateId == 0) 766 gl.polygonOffset(0.0f, 0.0f); 767 else if (stateId == 1) 768 gl.polygonOffset(0.1f, 0.1f); 769 else 770 DE_ASSERT(false); 771 }) 772 ) 773 774 ADD_TESTCASE(sample_coverage, "Sample coverage.", 775 true, 776 false, 777 MACRO_BLOCK({ 778 requireCoordBuffers(1); 779 requireTextures(1); 780 requirePrograms(1); 781 782 gl.useProgram(m_programs[0]->getProgram()); 783 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 784 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 785 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 786 787 gl.enableVertexAttribArray(coordLoc); 788 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 789 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 790 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 791 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 792 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 793 794 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 795 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 796 797 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 798 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 799 800 gl.uniform1i(samplerLoc, 0); 801 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 802 803 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 804 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 805 }), 806 MACRO_BLOCK({ 807 if (stateId == 0) 808 gl.sampleCoverage(0.25f, GL_TRUE); 809 else if (stateId == 1) 810 gl.sampleCoverage(0.75f, GL_FALSE); 811 else 812 DE_ASSERT(false); 813 }) 814 ) 815 816 ADD_TESTCASE(viewport, "Change viewport.", 817 true, 818 false, 819 MACRO_BLOCK({ 820 requireCoordBuffers(1); 821 requireTextures(1); 822 requirePrograms(1); 823 824 gl.useProgram(m_programs[0]->getProgram()); 825 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 826 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 827 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 828 829 gl.enableVertexAttribArray(coordLoc); 830 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 831 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 832 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 833 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 834 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 835 836 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 837 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 838 839 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 840 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 841 842 gl.uniform1i(samplerLoc, 0); 843 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 844 845 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 846 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 847 }), 848 MACRO_BLOCK({ 849 if (stateId == 0) 850 gl.viewport(10, 11, 5, 6); 851 else if (stateId == 1) 852 gl.viewport(2, 3, 17, 14); 853 else 854 DE_ASSERT(false); 855 }) 856 ) 857 858 ADD_TESTCASE(scissor, "Change scissor box.", 859 true, 860 false, 861 MACRO_BLOCK({ 862 requireCoordBuffers(1); 863 requireTextures(1); 864 requirePrograms(1); 865 866 gl.useProgram(m_programs[0]->getProgram()); 867 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 868 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 869 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 870 871 gl.enableVertexAttribArray(coordLoc); 872 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 873 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 874 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 875 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 876 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 877 878 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 879 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 880 881 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 882 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 883 884 gl.uniform1i(samplerLoc, 0); 885 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 886 887 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 888 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 889 890 gl.enable(GL_SCISSOR_TEST); 891 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 892 }), 893 MACRO_BLOCK({ 894 if (stateId == 0) 895 gl.scissor(17, 13, 5, 8); 896 else if (stateId == 1) 897 gl.scissor(7, 3, 13, 13); 898 else 899 DE_ASSERT(false); 900 }) 901 ) 902 903 ADD_TESTCASE(color_mask, "Change color mask.", 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 MACRO_BLOCK({ 936 if (stateId == 0) 937 gl.colorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_FALSE); 938 else if (stateId == 1) 939 gl.colorMask(GL_FALSE, GL_TRUE, GL_FALSE, GL_TRUE); 940 else 941 DE_ASSERT(false); 942 }) 943 ) 944 945 ADD_TESTCASE(cull_face, "Change culling mode.", 946 true, 947 false, 948 MACRO_BLOCK({ 949 requireCoordBuffers(1); 950 requireTextures(1); 951 requirePrograms(1); 952 953 gl.useProgram(m_programs[0]->getProgram()); 954 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 955 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 956 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 957 958 gl.enableVertexAttribArray(coordLoc); 959 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 960 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 961 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 962 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 963 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 964 965 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 966 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 967 968 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 969 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 970 971 gl.uniform1i(samplerLoc, 0); 972 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 973 974 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 975 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 976 977 gl.enable(GL_CULL_FACE); 978 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 979 }), 980 MACRO_BLOCK({ 981 if (stateId == 0) 982 gl.cullFace(GL_FRONT); 983 else if (stateId == 1) 984 gl.cullFace(GL_BACK); 985 else 986 DE_ASSERT(false); 987 }) 988 ) 989 990 ADD_TESTCASE(front_face, "Change front face.", 991 true, 992 false, 993 MACRO_BLOCK({ 994 requireCoordBuffers(1); 995 requireTextures(1); 996 requirePrograms(1); 997 998 gl.useProgram(m_programs[0]->getProgram()); 999 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1000 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1001 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1002 1003 gl.enableVertexAttribArray(coordLoc); 1004 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1005 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1006 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1007 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1008 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1009 1010 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1011 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1012 1013 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1014 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1015 1016 gl.uniform1i(samplerLoc, 0); 1017 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1018 1019 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1020 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1021 1022 gl.enable(GL_CULL_FACE); 1023 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 1024 }), 1025 MACRO_BLOCK({ 1026 if (stateId == 0) 1027 gl.frontFace(GL_CCW); 1028 else if (stateId == 1) 1029 gl.frontFace(GL_CW); 1030 else 1031 DE_ASSERT(false); 1032 }) 1033 ) 1034 1035 ADD_TESTCASE(stencil_mask, "Change stencil mask.", 1036 true, 1037 false, 1038 MACRO_BLOCK({ 1039 requireCoordBuffers(1); 1040 requireTextures(1); 1041 requirePrograms(1); 1042 1043 gl.useProgram(m_programs[0]->getProgram()); 1044 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1045 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1046 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1047 1048 gl.enableVertexAttribArray(coordLoc); 1049 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1050 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1051 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1052 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1053 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1054 1055 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1056 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1057 1058 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1059 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1060 1061 gl.uniform1i(samplerLoc, 0); 1062 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1063 1064 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1065 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1066 1067 gl.enable(GL_STENCIL_TEST); 1068 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 1069 1070 gl.stencilFunc(GL_LEQUAL, 0, 0); 1071 GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilFunc()"); 1072 1073 gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE); 1074 GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilOp()"); 1075 1076 gl.clearStencil(0); 1077 GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()"); 1078 gl.clear(GL_STENCIL_BUFFER_BIT); 1079 GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()"); 1080 }), 1081 MACRO_BLOCK({ 1082 if (stateId == 0) 1083 gl.stencilMask(0xDD); 1084 else if (stateId == 1) 1085 gl.stencilMask(~0xDD); 1086 else 1087 DE_ASSERT(false); 1088 }) 1089 ) 1090 1091 ADD_TESTCASE(stencil_func, "Change stencil func.", 1092 true, 1093 false, 1094 MACRO_BLOCK({ 1095 requireCoordBuffers(1); 1096 requireTextures(1); 1097 requirePrograms(1); 1098 1099 gl.useProgram(m_programs[0]->getProgram()); 1100 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1101 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1102 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1103 1104 gl.enableVertexAttribArray(coordLoc); 1105 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1106 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1107 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1108 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1109 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1110 1111 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1112 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1113 1114 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1115 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1116 1117 gl.uniform1i(samplerLoc, 0); 1118 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1119 1120 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1121 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1122 1123 gl.enable(GL_STENCIL_TEST); 1124 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 1125 1126 gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE); 1127 GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilOp()"); 1128 gl.clearStencil(0); 1129 GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()"); 1130 gl.clear(GL_STENCIL_BUFFER_BIT); 1131 GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()"); 1132 }), 1133 MACRO_BLOCK({ 1134 if (stateId == 0) 1135 gl.stencilFunc(GL_LEQUAL, 0, 0xFF); 1136 else if (stateId == 1) 1137 gl.stencilFunc(GL_GEQUAL, 0, 0x00); 1138 else 1139 DE_ASSERT(false); 1140 }) 1141 ) 1142 1143 ADD_TESTCASE(stencil_op, "Change stencil op.", 1144 true, 1145 false, 1146 MACRO_BLOCK({ 1147 requireCoordBuffers(1); 1148 requireTextures(1); 1149 requirePrograms(1); 1150 1151 gl.useProgram(m_programs[0]->getProgram()); 1152 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1153 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1154 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1155 1156 gl.enableVertexAttribArray(coordLoc); 1157 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1158 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1159 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1160 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1161 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1162 1163 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1164 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1165 1166 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1167 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1168 1169 gl.uniform1i(samplerLoc, 0); 1170 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1171 1172 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1173 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1174 1175 gl.enable(GL_STENCIL_TEST); 1176 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 1177 1178 gl.stencilFunc(GL_LEQUAL, 0, 0); 1179 GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilFunc()"); 1180 1181 gl.clearStencil(0); 1182 GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()"); 1183 1184 gl.clear(GL_STENCIL_BUFFER_BIT); 1185 GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()"); 1186 }), 1187 MACRO_BLOCK({ 1188 if (stateId == 0) 1189 gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE); 1190 else if (stateId == 1) 1191 gl.stencilOp(GL_REPLACE, GL_KEEP, GL_KEEP); 1192 else 1193 DE_ASSERT(false); 1194 }) 1195 ) 1196 1197 ADD_TESTCASE(bind_array_buffer, "Change array buffer and refresh vertex attrib pointer.", 1198 true, 1199 false, 1200 MACRO_BLOCK({ 1201 requireCoordBuffers(2); 1202 requireTextures(1); 1203 requirePrograms(1); 1204 1205 gl.bindAttribLocation(m_programs[0]->getProgram(), 0, "a_coord"); 1206 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindAttribLocation()"); 1207 gl.linkProgram(m_programs[0]->getProgram()); 1208 GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram()"); 1209 1210 gl.useProgram(m_programs[0]->getProgram()); 1211 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1212 1213 gl.enableVertexAttribArray(0); 1214 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1215 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1216 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1217 gl.vertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1218 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1219 1220 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1221 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1222 1223 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1224 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1225 1226 gl.uniform1i(samplerLoc, 0); 1227 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1228 1229 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1230 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1231 }), 1232 MACRO_BLOCK({ 1233 if (stateId == 0) 1234 { 1235 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1236 gl.vertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1237 } 1238 else if (stateId == 1) 1239 { 1240 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[1]); 1241 gl.vertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1242 } 1243 else 1244 DE_ASSERT(false); 1245 }) 1246 ) 1247 1248 ADD_TESTCASE(element_array_buffer, "Change element array buffer.", 1249 false, 1250 true, 1251 MACRO_BLOCK({ 1252 requireCoordBuffers(1); 1253 requireIndexBuffers(2); 1254 requireTextures(1); 1255 requirePrograms(1); 1256 1257 gl.useProgram(m_programs[0]->getProgram()); 1258 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1259 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1260 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1261 1262 gl.enableVertexAttribArray(coordLoc); 1263 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1264 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1265 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1266 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1267 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1268 1269 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1270 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1271 1272 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1273 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1274 1275 gl.uniform1i(samplerLoc, 0); 1276 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1277 1278 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1279 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1280 1281 gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffers[0]); 1282 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1283 }), 1284 MACRO_BLOCK({ 1285 if (stateId == 0) 1286 gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffers[0]); 1287 else if (stateId == 1) 1288 gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffers[1]); 1289 else 1290 DE_ASSERT(false); 1291 }) 1292 ) 1293 1294 ADD_TESTCASE(bind_texture, "Change texture binding.", 1295 true, 1296 false, 1297 MACRO_BLOCK({ 1298 requireCoordBuffers(1); 1299 requireTextures(2); 1300 requirePrograms(1); 1301 1302 gl.useProgram(m_programs[0]->getProgram()); 1303 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1304 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1305 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1306 1307 gl.enableVertexAttribArray(coordLoc); 1308 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1309 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1310 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1311 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1312 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1313 1314 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1315 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1316 1317 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1318 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1319 1320 gl.uniform1i(samplerLoc, 0); 1321 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1322 1323 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1324 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1325 }), 1326 MACRO_BLOCK({ 1327 if (stateId == 0) 1328 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1329 else if (stateId == 1) 1330 gl.bindTexture(GL_TEXTURE_2D, m_textures[1]); 1331 else 1332 DE_ASSERT(false); 1333 }) 1334 ) 1335 1336 ADD_TESTCASE(use_program, "Change used program.", 1337 true, 1338 false, 1339 MACRO_BLOCK({ 1340 requireCoordBuffers(1); 1341 requireTextures(1); 1342 requirePrograms(2); 1343 1344 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1345 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1346 1347 gl.enableVertexAttribArray(coordLoc); 1348 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1349 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1350 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1351 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1352 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1353 1354 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1355 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1356 1357 { 1358 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1359 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1360 gl.useProgram(m_programs[0]->getProgram()); 1361 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1362 gl.uniform1i(samplerLoc, 0); 1363 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1364 } 1365 1366 { 1367 GLint samplerLoc = gl.getUniformLocation(m_programs[1]->getProgram(), "u_sampler"); 1368 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1369 gl.useProgram(m_programs[1]->getProgram()); 1370 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1371 gl.uniform1i(samplerLoc, 0); 1372 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1373 } 1374 1375 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1376 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1377 }), 1378 MACRO_BLOCK({ 1379 if (stateId == 0) 1380 gl.useProgram(m_programs[0]->getProgram()); 1381 else if (stateId == 1) 1382 gl.useProgram(m_programs[1]->getProgram()); 1383 else 1384 DE_ASSERT(false); 1385 }) 1386 ) 1387 1388 ADD_TESTCASE(tex_parameter_min_filter, "Change texture parameter min filter.", 1389 true, 1390 false, 1391 MACRO_BLOCK({ 1392 requireCoordBuffers(1); 1393 requireTextures(1); 1394 requirePrograms(1); 1395 1396 gl.useProgram(m_programs[0]->getProgram()); 1397 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1398 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1399 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1400 1401 gl.enableVertexAttribArray(coordLoc); 1402 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1403 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1404 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1405 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1406 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1407 1408 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1409 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1410 1411 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1412 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1413 1414 gl.uniform1i(samplerLoc, 0); 1415 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1416 1417 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1418 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1419 }), 1420 MACRO_BLOCK({ 1421 if (stateId == 0) 1422 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 1423 else if (stateId == 1) 1424 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 1425 else 1426 DE_ASSERT(false); 1427 }) 1428 ) 1429 1430 ADD_TESTCASE(tex_parameter_mag_filter, "Change texture parameter mag filter.", 1431 true, 1432 false, 1433 MACRO_BLOCK({ 1434 requireCoordBuffers(1); 1435 requireTextures(1); 1436 requirePrograms(1); 1437 1438 gl.useProgram(m_programs[0]->getProgram()); 1439 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1440 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1441 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1442 1443 gl.enableVertexAttribArray(coordLoc); 1444 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1445 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1446 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1447 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1448 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1449 1450 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1451 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1452 1453 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1454 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1455 1456 gl.uniform1i(samplerLoc, 0); 1457 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1458 1459 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1460 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1461 }), 1462 MACRO_BLOCK({ 1463 if (stateId == 0) 1464 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1465 else if (stateId == 1) 1466 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 1467 else 1468 DE_ASSERT(false); 1469 }) 1470 ) 1471 1472 ADD_TESTCASE(tex_parameter_wrap, "Change texture parameter wrap filter.", 1473 true, 1474 false, 1475 MACRO_BLOCK({ 1476 requireCoordBuffers(1); 1477 requireTextures(1); 1478 requirePrograms(1); 1479 1480 gl.useProgram(m_programs[0]->getProgram()); 1481 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1482 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1483 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1484 1485 gl.enableVertexAttribArray(coordLoc); 1486 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1487 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1488 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1489 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1490 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1491 1492 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1493 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1494 1495 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1496 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1497 1498 gl.uniform1i(samplerLoc, 0); 1499 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1500 1501 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1502 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1503 }), 1504 MACRO_BLOCK({ 1505 if (stateId == 0) 1506 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 1507 else if (stateId == 1) 1508 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 1509 else 1510 DE_ASSERT(false); 1511 }) 1512 ) 1513 1514 ADD_TESTCASE(bind_framebuffer, "Change framebuffer.", 1515 true, 1516 false, 1517 MACRO_BLOCK({ 1518 requireCoordBuffers(1); 1519 requireTextures(1); 1520 requireFramebuffers(2); 1521 requirePrograms(1); 1522 1523 gl.useProgram(m_programs[0]->getProgram()); 1524 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1525 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1526 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1527 1528 gl.enableVertexAttribArray(coordLoc); 1529 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1530 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1531 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1532 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1533 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1534 1535 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1536 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1537 1538 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1539 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1540 1541 gl.uniform1i(samplerLoc, 0); 1542 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1543 1544 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1545 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1546 1547 gl.bindFramebuffer(GL_FRAMEBUFFER, m_framebuffers[0]); 1548 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer()"); 1549 }), 1550 MACRO_BLOCK({ 1551 if (stateId == 0) 1552 gl.bindFramebuffer(GL_FRAMEBUFFER, m_framebuffers[0]); 1553 else if (stateId == 1) 1554 gl.bindFramebuffer(GL_FRAMEBUFFER, m_framebuffers[1]); 1555 else 1556 DE_ASSERT(false); 1557 }) 1558 ) 1559 1560 ADD_TESTCASE(blend_color, "Change blend color.", 1561 true, 1562 false, 1563 MACRO_BLOCK({ 1564 requireCoordBuffers(1); 1565 requireTextures(1); 1566 requirePrograms(1); 1567 1568 gl.useProgram(m_programs[0]->getProgram()); 1569 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1570 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1571 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1572 1573 gl.enableVertexAttribArray(coordLoc); 1574 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1575 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1576 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1577 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1578 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1579 1580 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1581 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1582 1583 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1584 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1585 1586 gl.uniform1i(samplerLoc, 0); 1587 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1588 1589 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1590 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1591 1592 gl.enable(GL_BLEND); 1593 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()"); 1594 1595 gl.blendFunc(GL_CONSTANT_COLOR, GL_CONSTANT_COLOR); 1596 GLU_EXPECT_NO_ERROR(gl.getError(), "glBlendFunc()"); 1597 }), 1598 MACRO_BLOCK({ 1599 if (stateId == 0) 1600 gl.blendColor(0.25f, 0.25f, 0.25f, 0.25f); 1601 else if (stateId == 1) 1602 gl.blendColor(0.75f, 0.75f, 0.75f, 0.75f); 1603 else 1604 DE_ASSERT(false); 1605 }) 1606 ) 1607 1608 ADD_TESTCASE(sampler, "Change sampler binding.", 1609 true, 1610 false, 1611 MACRO_BLOCK({ 1612 requireCoordBuffers(1); 1613 requireTextures(1); 1614 requirePrograms(1); 1615 requireSamplers(2); 1616 1617 gl.useProgram(m_programs[0]->getProgram()); 1618 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1619 GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord"); 1620 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()"); 1621 1622 gl.enableVertexAttribArray(coordLoc); 1623 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1624 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]); 1625 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1626 gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1627 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1628 1629 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1630 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1631 1632 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1633 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1634 1635 gl.uniform1i(samplerLoc, 0); 1636 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1637 1638 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1639 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1640 1641 for (int ndx = 0; ndx < 2; ndx++) 1642 { 1643 gl.bindSampler(0, m_samplers[ndx]); 1644 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, ndx == 0 ? GL_NEAREST : GL_LINEAR); 1645 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, ndx == 0 ? GL_LINEAR : GL_NEAREST); 1646 GLU_EXPECT_NO_ERROR(gl.getError(), "Sampler setup"); 1647 } 1648 }), 1649 MACRO_BLOCK({ 1650 DE_ASSERT(de::inBounds(stateId, 0, 2)); 1651 gl.bindSampler(0, m_samplers[stateId]); 1652 }) 1653 ) 1654 1655 ADD_TESTCASE(bind_vertex_array, "Change vertex array binding.", 1656 true, 1657 false, 1658 MACRO_BLOCK({ 1659 requireCoordBuffers(2); 1660 requireTextures(1); 1661 requirePrograms(1); 1662 requireVertexArrays(2); 1663 1664 gl.bindAttribLocation(m_programs[0]->getProgram(), 0, "a_coord"); 1665 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindAttribLocation()"); 1666 gl.linkProgram(m_programs[0]->getProgram()); 1667 GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram()"); 1668 1669 gl.useProgram(m_programs[0]->getProgram()); 1670 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()"); 1671 1672 for (int ndx = 0; ndx < 2; ndx++) 1673 { 1674 gl.bindVertexArray(m_vertexArrays[ndx]); 1675 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray()"); 1676 gl.enableVertexAttribArray(0); 1677 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()"); 1678 gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[ndx]); 1679 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()"); 1680 gl.vertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL); 1681 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()"); 1682 } 1683 1684 GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler"); 1685 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()"); 1686 1687 gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); 1688 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()"); 1689 1690 gl.uniform1i(samplerLoc, 0); 1691 GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()"); 1692 1693 gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 1694 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()"); 1695 }), 1696 MACRO_BLOCK({ 1697 DE_ASSERT(de::inRange(stateId, 0, 2)); 1698 gl.bindVertexArray(m_vertexArrays[stateId]); 1699 }) 1700 ) 1701 } 1702 1703 } // Performance 1704 } // gles3 1705 } // deqp 1706