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

Unified Diff: gpu/command_buffer/service/texture_manager_unittest.cc

Issue 14188053: gpu: Change Produce/ConsumeTexture to allow texture sharing (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..1dda4f4b8e7a0375d5e7f2e14defa532eddfabc9 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"
@@ -1430,24 +1430,14 @@ 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* 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.
+ 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 Restore(GLuint client_id, Texture* texture) {
+ EXPECT_TRUE(manager_->Consume(client_id, texture));
}
scoped_refptr<TextureRef> texture2_;
@@ -1473,10 +1463,8 @@ 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 = Save(texture_ref_);
+ EXPECT_EQ(produced_texture, texture);
// Make this texture bigger with more levels, and make sure they get
// clobbered correctly during Restore().
@@ -1489,15 +1477,23 @@ 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);
+ Restore(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) {
@@ -1508,20 +1504,24 @@ 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 = Save(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);
+ Restore(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) {
@@ -1530,13 +1530,17 @@ TEST_F(SaveRestoreTextureTest, SaveRestoreStreamTexture) {
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 = Save(texture_ref_);
+ EXPECT_TRUE(texture->IsStreamTexture());
+
+ GLuint client_id = texture2_->client_id();
+ manager_->RemoveTexture(client_id);
+ Restore(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) {
@@ -1562,16 +1566,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 = Save(texture_ref_);
+ EXPECT_EQ(produced_texture, texture);
+
+ GLuint client_id = texture2_->client_id();
+ manager_->RemoveTexture(client_id);
+ Restore(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 +1659,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 +1671,7 @@ TEST_F(SharedTextureTest, DeleteTextures) {
.Times(1)
.RetiresOnSaturation();
ref2 = NULL;
+ texture_manager2_->RemoveTexture(20);
testing::Mock::VerifyAndClearExpectations(gl_.get());
}
@@ -1676,7 +1683,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 +1691,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 +1727,7 @@ TEST_F(SharedTextureTest, TextureSafetyAccounting) {
.Times(1)
.RetiresOnSaturation();
texture_manager1_->RemoveTexture(10);
+ texture_manager2_->RemoveTexture(20);
}
TEST_F(SharedTextureTest, FBOCompletenessCheck) {
@@ -1746,8 +1754,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 +1786,7 @@ TEST_F(SharedTextureTest, FBOCompletenessCheck) {
.Times(1)
.RetiresOnSaturation();
texture_manager1_->RemoveTexture(10);
+ texture_manager2_->RemoveTexture(20);
}
TEST_F(SharedTextureTest, Memory) {
@@ -1796,8 +1805,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 +1824,7 @@ TEST_F(SharedTextureTest, Memory) {
.Times(1)
.RetiresOnSaturation();
ref2 = NULL;
+ texture_manager2_->RemoveTexture(20);
EXPECT_EQ(initial_memory2,
memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
}

Powered by Google App Engine
This is Rietveld 408576698