Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(56)

Side by Side Diff: gpu/command_buffer/tests/gl_texture_mailbox_unittest.cc

Issue 1964793002: Revert of [Reland 1] Pepper takes ownership of a mailbox before passing it to the texture layer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <GLES2/gl2.h> 5 #include <GLES2/gl2.h>
6 #include <GLES2/gl2ext.h> 6 #include <GLES2/gl2ext.h>
7 #include <GLES2/gl2extchromium.h> 7 #include <GLES2/gl2extchromium.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 GLManager::Options options; 61 GLManager::Options options;
62 options.share_mailbox_manager = &gl1_; 62 options.share_mailbox_manager = &gl1_;
63 gl2_.Initialize(options); 63 gl2_.Initialize(options);
64 } 64 }
65 65
66 void TearDown() override { 66 void TearDown() override {
67 gl1_.Destroy(); 67 gl1_.Destroy();
68 gl2_.Destroy(); 68 gl2_.Destroy();
69 } 69 }
70 70
71 // The second GL context takes and consumes a mailbox from the first GL
72 // context. Assumes that |gl1_| is current.
73 Mailbox TakeAndConsumeMailbox() {
74 glResizeCHROMIUM(10, 10, 1, true);
75 glClearColor(0, 1, 1, 1);
76 glClear(GL_COLOR_BUFFER_BIT);
77 ::gles2::GetGLContext()->SwapBuffers();
78
79 Mailbox mailbox;
80 glGenMailboxCHROMIUM(mailbox.name);
81 gl1_.decoder()->TakeFrontBuffer(mailbox);
82
83 gl2_.MakeCurrent();
84 GLuint tex;
85 glGenTextures(1, &tex);
86 glBindTexture(GL_TEXTURE_2D, tex);
87 glConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name);
88 glDeleteTextures(1, &tex);
89 glFlush();
90 gl1_.MakeCurrent();
91 return mailbox;
92 }
93
94 GLManager gl1_; 71 GLManager gl1_;
95 GLManager gl2_; 72 GLManager gl2_;
96 }; 73 };
97 74
98 TEST_F(GLTextureMailboxTest, ProduceAndConsumeTexture) { 75 TEST_F(GLTextureMailboxTest, ProduceAndConsumeTexture) {
99 gl1_.MakeCurrent(); 76 gl1_.MakeCurrent();
100 77
101 GLbyte mailbox1[GL_MAILBOX_SIZE_CHROMIUM]; 78 GLbyte mailbox1[GL_MAILBOX_SIZE_CHROMIUM];
102 glGenMailboxCHROMIUM(mailbox1); 79 glGenMailboxCHROMIUM(mailbox1);
103 80
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 320
344 // Mailbox should be gone now. 321 // Mailbox should be gone now.
345 glGenTextures(1, &tex2); 322 glGenTextures(1, &tex2);
346 glBindTexture(GL_TEXTURE_2D, tex2); 323 glBindTexture(GL_TEXTURE_2D, tex2);
347 glConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox); 324 glConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox);
348 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError()); 325 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
349 glDeleteTextures(1, &tex2); 326 glDeleteTextures(1, &tex2);
350 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 327 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
351 } 328 }
352 329
353 TEST_F(GLTextureMailboxTest, TakeFrontBuffer) { 330 TEST_F(GLTextureMailboxTest, ProduceFrontBuffer) {
354 gl1_.MakeCurrent(); 331 gl1_.MakeCurrent();
355 Mailbox mailbox; 332 Mailbox mailbox;
356 glGenMailboxCHROMIUM(mailbox.name); 333 glGenMailboxCHROMIUM(mailbox.name);
357 334
358 gl2_.MakeCurrent(); 335 gl2_.MakeCurrent();
359 glResizeCHROMIUM(10, 10, 1, true); 336 gl2_.decoder()->ProduceFrontBuffer(mailbox);
360 glClearColor(0, 1, 1, 1);
361 glClear(GL_COLOR_BUFFER_BIT);
362 ::gles2::GetGLContext()->SwapBuffers();
363 gl2_.decoder()->TakeFrontBuffer(mailbox);
364 337
365 gl1_.MakeCurrent(); 338 gl1_.MakeCurrent();
366 GLuint tex1; 339 GLuint tex1;
367 glGenTextures(1, &tex1); 340 glGenTextures(1, &tex1);
368 glBindTexture(GL_TEXTURE_2D, tex1); 341 glBindTexture(GL_TEXTURE_2D, tex1);
369 glConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); 342 glConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name);
370 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 343 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
371 EXPECT_EQ(0xFFFFFF00u, ReadTexel(tex1, 0, 0));
372 344
373 gl2_.MakeCurrent(); 345 gl2_.MakeCurrent();
346 glResizeCHROMIUM(10, 10, 1, true);
374 glClearColor(1, 0, 0, 1); 347 glClearColor(1, 0, 0, 1);
375 glClear(GL_COLOR_BUFFER_BIT); 348 glClear(GL_COLOR_BUFFER_BIT);
376 ::gles2::GetGLContext()->SwapBuffers(); 349 ::gles2::GetGLContext()->SwapBuffers();
377 350
378 gl1_.MakeCurrent(); 351 gl1_.MakeCurrent();
379 EXPECT_EQ(0xFFFFFF00u, ReadTexel(tex1, 0, 0)); 352 EXPECT_EQ(0xFF0000FFu, ReadTexel(tex1, 0, 0));
380 353 EXPECT_EQ(0xFF0000FFu, ReadTexel(tex1, 9, 9));
381 glDeleteTextures(1, &tex1); 354 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
382
383 Mailbox mailbox2;
384 glGenMailboxCHROMIUM(mailbox2.name);
385 355
386 gl2_.MakeCurrent(); 356 gl2_.MakeCurrent();
387 gl2_.decoder()->ReturnFrontBuffer(mailbox, false);
388
389 // Flushing doesn't matter, only SwapBuffers().
390 glClearColor(0, 1, 0, 1); 357 glClearColor(0, 1, 0, 1);
391 glClear(GL_COLOR_BUFFER_BIT); 358 glClear(GL_COLOR_BUFFER_BIT);
392 glFlush(); 359 glFlush();
393 360
394 gl2_.decoder()->TakeFrontBuffer(mailbox2); 361 gl1_.MakeCurrent();
362 EXPECT_EQ(0xFF0000FFu, ReadTexel(tex1, 0, 0));
363
364 gl2_.MakeCurrent();
365 ::gles2::GetGLContext()->SwapBuffers();
395 366
396 gl1_.MakeCurrent(); 367 gl1_.MakeCurrent();
397 glGenTextures(1, &tex1); 368 EXPECT_EQ(0xFF00FF00u, ReadTexel(tex1, 0, 0));
398 glBindTexture(GL_TEXTURE_2D, tex1);
399 glConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox2.name);
400 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
401 EXPECT_EQ(0xFF0000FFu, ReadTexel(tex1, 0, 0));
402 369
403 gl2_.MakeCurrent(); 370 gl2_.MakeCurrent();
404 gl2_.Destroy(); 371 gl2_.Destroy();
405 372
406 gl1_.MakeCurrent(); 373 gl1_.MakeCurrent();
407 EXPECT_EQ(0xFF0000FFu, ReadTexel(tex1, 0, 0)); 374 EXPECT_EQ(0xFF00FF00u, ReadTexel(tex1, 0, 0));
408 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 375 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
409 glDeleteTextures(1, &tex1); 376 glDeleteTextures(1, &tex1);
410 } 377 }
411 378
412 // The client, represented by |gl2_|, will request 5 frontbuffers, and then
413 // start returning them.
414 TEST_F(GLTextureMailboxTest, FrontBufferCache) {
415 gl1_.MakeCurrent();
416
417 std::vector<Mailbox> mailboxes;
418 for (int i = 0; i < 5; ++i) {
419 Mailbox mailbox = TakeAndConsumeMailbox();
420 mailboxes.push_back(mailbox);
421 }
422 EXPECT_EQ(5u, gl1_.decoder()->GetSavedBackTextureCountForTest());
423 EXPECT_EQ(5u, gl1_.decoder()->GetCreatedBackTextureCountForTest());
424
425 // If the textures aren't lost, they're reused.
426 for (int i = 0; i < 100; ++i) {
427 gl1_.decoder()->ReturnFrontBuffer(mailboxes[0], false);
428 mailboxes.erase(mailboxes.begin());
429
430 Mailbox mailbox = TakeAndConsumeMailbox();
431 mailboxes.push_back(mailbox);
432 }
433
434 EXPECT_EQ(5u, gl1_.decoder()->GetSavedBackTextureCountForTest());
435 EXPECT_EQ(5u, gl1_.decoder()->GetCreatedBackTextureCountForTest());
436
437 // If the textures are lost, they're not reused.
438 for (int i = 0; i < 100; ++i) {
439 gl1_.decoder()->ReturnFrontBuffer(mailboxes[0], true);
440 mailboxes.erase(mailboxes.begin());
441
442 Mailbox mailbox = TakeAndConsumeMailbox();
443 mailboxes.push_back(mailbox);
444 }
445
446 EXPECT_EQ(5u, gl1_.decoder()->GetSavedBackTextureCountForTest());
447 EXPECT_EQ(105u, gl1_.decoder()->GetCreatedBackTextureCountForTest());
448 }
449
450 // The client, represented by |gl2_|, will request and return 5 frontbuffers.
451 // Then the size of the buffer will be changed. All cached frontbuffers should
452 // be discarded.
453 TEST_F(GLTextureMailboxTest, FrontBufferChangeSize) {
454 gl1_.MakeCurrent();
455
456 std::vector<Mailbox> mailboxes;
457 for (int i = 0; i < 5; ++i) {
458 Mailbox mailbox = TakeAndConsumeMailbox();
459 mailboxes.push_back(mailbox);
460 }
461 EXPECT_EQ(5u, gl1_.decoder()->GetSavedBackTextureCountForTest());
462
463 for (int i = 0; i < 5; ++i) {
464 gl1_.decoder()->ReturnFrontBuffer(mailboxes[i], false);
465 }
466 mailboxes.clear();
467 EXPECT_EQ(5u, gl1_.decoder()->GetSavedBackTextureCountForTest());
468
469 glResizeCHROMIUM(21, 31, 1, true);
470 ::gles2::GetGLContext()->SwapBuffers();
471 EXPECT_EQ(0u, gl1_.decoder()->GetSavedBackTextureCountForTest());
472 }
473
474 TEST_F(GLTextureMailboxTest, ProduceTextureDirectInvalidTarget) { 379 TEST_F(GLTextureMailboxTest, ProduceTextureDirectInvalidTarget) {
475 gl1_.MakeCurrent(); 380 gl1_.MakeCurrent();
476 381
477 GLbyte mailbox1[GL_MAILBOX_SIZE_CHROMIUM]; 382 GLbyte mailbox1[GL_MAILBOX_SIZE_CHROMIUM];
478 glGenMailboxCHROMIUM(mailbox1); 383 glGenMailboxCHROMIUM(mailbox1);
479 384
480 GLuint tex1; 385 GLuint tex1;
481 glGenTextures(1, &tex1); 386 glGenTextures(1, &tex1);
482 387
483 glBindTexture(GL_TEXTURE_CUBE_MAP, tex1); 388 glBindTexture(GL_TEXTURE_CUBE_MAP, tex1);
484 uint32_t source_pixel = 0xFF0000FF; 389 uint32_t source_pixel = 0xFF0000FF;
485 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 390 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X,
486 0, 391 0,
487 GL_RGBA, 392 GL_RGBA,
488 1, 1, 393 1, 1,
489 0, 394 0,
490 GL_RGBA, 395 GL_RGBA,
491 GL_UNSIGNED_BYTE, 396 GL_UNSIGNED_BYTE,
492 &source_pixel); 397 &source_pixel);
493 398
494 glProduceTextureDirectCHROMIUM(tex1, GL_TEXTURE_2D, mailbox1); 399 glProduceTextureDirectCHROMIUM(tex1, GL_TEXTURE_2D, mailbox1);
495 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError()); 400 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
496 } 401 }
497 402
498 // http://crbug.com/281565 403 // http://crbug.com/281565
499 #if !defined(OS_ANDROID) 404 #if !defined(OS_ANDROID)
500 TEST_F(GLTextureMailboxTest, TakeFrontBufferMultipleContexts) { 405 TEST_F(GLTextureMailboxTest, ProduceFrontBufferMultipleContexts) {
501 gl1_.MakeCurrent(); 406 gl1_.MakeCurrent();
502 Mailbox mailbox[2]; 407 Mailbox mailbox[2];
503 glGenMailboxCHROMIUM(mailbox[0].name); 408 glGenMailboxCHROMIUM(mailbox[0].name);
504 glGenMailboxCHROMIUM(mailbox[1].name); 409 glGenMailboxCHROMIUM(mailbox[1].name);
505 GLuint tex[2]; 410 GLuint tex[2];
506 glGenTextures(2, tex); 411 glGenTextures(2, tex);
507 412
508 GLManager::Options options; 413 GLManager::Options options;
509 options.share_mailbox_manager = &gl1_; 414 options.share_mailbox_manager = &gl1_;
510 GLManager other_gl[2]; 415 GLManager other_gl[2];
511 for (size_t i = 0; i < 2; ++i) { 416 for (size_t i = 0; i < 2; ++i) {
512 other_gl[i].Initialize(options); 417 other_gl[i].Initialize(options);
513 other_gl[i].MakeCurrent(); 418 other_gl[i].MakeCurrent();
514 glResizeCHROMIUM(10, 10, 1, true); 419 other_gl[i].decoder()->ProduceFrontBuffer(mailbox[i]);
515 glClearColor(1 - i % 2, i % 2, 0, 1);
516 glClear(GL_COLOR_BUFFER_BIT);
517 ::gles2::GetGLContext()->SwapBuffers();
518 other_gl[i].decoder()->TakeFrontBuffer(mailbox[i]);
519 // Make sure both "other gl" are in the same share group. 420 // Make sure both "other gl" are in the same share group.
520 if (!options.share_group_manager) 421 if (!options.share_group_manager)
521 options.share_group_manager = other_gl+i; 422 options.share_group_manager = other_gl+i;
522 } 423 }
523 424
425
524 gl1_.MakeCurrent(); 426 gl1_.MakeCurrent();
525 for (size_t i = 0; i < 2; ++i) { 427 for (size_t i = 0; i < 2; ++i) {
526 glBindTexture(GL_TEXTURE_2D, tex[i]); 428 glBindTexture(GL_TEXTURE_2D, tex[i]);
527 glConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox[i].name); 429 glConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox[i].name);
528 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 430 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
529 } 431 }
530 432
433 for (size_t i = 0; i < 2; ++i) {
434 other_gl[i].MakeCurrent();
435 glResizeCHROMIUM(10, 10, 1, true);
436 glClearColor(1-i%2, i%2, 0, 1);
437 glClear(GL_COLOR_BUFFER_BIT);
438 ::gles2::GetGLContext()->SwapBuffers();
439 }
440
531 gl1_.MakeCurrent(); 441 gl1_.MakeCurrent();
532 EXPECT_EQ(0xFF0000FFu, ReadTexel(tex[0], 0, 0)); 442 EXPECT_EQ(0xFF0000FFu, ReadTexel(tex[0], 0, 0));
533 EXPECT_EQ(0xFF00FF00u, ReadTexel(tex[1], 9, 9)); 443 EXPECT_EQ(0xFF00FF00u, ReadTexel(tex[1], 9, 9));
534 444
535 for (size_t i = 0; i < 2; ++i) { 445 for (size_t i = 0; i < 2; ++i) {
536 other_gl[i].MakeCurrent(); 446 other_gl[i].MakeCurrent();
537 other_gl[i].Destroy(); 447 other_gl[i].Destroy();
538 } 448 }
539 449
540 gl1_.MakeCurrent(); 450 gl1_.MakeCurrent();
541 glDeleteTextures(2, tex); 451 glDeleteTextures(2, tex);
542 } 452 }
543 #endif 453 #endif
544 454
545 } // namespace gpu 455 } // namespace gpu
546 456
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder_mock.h ('k') | gpu/ipc/client/command_buffer_proxy_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698