Index: gpu/command_buffer/service/texture_manager_unittest.cc |
diff --git a/gpu/command_buffer/service/texture_manager_unittest.cc b/gpu/command_buffer/service/texture_manager_unittest.cc |
index c66ffa6a9632da0162e3990a9809633593746ee9..34e66923c611a67fa777a4aed008bd5d0446c2e0 100644 |
--- a/gpu/command_buffer/service/texture_manager_unittest.cc |
+++ b/gpu/command_buffer/service/texture_manager_unittest.cc |
@@ -9,10 +9,10 @@ |
#include "gpu/command_buffer/service/feature_info.h" |
#include "gpu/command_buffer/service/framebuffer_manager.h" |
#include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" |
+#include "gpu/command_buffer/service/mailbox_manager.h" |
#include "gpu/command_buffer/service/memory_tracking.h" |
#include "gpu/command_buffer/service/mocks.h" |
#include "gpu/command_buffer/service/test_helper.h" |
-#include "gpu/command_buffer/service/texture_definition.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "ui/gl/gl_mock.h" |
@@ -1326,7 +1326,7 @@ TEST_F(TextureTest, AddToSignature) { |
EXPECT_EQ(11u, string_set.size()); |
} |
-class SaveRestoreTextureTest : public TextureTest { |
+class ProduceConsumeTextureTest : public TextureTest { |
public: |
virtual void SetUp() { |
TextureTest::SetUpBase(NULL, "GL_OES_EGL_image_external"); |
@@ -1430,39 +1430,27 @@ class SaveRestoreTextureTest : public TextureTest { |
return info; |
} |
- TextureDefinition* Save(TextureRef* texture_ref) { |
- EXPECT_CALL(*gl_, GenTextures(_, _)) |
- .WillOnce(SetArgumentPointee<1>(kEmptyTextureServiceId)); |
- TextureDefinition* definition = manager_->Save(texture_ref); |
- EXPECT_TRUE(definition != NULL); |
- return definition; |
+ Texture* Produce(TextureRef* texture_ref) { |
+ Texture* texture = manager_->Produce(texture_ref); |
+ EXPECT_TRUE(texture != NULL); |
+ return texture; |
} |
- void Restore(TextureRef* texture_ref, TextureDefinition* definition) { |
- EXPECT_CALL(*gl_, DeleteTextures(1, Pointee(texture_ref->service_id()))) |
- .Times(1).RetiresOnSaturation(); |
- EXPECT_CALL(*gl_, |
- BindTexture(definition->target(), definition->service_id())) |
- .Times(1).RetiresOnSaturation(); |
- EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(AtLeast(1)); |
- |
- EXPECT_TRUE(manager_->Restore("TextureTest", decoder_.get(), |
- texture_ref, definition)); |
+ void Consume(GLuint client_id, Texture* texture) { |
+ EXPECT_TRUE(manager_->Consume(client_id, texture)); |
} |
scoped_refptr<TextureRef> texture2_; |
private: |
- static const GLuint kEmptyTextureServiceId; |
static const GLuint kClient2Id; |
static const GLuint kService2Id; |
}; |
-const GLuint SaveRestoreTextureTest::kClient2Id = 2; |
-const GLuint SaveRestoreTextureTest::kService2Id = 12; |
-const GLuint SaveRestoreTextureTest::kEmptyTextureServiceId = 13; |
+const GLuint ProduceConsumeTextureTest::kClient2Id = 2; |
+const GLuint ProduceConsumeTextureTest::kService2Id = 12; |
-TEST_F(SaveRestoreTextureTest, SaveRestore2D) { |
+TEST_F(ProduceConsumeTextureTest, ProduceConsume2D) { |
manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); |
Texture* texture = texture_ref_->texture(); |
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); |
@@ -1473,13 +1461,11 @@ TEST_F(SaveRestoreTextureTest, SaveRestore2D) { |
EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); |
LevelInfo level1 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 1); |
LevelInfo level2 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 2); |
- scoped_ptr<TextureDefinition> definition(Save(texture_ref_)); |
- const TextureDefinition::LevelInfos& infos = definition->level_infos(); |
- EXPECT_EQ(1U, infos.size()); |
- EXPECT_EQ(3U, infos[0].size()); |
+ Texture* produced_texture = Produce(texture_ref_); |
+ EXPECT_EQ(produced_texture, texture); |
// Make this texture bigger with more levels, and make sure they get |
- // clobbered correctly during Restore(). |
+ // clobbered correctly during Consume(). |
manager_->SetTarget(texture2_, GL_TEXTURE_2D); |
SetLevelInfo( |
texture2_, |
@@ -1489,18 +1475,26 @@ TEST_F(SaveRestoreTextureTest, SaveRestore2D) { |
texture = texture2_->texture(); |
EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); |
EXPECT_EQ(1024U + 256U + 64U + 16U + 4U, texture->estimated_size()); |
- Restore(texture2_, definition.release()); |
- EXPECT_EQ(level0, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 0)); |
- EXPECT_EQ(level1, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 1)); |
- EXPECT_EQ(level2, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 2)); |
+ |
+ GLuint client_id = texture2_->client_id(); |
+ manager_->RemoveTexture(client_id); |
+ Consume(client_id, produced_texture); |
+ scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id); |
+ EXPECT_EQ(produced_texture, restored_texture->texture()); |
+ EXPECT_EQ(level0, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 0)); |
+ EXPECT_EQ(level1, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 1)); |
+ EXPECT_EQ(level2, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 2)); |
+ texture = restored_texture->texture(); |
EXPECT_EQ(64U + 16U + 4U, texture->estimated_size()); |
GLint w, h; |
- EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 3, &w, &h)); |
- EXPECT_EQ(0, w); |
- EXPECT_EQ(0, h); |
+ EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 3, &w, &h)); |
+ |
+ // However the old texture ref still exists if it was referenced somewhere. |
+ EXPECT_EQ(1024U + 256U + 64U + 16U + 4U, |
+ texture2_->texture()->estimated_size()); |
} |
-TEST_F(SaveRestoreTextureTest, SaveRestoreClearRectangle) { |
+TEST_F(ProduceConsumeTextureTest, ProduceConsumeClearRectangle) { |
manager_->SetTarget(texture_ref_, GL_TEXTURE_RECTANGLE_ARB); |
Texture* texture = texture_ref_->texture(); |
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), texture->target()); |
@@ -1508,38 +1502,46 @@ TEST_F(SaveRestoreTextureTest, SaveRestoreClearRectangle) { |
GL_TEXTURE_RECTANGLE_ARB, GL_RGBA, 1, 1, 1, 0, GL_UNSIGNED_BYTE, false); |
SetLevelInfo(texture_ref_, 0, level0); |
EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); |
- scoped_ptr<TextureDefinition> definition(Save(texture_ref_)); |
- const TextureDefinition::LevelInfos& infos = definition->level_infos(); |
- EXPECT_EQ(1U, infos.size()); |
- EXPECT_EQ(1U, infos[0].size()); |
- EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), infos[0][0].target); |
- manager_->SetTarget(texture2_, GL_TEXTURE_RECTANGLE_ARB); |
- Restore(texture2_, definition.release()); |
+ Texture* produced_texture = Produce(texture_ref_); |
+ EXPECT_EQ(produced_texture, texture); |
+ EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), |
+ produced_texture->target()); |
+ |
+ GLuint client_id = texture2_->client_id(); |
+ manager_->RemoveTexture(client_id); |
+ Consume(client_id, produced_texture); |
+ scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id); |
+ EXPECT_EQ(produced_texture, restored_texture->texture()); |
// See if we can clear the previously uncleared level now. |
- EXPECT_EQ(level0, GetLevelInfo(texture2_.get(), GL_TEXTURE_RECTANGLE_ARB, 0)); |
+ EXPECT_EQ(level0, |
+ GetLevelInfo(restored_texture.get(), GL_TEXTURE_RECTANGLE_ARB, 0)); |
EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _)) |
.WillRepeatedly(Return(true)); |
EXPECT_TRUE(manager_->ClearTextureLevel( |
- decoder_.get(), texture2_, GL_TEXTURE_RECTANGLE_ARB, 0)); |
+ decoder_.get(), restored_texture, GL_TEXTURE_RECTANGLE_ARB, 0)); |
} |
-TEST_F(SaveRestoreTextureTest, SaveRestoreStreamTexture) { |
+TEST_F(ProduceConsumeTextureTest, ProduceConsumeStreamTexture) { |
manager_->SetTarget(texture_ref_, GL_TEXTURE_EXTERNAL_OES); |
Texture* texture = texture_ref_->texture(); |
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target()); |
manager_->SetStreamTexture(texture_ref_, true); |
GLuint service_id = texture->service_id(); |
- scoped_ptr<TextureDefinition> definition(Save(texture_ref_)); |
- EXPECT_FALSE(texture->IsStreamTexture()); |
- manager_->SetTarget(texture2_, GL_TEXTURE_EXTERNAL_OES); |
- Restore(texture2_, definition.release()); |
- EXPECT_TRUE(texture2_->texture()->IsStreamTexture()); |
- EXPECT_TRUE(texture2_->texture()->IsImmutable()); |
- EXPECT_EQ(service_id, texture2_->service_id()); |
+ Texture* produced_texture = Produce(texture_ref_); |
+ EXPECT_TRUE(texture->IsStreamTexture()); |
+ |
+ GLuint client_id = texture2_->client_id(); |
+ manager_->RemoveTexture(client_id); |
+ Consume(client_id, produced_texture); |
+ scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id); |
+ EXPECT_EQ(produced_texture, restored_texture->texture()); |
+ EXPECT_TRUE(restored_texture->texture()->IsStreamTexture()); |
+ EXPECT_TRUE(restored_texture->texture()->IsImmutable()); |
+ EXPECT_EQ(service_id, restored_texture->service_id()); |
} |
-TEST_F(SaveRestoreTextureTest, SaveRestoreCube) { |
+TEST_F(ProduceConsumeTextureTest, ProduceConsumeCube) { |
manager_->SetTarget(texture_ref_, GL_TEXTURE_CUBE_MAP); |
Texture* texture = texture_ref_->texture(); |
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target()); |
@@ -1562,16 +1564,18 @@ TEST_F(SaveRestoreTextureTest, SaveRestoreCube) { |
SetLevelInfo(texture_ref_, 0, face0); |
SetLevelInfo(texture_ref_, 0, face5); |
EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); |
- scoped_ptr<TextureDefinition> definition(Save(texture_ref_)); |
- const TextureDefinition::LevelInfos& infos = definition->level_infos(); |
- EXPECT_EQ(6U, infos.size()); |
- EXPECT_EQ(1U, infos[0].size()); |
- manager_->SetTarget(texture2_, GL_TEXTURE_CUBE_MAP); |
- Restore(texture2_, definition.release()); |
+ Texture* produced_texture = Produce(texture_ref_); |
+ EXPECT_EQ(produced_texture, texture); |
+ |
+ GLuint client_id = texture2_->client_id(); |
+ manager_->RemoveTexture(client_id); |
+ Consume(client_id, produced_texture); |
+ scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id); |
+ EXPECT_EQ(produced_texture, restored_texture->texture()); |
EXPECT_EQ(face0, |
- GetLevelInfo(texture2_.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0)); |
+ GetLevelInfo(restored_texture, GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0)); |
EXPECT_EQ(face5, |
- GetLevelInfo(texture2_.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0)); |
+ GetLevelInfo(restored_texture, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0)); |
} |
class CountingMemoryTracker : public MemoryTracker { |
@@ -1653,8 +1657,8 @@ class SharedTextureTest : public testing::Test { |
TEST_F(SharedTextureTest, DeleteTextures) { |
scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10); |
- scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(), |
- ref1->texture()); |
+ scoped_refptr<TextureRef> ref2 = |
+ texture_manager2_->Consume(20, ref1->texture()); |
EXPECT_CALL(*gl_, DeleteTextures(1, _)) |
.Times(0); |
ref1 = NULL; |
@@ -1665,6 +1669,7 @@ TEST_F(SharedTextureTest, DeleteTextures) { |
.Times(1) |
.RetiresOnSaturation(); |
ref2 = NULL; |
+ texture_manager2_->RemoveTexture(20); |
testing::Mock::VerifyAndClearExpectations(gl_.get()); |
} |
@@ -1676,7 +1681,7 @@ TEST_F(SharedTextureTest, TextureSafetyAccounting) { |
EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures()); |
EXPECT_FALSE(texture_manager2_->HaveUnclearedMips()); |
- // Newly created texture is unrenderable. |
+ // Newly created texture is renderable. |
scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10); |
EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures()); |
EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures()); |
@@ -1684,8 +1689,8 @@ TEST_F(SharedTextureTest, TextureSafetyAccounting) { |
// Associate new texture ref to other texture manager, should account for it |
// too. |
- scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(), |
- ref1->texture()); |
+ scoped_refptr<TextureRef> ref2 = |
+ texture_manager2_->Consume(20, ref1->texture()); |
EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures()); |
EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures()); |
EXPECT_FALSE(texture_manager2_->HaveUnclearedMips()); |
@@ -1720,6 +1725,7 @@ TEST_F(SharedTextureTest, TextureSafetyAccounting) { |
.Times(1) |
.RetiresOnSaturation(); |
texture_manager1_->RemoveTexture(10); |
+ texture_manager2_->RemoveTexture(20); |
} |
TEST_F(SharedTextureTest, FBOCompletenessCheck) { |
@@ -1746,8 +1752,8 @@ TEST_F(SharedTextureTest, FBOCompletenessCheck) { |
EXPECT_TRUE(framebuffer_manager1.IsComplete(framebuffer1)); |
// Share texture with manager 2. |
- scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(), |
- ref1->texture()); |
+ scoped_refptr<TextureRef> ref2 = |
+ texture_manager2_->Consume(20, ref1->texture()); |
framebuffer_manager2.CreateFramebuffer(20, 20); |
scoped_refptr<Framebuffer> framebuffer2 = |
framebuffer_manager2.GetFramebuffer(20); |
@@ -1778,6 +1784,7 @@ TEST_F(SharedTextureTest, FBOCompletenessCheck) { |
.Times(1) |
.RetiresOnSaturation(); |
texture_manager1_->RemoveTexture(10); |
+ texture_manager2_->RemoveTexture(20); |
} |
TEST_F(SharedTextureTest, Memory) { |
@@ -1796,8 +1803,8 @@ TEST_F(SharedTextureTest, Memory) { |
// Associate new texture ref to other texture manager, it doesn't account for |
// the texture memory, the first memory tracker still has it. |
- scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(), |
- ref1->texture()); |
+ scoped_refptr<TextureRef> ref2 = |
+ texture_manager2_->Consume(20, ref1->texture()); |
EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(), |
memory_tracker1_->GetSize(MemoryTracker::kUnmanaged)); |
EXPECT_EQ(initial_memory2, |
@@ -1815,6 +1822,7 @@ TEST_F(SharedTextureTest, Memory) { |
.Times(1) |
.RetiresOnSaturation(); |
ref2 = NULL; |
+ texture_manager2_->RemoveTexture(20); |
EXPECT_EQ(initial_memory2, |
memory_tracker2_->GetSize(MemoryTracker::kUnmanaged)); |
} |