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 1293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1319 // Check putting it back genenerates the same signature | 1319 // Check putting it back genenerates the same signature |
1320 SetParameter(texture_ref_, GL_TEXTURE_WRAP_T, GL_REPEAT, GL_NO_ERROR); | 1320 SetParameter(texture_ref_, GL_TEXTURE_WRAP_T, GL_REPEAT, GL_NO_ERROR); |
1321 signature2.clear(); | 1321 signature2.clear(); |
1322 manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2); | 1322 manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2); |
1323 EXPECT_EQ(signature1, signature2); | 1323 EXPECT_EQ(signature1, signature2); |
1324 | 1324 |
1325 // Check the set was acutally getting different signatures. | 1325 // Check the set was acutally getting different signatures. |
1326 EXPECT_EQ(11u, string_set.size()); | 1326 EXPECT_EQ(11u, string_set.size()); |
1327 } | 1327 } |
1328 | 1328 |
1329 class SaveRestoreTextureTest : public TextureTest { | 1329 class ProduceConsumeTextureTest : public TextureTest { |
1330 public: | 1330 public: |
1331 virtual void SetUp() { | 1331 virtual void SetUp() { |
1332 TextureTest::SetUpBase(NULL, "GL_OES_EGL_image_external"); | 1332 TextureTest::SetUpBase(NULL, "GL_OES_EGL_image_external"); |
1333 manager_->CreateTexture(kClient2Id, kService2Id); | 1333 manager_->CreateTexture(kClient2Id, kService2Id); |
1334 texture2_ = manager_->GetTexture(kClient2Id); | 1334 texture2_ = manager_->GetTexture(kClient2Id); |
1335 | 1335 |
1336 EXPECT_CALL(*decoder_.get(), GetErrorState()) | 1336 EXPECT_CALL(*decoder_.get(), GetErrorState()) |
1337 .WillRepeatedly(Return(error_state_.get())); | 1337 .WillRepeatedly(Return(error_state_.get())); |
1338 } | 1338 } |
1339 | 1339 |
(...skipping 83 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* Produce(TextureRef* texture_ref) { |
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 Consume(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; | |
1457 static const GLuint kClient2Id; | 1446 static const GLuint kClient2Id; |
1458 static const GLuint kService2Id; | 1447 static const GLuint kService2Id; |
1459 }; | 1448 }; |
1460 | 1449 |
1461 const GLuint SaveRestoreTextureTest::kClient2Id = 2; | 1450 const GLuint ProduceConsumeTextureTest::kClient2Id = 2; |
1462 const GLuint SaveRestoreTextureTest::kService2Id = 12; | 1451 const GLuint ProduceConsumeTextureTest::kService2Id = 12; |
1463 const GLuint SaveRestoreTextureTest::kEmptyTextureServiceId = 13; | |
1464 | 1452 |
1465 TEST_F(SaveRestoreTextureTest, SaveRestore2D) { | 1453 TEST_F(ProduceConsumeTextureTest, ProduceConsume2D) { |
1466 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); | 1454 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); |
1467 Texture* texture = texture_ref_->texture(); | 1455 Texture* texture = texture_ref_->texture(); |
1468 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); | 1456 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); |
1469 LevelInfo level0( | 1457 LevelInfo level0( |
1470 GL_TEXTURE_2D, GL_RGBA, 4, 4, 1, 0, GL_UNSIGNED_BYTE, true); | 1458 GL_TEXTURE_2D, GL_RGBA, 4, 4, 1, 0, GL_UNSIGNED_BYTE, true); |
1471 SetLevelInfo(texture_ref_, 0, level0); | 1459 SetLevelInfo(texture_ref_, 0, level0); |
1472 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_)); | 1460 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_)); |
1473 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 1461 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); |
1474 LevelInfo level1 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 1); | 1462 LevelInfo level1 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 1); |
1475 LevelInfo level2 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 2); | 1463 LevelInfo level2 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 2); |
1476 scoped_ptr<TextureDefinition> definition(Save(texture_ref_)); | 1464 Texture* produced_texture = Produce(texture_ref_); |
1477 const TextureDefinition::LevelInfos& infos = definition->level_infos(); | 1465 EXPECT_EQ(produced_texture, texture); |
1478 EXPECT_EQ(1U, infos.size()); | |
1479 EXPECT_EQ(3U, infos[0].size()); | |
1480 | 1466 |
1481 // Make this texture bigger with more levels, and make sure they get | 1467 // Make this texture bigger with more levels, and make sure they get |
1482 // clobbered correctly during Restore(). | 1468 // clobbered correctly during Consume(). |
1483 manager_->SetTarget(texture2_, GL_TEXTURE_2D); | 1469 manager_->SetTarget(texture2_, GL_TEXTURE_2D); |
1484 SetLevelInfo( | 1470 SetLevelInfo( |
1485 texture2_, | 1471 texture2_, |
1486 0, | 1472 0, |
1487 LevelInfo(GL_TEXTURE_2D, GL_RGBA, 16, 16, 1, 0, GL_UNSIGNED_BYTE, false)); | 1473 LevelInfo(GL_TEXTURE_2D, GL_RGBA, 16, 16, 1, 0, GL_UNSIGNED_BYTE, false)); |
1488 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture2_)); | 1474 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture2_)); |
1489 texture = texture2_->texture(); | 1475 texture = texture2_->texture(); |
1490 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 1476 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); |
1491 EXPECT_EQ(1024U + 256U + 64U + 16U + 4U, texture->estimated_size()); | 1477 EXPECT_EQ(1024U + 256U + 64U + 16U + 4U, texture->estimated_size()); |
1492 Restore(texture2_, definition.release()); | 1478 |
1493 EXPECT_EQ(level0, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 0)); | 1479 GLuint client_id = texture2_->client_id(); |
1494 EXPECT_EQ(level1, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 1)); | 1480 manager_->RemoveTexture(client_id); |
1495 EXPECT_EQ(level2, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 2)); | 1481 Consume(client_id, produced_texture); |
| 1482 scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id); |
| 1483 EXPECT_EQ(produced_texture, restored_texture->texture()); |
| 1484 EXPECT_EQ(level0, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 0)); |
| 1485 EXPECT_EQ(level1, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 1)); |
| 1486 EXPECT_EQ(level2, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 2)); |
| 1487 texture = restored_texture->texture(); |
1496 EXPECT_EQ(64U + 16U + 4U, texture->estimated_size()); | 1488 EXPECT_EQ(64U + 16U + 4U, texture->estimated_size()); |
1497 GLint w, h; | 1489 GLint w, h; |
1498 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 3, &w, &h)); | 1490 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 3, &w, &h)); |
1499 EXPECT_EQ(0, w); | 1491 |
1500 EXPECT_EQ(0, h); | 1492 // However the old texture ref still exists if it was referenced somewhere. |
| 1493 EXPECT_EQ(1024U + 256U + 64U + 16U + 4U, |
| 1494 texture2_->texture()->estimated_size()); |
1501 } | 1495 } |
1502 | 1496 |
1503 TEST_F(SaveRestoreTextureTest, SaveRestoreClearRectangle) { | 1497 TEST_F(ProduceConsumeTextureTest, ProduceConsumeClearRectangle) { |
1504 manager_->SetTarget(texture_ref_, GL_TEXTURE_RECTANGLE_ARB); | 1498 manager_->SetTarget(texture_ref_, GL_TEXTURE_RECTANGLE_ARB); |
1505 Texture* texture = texture_ref_->texture(); | 1499 Texture* texture = texture_ref_->texture(); |
1506 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), texture->target()); | 1500 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), texture->target()); |
1507 LevelInfo level0( | 1501 LevelInfo level0( |
1508 GL_TEXTURE_RECTANGLE_ARB, GL_RGBA, 1, 1, 1, 0, GL_UNSIGNED_BYTE, false); | 1502 GL_TEXTURE_RECTANGLE_ARB, GL_RGBA, 1, 1, 1, 0, GL_UNSIGNED_BYTE, false); |
1509 SetLevelInfo(texture_ref_, 0, level0); | 1503 SetLevelInfo(texture_ref_, 0, level0); |
1510 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 1504 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); |
1511 scoped_ptr<TextureDefinition> definition(Save(texture_ref_)); | 1505 Texture* produced_texture = Produce(texture_ref_); |
1512 const TextureDefinition::LevelInfos& infos = definition->level_infos(); | 1506 EXPECT_EQ(produced_texture, texture); |
1513 EXPECT_EQ(1U, infos.size()); | 1507 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), |
1514 EXPECT_EQ(1U, infos[0].size()); | 1508 produced_texture->target()); |
1515 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), infos[0][0].target); | 1509 |
1516 manager_->SetTarget(texture2_, GL_TEXTURE_RECTANGLE_ARB); | 1510 GLuint client_id = texture2_->client_id(); |
1517 Restore(texture2_, definition.release()); | 1511 manager_->RemoveTexture(client_id); |
| 1512 Consume(client_id, produced_texture); |
| 1513 scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id); |
| 1514 EXPECT_EQ(produced_texture, restored_texture->texture()); |
1518 | 1515 |
1519 // See if we can clear the previously uncleared level now. | 1516 // See if we can clear the previously uncleared level now. |
1520 EXPECT_EQ(level0, GetLevelInfo(texture2_.get(), GL_TEXTURE_RECTANGLE_ARB, 0)); | 1517 EXPECT_EQ(level0, |
| 1518 GetLevelInfo(restored_texture.get(), GL_TEXTURE_RECTANGLE_ARB, 0)); |
1521 EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _)) | 1519 EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _)) |
1522 .WillRepeatedly(Return(true)); | 1520 .WillRepeatedly(Return(true)); |
1523 EXPECT_TRUE(manager_->ClearTextureLevel( | 1521 EXPECT_TRUE(manager_->ClearTextureLevel( |
1524 decoder_.get(), texture2_, GL_TEXTURE_RECTANGLE_ARB, 0)); | 1522 decoder_.get(), restored_texture, GL_TEXTURE_RECTANGLE_ARB, 0)); |
1525 } | 1523 } |
1526 | 1524 |
1527 TEST_F(SaveRestoreTextureTest, SaveRestoreStreamTexture) { | 1525 TEST_F(ProduceConsumeTextureTest, ProduceConsumeStreamTexture) { |
1528 manager_->SetTarget(texture_ref_, GL_TEXTURE_EXTERNAL_OES); | 1526 manager_->SetTarget(texture_ref_, GL_TEXTURE_EXTERNAL_OES); |
1529 Texture* texture = texture_ref_->texture(); | 1527 Texture* texture = texture_ref_->texture(); |
1530 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target()); | 1528 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target()); |
1531 manager_->SetStreamTexture(texture_ref_, true); | 1529 manager_->SetStreamTexture(texture_ref_, true); |
1532 GLuint service_id = texture->service_id(); | 1530 GLuint service_id = texture->service_id(); |
1533 scoped_ptr<TextureDefinition> definition(Save(texture_ref_)); | 1531 Texture* produced_texture = Produce(texture_ref_); |
1534 EXPECT_FALSE(texture->IsStreamTexture()); | 1532 EXPECT_TRUE(texture->IsStreamTexture()); |
1535 manager_->SetTarget(texture2_, GL_TEXTURE_EXTERNAL_OES); | 1533 |
1536 Restore(texture2_, definition.release()); | 1534 GLuint client_id = texture2_->client_id(); |
1537 EXPECT_TRUE(texture2_->texture()->IsStreamTexture()); | 1535 manager_->RemoveTexture(client_id); |
1538 EXPECT_TRUE(texture2_->texture()->IsImmutable()); | 1536 Consume(client_id, produced_texture); |
1539 EXPECT_EQ(service_id, texture2_->service_id()); | 1537 scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id); |
| 1538 EXPECT_EQ(produced_texture, restored_texture->texture()); |
| 1539 EXPECT_TRUE(restored_texture->texture()->IsStreamTexture()); |
| 1540 EXPECT_TRUE(restored_texture->texture()->IsImmutable()); |
| 1541 EXPECT_EQ(service_id, restored_texture->service_id()); |
1540 } | 1542 } |
1541 | 1543 |
1542 TEST_F(SaveRestoreTextureTest, SaveRestoreCube) { | 1544 TEST_F(ProduceConsumeTextureTest, ProduceConsumeCube) { |
1543 manager_->SetTarget(texture_ref_, GL_TEXTURE_CUBE_MAP); | 1545 manager_->SetTarget(texture_ref_, GL_TEXTURE_CUBE_MAP); |
1544 Texture* texture = texture_ref_->texture(); | 1546 Texture* texture = texture_ref_->texture(); |
1545 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target()); | 1547 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target()); |
1546 LevelInfo face0(GL_TEXTURE_CUBE_MAP_POSITIVE_X, | 1548 LevelInfo face0(GL_TEXTURE_CUBE_MAP_POSITIVE_X, |
1547 GL_RGBA, | 1549 GL_RGBA, |
1548 1, | 1550 1, |
1549 1, | 1551 1, |
1550 1, | 1552 1, |
1551 0, | 1553 0, |
1552 GL_UNSIGNED_BYTE, | 1554 GL_UNSIGNED_BYTE, |
1553 true); | 1555 true); |
1554 LevelInfo face5(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, | 1556 LevelInfo face5(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, |
1555 GL_RGBA, | 1557 GL_RGBA, |
1556 3, | 1558 3, |
1557 3, | 1559 3, |
1558 1, | 1560 1, |
1559 0, | 1561 0, |
1560 GL_UNSIGNED_BYTE, | 1562 GL_UNSIGNED_BYTE, |
1561 true); | 1563 true); |
1562 SetLevelInfo(texture_ref_, 0, face0); | 1564 SetLevelInfo(texture_ref_, 0, face0); |
1563 SetLevelInfo(texture_ref_, 0, face5); | 1565 SetLevelInfo(texture_ref_, 0, face5); |
1564 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 1566 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); |
1565 scoped_ptr<TextureDefinition> definition(Save(texture_ref_)); | 1567 Texture* produced_texture = Produce(texture_ref_); |
1566 const TextureDefinition::LevelInfos& infos = definition->level_infos(); | 1568 EXPECT_EQ(produced_texture, texture); |
1567 EXPECT_EQ(6U, infos.size()); | 1569 |
1568 EXPECT_EQ(1U, infos[0].size()); | 1570 GLuint client_id = texture2_->client_id(); |
1569 manager_->SetTarget(texture2_, GL_TEXTURE_CUBE_MAP); | 1571 manager_->RemoveTexture(client_id); |
1570 Restore(texture2_, definition.release()); | 1572 Consume(client_id, produced_texture); |
| 1573 scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id); |
| 1574 EXPECT_EQ(produced_texture, restored_texture->texture()); |
1571 EXPECT_EQ(face0, | 1575 EXPECT_EQ(face0, |
1572 GetLevelInfo(texture2_.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0)); | 1576 GetLevelInfo(restored_texture, GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0)); |
1573 EXPECT_EQ(face5, | 1577 EXPECT_EQ(face5, |
1574 GetLevelInfo(texture2_.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0)); | 1578 GetLevelInfo(restored_texture, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0)); |
1575 } | 1579 } |
1576 | 1580 |
1577 class CountingMemoryTracker : public MemoryTracker { | 1581 class CountingMemoryTracker : public MemoryTracker { |
1578 public: | 1582 public: |
1579 CountingMemoryTracker() { | 1583 CountingMemoryTracker() { |
1580 current_size_[0] = 0; | 1584 current_size_[0] = 0; |
1581 current_size_[1] = 0; | 1585 current_size_[1] = 0; |
1582 } | 1586 } |
1583 | 1587 |
1584 virtual void TrackMemoryAllocatedChange(size_t old_size, | 1588 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_; | 1650 scoped_ptr< ::gfx::MockGLInterface > gl_; |
1647 scoped_refptr<FeatureInfo> feature_info_; | 1651 scoped_refptr<FeatureInfo> feature_info_; |
1648 scoped_refptr<CountingMemoryTracker> memory_tracker1_; | 1652 scoped_refptr<CountingMemoryTracker> memory_tracker1_; |
1649 scoped_ptr<TextureManager> texture_manager1_; | 1653 scoped_ptr<TextureManager> texture_manager1_; |
1650 scoped_refptr<CountingMemoryTracker> memory_tracker2_; | 1654 scoped_refptr<CountingMemoryTracker> memory_tracker2_; |
1651 scoped_ptr<TextureManager> texture_manager2_; | 1655 scoped_ptr<TextureManager> texture_manager2_; |
1652 }; | 1656 }; |
1653 | 1657 |
1654 TEST_F(SharedTextureTest, DeleteTextures) { | 1658 TEST_F(SharedTextureTest, DeleteTextures) { |
1655 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10); | 1659 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10); |
1656 scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(), | 1660 scoped_refptr<TextureRef> ref2 = |
1657 ref1->texture()); | 1661 texture_manager2_->Consume(20, ref1->texture()); |
1658 EXPECT_CALL(*gl_, DeleteTextures(1, _)) | 1662 EXPECT_CALL(*gl_, DeleteTextures(1, _)) |
1659 .Times(0); | 1663 .Times(0); |
1660 ref1 = NULL; | 1664 ref1 = NULL; |
1661 texture_manager1_->RemoveTexture(10); | 1665 texture_manager1_->RemoveTexture(10); |
1662 testing::Mock::VerifyAndClearExpectations(gl_.get()); | 1666 testing::Mock::VerifyAndClearExpectations(gl_.get()); |
1663 | 1667 |
1664 EXPECT_CALL(*gl_, DeleteTextures(1, _)) | 1668 EXPECT_CALL(*gl_, DeleteTextures(1, _)) |
1665 .Times(1) | 1669 .Times(1) |
1666 .RetiresOnSaturation(); | 1670 .RetiresOnSaturation(); |
1667 ref2 = NULL; | 1671 ref2 = NULL; |
| 1672 texture_manager2_->RemoveTexture(20); |
1668 testing::Mock::VerifyAndClearExpectations(gl_.get()); | 1673 testing::Mock::VerifyAndClearExpectations(gl_.get()); |
1669 } | 1674 } |
1670 | 1675 |
1671 TEST_F(SharedTextureTest, TextureSafetyAccounting) { | 1676 TEST_F(SharedTextureTest, TextureSafetyAccounting) { |
1672 EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures()); | 1677 EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures()); |
1673 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures()); | 1678 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures()); |
1674 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips()); | 1679 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips()); |
1675 EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures()); | 1680 EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures()); |
1676 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures()); | 1681 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures()); |
1677 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips()); | 1682 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips()); |
1678 | 1683 |
1679 // Newly created texture is unrenderable. | 1684 // Newly created texture is renderable. |
1680 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10); | 1685 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10); |
1681 EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures()); | 1686 EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures()); |
1682 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures()); | 1687 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures()); |
1683 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips()); | 1688 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips()); |
1684 | 1689 |
1685 // Associate new texture ref to other texture manager, should account for it | 1690 // Associate new texture ref to other texture manager, should account for it |
1686 // too. | 1691 // too. |
1687 scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(), | 1692 scoped_refptr<TextureRef> ref2 = |
1688 ref1->texture()); | 1693 texture_manager2_->Consume(20, ref1->texture()); |
1689 EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures()); | 1694 EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures()); |
1690 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures()); | 1695 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures()); |
1691 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips()); | 1696 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips()); |
1692 | 1697 |
1693 // Make texture renderable but uncleared on one texture manager, should affect | 1698 // Make texture renderable but uncleared on one texture manager, should affect |
1694 // other one. | 1699 // other one. |
1695 texture_manager1_->SetTarget(ref1, GL_TEXTURE_2D); | 1700 texture_manager1_->SetTarget(ref1, GL_TEXTURE_2D); |
1696 EXPECT_TRUE(texture_manager1_->HaveUnrenderableTextures()); | 1701 EXPECT_TRUE(texture_manager1_->HaveUnrenderableTextures()); |
1697 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures()); | 1702 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures()); |
1698 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips()); | 1703 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips()); |
(...skipping 14 matching lines...) Expand all Loading... |
1713 texture_manager1_->SetLevelCleared(ref1, GL_TEXTURE_2D, 0, true); | 1718 texture_manager1_->SetLevelCleared(ref1, GL_TEXTURE_2D, 0, true); |
1714 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures()); | 1719 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures()); |
1715 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips()); | 1720 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips()); |
1716 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures()); | 1721 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures()); |
1717 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips()); | 1722 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips()); |
1718 | 1723 |
1719 EXPECT_CALL(*gl_, DeleteTextures(1, _)) | 1724 EXPECT_CALL(*gl_, DeleteTextures(1, _)) |
1720 .Times(1) | 1725 .Times(1) |
1721 .RetiresOnSaturation(); | 1726 .RetiresOnSaturation(); |
1722 texture_manager1_->RemoveTexture(10); | 1727 texture_manager1_->RemoveTexture(10); |
| 1728 texture_manager2_->RemoveTexture(20); |
1723 } | 1729 } |
1724 | 1730 |
1725 TEST_F(SharedTextureTest, FBOCompletenessCheck) { | 1731 TEST_F(SharedTextureTest, FBOCompletenessCheck) { |
1726 const GLenum kCompleteValue = GL_FRAMEBUFFER_COMPLETE; | 1732 const GLenum kCompleteValue = GL_FRAMEBUFFER_COMPLETE; |
1727 FramebufferManager framebuffer_manager1(1, 1); | 1733 FramebufferManager framebuffer_manager1(1, 1); |
1728 texture_manager1_->set_framebuffer_manager(&framebuffer_manager1); | 1734 texture_manager1_->set_framebuffer_manager(&framebuffer_manager1); |
1729 FramebufferManager framebuffer_manager2(1, 1); | 1735 FramebufferManager framebuffer_manager2(1, 1); |
1730 texture_manager2_->set_framebuffer_manager(&framebuffer_manager2); | 1736 texture_manager2_->set_framebuffer_manager(&framebuffer_manager2); |
1731 | 1737 |
1732 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10); | 1738 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10); |
1733 framebuffer_manager1.CreateFramebuffer(10, 10); | 1739 framebuffer_manager1.CreateFramebuffer(10, 10); |
1734 scoped_refptr<Framebuffer> framebuffer1 = | 1740 scoped_refptr<Framebuffer> framebuffer1 = |
1735 framebuffer_manager1.GetFramebuffer(10); | 1741 framebuffer_manager1.GetFramebuffer(10); |
1736 framebuffer1->AttachTexture(GL_COLOR_ATTACHMENT0, ref1, GL_TEXTURE_2D, 0); | 1742 framebuffer1->AttachTexture(GL_COLOR_ATTACHMENT0, ref1, GL_TEXTURE_2D, 0); |
1737 EXPECT_FALSE(framebuffer_manager1.IsComplete(framebuffer1)); | 1743 EXPECT_FALSE(framebuffer_manager1.IsComplete(framebuffer1)); |
1738 EXPECT_NE(kCompleteValue, framebuffer1->IsPossiblyComplete()); | 1744 EXPECT_NE(kCompleteValue, framebuffer1->IsPossiblyComplete()); |
1739 | 1745 |
1740 // Make FBO complete in manager 1. | 1746 // Make FBO complete in manager 1. |
1741 texture_manager1_->SetTarget(ref1, GL_TEXTURE_2D); | 1747 texture_manager1_->SetTarget(ref1, GL_TEXTURE_2D); |
1742 texture_manager1_->SetLevelInfo(ref1, GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, | 1748 texture_manager1_->SetLevelInfo(ref1, GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, |
1743 GL_RGBA, GL_UNSIGNED_BYTE, true); | 1749 GL_RGBA, GL_UNSIGNED_BYTE, true); |
1744 EXPECT_EQ(kCompleteValue, framebuffer1->IsPossiblyComplete()); | 1750 EXPECT_EQ(kCompleteValue, framebuffer1->IsPossiblyComplete()); |
1745 framebuffer_manager1.MarkAsComplete(framebuffer1); | 1751 framebuffer_manager1.MarkAsComplete(framebuffer1); |
1746 EXPECT_TRUE(framebuffer_manager1.IsComplete(framebuffer1)); | 1752 EXPECT_TRUE(framebuffer_manager1.IsComplete(framebuffer1)); |
1747 | 1753 |
1748 // Share texture with manager 2. | 1754 // Share texture with manager 2. |
1749 scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(), | 1755 scoped_refptr<TextureRef> ref2 = |
1750 ref1->texture()); | 1756 texture_manager2_->Consume(20, ref1->texture()); |
1751 framebuffer_manager2.CreateFramebuffer(20, 20); | 1757 framebuffer_manager2.CreateFramebuffer(20, 20); |
1752 scoped_refptr<Framebuffer> framebuffer2 = | 1758 scoped_refptr<Framebuffer> framebuffer2 = |
1753 framebuffer_manager2.GetFramebuffer(20); | 1759 framebuffer_manager2.GetFramebuffer(20); |
1754 framebuffer2->AttachTexture(GL_COLOR_ATTACHMENT0, ref2, GL_TEXTURE_2D, 0); | 1760 framebuffer2->AttachTexture(GL_COLOR_ATTACHMENT0, ref2, GL_TEXTURE_2D, 0); |
1755 EXPECT_FALSE(framebuffer_manager2.IsComplete(framebuffer2)); | 1761 EXPECT_FALSE(framebuffer_manager2.IsComplete(framebuffer2)); |
1756 EXPECT_EQ(kCompleteValue, framebuffer2->IsPossiblyComplete()); | 1762 EXPECT_EQ(kCompleteValue, framebuffer2->IsPossiblyComplete()); |
1757 framebuffer_manager2.MarkAsComplete(framebuffer2); | 1763 framebuffer_manager2.MarkAsComplete(framebuffer2); |
1758 EXPECT_TRUE(framebuffer_manager2.IsComplete(framebuffer2)); | 1764 EXPECT_TRUE(framebuffer_manager2.IsComplete(framebuffer2)); |
1759 | 1765 |
1760 // Change level for texture, both FBOs should be marked incomplete | 1766 // Change level for texture, both FBOs should be marked incomplete |
(...skipping 10 matching lines...) Expand all Loading... |
1771 | 1777 |
1772 EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, _)) | 1778 EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, _)) |
1773 .Times(2) | 1779 .Times(2) |
1774 .RetiresOnSaturation(); | 1780 .RetiresOnSaturation(); |
1775 framebuffer_manager1.RemoveFramebuffer(10); | 1781 framebuffer_manager1.RemoveFramebuffer(10); |
1776 framebuffer_manager2.RemoveFramebuffer(20); | 1782 framebuffer_manager2.RemoveFramebuffer(20); |
1777 EXPECT_CALL(*gl_, DeleteTextures(1, _)) | 1783 EXPECT_CALL(*gl_, DeleteTextures(1, _)) |
1778 .Times(1) | 1784 .Times(1) |
1779 .RetiresOnSaturation(); | 1785 .RetiresOnSaturation(); |
1780 texture_manager1_->RemoveTexture(10); | 1786 texture_manager1_->RemoveTexture(10); |
| 1787 texture_manager2_->RemoveTexture(20); |
1781 } | 1788 } |
1782 | 1789 |
1783 TEST_F(SharedTextureTest, Memory) { | 1790 TEST_F(SharedTextureTest, Memory) { |
1784 size_t initial_memory1 = memory_tracker1_->GetSize(MemoryTracker::kUnmanaged); | 1791 size_t initial_memory1 = memory_tracker1_->GetSize(MemoryTracker::kUnmanaged); |
1785 size_t initial_memory2 = memory_tracker2_->GetSize(MemoryTracker::kUnmanaged); | 1792 size_t initial_memory2 = memory_tracker2_->GetSize(MemoryTracker::kUnmanaged); |
1786 | 1793 |
1787 // Newly created texture is unrenderable. | 1794 // Newly created texture is unrenderable. |
1788 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10); | 1795 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10); |
1789 texture_manager1_->SetTarget(ref1, GL_TEXTURE_2D); | 1796 texture_manager1_->SetTarget(ref1, GL_TEXTURE_2D); |
1790 texture_manager1_->SetLevelInfo(ref1, GL_TEXTURE_2D, 0, GL_RGBA, 10, 10, 1, 0, | 1797 texture_manager1_->SetLevelInfo(ref1, GL_TEXTURE_2D, 0, GL_RGBA, 10, 10, 1, 0, |
1791 GL_RGBA, GL_UNSIGNED_BYTE, false); | 1798 GL_RGBA, GL_UNSIGNED_BYTE, false); |
1792 | 1799 |
1793 EXPECT_LT(0u, ref1->texture()->estimated_size()); | 1800 EXPECT_LT(0u, ref1->texture()->estimated_size()); |
1794 EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(), | 1801 EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(), |
1795 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged)); | 1802 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged)); |
1796 | 1803 |
1797 // Associate new texture ref to other texture manager, it doesn't account for | 1804 // Associate new texture ref to other texture manager, it doesn't account for |
1798 // the texture memory, the first memory tracker still has it. | 1805 // the texture memory, the first memory tracker still has it. |
1799 scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(), | 1806 scoped_refptr<TextureRef> ref2 = |
1800 ref1->texture()); | 1807 texture_manager2_->Consume(20, ref1->texture()); |
1801 EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(), | 1808 EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(), |
1802 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged)); | 1809 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged)); |
1803 EXPECT_EQ(initial_memory2, | 1810 EXPECT_EQ(initial_memory2, |
1804 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged)); | 1811 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged)); |
1805 | 1812 |
1806 // Delete the texture, memory should go to the remaining tracker. | 1813 // Delete the texture, memory should go to the remaining tracker. |
1807 texture_manager1_->RemoveTexture(10); | 1814 texture_manager1_->RemoveTexture(10); |
1808 ref1 = NULL; | 1815 ref1 = NULL; |
1809 EXPECT_EQ(initial_memory1, | 1816 EXPECT_EQ(initial_memory1, |
1810 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged)); | 1817 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged)); |
1811 EXPECT_EQ(initial_memory2 + ref2->texture()->estimated_size(), | 1818 EXPECT_EQ(initial_memory2 + ref2->texture()->estimated_size(), |
1812 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged)); | 1819 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged)); |
1813 | 1820 |
1814 EXPECT_CALL(*gl_, DeleteTextures(1, _)) | 1821 EXPECT_CALL(*gl_, DeleteTextures(1, _)) |
1815 .Times(1) | 1822 .Times(1) |
1816 .RetiresOnSaturation(); | 1823 .RetiresOnSaturation(); |
1817 ref2 = NULL; | 1824 ref2 = NULL; |
| 1825 texture_manager2_->RemoveTexture(20); |
1818 EXPECT_EQ(initial_memory2, | 1826 EXPECT_EQ(initial_memory2, |
1819 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged)); | 1827 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged)); |
1820 } | 1828 } |
1821 | 1829 |
1822 } // namespace gles2 | 1830 } // namespace gles2 |
1823 } // namespace gpu | 1831 } // namespace gpu |
OLD | NEW |