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

Side by Side Diff: gpu/command_buffer/service/texture_manager_unittest.cc

Issue 14188053: gpu: Change Produce/ConsumeTexture to allow texture sharing (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "gpu/command_buffer/service/texture_manager.h" 5 #include "gpu/command_buffer/service/texture_manager.h"
6 6
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "gpu/command_buffer/service/error_state_mock.h" 8 #include "gpu/command_buffer/service/error_state_mock.h"
9 #include "gpu/command_buffer/service/feature_info.h" 9 #include "gpu/command_buffer/service/feature_info.h"
10 #include "gpu/command_buffer/service/framebuffer_manager.h" 10 #include "gpu/command_buffer/service/framebuffer_manager.h"
11 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" 11 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h"
12 #include "gpu/command_buffer/service/mailbox_manager.h"
12 #include "gpu/command_buffer/service/memory_tracking.h" 13 #include "gpu/command_buffer/service/memory_tracking.h"
13 #include "gpu/command_buffer/service/mocks.h" 14 #include "gpu/command_buffer/service/mocks.h"
14 #include "gpu/command_buffer/service/test_helper.h" 15 #include "gpu/command_buffer/service/test_helper.h"
15 #include "gpu/command_buffer/service/texture_definition.h"
16 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "ui/gl/gl_mock.h" 17 #include "ui/gl/gl_mock.h"
18 18
19 using ::testing::AtLeast; 19 using ::testing::AtLeast;
20 using ::testing::Pointee; 20 using ::testing::Pointee;
21 using ::testing::Return; 21 using ::testing::Return;
22 using ::testing::SetArgumentPointee; 22 using ::testing::SetArgumentPointee;
23 using ::testing::StrictMock; 23 using ::testing::StrictMock;
24 using ::testing::_; 24 using ::testing::_;
25 25
(...skipping 1397 matching lines...) Expand 10 before | Expand all | Expand 10 after
1423 LevelInfo info; 1423 LevelInfo info;
1424 info.target = target; 1424 info.target = target;
1425 EXPECT_TRUE(texture->GetLevelSize(target, level, &info.width, 1425 EXPECT_TRUE(texture->GetLevelSize(target, level, &info.width,
1426 &info.height)); 1426 &info.height));
1427 EXPECT_TRUE(texture->GetLevelType(target, level, &info.type, 1427 EXPECT_TRUE(texture->GetLevelType(target, level, &info.type,
1428 &info.format)); 1428 &info.format));
1429 info.cleared = texture->IsLevelCleared(target, level); 1429 info.cleared = texture->IsLevelCleared(target, level);
1430 return info; 1430 return info;
1431 } 1431 }
1432 1432
1433 TextureDefinition* Save(TextureRef* texture_ref) { 1433 Texture* Save(TextureRef* texture_ref) {
apatrick_chromium 2013/05/23 18:37:11 Want to rename these to Produce/Consume as well?
piman 2013/05/24 02:32:22 Done.
1434 EXPECT_CALL(*gl_, GenTextures(_, _)) 1434 Texture* texture = manager_->Produce(texture_ref);
1435 .WillOnce(SetArgumentPointee<1>(kEmptyTextureServiceId)); 1435 EXPECT_TRUE(texture != NULL);
1436 TextureDefinition* definition = manager_->Save(texture_ref); 1436 return texture;
1437 EXPECT_TRUE(definition != NULL);
1438 return definition;
1439 } 1437 }
1440 1438
1441 void Restore(TextureRef* texture_ref, TextureDefinition* definition) { 1439 void Restore(GLuint client_id, Texture* texture) {
1442 EXPECT_CALL(*gl_, DeleteTextures(1, Pointee(texture_ref->service_id()))) 1440 EXPECT_TRUE(manager_->Consume(client_id, texture));
1443 .Times(1).RetiresOnSaturation();
1444 EXPECT_CALL(*gl_,
1445 BindTexture(definition->target(), definition->service_id()))
1446 .Times(1).RetiresOnSaturation();
1447 EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(AtLeast(1));
1448
1449 EXPECT_TRUE(manager_->Restore("TextureTest", decoder_.get(),
1450 texture_ref, definition));
1451 } 1441 }
1452 1442
1453 scoped_refptr<TextureRef> texture2_; 1443 scoped_refptr<TextureRef> texture2_;
1454 1444
1455 private: 1445 private:
1456 static const GLuint kEmptyTextureServiceId; 1446 static const GLuint kEmptyTextureServiceId;
no sievers 2013/05/24 01:31:38 nit: kEmptyTextureServiceId is not used anymore
piman 2013/05/24 02:32:22 Done.
1457 static const GLuint kClient2Id; 1447 static const GLuint kClient2Id;
1458 static const GLuint kService2Id; 1448 static const GLuint kService2Id;
1459 }; 1449 };
1460 1450
1461 const GLuint SaveRestoreTextureTest::kClient2Id = 2; 1451 const GLuint SaveRestoreTextureTest::kClient2Id = 2;
1462 const GLuint SaveRestoreTextureTest::kService2Id = 12; 1452 const GLuint SaveRestoreTextureTest::kService2Id = 12;
1463 const GLuint SaveRestoreTextureTest::kEmptyTextureServiceId = 13; 1453 const GLuint SaveRestoreTextureTest::kEmptyTextureServiceId = 13;
1464 1454
1465 TEST_F(SaveRestoreTextureTest, SaveRestore2D) { 1455 TEST_F(SaveRestoreTextureTest, SaveRestore2D) {
1466 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); 1456 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
1467 Texture* texture = texture_ref_->texture(); 1457 Texture* texture = texture_ref_->texture();
1468 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); 1458 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
1469 LevelInfo level0( 1459 LevelInfo level0(
1470 GL_TEXTURE_2D, GL_RGBA, 4, 4, 1, 0, GL_UNSIGNED_BYTE, true); 1460 GL_TEXTURE_2D, GL_RGBA, 4, 4, 1, 0, GL_UNSIGNED_BYTE, true);
1471 SetLevelInfo(texture_ref_, 0, level0); 1461 SetLevelInfo(texture_ref_, 0, level0);
1472 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_)); 1462 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_));
1473 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); 1463 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1474 LevelInfo level1 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 1); 1464 LevelInfo level1 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 1);
1475 LevelInfo level2 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 2); 1465 LevelInfo level2 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 2);
1476 scoped_ptr<TextureDefinition> definition(Save(texture_ref_)); 1466 Texture* produced_texture = Save(texture_ref_);
1477 const TextureDefinition::LevelInfos& infos = definition->level_infos(); 1467 EXPECT_EQ(produced_texture, texture);
1478 EXPECT_EQ(1U, infos.size());
1479 EXPECT_EQ(3U, infos[0].size());
1480 1468
1481 // Make this texture bigger with more levels, and make sure they get 1469 // Make this texture bigger with more levels, and make sure they get
1482 // clobbered correctly during Restore(). 1470 // clobbered correctly during Restore().
1483 manager_->SetTarget(texture2_, GL_TEXTURE_2D); 1471 manager_->SetTarget(texture2_, GL_TEXTURE_2D);
1484 SetLevelInfo( 1472 SetLevelInfo(
1485 texture2_, 1473 texture2_,
1486 0, 1474 0,
1487 LevelInfo(GL_TEXTURE_2D, GL_RGBA, 16, 16, 1, 0, GL_UNSIGNED_BYTE, false)); 1475 LevelInfo(GL_TEXTURE_2D, GL_RGBA, 16, 16, 1, 0, GL_UNSIGNED_BYTE, false));
1488 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture2_)); 1476 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture2_));
1489 texture = texture2_->texture(); 1477 texture = texture2_->texture();
1490 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); 1478 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1491 EXPECT_EQ(1024U + 256U + 64U + 16U + 4U, texture->estimated_size()); 1479 EXPECT_EQ(1024U + 256U + 64U + 16U + 4U, texture->estimated_size());
1492 Restore(texture2_, definition.release()); 1480
1493 EXPECT_EQ(level0, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 0)); 1481 GLuint client_id = texture2_->client_id();
1494 EXPECT_EQ(level1, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 1)); 1482 manager_->RemoveTexture(client_id);
1495 EXPECT_EQ(level2, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 2)); 1483 Restore(client_id, produced_texture);
1484 scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
1485 EXPECT_EQ(produced_texture, restored_texture->texture());
1486 EXPECT_EQ(level0, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 0));
1487 EXPECT_EQ(level1, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 1));
1488 EXPECT_EQ(level2, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 2));
1489 texture = restored_texture->texture();
1496 EXPECT_EQ(64U + 16U + 4U, texture->estimated_size()); 1490 EXPECT_EQ(64U + 16U + 4U, texture->estimated_size());
1497 GLint w, h; 1491 GLint w, h;
1498 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 3, &w, &h)); 1492 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 3, &w, &h));
1499 EXPECT_EQ(0, w); 1493
1500 EXPECT_EQ(0, h); 1494 // However the old texture ref still exists if it was referenced somewhere.
1495 EXPECT_EQ(1024U + 256U + 64U + 16U + 4U,
1496 texture2_->texture()->estimated_size());
1501 } 1497 }
1502 1498
1503 TEST_F(SaveRestoreTextureTest, SaveRestoreClearRectangle) { 1499 TEST_F(SaveRestoreTextureTest, SaveRestoreClearRectangle) {
1504 manager_->SetTarget(texture_ref_, GL_TEXTURE_RECTANGLE_ARB); 1500 manager_->SetTarget(texture_ref_, GL_TEXTURE_RECTANGLE_ARB);
1505 Texture* texture = texture_ref_->texture(); 1501 Texture* texture = texture_ref_->texture();
1506 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), texture->target()); 1502 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), texture->target());
1507 LevelInfo level0( 1503 LevelInfo level0(
1508 GL_TEXTURE_RECTANGLE_ARB, GL_RGBA, 1, 1, 1, 0, GL_UNSIGNED_BYTE, false); 1504 GL_TEXTURE_RECTANGLE_ARB, GL_RGBA, 1, 1, 1, 0, GL_UNSIGNED_BYTE, false);
1509 SetLevelInfo(texture_ref_, 0, level0); 1505 SetLevelInfo(texture_ref_, 0, level0);
1510 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); 1506 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1511 scoped_ptr<TextureDefinition> definition(Save(texture_ref_)); 1507 Texture* produced_texture = Save(texture_ref_);
1512 const TextureDefinition::LevelInfos& infos = definition->level_infos(); 1508 EXPECT_EQ(produced_texture, texture);
1513 EXPECT_EQ(1U, infos.size()); 1509 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB),
1514 EXPECT_EQ(1U, infos[0].size()); 1510 produced_texture->target());
1515 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), infos[0][0].target); 1511
1516 manager_->SetTarget(texture2_, GL_TEXTURE_RECTANGLE_ARB); 1512 GLuint client_id = texture2_->client_id();
1517 Restore(texture2_, definition.release()); 1513 manager_->RemoveTexture(client_id);
1514 Restore(client_id, produced_texture);
1515 scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
1516 EXPECT_EQ(produced_texture, restored_texture->texture());
1518 1517
1519 // See if we can clear the previously uncleared level now. 1518 // See if we can clear the previously uncleared level now.
1520 EXPECT_EQ(level0, GetLevelInfo(texture2_.get(), GL_TEXTURE_RECTANGLE_ARB, 0)); 1519 EXPECT_EQ(level0,
1520 GetLevelInfo(restored_texture.get(), GL_TEXTURE_RECTANGLE_ARB, 0));
1521 EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _)) 1521 EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _))
1522 .WillRepeatedly(Return(true)); 1522 .WillRepeatedly(Return(true));
1523 EXPECT_TRUE(manager_->ClearTextureLevel( 1523 EXPECT_TRUE(manager_->ClearTextureLevel(
1524 decoder_.get(), texture2_, GL_TEXTURE_RECTANGLE_ARB, 0)); 1524 decoder_.get(), restored_texture, GL_TEXTURE_RECTANGLE_ARB, 0));
1525 } 1525 }
1526 1526
1527 TEST_F(SaveRestoreTextureTest, SaveRestoreStreamTexture) { 1527 TEST_F(SaveRestoreTextureTest, SaveRestoreStreamTexture) {
1528 manager_->SetTarget(texture_ref_, GL_TEXTURE_EXTERNAL_OES); 1528 manager_->SetTarget(texture_ref_, GL_TEXTURE_EXTERNAL_OES);
1529 Texture* texture = texture_ref_->texture(); 1529 Texture* texture = texture_ref_->texture();
1530 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target()); 1530 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target());
1531 manager_->SetStreamTexture(texture_ref_, true); 1531 manager_->SetStreamTexture(texture_ref_, true);
1532 GLuint service_id = texture->service_id(); 1532 GLuint service_id = texture->service_id();
1533 scoped_ptr<TextureDefinition> definition(Save(texture_ref_)); 1533 Texture* produced_texture = Save(texture_ref_);
1534 EXPECT_FALSE(texture->IsStreamTexture()); 1534 EXPECT_TRUE(texture->IsStreamTexture());
1535 manager_->SetTarget(texture2_, GL_TEXTURE_EXTERNAL_OES); 1535
1536 Restore(texture2_, definition.release()); 1536 GLuint client_id = texture2_->client_id();
1537 EXPECT_TRUE(texture2_->texture()->IsStreamTexture()); 1537 manager_->RemoveTexture(client_id);
1538 EXPECT_TRUE(texture2_->texture()->IsImmutable()); 1538 Restore(client_id, produced_texture);
1539 EXPECT_EQ(service_id, texture2_->service_id()); 1539 scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
1540 EXPECT_EQ(produced_texture, restored_texture->texture());
1541 EXPECT_TRUE(restored_texture->texture()->IsStreamTexture());
1542 EXPECT_TRUE(restored_texture->texture()->IsImmutable());
1543 EXPECT_EQ(service_id, restored_texture->service_id());
1540 } 1544 }
1541 1545
1542 TEST_F(SaveRestoreTextureTest, SaveRestoreCube) { 1546 TEST_F(SaveRestoreTextureTest, SaveRestoreCube) {
1543 manager_->SetTarget(texture_ref_, GL_TEXTURE_CUBE_MAP); 1547 manager_->SetTarget(texture_ref_, GL_TEXTURE_CUBE_MAP);
1544 Texture* texture = texture_ref_->texture(); 1548 Texture* texture = texture_ref_->texture();
1545 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target()); 1549 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target());
1546 LevelInfo face0(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 1550 LevelInfo face0(GL_TEXTURE_CUBE_MAP_POSITIVE_X,
1547 GL_RGBA, 1551 GL_RGBA,
1548 1, 1552 1,
1549 1, 1553 1,
1550 1, 1554 1,
1551 0, 1555 0,
1552 GL_UNSIGNED_BYTE, 1556 GL_UNSIGNED_BYTE,
1553 true); 1557 true);
1554 LevelInfo face5(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 1558 LevelInfo face5(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
1555 GL_RGBA, 1559 GL_RGBA,
1556 3, 1560 3,
1557 3, 1561 3,
1558 1, 1562 1,
1559 0, 1563 0,
1560 GL_UNSIGNED_BYTE, 1564 GL_UNSIGNED_BYTE,
1561 true); 1565 true);
1562 SetLevelInfo(texture_ref_, 0, face0); 1566 SetLevelInfo(texture_ref_, 0, face0);
1563 SetLevelInfo(texture_ref_, 0, face5); 1567 SetLevelInfo(texture_ref_, 0, face5);
1564 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); 1568 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1565 scoped_ptr<TextureDefinition> definition(Save(texture_ref_)); 1569 Texture* produced_texture = Save(texture_ref_);
1566 const TextureDefinition::LevelInfos& infos = definition->level_infos(); 1570 EXPECT_EQ(produced_texture, texture);
1567 EXPECT_EQ(6U, infos.size()); 1571
1568 EXPECT_EQ(1U, infos[0].size()); 1572 GLuint client_id = texture2_->client_id();
1569 manager_->SetTarget(texture2_, GL_TEXTURE_CUBE_MAP); 1573 manager_->RemoveTexture(client_id);
1570 Restore(texture2_, definition.release()); 1574 Restore(client_id, produced_texture);
1575 scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
1576 EXPECT_EQ(produced_texture, restored_texture->texture());
1571 EXPECT_EQ(face0, 1577 EXPECT_EQ(face0,
1572 GetLevelInfo(texture2_.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0)); 1578 GetLevelInfo(restored_texture, GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0));
1573 EXPECT_EQ(face5, 1579 EXPECT_EQ(face5,
1574 GetLevelInfo(texture2_.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0)); 1580 GetLevelInfo(restored_texture, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0));
1575 } 1581 }
1576 1582
1577 class CountingMemoryTracker : public MemoryTracker { 1583 class CountingMemoryTracker : public MemoryTracker {
1578 public: 1584 public:
1579 CountingMemoryTracker() { 1585 CountingMemoryTracker() {
1580 current_size_[0] = 0; 1586 current_size_[0] = 0;
1581 current_size_[1] = 0; 1587 current_size_[1] = 0;
1582 } 1588 }
1583 1589
1584 virtual void TrackMemoryAllocatedChange(size_t old_size, 1590 virtual void TrackMemoryAllocatedChange(size_t old_size,
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1646 scoped_ptr< ::gfx::MockGLInterface > gl_; 1652 scoped_ptr< ::gfx::MockGLInterface > gl_;
1647 scoped_refptr<FeatureInfo> feature_info_; 1653 scoped_refptr<FeatureInfo> feature_info_;
1648 scoped_refptr<CountingMemoryTracker> memory_tracker1_; 1654 scoped_refptr<CountingMemoryTracker> memory_tracker1_;
1649 scoped_ptr<TextureManager> texture_manager1_; 1655 scoped_ptr<TextureManager> texture_manager1_;
1650 scoped_refptr<CountingMemoryTracker> memory_tracker2_; 1656 scoped_refptr<CountingMemoryTracker> memory_tracker2_;
1651 scoped_ptr<TextureManager> texture_manager2_; 1657 scoped_ptr<TextureManager> texture_manager2_;
1652 }; 1658 };
1653 1659
1654 TEST_F(SharedTextureTest, DeleteTextures) { 1660 TEST_F(SharedTextureTest, DeleteTextures) {
1655 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10); 1661 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
1656 scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(), 1662 scoped_refptr<TextureRef> ref2 =
1657 ref1->texture()); 1663 texture_manager2_->Consume(20, ref1->texture());
1658 EXPECT_CALL(*gl_, DeleteTextures(1, _)) 1664 EXPECT_CALL(*gl_, DeleteTextures(1, _))
1659 .Times(0); 1665 .Times(0);
1660 ref1 = NULL; 1666 ref1 = NULL;
1661 texture_manager1_->RemoveTexture(10); 1667 texture_manager1_->RemoveTexture(10);
1662 testing::Mock::VerifyAndClearExpectations(gl_.get()); 1668 testing::Mock::VerifyAndClearExpectations(gl_.get());
1663 1669
1664 EXPECT_CALL(*gl_, DeleteTextures(1, _)) 1670 EXPECT_CALL(*gl_, DeleteTextures(1, _))
1665 .Times(1) 1671 .Times(1)
1666 .RetiresOnSaturation(); 1672 .RetiresOnSaturation();
1667 ref2 = NULL; 1673 ref2 = NULL;
1674 texture_manager2_->RemoveTexture(20);
1668 testing::Mock::VerifyAndClearExpectations(gl_.get()); 1675 testing::Mock::VerifyAndClearExpectations(gl_.get());
1669 } 1676 }
1670 1677
1671 TEST_F(SharedTextureTest, TextureSafetyAccounting) { 1678 TEST_F(SharedTextureTest, TextureSafetyAccounting) {
1672 EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures()); 1679 EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures());
1673 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures()); 1680 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
1674 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips()); 1681 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
1675 EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures()); 1682 EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures());
1676 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures()); 1683 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
1677 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips()); 1684 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
1678 1685
1679 // Newly created texture is unrenderable. 1686 // Newly created texture is renderable.
1680 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10); 1687 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
1681 EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures()); 1688 EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures());
1682 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures()); 1689 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
1683 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips()); 1690 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
1684 1691
1685 // Associate new texture ref to other texture manager, should account for it 1692 // Associate new texture ref to other texture manager, should account for it
1686 // too. 1693 // too.
1687 scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(), 1694 scoped_refptr<TextureRef> ref2 =
1688 ref1->texture()); 1695 texture_manager2_->Consume(20, ref1->texture());
1689 EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures()); 1696 EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures());
1690 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures()); 1697 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
1691 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips()); 1698 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
1692 1699
1693 // Make texture renderable but uncleared on one texture manager, should affect 1700 // Make texture renderable but uncleared on one texture manager, should affect
1694 // other one. 1701 // other one.
1695 texture_manager1_->SetTarget(ref1, GL_TEXTURE_2D); 1702 texture_manager1_->SetTarget(ref1, GL_TEXTURE_2D);
1696 EXPECT_TRUE(texture_manager1_->HaveUnrenderableTextures()); 1703 EXPECT_TRUE(texture_manager1_->HaveUnrenderableTextures());
1697 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures()); 1704 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
1698 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips()); 1705 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
(...skipping 14 matching lines...) Expand all
1713 texture_manager1_->SetLevelCleared(ref1, GL_TEXTURE_2D, 0, true); 1720 texture_manager1_->SetLevelCleared(ref1, GL_TEXTURE_2D, 0, true);
1714 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures()); 1721 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
1715 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips()); 1722 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
1716 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures()); 1723 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
1717 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips()); 1724 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
1718 1725
1719 EXPECT_CALL(*gl_, DeleteTextures(1, _)) 1726 EXPECT_CALL(*gl_, DeleteTextures(1, _))
1720 .Times(1) 1727 .Times(1)
1721 .RetiresOnSaturation(); 1728 .RetiresOnSaturation();
1722 texture_manager1_->RemoveTexture(10); 1729 texture_manager1_->RemoveTexture(10);
1730 texture_manager2_->RemoveTexture(20);
1723 } 1731 }
1724 1732
1725 TEST_F(SharedTextureTest, FBOCompletenessCheck) { 1733 TEST_F(SharedTextureTest, FBOCompletenessCheck) {
1726 const GLenum kCompleteValue = GL_FRAMEBUFFER_COMPLETE; 1734 const GLenum kCompleteValue = GL_FRAMEBUFFER_COMPLETE;
1727 FramebufferManager framebuffer_manager1(1, 1); 1735 FramebufferManager framebuffer_manager1(1, 1);
1728 texture_manager1_->set_framebuffer_manager(&framebuffer_manager1); 1736 texture_manager1_->set_framebuffer_manager(&framebuffer_manager1);
1729 FramebufferManager framebuffer_manager2(1, 1); 1737 FramebufferManager framebuffer_manager2(1, 1);
1730 texture_manager2_->set_framebuffer_manager(&framebuffer_manager2); 1738 texture_manager2_->set_framebuffer_manager(&framebuffer_manager2);
1731 1739
1732 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10); 1740 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
1733 framebuffer_manager1.CreateFramebuffer(10, 10); 1741 framebuffer_manager1.CreateFramebuffer(10, 10);
1734 scoped_refptr<Framebuffer> framebuffer1 = 1742 scoped_refptr<Framebuffer> framebuffer1 =
1735 framebuffer_manager1.GetFramebuffer(10); 1743 framebuffer_manager1.GetFramebuffer(10);
1736 framebuffer1->AttachTexture(GL_COLOR_ATTACHMENT0, ref1, GL_TEXTURE_2D, 0); 1744 framebuffer1->AttachTexture(GL_COLOR_ATTACHMENT0, ref1, GL_TEXTURE_2D, 0);
1737 EXPECT_FALSE(framebuffer_manager1.IsComplete(framebuffer1)); 1745 EXPECT_FALSE(framebuffer_manager1.IsComplete(framebuffer1));
1738 EXPECT_NE(kCompleteValue, framebuffer1->IsPossiblyComplete()); 1746 EXPECT_NE(kCompleteValue, framebuffer1->IsPossiblyComplete());
1739 1747
1740 // Make FBO complete in manager 1. 1748 // Make FBO complete in manager 1.
1741 texture_manager1_->SetTarget(ref1, GL_TEXTURE_2D); 1749 texture_manager1_->SetTarget(ref1, GL_TEXTURE_2D);
1742 texture_manager1_->SetLevelInfo(ref1, GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, 1750 texture_manager1_->SetLevelInfo(ref1, GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0,
1743 GL_RGBA, GL_UNSIGNED_BYTE, true); 1751 GL_RGBA, GL_UNSIGNED_BYTE, true);
1744 EXPECT_EQ(kCompleteValue, framebuffer1->IsPossiblyComplete()); 1752 EXPECT_EQ(kCompleteValue, framebuffer1->IsPossiblyComplete());
1745 framebuffer_manager1.MarkAsComplete(framebuffer1); 1753 framebuffer_manager1.MarkAsComplete(framebuffer1);
1746 EXPECT_TRUE(framebuffer_manager1.IsComplete(framebuffer1)); 1754 EXPECT_TRUE(framebuffer_manager1.IsComplete(framebuffer1));
1747 1755
1748 // Share texture with manager 2. 1756 // Share texture with manager 2.
1749 scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(), 1757 scoped_refptr<TextureRef> ref2 =
1750 ref1->texture()); 1758 texture_manager2_->Consume(20, ref1->texture());
1751 framebuffer_manager2.CreateFramebuffer(20, 20); 1759 framebuffer_manager2.CreateFramebuffer(20, 20);
1752 scoped_refptr<Framebuffer> framebuffer2 = 1760 scoped_refptr<Framebuffer> framebuffer2 =
1753 framebuffer_manager2.GetFramebuffer(20); 1761 framebuffer_manager2.GetFramebuffer(20);
1754 framebuffer2->AttachTexture(GL_COLOR_ATTACHMENT0, ref2, GL_TEXTURE_2D, 0); 1762 framebuffer2->AttachTexture(GL_COLOR_ATTACHMENT0, ref2, GL_TEXTURE_2D, 0);
1755 EXPECT_FALSE(framebuffer_manager2.IsComplete(framebuffer2)); 1763 EXPECT_FALSE(framebuffer_manager2.IsComplete(framebuffer2));
1756 EXPECT_EQ(kCompleteValue, framebuffer2->IsPossiblyComplete()); 1764 EXPECT_EQ(kCompleteValue, framebuffer2->IsPossiblyComplete());
1757 framebuffer_manager2.MarkAsComplete(framebuffer2); 1765 framebuffer_manager2.MarkAsComplete(framebuffer2);
1758 EXPECT_TRUE(framebuffer_manager2.IsComplete(framebuffer2)); 1766 EXPECT_TRUE(framebuffer_manager2.IsComplete(framebuffer2));
1759 1767
1760 // Change level for texture, both FBOs should be marked incomplete 1768 // Change level for texture, both FBOs should be marked incomplete
(...skipping 10 matching lines...) Expand all
1771 1779
1772 EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, _)) 1780 EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, _))
1773 .Times(2) 1781 .Times(2)
1774 .RetiresOnSaturation(); 1782 .RetiresOnSaturation();
1775 framebuffer_manager1.RemoveFramebuffer(10); 1783 framebuffer_manager1.RemoveFramebuffer(10);
1776 framebuffer_manager2.RemoveFramebuffer(20); 1784 framebuffer_manager2.RemoveFramebuffer(20);
1777 EXPECT_CALL(*gl_, DeleteTextures(1, _)) 1785 EXPECT_CALL(*gl_, DeleteTextures(1, _))
1778 .Times(1) 1786 .Times(1)
1779 .RetiresOnSaturation(); 1787 .RetiresOnSaturation();
1780 texture_manager1_->RemoveTexture(10); 1788 texture_manager1_->RemoveTexture(10);
1789 texture_manager2_->RemoveTexture(20);
1781 } 1790 }
1782 1791
1783 TEST_F(SharedTextureTest, Memory) { 1792 TEST_F(SharedTextureTest, Memory) {
1784 size_t initial_memory1 = memory_tracker1_->GetSize(MemoryTracker::kUnmanaged); 1793 size_t initial_memory1 = memory_tracker1_->GetSize(MemoryTracker::kUnmanaged);
1785 size_t initial_memory2 = memory_tracker2_->GetSize(MemoryTracker::kUnmanaged); 1794 size_t initial_memory2 = memory_tracker2_->GetSize(MemoryTracker::kUnmanaged);
1786 1795
1787 // Newly created texture is unrenderable. 1796 // Newly created texture is unrenderable.
1788 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10); 1797 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
1789 texture_manager1_->SetTarget(ref1, GL_TEXTURE_2D); 1798 texture_manager1_->SetTarget(ref1, GL_TEXTURE_2D);
1790 texture_manager1_->SetLevelInfo(ref1, GL_TEXTURE_2D, 0, GL_RGBA, 10, 10, 1, 0, 1799 texture_manager1_->SetLevelInfo(ref1, GL_TEXTURE_2D, 0, GL_RGBA, 10, 10, 1, 0,
1791 GL_RGBA, GL_UNSIGNED_BYTE, false); 1800 GL_RGBA, GL_UNSIGNED_BYTE, false);
1792 1801
1793 EXPECT_LT(0u, ref1->texture()->estimated_size()); 1802 EXPECT_LT(0u, ref1->texture()->estimated_size());
1794 EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(), 1803 EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(),
1795 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged)); 1804 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
1796 1805
1797 // Associate new texture ref to other texture manager, it doesn't account for 1806 // Associate new texture ref to other texture manager, it doesn't account for
1798 // the texture memory, the first memory tracker still has it. 1807 // the texture memory, the first memory tracker still has it.
1799 scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(), 1808 scoped_refptr<TextureRef> ref2 =
1800 ref1->texture()); 1809 texture_manager2_->Consume(20, ref1->texture());
1801 EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(), 1810 EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(),
1802 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged)); 1811 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
1803 EXPECT_EQ(initial_memory2, 1812 EXPECT_EQ(initial_memory2,
1804 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged)); 1813 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
1805 1814
1806 // Delete the texture, memory should go to the remaining tracker. 1815 // Delete the texture, memory should go to the remaining tracker.
1807 texture_manager1_->RemoveTexture(10); 1816 texture_manager1_->RemoveTexture(10);
1808 ref1 = NULL; 1817 ref1 = NULL;
1809 EXPECT_EQ(initial_memory1, 1818 EXPECT_EQ(initial_memory1,
1810 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged)); 1819 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
1811 EXPECT_EQ(initial_memory2 + ref2->texture()->estimated_size(), 1820 EXPECT_EQ(initial_memory2 + ref2->texture()->estimated_size(),
1812 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged)); 1821 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
1813 1822
1814 EXPECT_CALL(*gl_, DeleteTextures(1, _)) 1823 EXPECT_CALL(*gl_, DeleteTextures(1, _))
1815 .Times(1) 1824 .Times(1)
1816 .RetiresOnSaturation(); 1825 .RetiresOnSaturation();
1817 ref2 = NULL; 1826 ref2 = NULL;
1827 texture_manager2_->RemoveTexture(20);
1818 EXPECT_EQ(initial_memory2, 1828 EXPECT_EQ(initial_memory2,
1819 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged)); 1829 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
1820 } 1830 }
1821 1831
1822 } // namespace gles2 1832 } // namespace gles2
1823 } // namespace gpu 1833 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698