OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |