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

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: review comments 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 1293 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698