| 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 5cf868372d0506de8b0d55015d581f897df073d9..52668720f6bada99c78d6704bec41c6cd7b277cb 100644
 | 
| --- a/gpu/command_buffer/service/texture_manager_unittest.cc
 | 
| +++ b/gpu/command_buffer/service/texture_manager_unittest.cc
 | 
| @@ -7,6 +7,7 @@
 | 
|  #include "base/memory/scoped_ptr.h"
 | 
|  #include "gpu/command_buffer/service/error_state_mock.h"
 | 
|  #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/memory_tracking.h"
 | 
|  #include "gpu/command_buffer/service/mocks.h"
 | 
| @@ -75,10 +76,10 @@ class TextureManagerTest : public testing::Test {
 | 
|    }
 | 
|  
 | 
|    void SetParameter(
 | 
| -      Texture* texture, GLenum pname, GLint value, GLenum error) {
 | 
| +      TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) {
 | 
|      TestHelper::SetTexParameterWithExpectations(
 | 
|          gl_.get(), error_state_.get(), manager_.get(),
 | 
| -        texture, pname, value, error);
 | 
| +        texture_ref, pname, value, error);
 | 
|    }
 | 
|  
 | 
|    // Use StrictMock to make 100% sure we know how GL will be called.
 | 
| @@ -108,7 +109,7 @@ TEST_F(TextureManagerTest, Basic) {
 | 
|    // Check we can create texture.
 | 
|    manager_->CreateTexture(kClient1Id, kService1Id);
 | 
|    // Check texture got created.
 | 
| -  Texture* texture = manager_->GetTexture(kClient1Id);
 | 
| +  TextureRef* texture = manager_->GetTexture(kClient1Id);
 | 
|    ASSERT_TRUE(texture != NULL);
 | 
|    EXPECT_EQ(kService1Id, texture->service_id());
 | 
|    GLuint client_id = 0;
 | 
| @@ -133,30 +134,31 @@ TEST_F(TextureManagerTest, SetParameter) {
 | 
|    // Check we can create texture.
 | 
|    manager_->CreateTexture(kClient1Id, kService1Id);
 | 
|    // Check texture got created.
 | 
| -  Texture* texture = manager_->GetTexture(kClient1Id);
 | 
| -  manager_->SetTarget(texture, GL_TEXTURE_2D);
 | 
| -  ASSERT_TRUE(texture != NULL);
 | 
| -  SetParameter(texture, GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR);
 | 
| +  TextureRef* texture_ref = manager_->GetTexture(kClient1Id);
 | 
| +  ASSERT_TRUE(texture_ref != NULL);
 | 
| +  Texture* texture = texture_ref->texture();
 | 
| +  manager_->SetTarget(texture_ref, GL_TEXTURE_2D);
 | 
| +  SetParameter(texture_ref, GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter());
 | 
| -  SetParameter(texture, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
 | 
| +  SetParameter(texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->mag_filter());
 | 
| -  SetParameter(texture, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
 | 
| +  SetParameter(texture_ref, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_s());
 | 
| -  SetParameter(texture, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
 | 
| +  SetParameter(texture_ref, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_t());
 | 
| -  SetParameter(texture, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1, GL_NO_ERROR);
 | 
| -  SetParameter(texture, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2, GL_NO_ERROR);
 | 
| +  SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1, GL_NO_ERROR);
 | 
| +  SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2, GL_NO_ERROR);
 | 
|    SetParameter(
 | 
| -      texture, GL_TEXTURE_MIN_FILTER, GL_CLAMP_TO_EDGE, GL_INVALID_ENUM);
 | 
| +      texture_ref, GL_TEXTURE_MIN_FILTER, GL_CLAMP_TO_EDGE, GL_INVALID_ENUM);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter());
 | 
|    SetParameter(
 | 
| -      texture, GL_TEXTURE_MAG_FILTER, GL_CLAMP_TO_EDGE, GL_INVALID_ENUM);
 | 
| +      texture_ref, GL_TEXTURE_MAG_FILTER, GL_CLAMP_TO_EDGE, GL_INVALID_ENUM);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter());
 | 
| -  SetParameter(texture, GL_TEXTURE_WRAP_S, GL_NEAREST, GL_INVALID_ENUM);
 | 
| +  SetParameter(texture_ref, GL_TEXTURE_WRAP_S, GL_NEAREST, GL_INVALID_ENUM);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_s());
 | 
| -  SetParameter(texture, GL_TEXTURE_WRAP_T, GL_NEAREST, GL_INVALID_ENUM);
 | 
| +  SetParameter(texture_ref, GL_TEXTURE_WRAP_T, GL_NEAREST, GL_INVALID_ENUM);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_t());
 | 
| -  SetParameter(texture, GL_TEXTURE_MAX_ANISOTROPY_EXT, 0, GL_INVALID_VALUE);
 | 
| +  SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 0, GL_INVALID_VALUE);
 | 
|  }
 | 
|  
 | 
|  TEST_F(TextureManagerTest, TextureUsageExt) {
 | 
| @@ -170,13 +172,13 @@ TEST_F(TextureManagerTest, TextureUsageExt) {
 | 
|    // Check we can create texture.
 | 
|    manager.CreateTexture(kClient1Id, kService1Id);
 | 
|    // Check texture got created.
 | 
| -  Texture* texture = manager.GetTexture(kClient1Id);
 | 
| -  ASSERT_TRUE(texture != NULL);
 | 
| +  TextureRef* texture_ref = manager.GetTexture(kClient1Id);
 | 
| +  ASSERT_TRUE(texture_ref != NULL);
 | 
|    TestHelper::SetTexParameterWithExpectations(
 | 
| -      gl_.get(), error_state_.get(), &manager, texture,
 | 
| +      gl_.get(), error_state_.get(), &manager, texture_ref,
 | 
|        GL_TEXTURE_USAGE_ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE,GL_NO_ERROR);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_ATTACHMENT_ANGLE),
 | 
| -            texture->usage());
 | 
| +            texture_ref->texture()->usage());
 | 
|    manager.Destroy(false);
 | 
|  }
 | 
|  
 | 
| @@ -190,7 +192,7 @@ TEST_F(TextureManagerTest, Destroy) {
 | 
|    // Check we can create texture.
 | 
|    manager.CreateTexture(kClient1Id, kService1Id);
 | 
|    // Check texture got created.
 | 
| -  Texture* texture = manager.GetTexture(kClient1Id);
 | 
| +  TextureRef* texture = manager.GetTexture(kClient1Id);
 | 
|    ASSERT_TRUE(texture != NULL);
 | 
|    EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id)))
 | 
|        .Times(1)
 | 
| @@ -210,12 +212,12 @@ TEST_F(TextureManagerTest, DestroyUnowned) {
 | 
|        NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
 | 
|    manager.Initialize();
 | 
|    // Check we can create texture.
 | 
| -  Texture* created_texture =
 | 
| +  TextureRef* created_texture =
 | 
|        manager.CreateTexture(kClient1Id, kService1Id);
 | 
| -  created_texture->SetNotOwned();
 | 
| +  created_texture->texture()->SetNotOwned();
 | 
|  
 | 
|    // Check texture got created.
 | 
| -  Texture* texture = manager.GetTexture(kClient1Id);
 | 
| +  TextureRef* texture = manager.GetTexture(kClient1Id);
 | 
|    ASSERT_TRUE(texture != NULL);
 | 
|  
 | 
|    // Check that it is not freed if it is not owned.
 | 
| @@ -365,7 +367,7 @@ class TextureTestBase : public testing::Test {
 | 
|        : feature_info_(new FeatureInfo()) {
 | 
|    }
 | 
|    virtual ~TextureTestBase() {
 | 
| -    texture_ = NULL;
 | 
| +    texture_ref_ = NULL;
 | 
|    }
 | 
|  
 | 
|   protected:
 | 
| @@ -385,23 +387,23 @@ class TextureTestBase : public testing::Test {
 | 
|      decoder_.reset(new ::testing::StrictMock<gles2::MockGLES2Decoder>());
 | 
|      error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>());
 | 
|      manager_->CreateTexture(kClient1Id, kService1Id);
 | 
| -    texture_ = manager_->GetTexture(kClient1Id);
 | 
| -    ASSERT_TRUE(texture_.get() != NULL);
 | 
| +    texture_ref_ = manager_->GetTexture(kClient1Id);
 | 
| +    ASSERT_TRUE(texture_ref_.get() != NULL);
 | 
|    }
 | 
|  
 | 
|    virtual void TearDown() {
 | 
| -    if (texture_.get()) {
 | 
| +    if (texture_ref_.get()) {
 | 
|        GLuint client_id = 0;
 | 
| -      // If it's not in the manager then setting texture_ to NULL will
 | 
| +      // If it's not in the manager then setting texture_ref_ to NULL will
 | 
|        // delete the texture.
 | 
| -      if (!manager_->GetClientId(texture_->service_id(), &client_id)) {
 | 
| +      if (!manager_->GetClientId(texture_ref_->service_id(), &client_id)) {
 | 
|          // Check that it gets deleted when the last reference is released.
 | 
|          EXPECT_CALL(*gl_,
 | 
| -            DeleteTextures(1, ::testing::Pointee(texture_->service_id())))
 | 
| +            DeleteTextures(1, ::testing::Pointee(texture_ref_->service_id())))
 | 
|              .Times(1)
 | 
|              .RetiresOnSaturation();
 | 
|        }
 | 
| -      texture_ = NULL;
 | 
| +      texture_ref_ = NULL;
 | 
|      }
 | 
|      manager_->Destroy(false);
 | 
|      manager_.reset();
 | 
| @@ -410,10 +412,10 @@ class TextureTestBase : public testing::Test {
 | 
|    }
 | 
|  
 | 
|    void SetParameter(
 | 
| -      Texture* texture, GLenum pname, GLint value, GLenum error) {
 | 
| +      TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) {
 | 
|      TestHelper::SetTexParameterWithExpectations(
 | 
|          gl_.get(), error_state_.get(), manager_.get(),
 | 
| -        texture, pname, value, error);
 | 
| +        texture_ref, pname, value, error);
 | 
|    }
 | 
|  
 | 
|    scoped_ptr<MockGLES2Decoder> decoder_;
 | 
| @@ -422,7 +424,7 @@ class TextureTestBase : public testing::Test {
 | 
|    scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_;
 | 
|    scoped_refptr<FeatureInfo> feature_info_;
 | 
|    scoped_ptr<TextureManager> manager_;
 | 
| -  scoped_refptr<Texture> texture_;
 | 
| +  scoped_refptr<TextureRef> texture_ref_;
 | 
|  };
 | 
|  
 | 
|  class TextureTest : public TextureTestBase {
 | 
| @@ -449,78 +451,81 @@ class TextureMemoryTrackerTest : public TextureTestBase {
 | 
|          .RetiresOnSaturation() \
 | 
|  
 | 
|  TEST_F(TextureTest, Basic) {
 | 
| -  EXPECT_EQ(0u, texture_->target());
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_));
 | 
| -  EXPECT_EQ(0, texture_->num_uncleared_mips());
 | 
| -  EXPECT_FALSE(manager_->CanRender(texture_));
 | 
| -  EXPECT_TRUE(texture_->SafeToRenderFrom());
 | 
| -  EXPECT_FALSE(texture_->IsImmutable());
 | 
| +  Texture* texture = texture_ref_->texture();
 | 
| +  EXPECT_EQ(0u, texture->target());
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
 | 
| +  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
 | 
| +  EXPECT_EQ(0, texture->num_uncleared_mips());
 | 
| +  EXPECT_FALSE(manager_->CanRender(texture_ref_));
 | 
| +  EXPECT_TRUE(texture->SafeToRenderFrom());
 | 
| +  EXPECT_FALSE(texture->IsImmutable());
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_NEAREST_MIPMAP_LINEAR),
 | 
| -            texture_->min_filter());
 | 
| -  EXPECT_EQ(static_cast<GLenum>(GL_LINEAR), texture_->mag_filter());
 | 
| -  EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture_->wrap_s());
 | 
| -  EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture_->wrap_t());
 | 
| +            texture->min_filter());
 | 
| +  EXPECT_EQ(static_cast<GLenum>(GL_LINEAR), texture->mag_filter());
 | 
| +  EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture->wrap_s());
 | 
| +  EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture->wrap_t());
 | 
|    EXPECT_TRUE(manager_->HaveUnrenderableTextures());
 | 
|    EXPECT_FALSE(manager_->HaveUnsafeTextures());
 | 
| -  EXPECT_EQ(0u, texture_->estimated_size());
 | 
| +  EXPECT_EQ(0u, texture->estimated_size());
 | 
|  }
 | 
|  
 | 
|  TEST_F(TextureTest, SetTargetTexture2D) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_2D);
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanRender(texture_));
 | 
| -  EXPECT_TRUE(texture_->SafeToRenderFrom());
 | 
| -  EXPECT_FALSE(texture_->IsImmutable());
 | 
| +  Texture* texture = texture_ref_->texture();
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
 | 
| +  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
 | 
| +  EXPECT_FALSE(manager_->CanRender(texture_ref_));
 | 
| +  EXPECT_TRUE(texture->SafeToRenderFrom());
 | 
| +  EXPECT_FALSE(texture->IsImmutable());
 | 
|  }
 | 
|  
 | 
|  TEST_F(TextureTest, SetTargetTextureExternalOES) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_EXTERNAL_OES);
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_));
 | 
| -  EXPECT_TRUE(TextureTestHelper::IsNPOT(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanRender(texture_));
 | 
| -  EXPECT_TRUE(texture_->SafeToRenderFrom());
 | 
| -  EXPECT_TRUE(texture_->IsImmutable());
 | 
| -  manager_->SetStreamTexture(texture_, true);
 | 
| -  EXPECT_TRUE(manager_->CanRender(texture_));
 | 
| +  Texture* texture = texture_ref_->texture();
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_EXTERNAL_OES);
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
 | 
| +  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_));
 | 
| +  EXPECT_TRUE(TextureTestHelper::IsNPOT(texture));
 | 
| +  EXPECT_FALSE(manager_->CanRender(texture_ref_));
 | 
| +  EXPECT_TRUE(texture->SafeToRenderFrom());
 | 
| +  EXPECT_TRUE(texture->IsImmutable());
 | 
| +  manager_->SetStreamTexture(texture_ref_, true);
 | 
| +  EXPECT_TRUE(manager_->CanRender(texture_ref_));
 | 
|  }
 | 
|  
 | 
|  TEST_F(TextureTest, ZeroSizeCanNotRender) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_2D);
 | 
| -  EXPECT_FALSE(manager_->CanRender(texture_));
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
 | 
| +  EXPECT_FALSE(manager_->CanRender(texture_ref_));
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_TRUE(manager_->CanRender(texture_));
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  EXPECT_TRUE(manager_->CanRender(texture_ref_));
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_FALSE(manager_->CanRender(texture_));
 | 
| +  EXPECT_FALSE(manager_->CanRender(texture_ref_));
 | 
|  }
 | 
|  
 | 
|  TEST_F(TextureTest, EstimatedSize) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_2D);
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_EQ(8u * 4u * 4u, texture_->estimated_size());
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  EXPECT_EQ(8u * 4u * 4u, texture_ref_->texture()->estimated_size());
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 2, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_EQ(8u * 4u * 4u * 2u, texture_->estimated_size());
 | 
| +  EXPECT_EQ(8u * 4u * 4u * 2u, texture_ref_->texture()->estimated_size());
 | 
|  }
 | 
|  
 | 
|  TEST_F(TextureMemoryTrackerTest, EstimatedSize) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_2D);
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
 | 
|    EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged);
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
|    EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged);
 | 
|    EXPECT_MEMORY_ALLOCATION_CHANGE(0, 256, MemoryTracker::kUnmanaged);
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 2, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
|    // Add expectation for texture deletion.
 | 
|    EXPECT_MEMORY_ALLOCATION_CHANGE(256, 0, MemoryTracker::kUnmanaged);
 | 
| @@ -528,14 +533,14 @@ TEST_F(TextureMemoryTrackerTest, EstimatedSize) {
 | 
|  }
 | 
|  
 | 
|  TEST_F(TextureMemoryTrackerTest, SetParameterPool) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_2D);
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
 | 
|    EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged);
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
|    EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged);
 | 
|    EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kManaged);
 | 
|    SetParameter(
 | 
| -      texture_, GL_TEXTURE_POOL_CHROMIUM, GL_TEXTURE_POOL_MANAGED_CHROMIUM,
 | 
| +      texture_ref_, GL_TEXTURE_POOL_CHROMIUM, GL_TEXTURE_POOL_MANAGED_CHROMIUM,
 | 
|        GL_NO_ERROR);
 | 
|    // Add expectation for texture deletion.
 | 
|    EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kManaged);
 | 
| @@ -544,116 +549,119 @@ TEST_F(TextureMemoryTrackerTest, SetParameterPool) {
 | 
|  }
 | 
|  
 | 
|  TEST_F(TextureTest, POT2D) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_2D);
 | 
| -  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture_->target());
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
 | 
| +  Texture* texture = texture_ref_->texture();
 | 
| +  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
 | 
|    // Check Setting level 0 to POT
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanRender(texture_));
 | 
| -  EXPECT_EQ(0, texture_->num_uncleared_mips());
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_FALSE(manager_->CanRender(texture_ref_));
 | 
| +  EXPECT_EQ(0, texture->num_uncleared_mips());
 | 
|    EXPECT_TRUE(manager_->HaveUnrenderableTextures());
 | 
|    // Set filters to something that will work with a single mip.
 | 
| -  SetParameter(texture_, GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR);
 | 
| -  EXPECT_TRUE(manager_->CanRender(texture_));
 | 
| +  SetParameter(texture_ref_, GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR);
 | 
| +  EXPECT_TRUE(manager_->CanRender(texture_ref_));
 | 
|    EXPECT_FALSE(manager_->HaveUnrenderableTextures());
 | 
|    // Set them back.
 | 
| -  SetParameter(
 | 
| -      texture_, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR, GL_NO_ERROR);
 | 
| +  SetParameter(texture_ref_, GL_TEXTURE_MIN_FILTER,
 | 
| +               GL_LINEAR_MIPMAP_LINEAR, GL_NO_ERROR);
 | 
|    EXPECT_TRUE(manager_->HaveUnrenderableTextures());
 | 
|  
 | 
| -  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_));
 | 
| +  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_));
 | 
|    // Make mips.
 | 
| -  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_));
 | 
| -  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_TRUE(manager_->CanRender(texture_));
 | 
| +  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_));
 | 
| +  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_TRUE(manager_->CanRender(texture_ref_));
 | 
|    EXPECT_FALSE(manager_->HaveUnrenderableTextures());
 | 
|    // Change a mip.
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanRender(texture_));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_));
 | 
| +  EXPECT_FALSE(manager_->CanRender(texture_ref_));
 | 
|    EXPECT_TRUE(manager_->HaveUnrenderableTextures());
 | 
|    // Set a level past the number of mips that would get generated.
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 3, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_));
 | 
| +  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_));
 | 
|    // Make mips.
 | 
| -  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_));
 | 
| -  EXPECT_TRUE(manager_->CanRender(texture_));
 | 
| -  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| +  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_));
 | 
| +  EXPECT_TRUE(manager_->CanRender(texture_ref_));
 | 
| +  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
 | 
|    EXPECT_FALSE(manager_->HaveUnrenderableTextures());
 | 
|  }
 | 
|  
 | 
|  TEST_F(TextureMemoryTrackerTest, MarkMipmapsGenerated) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_2D);
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
 | 
|    EXPECT_MEMORY_ALLOCATION_CHANGE(0, 64, MemoryTracker::kUnmanaged);
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
|    EXPECT_MEMORY_ALLOCATION_CHANGE(64, 0, MemoryTracker::kUnmanaged);
 | 
|    EXPECT_MEMORY_ALLOCATION_CHANGE(0, 84, MemoryTracker::kUnmanaged);
 | 
| -  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_));
 | 
| +  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_));
 | 
|    EXPECT_MEMORY_ALLOCATION_CHANGE(84, 0, MemoryTracker::kUnmanaged);
 | 
|    EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged);
 | 
|  }
 | 
|  
 | 
|  TEST_F(TextureTest, UnusedMips) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_2D);
 | 
| -  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture_->target());
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
 | 
| +  Texture* texture = texture_ref_->texture();
 | 
| +  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
 | 
|    // Set level zero to large size.
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_));
 | 
| -  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_TRUE(manager_->CanRender(texture_));
 | 
| +  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
 | 
| +  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_TRUE(manager_->CanRender(texture_ref_));
 | 
|    EXPECT_FALSE(manager_->HaveUnrenderableTextures());
 | 
|    // Set level zero to large smaller (levels unused mips)
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_));
 | 
| -  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_TRUE(manager_->CanRender(texture_));
 | 
| +  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
 | 
| +  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_TRUE(manager_->CanRender(texture_ref_));
 | 
|    EXPECT_FALSE(manager_->HaveUnrenderableTextures());
 | 
|    // Set an unused level to some size
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 4, GL_RGBA, 16, 16, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_));
 | 
| -  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_TRUE(manager_->CanRender(texture_));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
 | 
| +  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_TRUE(manager_->CanRender(texture_ref_));
 | 
|    EXPECT_FALSE(manager_->HaveUnrenderableTextures());
 | 
|  }
 | 
|  
 | 
|  TEST_F(TextureTest, NPOT2D) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_2D);
 | 
| -  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture_->target());
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
 | 
| +  Texture* texture = texture_ref_->texture();
 | 
| +  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
 | 
|    // Check Setting level 0 to NPOT
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_TRUE(TextureTestHelper::IsNPOT(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanRender(texture_));
 | 
| +  EXPECT_TRUE(TextureTestHelper::IsNPOT(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_));
 | 
| +  EXPECT_FALSE(manager_->CanRender(texture_ref_));
 | 
|    EXPECT_TRUE(manager_->HaveUnrenderableTextures());
 | 
| -  SetParameter(texture_, GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR);
 | 
| -  EXPECT_FALSE(manager_->CanRender(texture_));
 | 
| +  SetParameter(texture_ref_, GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR);
 | 
| +  EXPECT_FALSE(manager_->CanRender(texture_ref_));
 | 
|    EXPECT_TRUE(manager_->HaveUnrenderableTextures());
 | 
| -  SetParameter(texture_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
 | 
| -  EXPECT_FALSE(manager_->CanRender(texture_));
 | 
| +  SetParameter(texture_ref_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
 | 
| +  EXPECT_FALSE(manager_->CanRender(texture_ref_));
 | 
|    EXPECT_TRUE(manager_->HaveUnrenderableTextures());
 | 
| -  SetParameter(texture_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
 | 
| -  EXPECT_TRUE(manager_->CanRender(texture_));
 | 
| +  SetParameter(texture_ref_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
 | 
| +  EXPECT_TRUE(manager_->CanRender(texture_ref_));
 | 
|    EXPECT_FALSE(manager_->HaveUnrenderableTextures());
 | 
|    // Change it to POT.
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_));
 | 
|    EXPECT_FALSE(manager_->HaveUnrenderableTextures());
 | 
|  }
 | 
|  
 | 
| @@ -665,190 +673,195 @@ TEST_F(TextureTest, NPOT2DNPOTOK) {
 | 
|    TextureManager manager(
 | 
|        NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
 | 
|    manager.CreateTexture(kClient1Id, kService1Id);
 | 
| -  Texture* texture = manager.GetTexture(kClient1Id);
 | 
| -  ASSERT_TRUE(texture != NULL);
 | 
| +  TextureRef* texture_ref = manager.GetTexture(kClient1Id);
 | 
| +  ASSERT_TRUE(texture_ref != NULL);
 | 
| +  Texture* texture = texture_ref->texture();
 | 
|  
 | 
| -  manager.SetTarget(texture, GL_TEXTURE_2D);
 | 
| +  manager.SetTarget(texture_ref, GL_TEXTURE_2D);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
 | 
|    // Check Setting level 0 to NPOT
 | 
| -  manager.SetLevelInfo(texture,
 | 
| +  manager.SetLevelInfo(texture_ref,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
|    EXPECT_TRUE(TextureTestHelper::IsNPOT(texture));
 | 
|    EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
| -  EXPECT_TRUE(manager.CanGenerateMipmaps(texture));
 | 
| -  EXPECT_FALSE(manager.CanRender(texture));
 | 
| +  EXPECT_TRUE(manager.CanGenerateMipmaps(texture_ref));
 | 
| +  EXPECT_FALSE(manager.CanRender(texture_ref));
 | 
|    EXPECT_TRUE(manager.HaveUnrenderableTextures());
 | 
| -  EXPECT_TRUE(manager.MarkMipmapsGenerated(texture));
 | 
| +  EXPECT_TRUE(manager.MarkMipmapsGenerated(texture_ref));
 | 
|    EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
 | 
| -  EXPECT_TRUE(manager.CanRender(texture));
 | 
| +  EXPECT_TRUE(manager.CanRender(texture_ref));
 | 
|    EXPECT_FALSE(manager.HaveUnrenderableTextures());
 | 
|    manager.Destroy(false);
 | 
|  }
 | 
|  
 | 
|  TEST_F(TextureTest, POTCubeMap) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_CUBE_MAP);
 | 
| -  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture_->target());
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_CUBE_MAP);
 | 
| +  Texture* texture = texture_ref_->texture();
 | 
| +  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target());
 | 
|    // Check Setting level 0 each face to POT
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_CUBE_MAP_POSITIVE_X,
 | 
|        0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanRender(texture_));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
 | 
| +  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_));
 | 
| +  EXPECT_FALSE(manager_->CanRender(texture_ref_));
 | 
|    EXPECT_TRUE(manager_->HaveUnrenderableTextures());
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
 | 
|        0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanRender(texture_));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
 | 
| +  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_));
 | 
| +  EXPECT_FALSE(manager_->CanRender(texture_ref_));
 | 
|    EXPECT_TRUE(manager_->HaveUnrenderableTextures());
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
 | 
|        0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanRender(texture_));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
 | 
| +  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_));
 | 
| +  EXPECT_FALSE(manager_->CanRender(texture_ref_));
 | 
|    EXPECT_TRUE(manager_->HaveUnrenderableTextures());
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
 | 
|        0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanRender(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
 | 
| +  EXPECT_FALSE(manager_->CanRender(texture_ref_));
 | 
| +  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_));
 | 
|    EXPECT_TRUE(manager_->HaveUnrenderableTextures());
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
 | 
|        0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanRender(texture_));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
 | 
| +  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_));
 | 
| +  EXPECT_FALSE(manager_->CanRender(texture_ref_));
 | 
|    EXPECT_TRUE(manager_->HaveUnrenderableTextures());
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
 | 
|        0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture_));
 | 
| -  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_));
 | 
| -  EXPECT_FALSE(manager_->CanRender(texture_));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
 | 
| +  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_));
 | 
| +  EXPECT_FALSE(manager_->CanRender(texture_ref_));
 | 
|    EXPECT_TRUE(manager_->HaveUnrenderableTextures());
 | 
|  
 | 
|    // Make mips.
 | 
| -  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_));
 | 
| -  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture_));
 | 
| -  EXPECT_TRUE(manager_->CanRender(texture_));
 | 
| +  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_));
 | 
| +  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
 | 
| +  EXPECT_TRUE(manager_->CanRender(texture_ref_));
 | 
|    EXPECT_FALSE(manager_->HaveUnrenderableTextures());
 | 
|  
 | 
|    // Change a mip.
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
 | 
|        1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_));
 | 
| -  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture_));
 | 
| -  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
 | 
| +  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
 | 
| +  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_));
 | 
|    // Set a level past the number of mips that would get generated.
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
 | 
|        3, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_));
 | 
| +  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_));
 | 
|    // Make mips.
 | 
| -  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_));
 | 
| -  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture_));
 | 
| +  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_));
 | 
| +  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
 | 
| +  EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
 | 
|  }
 | 
|  
 | 
|  TEST_F(TextureTest, GetLevelSize) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_2D);
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
|    GLsizei width = -1;
 | 
|    GLsizei height = -1;
 | 
| -  EXPECT_FALSE(texture_->GetLevelSize(GL_TEXTURE_2D, -1, &width, &height));
 | 
| -  EXPECT_FALSE(texture_->GetLevelSize(GL_TEXTURE_2D, 1000, &width, &height));
 | 
| -  EXPECT_FALSE(texture_->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
 | 
| -  EXPECT_TRUE(texture_->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
 | 
| +  Texture* texture = texture_ref_->texture();
 | 
| +  EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, -1, &width, &height));
 | 
| +  EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 1000, &width, &height));
 | 
| +  EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
 | 
| +  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
 | 
|    EXPECT_EQ(4, width);
 | 
|    EXPECT_EQ(5, height);
 | 
|    manager_->RemoveTexture(kClient1Id);
 | 
| -  EXPECT_TRUE(texture_->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
 | 
| +  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
 | 
|    EXPECT_EQ(4, width);
 | 
|    EXPECT_EQ(5, height);
 | 
|  }
 | 
|  
 | 
|  TEST_F(TextureTest, GetLevelType) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_2D);
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
|    GLenum type = -1;
 | 
|    GLenum format = -1;
 | 
| -  EXPECT_FALSE(texture_->GetLevelType(GL_TEXTURE_2D, -1, &type, &format));
 | 
| -  EXPECT_FALSE(texture_->GetLevelType(GL_TEXTURE_2D, 1000, &type, &format));
 | 
| -  EXPECT_FALSE(texture_->GetLevelType(GL_TEXTURE_2D, 0, &type, &format));
 | 
| -  EXPECT_TRUE(texture_->GetLevelType(GL_TEXTURE_2D, 1, &type, &format));
 | 
| +  Texture* texture = texture_ref_->texture();
 | 
| +  EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, -1, &type, &format));
 | 
| +  EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, 1000, &type, &format));
 | 
| +  EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &format));
 | 
| +  EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &format));
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format);
 | 
|    manager_->RemoveTexture(kClient1Id);
 | 
| -  EXPECT_TRUE(texture_->GetLevelType(GL_TEXTURE_2D, 1, &type, &format));
 | 
| +  EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &format));
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format);
 | 
|  }
 | 
|  
 | 
|  TEST_F(TextureTest, ValidForTexture) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_2D);
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
|    // Check bad face.
 | 
| -  EXPECT_FALSE(texture_->ValidForTexture(
 | 
| +  Texture* texture = texture_ref_->texture();
 | 
| +  EXPECT_FALSE(texture->ValidForTexture(
 | 
|        GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
 | 
|        1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
 | 
|    // Check bad level.
 | 
| -  EXPECT_FALSE(texture_->ValidForTexture(
 | 
| +  EXPECT_FALSE(texture->ValidForTexture(
 | 
|        GL_TEXTURE_2D, 0, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
 | 
|    // Check bad xoffset.
 | 
| -  EXPECT_FALSE(texture_->ValidForTexture(
 | 
| +  EXPECT_FALSE(texture->ValidForTexture(
 | 
|        GL_TEXTURE_2D, 1, -1, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
 | 
|    // Check bad xoffset + width > width.
 | 
| -  EXPECT_FALSE(texture_->ValidForTexture(
 | 
| +  EXPECT_FALSE(texture->ValidForTexture(
 | 
|        GL_TEXTURE_2D, 1, 1, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
 | 
|    // Check bad yoffset.
 | 
| -  EXPECT_FALSE(texture_->ValidForTexture(
 | 
| +  EXPECT_FALSE(texture->ValidForTexture(
 | 
|        GL_TEXTURE_2D, 1, 0, -1, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
 | 
|    // Check bad yoffset + height > height.
 | 
| -  EXPECT_FALSE(texture_->ValidForTexture(
 | 
| +  EXPECT_FALSE(texture->ValidForTexture(
 | 
|        GL_TEXTURE_2D, 1, 0, 1, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
 | 
|    // Check bad width.
 | 
| -  EXPECT_FALSE(texture_->ValidForTexture(
 | 
| +  EXPECT_FALSE(texture->ValidForTexture(
 | 
|        GL_TEXTURE_2D, 1, 0, 0, 5, 5, GL_RGBA, GL_UNSIGNED_BYTE));
 | 
|    // Check bad height.
 | 
| -  EXPECT_FALSE(texture_->ValidForTexture(
 | 
| +  EXPECT_FALSE(texture->ValidForTexture(
 | 
|        GL_TEXTURE_2D, 1, 0, 0, 4, 6, GL_RGBA, GL_UNSIGNED_BYTE));
 | 
|    // Check bad format.
 | 
| -  EXPECT_FALSE(texture_->ValidForTexture(
 | 
| +  EXPECT_FALSE(texture->ValidForTexture(
 | 
|        GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGB, GL_UNSIGNED_BYTE));
 | 
|    // Check bad type.
 | 
| -  EXPECT_FALSE(texture_->ValidForTexture(
 | 
| +  EXPECT_FALSE(texture->ValidForTexture(
 | 
|        GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4));
 | 
|    // Check valid full size
 | 
| -  EXPECT_TRUE(texture_->ValidForTexture(
 | 
| +  EXPECT_TRUE(texture->ValidForTexture(
 | 
|        GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
 | 
|    // Check valid particial size.
 | 
| -  EXPECT_TRUE(texture_->ValidForTexture(
 | 
| +  EXPECT_TRUE(texture->ValidForTexture(
 | 
|        GL_TEXTURE_2D, 1, 1, 1, 2, 3, GL_RGBA, GL_UNSIGNED_BYTE));
 | 
|    manager_->RemoveTexture(kClient1Id);
 | 
| -  EXPECT_TRUE(texture_->ValidForTexture(
 | 
| +  EXPECT_TRUE(texture->ValidForTexture(
 | 
|        GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
 | 
|  }
 | 
|  
 | 
| @@ -860,20 +873,21 @@ TEST_F(TextureTest, FloatNotLinear) {
 | 
|    TextureManager manager(
 | 
|        NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
 | 
|    manager.CreateTexture(kClient1Id, kService1Id);
 | 
| -  Texture* texture = manager.GetTexture(kClient1Id);
 | 
| -  ASSERT_TRUE(texture != NULL);
 | 
| -  manager.SetTarget(texture, GL_TEXTURE_2D);
 | 
| +  TextureRef* texture_ref = manager.GetTexture(kClient1Id);
 | 
| +  ASSERT_TRUE(texture_ref != NULL);
 | 
| +  manager.SetTarget(texture_ref, GL_TEXTURE_2D);
 | 
| +  Texture* texture = texture_ref->texture();
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
 | 
| -  manager.SetLevelInfo(texture,
 | 
| +  manager.SetLevelInfo(texture_ref,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true);
 | 
|    EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
|    TestHelper::SetTexParameterWithExpectations(
 | 
|        gl_.get(), error_state_.get(), &manager,
 | 
| -      texture, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
 | 
| +      texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
 | 
|    EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
|    TestHelper::SetTexParameterWithExpectations(
 | 
| -      gl_.get(), error_state_.get(), &manager,
 | 
| -      texture, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR);
 | 
| +      gl_.get(), error_state_.get(), &manager, texture_ref,
 | 
| +      GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR);
 | 
|    EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
 | 
|    manager.Destroy(false);
 | 
|  }
 | 
| @@ -886,11 +900,12 @@ TEST_F(TextureTest, FloatLinear) {
 | 
|    TextureManager manager(
 | 
|        NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
 | 
|    manager.CreateTexture(kClient1Id, kService1Id);
 | 
| -  Texture* texture = manager.GetTexture(kClient1Id);
 | 
| -  ASSERT_TRUE(texture != NULL);
 | 
| -  manager.SetTarget(texture, GL_TEXTURE_2D);
 | 
| +  TextureRef* texture_ref = manager.GetTexture(kClient1Id);
 | 
| +  ASSERT_TRUE(texture_ref != NULL);
 | 
| +  manager.SetTarget(texture_ref, GL_TEXTURE_2D);
 | 
| +  Texture* texture = texture_ref->texture();
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
 | 
| -  manager.SetLevelInfo(texture,
 | 
| +  manager.SetLevelInfo(texture_ref,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true);
 | 
|    EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
 | 
|    manager.Destroy(false);
 | 
| @@ -904,20 +919,21 @@ TEST_F(TextureTest, HalfFloatNotLinear) {
 | 
|    TextureManager manager(
 | 
|        NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
 | 
|    manager.CreateTexture(kClient1Id, kService1Id);
 | 
| -  Texture* texture = manager.GetTexture(kClient1Id);
 | 
| -  ASSERT_TRUE(texture != NULL);
 | 
| -  manager.SetTarget(texture, GL_TEXTURE_2D);
 | 
| +  TextureRef* texture_ref = manager.GetTexture(kClient1Id);
 | 
| +  ASSERT_TRUE(texture_ref != NULL);
 | 
| +  manager.SetTarget(texture_ref, GL_TEXTURE_2D);
 | 
| +  Texture* texture = texture_ref->texture();
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
 | 
| -  manager.SetLevelInfo(texture,
 | 
| +  manager.SetLevelInfo(texture_ref,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true);
 | 
|    EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
|    TestHelper::SetTexParameterWithExpectations(
 | 
|        gl_.get(), error_state_.get(), &manager,
 | 
| -      texture, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
 | 
| +      texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
 | 
|    EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
 | 
|    TestHelper::SetTexParameterWithExpectations(
 | 
| -      gl_.get(), error_state_.get(), &manager,
 | 
| -      texture, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR);
 | 
| +      gl_.get(), error_state_.get(), &manager, texture_ref,
 | 
| +      GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR);
 | 
|    EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
 | 
|    manager.Destroy(false);
 | 
|  }
 | 
| @@ -930,11 +946,12 @@ TEST_F(TextureTest, HalfFloatLinear) {
 | 
|    TextureManager manager(
 | 
|        NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
 | 
|    manager.CreateTexture(kClient1Id, kService1Id);
 | 
| -  Texture* texture = manager.GetTexture(kClient1Id);
 | 
| -  ASSERT_TRUE(texture != NULL);
 | 
| -  manager.SetTarget(texture, GL_TEXTURE_2D);
 | 
| +  TextureRef* texture_ref = manager.GetTexture(kClient1Id);
 | 
| +  ASSERT_TRUE(texture_ref != NULL);
 | 
| +  manager.SetTarget(texture_ref, GL_TEXTURE_2D);
 | 
| +  Texture* texture = texture_ref->texture();
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
 | 
| -  manager.SetLevelInfo(texture,
 | 
| +  manager.SetLevelInfo(texture_ref,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true);
 | 
|    EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
 | 
|    manager.Destroy(false);
 | 
| @@ -948,11 +965,12 @@ TEST_F(TextureTest, EGLImageExternal) {
 | 
|    TextureManager manager(
 | 
|        NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
 | 
|    manager.CreateTexture(kClient1Id, kService1Id);
 | 
| -  Texture* texture = manager.GetTexture(kClient1Id);
 | 
| -  ASSERT_TRUE(texture != NULL);
 | 
| -  manager.SetTarget(texture, GL_TEXTURE_EXTERNAL_OES);
 | 
| +  TextureRef* texture_ref = manager.GetTexture(kClient1Id);
 | 
| +  ASSERT_TRUE(texture_ref != NULL);
 | 
| +  manager.SetTarget(texture_ref, GL_TEXTURE_EXTERNAL_OES);
 | 
| +  Texture* texture = texture_ref->texture();
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target());
 | 
| -  EXPECT_FALSE(manager.CanGenerateMipmaps(texture));
 | 
| +  EXPECT_FALSE(manager.CanGenerateMipmaps(texture_ref));
 | 
|    manager.Destroy(false);
 | 
|  }
 | 
|  
 | 
| @@ -964,13 +982,13 @@ TEST_F(TextureTest, DepthTexture) {
 | 
|    TextureManager manager(
 | 
|        NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
 | 
|    manager.CreateTexture(kClient1Id, kService1Id);
 | 
| -  Texture* texture = manager.GetTexture(kClient1Id);
 | 
| -  ASSERT_TRUE(texture != NULL);
 | 
| -  manager.SetTarget(texture, GL_TEXTURE_2D);
 | 
| +  TextureRef* texture_ref = manager.GetTexture(kClient1Id);
 | 
| +  ASSERT_TRUE(texture_ref != NULL);
 | 
| +  manager.SetTarget(texture_ref, GL_TEXTURE_2D);
 | 
|    manager.SetLevelInfo(
 | 
| -      texture, GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 4, 4, 1, 0,
 | 
| +      texture_ref, GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 4, 4, 1, 0,
 | 
|        GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, false);
 | 
| -  EXPECT_FALSE(manager.CanGenerateMipmaps(texture));
 | 
| +  EXPECT_FALSE(manager.CanGenerateMipmaps(texture_ref));
 | 
|    manager.Destroy(false);
 | 
|  }
 | 
|  
 | 
| @@ -980,101 +998,104 @@ TEST_F(TextureTest, SafeUnsafe) {
 | 
|    static const GLuint kClient3Id = 3;
 | 
|    static const GLuint kService3Id = 13;
 | 
|    EXPECT_FALSE(manager_->HaveUnclearedMips());
 | 
| -  EXPECT_EQ(0, texture_->num_uncleared_mips());
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_2D);
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  Texture* texture = texture_ref_->texture();
 | 
| +  EXPECT_EQ(0, texture->num_uncleared_mips());
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
| -  EXPECT_FALSE(texture_->SafeToRenderFrom());
 | 
| +  EXPECT_FALSE(texture->SafeToRenderFrom());
 | 
|    EXPECT_TRUE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_TRUE(manager_->HaveUnclearedMips());
 | 
| -  EXPECT_EQ(1, texture_->num_uncleared_mips());
 | 
| -  manager_->SetLevelCleared(texture_, GL_TEXTURE_2D, 0, true);
 | 
| -  EXPECT_TRUE(texture_->SafeToRenderFrom());
 | 
| +  EXPECT_EQ(1, texture->num_uncleared_mips());
 | 
| +  manager_->SetLevelCleared(texture_ref_, GL_TEXTURE_2D, 0, true);
 | 
| +  EXPECT_TRUE(texture->SafeToRenderFrom());
 | 
|    EXPECT_FALSE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_FALSE(manager_->HaveUnclearedMips());
 | 
| -  EXPECT_EQ(0, texture_->num_uncleared_mips());
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  EXPECT_EQ(0, texture->num_uncleared_mips());
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
| -  EXPECT_FALSE(texture_->SafeToRenderFrom());
 | 
| +  EXPECT_FALSE(texture->SafeToRenderFrom());
 | 
|    EXPECT_TRUE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_TRUE(manager_->HaveUnclearedMips());
 | 
| -  EXPECT_EQ(1, texture_->num_uncleared_mips());
 | 
| -  manager_->SetLevelCleared(texture_, GL_TEXTURE_2D, 1, true);
 | 
| -  EXPECT_TRUE(texture_->SafeToRenderFrom());
 | 
| +  EXPECT_EQ(1, texture->num_uncleared_mips());
 | 
| +  manager_->SetLevelCleared(texture_ref_, GL_TEXTURE_2D, 1, true);
 | 
| +  EXPECT_TRUE(texture->SafeToRenderFrom());
 | 
|    EXPECT_FALSE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_FALSE(manager_->HaveUnclearedMips());
 | 
| -  EXPECT_EQ(0, texture_->num_uncleared_mips());
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  EXPECT_EQ(0, texture->num_uncleared_mips());
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
| -  EXPECT_FALSE(texture_->SafeToRenderFrom());
 | 
| +  EXPECT_FALSE(texture->SafeToRenderFrom());
 | 
|    EXPECT_TRUE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_TRUE(manager_->HaveUnclearedMips());
 | 
| -  EXPECT_EQ(2, texture_->num_uncleared_mips());
 | 
| -  manager_->SetLevelCleared(texture_, GL_TEXTURE_2D, 0, true);
 | 
| -  EXPECT_FALSE(texture_->SafeToRenderFrom());
 | 
| +  EXPECT_EQ(2, texture->num_uncleared_mips());
 | 
| +  manager_->SetLevelCleared(texture_ref_, GL_TEXTURE_2D, 0, true);
 | 
| +  EXPECT_FALSE(texture->SafeToRenderFrom());
 | 
|    EXPECT_TRUE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_TRUE(manager_->HaveUnclearedMips());
 | 
| -  EXPECT_EQ(1, texture_->num_uncleared_mips());
 | 
| -  manager_->SetLevelCleared(texture_, GL_TEXTURE_2D, 1, true);
 | 
| -  EXPECT_TRUE(texture_->SafeToRenderFrom());
 | 
| +  EXPECT_EQ(1, texture->num_uncleared_mips());
 | 
| +  manager_->SetLevelCleared(texture_ref_, GL_TEXTURE_2D, 1, true);
 | 
| +  EXPECT_TRUE(texture->SafeToRenderFrom());
 | 
|    EXPECT_FALSE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_FALSE(manager_->HaveUnclearedMips());
 | 
| -  EXPECT_EQ(0, texture_->num_uncleared_mips());
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  EXPECT_EQ(0, texture->num_uncleared_mips());
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
| -  EXPECT_FALSE(texture_->SafeToRenderFrom());
 | 
| +  EXPECT_FALSE(texture->SafeToRenderFrom());
 | 
|    EXPECT_TRUE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_TRUE(manager_->HaveUnclearedMips());
 | 
| -  EXPECT_EQ(1, texture_->num_uncleared_mips());
 | 
| -  manager_->MarkMipmapsGenerated(texture_);
 | 
| -  EXPECT_TRUE(texture_->SafeToRenderFrom());
 | 
| +  EXPECT_EQ(1, texture->num_uncleared_mips());
 | 
| +  manager_->MarkMipmapsGenerated(texture_ref_);
 | 
| +  EXPECT_TRUE(texture->SafeToRenderFrom());
 | 
|    EXPECT_FALSE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_FALSE(manager_->HaveUnclearedMips());
 | 
| -  EXPECT_EQ(0, texture_->num_uncleared_mips());
 | 
| +  EXPECT_EQ(0, texture->num_uncleared_mips());
 | 
|  
 | 
|    manager_->CreateTexture(kClient2Id, kService2Id);
 | 
| -  scoped_refptr<Texture> texture2(
 | 
| +  scoped_refptr<TextureRef> texture_ref2(
 | 
|        manager_->GetTexture(kClient2Id));
 | 
| -  ASSERT_TRUE(texture2.get() != NULL);
 | 
| -  manager_->SetTarget(texture2, GL_TEXTURE_2D);
 | 
| +  ASSERT_TRUE(texture_ref2.get() != NULL);
 | 
| +  manager_->SetTarget(texture_ref2, GL_TEXTURE_2D);
 | 
|    EXPECT_FALSE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_FALSE(manager_->HaveUnclearedMips());
 | 
| +  Texture* texture2 = texture_ref2->texture();
 | 
|    EXPECT_EQ(0, texture2->num_uncleared_mips());
 | 
| -  manager_->SetLevelInfo(texture2,
 | 
| +  manager_->SetLevelInfo(texture_ref2,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
|    EXPECT_FALSE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_FALSE(manager_->HaveUnclearedMips());
 | 
|    EXPECT_EQ(0, texture2->num_uncleared_mips());
 | 
| -  manager_->SetLevelInfo(texture2,
 | 
| +  manager_->SetLevelInfo(texture_ref2,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
|    EXPECT_TRUE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_TRUE(manager_->HaveUnclearedMips());
 | 
|    EXPECT_EQ(1, texture2->num_uncleared_mips());
 | 
|  
 | 
|    manager_->CreateTexture(kClient3Id, kService3Id);
 | 
| -  scoped_refptr<Texture> texture3(
 | 
| +  scoped_refptr<TextureRef> texture_ref3(
 | 
|        manager_->GetTexture(kClient3Id));
 | 
| -  ASSERT_TRUE(texture3.get() != NULL);
 | 
| -  manager_->SetTarget(texture3, GL_TEXTURE_2D);
 | 
| -  manager_->SetLevelInfo(texture3,
 | 
| +  ASSERT_TRUE(texture_ref3.get() != NULL);
 | 
| +  manager_->SetTarget(texture_ref3, GL_TEXTURE_2D);
 | 
| +  manager_->SetLevelInfo(texture_ref3,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
|    EXPECT_TRUE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_TRUE(manager_->HaveUnclearedMips());
 | 
| +  Texture* texture3 = texture_ref3->texture();
 | 
|    EXPECT_EQ(1, texture3->num_uncleared_mips());
 | 
| -  manager_->SetLevelCleared(texture2, GL_TEXTURE_2D, 0, true);
 | 
| +  manager_->SetLevelCleared(texture_ref2, GL_TEXTURE_2D, 0, true);
 | 
|    EXPECT_TRUE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_TRUE(manager_->HaveUnclearedMips());
 | 
|    EXPECT_EQ(0, texture2->num_uncleared_mips());
 | 
| -  manager_->SetLevelCleared(texture3, GL_TEXTURE_2D, 0, true);
 | 
| +  manager_->SetLevelCleared(texture_ref3, GL_TEXTURE_2D, 0, true);
 | 
|    EXPECT_FALSE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_FALSE(manager_->HaveUnclearedMips());
 | 
|    EXPECT_EQ(0, texture3->num_uncleared_mips());
 | 
|  
 | 
| -  manager_->SetLevelInfo(texture2,
 | 
| +  manager_->SetLevelInfo(texture_ref2,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
| -  manager_->SetLevelInfo(texture3,
 | 
| +  manager_->SetLevelInfo(texture_ref3,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
|    EXPECT_TRUE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_TRUE(manager_->HaveUnclearedMips());
 | 
| @@ -1089,13 +1110,13 @@ TEST_F(TextureTest, SafeUnsafe) {
 | 
|    EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService2Id)))
 | 
|        .Times(1)
 | 
|        .RetiresOnSaturation();
 | 
| -  texture2 = NULL;
 | 
| +  texture_ref2 = NULL;
 | 
|    EXPECT_TRUE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_TRUE(manager_->HaveUnclearedMips());
 | 
|    EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService3Id)))
 | 
|        .Times(1)
 | 
|        .RetiresOnSaturation();
 | 
| -  texture3 = NULL;
 | 
| +  texture_ref3 = NULL;
 | 
|    EXPECT_FALSE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_FALSE(manager_->HaveUnclearedMips());
 | 
|  }
 | 
| @@ -1103,88 +1124,90 @@ TEST_F(TextureTest, SafeUnsafe) {
 | 
|  TEST_F(TextureTest, ClearTexture) {
 | 
|    EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _))
 | 
|        .WillRepeatedly(Return(true));
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_2D);
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
| -  EXPECT_FALSE(texture_->SafeToRenderFrom());
 | 
| +  Texture* texture = texture_ref_->texture();
 | 
| +  EXPECT_FALSE(texture->SafeToRenderFrom());
 | 
|    EXPECT_TRUE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_TRUE(manager_->HaveUnclearedMips());
 | 
| -  EXPECT_EQ(2, texture_->num_uncleared_mips());
 | 
| -  manager_->ClearRenderableLevels(decoder_.get(), texture_);
 | 
| -  EXPECT_TRUE(texture_->SafeToRenderFrom());
 | 
| +  EXPECT_EQ(2, texture->num_uncleared_mips());
 | 
| +  manager_->ClearRenderableLevels(decoder_.get(), texture_ref_);
 | 
| +  EXPECT_TRUE(texture->SafeToRenderFrom());
 | 
|    EXPECT_FALSE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_FALSE(manager_->HaveUnclearedMips());
 | 
| -  EXPECT_EQ(0, texture_->num_uncleared_mips());
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  EXPECT_EQ(0, texture->num_uncleared_mips());
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
| -  EXPECT_FALSE(texture_->SafeToRenderFrom());
 | 
| +  EXPECT_FALSE(texture->SafeToRenderFrom());
 | 
|    EXPECT_TRUE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_TRUE(manager_->HaveUnclearedMips());
 | 
| -  EXPECT_EQ(2, texture_->num_uncleared_mips());
 | 
| -  manager_->ClearTextureLevel(decoder_.get(), texture_, GL_TEXTURE_2D, 0);
 | 
| -  EXPECT_FALSE(texture_->SafeToRenderFrom());
 | 
| +  EXPECT_EQ(2, texture->num_uncleared_mips());
 | 
| +  manager_->ClearTextureLevel(decoder_.get(), texture_ref_, GL_TEXTURE_2D, 0);
 | 
| +  EXPECT_FALSE(texture->SafeToRenderFrom());
 | 
|    EXPECT_TRUE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_TRUE(manager_->HaveUnclearedMips());
 | 
| -  EXPECT_EQ(1, texture_->num_uncleared_mips());
 | 
| -  manager_->ClearTextureLevel(decoder_.get(), texture_, GL_TEXTURE_2D, 1);
 | 
| -  EXPECT_TRUE(texture_->SafeToRenderFrom());
 | 
| +  EXPECT_EQ(1, texture->num_uncleared_mips());
 | 
| +  manager_->ClearTextureLevel(decoder_.get(), texture_ref_, GL_TEXTURE_2D, 1);
 | 
| +  EXPECT_TRUE(texture->SafeToRenderFrom());
 | 
|    EXPECT_FALSE(manager_->HaveUnsafeTextures());
 | 
|    EXPECT_FALSE(manager_->HaveUnclearedMips());
 | 
| -  EXPECT_EQ(0, texture_->num_uncleared_mips());
 | 
| +  EXPECT_EQ(0, texture->num_uncleared_mips());
 | 
|  }
 | 
|  
 | 
|  TEST_F(TextureTest, UseDeletedTexture) {
 | 
|    static const GLuint kClient2Id = 2;
 | 
|    static const GLuint kService2Id = 12;
 | 
|    // Make the default texture renderable
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_2D);
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
|    EXPECT_FALSE(manager_->HaveUnrenderableTextures());
 | 
|    // Make a new texture
 | 
|    manager_->CreateTexture(kClient2Id, kService2Id);
 | 
| -  scoped_refptr<Texture> texture(
 | 
| +  scoped_refptr<TextureRef> texture_ref(
 | 
|        manager_->GetTexture(kClient2Id));
 | 
| -  manager_->SetTarget(texture, GL_TEXTURE_2D);
 | 
| -  EXPECT_FALSE(manager_->CanRender(texture));
 | 
| +  manager_->SetTarget(texture_ref, GL_TEXTURE_2D);
 | 
| +  EXPECT_FALSE(manager_->CanRender(texture_ref));
 | 
|    EXPECT_TRUE(manager_->HaveUnrenderableTextures());
 | 
|    // Remove it.
 | 
|    manager_->RemoveTexture(kClient2Id);
 | 
| -  EXPECT_FALSE(manager_->CanRender(texture));
 | 
| +  EXPECT_FALSE(manager_->CanRender(texture_ref));
 | 
|    EXPECT_TRUE(manager_->HaveUnrenderableTextures());
 | 
|    // Check that we can still manipulate it and it effects the manager.
 | 
| -  manager_->SetLevelInfo(texture,
 | 
| +  manager_->SetLevelInfo(texture_ref,
 | 
|        GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
| -  EXPECT_TRUE(manager_->CanRender(texture));
 | 
| +  EXPECT_TRUE(manager_->CanRender(texture_ref));
 | 
|    EXPECT_FALSE(manager_->HaveUnrenderableTextures());
 | 
|    EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService2Id)))
 | 
|        .Times(1)
 | 
|        .RetiresOnSaturation();
 | 
| -  texture = NULL;
 | 
| +  texture_ref = NULL;
 | 
|  }
 | 
|  
 | 
|  TEST_F(TextureTest, GetLevelImage) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_2D);
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_TRUE(texture_->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
 | 
| +  Texture* texture = texture_ref_->texture();
 | 
| +  EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
 | 
|    // Set image.
 | 
| -  manager_->SetLevelImage(texture_,
 | 
| +  manager_->SetLevelImage(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, gfx::GLImage::CreateGLImage(0));
 | 
| -  EXPECT_FALSE(texture_->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
 | 
| +  EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
 | 
|    // Remove it.
 | 
| -  manager_->SetLevelImage(texture_, GL_TEXTURE_2D, 1, NULL);
 | 
| -  EXPECT_TRUE(texture_->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
 | 
| -  manager_->SetLevelImage(texture_,
 | 
| +  manager_->SetLevelImage(texture_ref_, GL_TEXTURE_2D, 1, NULL);
 | 
| +  EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
 | 
| +  manager_->SetLevelImage(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, gfx::GLImage::CreateGLImage(0));
 | 
|    // Image should be reset when SetLevelInfo is called.
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  EXPECT_TRUE(texture_->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
 | 
| +  EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
 | 
|  }
 | 
|  
 | 
|  namespace {
 | 
| @@ -1198,105 +1221,105 @@ bool InSet(std::set<std::string>* string_set, const std::string& str) {
 | 
|  }  // anonymous namespace
 | 
|  
 | 
|  TEST_F(TextureTest, AddToSignature) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_2D);
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
|    std::string signature1;
 | 
|    std::string signature2;
 | 
| -  manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature1);
 | 
| +  manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature1);
 | 
|  
 | 
|    std::set<std::string> string_set;
 | 
|    EXPECT_FALSE(InSet(&string_set, signature1));
 | 
|  
 | 
|    // check changing 1 thing makes a different signature.
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 4, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| -  manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2);
 | 
| +  manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
 | 
|    EXPECT_FALSE(InSet(&string_set, signature2));
 | 
|  
 | 
|    // check putting it back makes the same signature.
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
|    signature2.clear();
 | 
| -  manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2);
 | 
| +  manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
 | 
|    EXPECT_EQ(signature1, signature2);
 | 
|  
 | 
|    // Check setting cleared status does not change signature.
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
|    signature2.clear();
 | 
| -  manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2);
 | 
| +  manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
 | 
|    EXPECT_EQ(signature1, signature2);
 | 
|  
 | 
|    // Check changing other settings changes signature.
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 2, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
|    signature2.clear();
 | 
| -  manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2);
 | 
| +  manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
 | 
|    EXPECT_FALSE(InSet(&string_set, signature2));
 | 
|  
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
|    signature2.clear();
 | 
| -  manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2);
 | 
| +  manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
 | 
|    EXPECT_FALSE(InSet(&string_set, signature2));
 | 
|  
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
|    signature2.clear();
 | 
| -  manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2);
 | 
| +  manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
 | 
|    EXPECT_FALSE(InSet(&string_set, signature2));
 | 
|  
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, false);
 | 
|    signature2.clear();
 | 
| -  manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2);
 | 
| +  manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
 | 
|    EXPECT_FALSE(InSet(&string_set, signature2));
 | 
|  
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_FLOAT,
 | 
|        false);
 | 
|    signature2.clear();
 | 
| -  manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2);
 | 
| +  manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
 | 
|    EXPECT_FALSE(InSet(&string_set, signature2));
 | 
|  
 | 
|    // put it back
 | 
| -  manager_->SetLevelInfo(texture_,
 | 
| +  manager_->SetLevelInfo(texture_ref_,
 | 
|        GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
 | 
|        false);
 | 
|    signature2.clear();
 | 
| -  manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2);
 | 
| +  manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
 | 
|    EXPECT_EQ(signature1, signature2);
 | 
|  
 | 
|    // check changing parameters changes signature.
 | 
| -  SetParameter(texture_, GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR);
 | 
| +  SetParameter(texture_ref_, GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR);
 | 
|    signature2.clear();
 | 
| -  manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2);
 | 
| +  manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
 | 
|    EXPECT_FALSE(InSet(&string_set, signature2));
 | 
|  
 | 
| -  SetParameter(
 | 
| -      texture_, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR, GL_NO_ERROR);
 | 
| -  SetParameter(texture_, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
 | 
| +  SetParameter(texture_ref_, GL_TEXTURE_MIN_FILTER,
 | 
| +               GL_NEAREST_MIPMAP_LINEAR, GL_NO_ERROR);
 | 
| +  SetParameter(texture_ref_, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
 | 
|    signature2.clear();
 | 
| -  manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2);
 | 
| +  manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
 | 
|    EXPECT_FALSE(InSet(&string_set, signature2));
 | 
|  
 | 
| -  SetParameter(texture_, GL_TEXTURE_MAG_FILTER, GL_LINEAR, GL_NO_ERROR);
 | 
| -  SetParameter(texture_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
 | 
| +  SetParameter(texture_ref_, GL_TEXTURE_MAG_FILTER, GL_LINEAR, GL_NO_ERROR);
 | 
| +  SetParameter(texture_ref_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
 | 
|    signature2.clear();
 | 
| -  manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2);
 | 
| +  manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
 | 
|    EXPECT_FALSE(InSet(&string_set, signature2));
 | 
|  
 | 
| -  SetParameter(texture_, GL_TEXTURE_WRAP_S, GL_REPEAT, GL_NO_ERROR);
 | 
| -  SetParameter(texture_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
 | 
| +  SetParameter(texture_ref_, GL_TEXTURE_WRAP_S, GL_REPEAT, GL_NO_ERROR);
 | 
| +  SetParameter(texture_ref_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
 | 
|    signature2.clear();
 | 
| -  manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2);
 | 
| +  manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
 | 
|    EXPECT_FALSE(InSet(&string_set, signature2));
 | 
|  
 | 
|    // Check putting it back genenerates the same signature
 | 
| -  SetParameter(texture_, GL_TEXTURE_WRAP_T, GL_REPEAT, GL_NO_ERROR);
 | 
| +  SetParameter(texture_ref_, GL_TEXTURE_WRAP_T, GL_REPEAT, GL_NO_ERROR);
 | 
|    signature2.clear();
 | 
| -  manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2);
 | 
| +  manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
 | 
|    EXPECT_EQ(signature1, signature2);
 | 
|  
 | 
|    // Check the set was acutally getting different signatures.
 | 
| @@ -1377,8 +1400,10 @@ class SaveRestoreTextureTest : public TextureTest {
 | 
|      bool cleared;
 | 
|    };
 | 
|  
 | 
| -  void SetLevelInfo(Texture* texture, GLint level, const LevelInfo& info) {
 | 
| -    manager_->SetLevelInfo(texture,
 | 
| +  void SetLevelInfo(TextureRef* texture_ref,
 | 
| +                    GLint level,
 | 
| +                    const LevelInfo& info) {
 | 
| +    manager_->SetLevelInfo(texture_ref,
 | 
|                             info.target,
 | 
|                             level,
 | 
|                             info.format,
 | 
| @@ -1391,9 +1416,10 @@ class SaveRestoreTextureTest : public TextureTest {
 | 
|                             info.cleared);
 | 
|    }
 | 
|  
 | 
| -  static LevelInfo GetLevelInfo(const Texture* texture,
 | 
| +  static LevelInfo GetLevelInfo(const TextureRef* texture_ref,
 | 
|                                  GLint target,
 | 
|                                  GLint level) {
 | 
| +    const Texture* texture = texture_ref->texture();
 | 
|      LevelInfo info;
 | 
|      info.target = target;
 | 
|      EXPECT_TRUE(texture->GetLevelSize(target, level, &info.width,
 | 
| @@ -1404,27 +1430,27 @@ class SaveRestoreTextureTest : public TextureTest {
 | 
|      return info;
 | 
|    }
 | 
|  
 | 
| -  TextureDefinition* Save(Texture* texture) {
 | 
| +  TextureDefinition* Save(TextureRef* texture_ref) {
 | 
|      EXPECT_CALL(*gl_, GenTextures(_, _))
 | 
|          .WillOnce(SetArgumentPointee<1>(kEmptyTextureServiceId));
 | 
| -    TextureDefinition* definition = manager_->Save(texture);
 | 
| +    TextureDefinition* definition = manager_->Save(texture_ref);
 | 
|      EXPECT_TRUE(definition != NULL);
 | 
|      return definition;
 | 
|    }
 | 
|  
 | 
| -  void Restore(Texture* texture, TextureDefinition* definition) {
 | 
| -    EXPECT_CALL(*gl_, DeleteTextures(1, Pointee(texture->service_id())))
 | 
| +  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, definition));
 | 
| +    EXPECT_TRUE(manager_->Restore("TextureTest", decoder_.get(),
 | 
| +                                  texture_ref, definition));
 | 
|    }
 | 
|  
 | 
| -  scoped_refptr<Texture> texture2_;
 | 
| +  scoped_refptr<TextureRef> texture2_;
 | 
|  
 | 
|   private:
 | 
|    static const GLuint kEmptyTextureServiceId;
 | 
| @@ -1437,16 +1463,17 @@ const GLuint SaveRestoreTextureTest::kService2Id = 12;
 | 
|  const GLuint SaveRestoreTextureTest::kEmptyTextureServiceId = 13;
 | 
|  
 | 
|  TEST_F(SaveRestoreTextureTest, SaveRestore2D) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_2D);
 | 
| -  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture_->target());
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
 | 
| +  Texture* texture = texture_ref_->texture();
 | 
| +  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
 | 
|    LevelInfo level0(
 | 
|        GL_TEXTURE_2D, GL_RGBA, 4, 4, 1, 0, GL_UNSIGNED_BYTE, true);
 | 
| -  SetLevelInfo(texture_, 0, level0);
 | 
| -  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_));
 | 
| -  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  LevelInfo level1 = GetLevelInfo(texture_.get(), GL_TEXTURE_2D, 1);
 | 
| -  LevelInfo level2 = GetLevelInfo(texture_.get(), GL_TEXTURE_2D, 2);
 | 
| -  scoped_ptr<TextureDefinition> definition(Save(texture_));
 | 
| +  SetLevelInfo(texture_ref_, 0, level0);
 | 
| +  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_));
 | 
| +  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());
 | 
| @@ -1459,27 +1486,29 @@ TEST_F(SaveRestoreTextureTest, SaveRestore2D) {
 | 
|        0,
 | 
|        LevelInfo(GL_TEXTURE_2D, GL_RGBA, 16, 16, 1, 0, GL_UNSIGNED_BYTE, false));
 | 
|    EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture2_));
 | 
| -  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture2_));
 | 
| -  EXPECT_EQ(1024U + 256U + 64U + 16U + 4U, texture2_->estimated_size());
 | 
| +  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));
 | 
| -  EXPECT_EQ(64U + 16U + 4U, texture2_->estimated_size());
 | 
| +  EXPECT_EQ(64U + 16U + 4U, texture->estimated_size());
 | 
|    GLint w, h;
 | 
| -  EXPECT_TRUE(texture2_->GetLevelSize(GL_TEXTURE_2D, 3, &w, &h));
 | 
| +  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 3, &w, &h));
 | 
|    EXPECT_EQ(0, w);
 | 
|    EXPECT_EQ(0, h);
 | 
|  }
 | 
|  
 | 
|  TEST_F(SaveRestoreTextureTest, SaveRestoreClearRectangle) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_RECTANGLE_ARB);
 | 
| -  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), texture_->target());
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_RECTANGLE_ARB);
 | 
| +  Texture* texture = texture_ref_->texture();
 | 
| +  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), texture->target());
 | 
|    LevelInfo level0(
 | 
|        GL_TEXTURE_RECTANGLE_ARB, GL_RGBA, 1, 1, 1, 0, GL_UNSIGNED_BYTE, false);
 | 
| -  SetLevelInfo(texture_, 0, level0);
 | 
| -  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  scoped_ptr<TextureDefinition> definition(Save(texture_));
 | 
| +  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());
 | 
| @@ -1496,22 +1525,24 @@ TEST_F(SaveRestoreTextureTest, SaveRestoreClearRectangle) {
 | 
|  }
 | 
|  
 | 
|  TEST_F(SaveRestoreTextureTest, SaveRestoreStreamTexture) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_EXTERNAL_OES);
 | 
| -  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture_->target());
 | 
| -  manager_->SetStreamTexture(texture_, true);
 | 
| -  GLuint service_id = texture_->service_id();
 | 
| -  scoped_ptr<TextureDefinition> definition(Save(texture_));
 | 
| -  EXPECT_FALSE(texture_->IsStreamTexture());
 | 
| +  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_->IsStreamTexture());
 | 
| -  EXPECT_TRUE(texture2_->IsImmutable());
 | 
| +  EXPECT_TRUE(texture2_->texture()->IsStreamTexture());
 | 
| +  EXPECT_TRUE(texture2_->texture()->IsImmutable());
 | 
|    EXPECT_EQ(service_id, texture2_->service_id());
 | 
|  }
 | 
|  
 | 
|  TEST_F(SaveRestoreTextureTest, SaveRestoreCube) {
 | 
| -  manager_->SetTarget(texture_, GL_TEXTURE_CUBE_MAP);
 | 
| -  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture_->target());
 | 
| +  manager_->SetTarget(texture_ref_, GL_TEXTURE_CUBE_MAP);
 | 
| +  Texture* texture = texture_ref_->texture();
 | 
| +  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target());
 | 
|    LevelInfo face0(GL_TEXTURE_CUBE_MAP_POSITIVE_X,
 | 
|                    GL_RGBA,
 | 
|                    1,
 | 
| @@ -1528,10 +1559,10 @@ TEST_F(SaveRestoreTextureTest, SaveRestoreCube) {
 | 
|                    0,
 | 
|                    GL_UNSIGNED_BYTE,
 | 
|                    true);
 | 
| -  SetLevelInfo(texture_, 0, face0);
 | 
| -  SetLevelInfo(texture_, 0, face5);
 | 
| -  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_));
 | 
| -  scoped_ptr<TextureDefinition> definition(Save(texture_));
 | 
| +  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());
 | 
| @@ -1543,7 +1574,243 @@ TEST_F(SaveRestoreTextureTest, SaveRestoreCube) {
 | 
|              GetLevelInfo(texture2_.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0));
 | 
|  }
 | 
|  
 | 
| -}  // namespace gles2
 | 
| -}  // namespace gpu
 | 
| +class CountingMemoryTracker : public MemoryTracker {
 | 
| + public:
 | 
| +  CountingMemoryTracker() {
 | 
| +    current_size_[0] = 0;
 | 
| +    current_size_[1] = 0;
 | 
| +  }
 | 
|  
 | 
| +  virtual void TrackMemoryAllocatedChange(size_t old_size,
 | 
| +                                          size_t new_size,
 | 
| +                                          Pool pool)  OVERRIDE {
 | 
| +    DCHECK_LT(static_cast<size_t>(pool), arraysize(current_size_));
 | 
| +    current_size_[pool] += new_size - old_size;
 | 
| +  }
 | 
|  
 | 
| +  virtual bool EnsureGPUMemoryAvailable(size_t size_needed) OVERRIDE {
 | 
| +    return true;
 | 
| +  }
 | 
| +
 | 
| +  size_t GetSize(Pool pool) {
 | 
| +    DCHECK_LT(static_cast<size_t>(pool), arraysize(current_size_));
 | 
| +    return current_size_[pool];
 | 
| +  }
 | 
| +
 | 
| + private:
 | 
| +  virtual ~CountingMemoryTracker() {}
 | 
| +
 | 
| +  size_t current_size_[2];
 | 
| +  DISALLOW_COPY_AND_ASSIGN(CountingMemoryTracker);
 | 
| +};
 | 
| +
 | 
| +class SharedTextureTest : public testing::Test {
 | 
| + public:
 | 
| +  SharedTextureTest()
 | 
| +      : feature_info_(new FeatureInfo()) {
 | 
| +  }
 | 
| +
 | 
| +  virtual ~SharedTextureTest() {
 | 
| +  }
 | 
| +
 | 
| +  virtual void SetUp() {
 | 
| +    gl_.reset(new ::gfx::MockGLInterface());
 | 
| +    ::gfx::GLInterface::SetGLInterface(gl_.get());
 | 
| +
 | 
| +    memory_tracker1_ = new CountingMemoryTracker;
 | 
| +    texture_manager1_.reset(new TextureManager(
 | 
| +        memory_tracker1_, feature_info_.get(),
 | 
| +        TextureManagerTest::kMaxTextureSize,
 | 
| +        TextureManagerTest::kMaxCubeMapTextureSize));
 | 
| +    memory_tracker2_ = new CountingMemoryTracker;
 | 
| +    texture_manager2_.reset(new TextureManager(
 | 
| +        memory_tracker2_, feature_info_.get(),
 | 
| +        TextureManagerTest::kMaxTextureSize,
 | 
| +        TextureManagerTest::kMaxCubeMapTextureSize));
 | 
| +    TestHelper::SetupTextureManagerInitExpectations(gl_.get(), "");
 | 
| +    texture_manager1_->Initialize();
 | 
| +    TestHelper::SetupTextureManagerInitExpectations(gl_.get(), "");
 | 
| +    texture_manager2_->Initialize();
 | 
| +  }
 | 
| +
 | 
| +  virtual void TearDown() {
 | 
| +    texture_manager2_->Destroy(false);
 | 
| +    texture_manager2_.reset();
 | 
| +    texture_manager1_->Destroy(false);
 | 
| +    texture_manager1_.reset();
 | 
| +    ::gfx::GLInterface::SetGLInterface(NULL);
 | 
| +    gl_.reset();
 | 
| +  }
 | 
| +
 | 
| + protected:
 | 
| +  scoped_ptr< ::gfx::MockGLInterface > gl_;
 | 
| +  scoped_refptr<FeatureInfo> feature_info_;
 | 
| +  scoped_refptr<CountingMemoryTracker> memory_tracker1_;
 | 
| +  scoped_ptr<TextureManager> texture_manager1_;
 | 
| +  scoped_refptr<CountingMemoryTracker> memory_tracker2_;
 | 
| +  scoped_ptr<TextureManager> texture_manager2_;
 | 
| +};
 | 
| +
 | 
| +TEST_F(SharedTextureTest, DeleteTextures) {
 | 
| +  scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
 | 
| +  scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(),
 | 
| +                                                  ref1->texture());
 | 
| +  EXPECT_CALL(*gl_, DeleteTextures(1, _))
 | 
| +      .Times(0);
 | 
| +  ref1 = NULL;
 | 
| +  texture_manager1_->RemoveTexture(10);
 | 
| +  testing::Mock::VerifyAndClearExpectations(gl_.get());
 | 
| +
 | 
| +  EXPECT_CALL(*gl_, DeleteTextures(1, _))
 | 
| +      .Times(1)
 | 
| +      .RetiresOnSaturation();
 | 
| +  ref2 = NULL;
 | 
| +  testing::Mock::VerifyAndClearExpectations(gl_.get());
 | 
| +}
 | 
| +
 | 
| +TEST_F(SharedTextureTest, TextureSafetyAccounting) {
 | 
| +  EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures());
 | 
| +  EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
 | 
| +  EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
 | 
| +  EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures());
 | 
| +  EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
 | 
| +  EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
 | 
| +
 | 
| +  // Newly created texture is unrenderable.
 | 
| +  scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
 | 
| +  EXPECT_TRUE(texture_manager1_->HaveUnrenderableTextures());
 | 
| +  EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
 | 
| +  EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
 | 
| +
 | 
| +  // Associate new texture ref to other texture manager, should account for it
 | 
| +  // too.
 | 
| +  scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(),
 | 
| +                                                  ref1->texture());
 | 
| +  EXPECT_TRUE(texture_manager2_->HaveUnrenderableTextures());
 | 
| +  EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
 | 
| +  EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
 | 
| +
 | 
| +  // Make texture renderable but uncleared on one texture manager, should affect
 | 
| +  // other one.
 | 
| +  texture_manager1_->SetTarget(ref1, GL_TEXTURE_2D);
 | 
| +  texture_manager1_->SetLevelInfo(ref1, GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0,
 | 
| +                                  GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
| +  EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures());
 | 
| +  EXPECT_TRUE(texture_manager1_->HaveUnsafeTextures());
 | 
| +  EXPECT_TRUE(texture_manager1_->HaveUnclearedMips());
 | 
| +  EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures());
 | 
| +  EXPECT_TRUE(texture_manager2_->HaveUnsafeTextures());
 | 
| +  EXPECT_TRUE(texture_manager2_->HaveUnclearedMips());
 | 
| +
 | 
| +  // Make texture cleared on one texture manager, should affect other one.
 | 
| +  texture_manager1_->SetLevelCleared(ref1, GL_TEXTURE_2D, 0, true);
 | 
| +  EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
 | 
| +  EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
 | 
| +  EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
 | 
| +  EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
 | 
| +
 | 
| +  EXPECT_CALL(*gl_, DeleteTextures(1, _))
 | 
| +      .Times(1)
 | 
| +      .RetiresOnSaturation();
 | 
| +  texture_manager1_->RemoveTexture(10);
 | 
| +}
 | 
| +
 | 
| +TEST_F(SharedTextureTest, FBOCompletenessCheck) {
 | 
| +  const GLenum kCompleteValue = GL_FRAMEBUFFER_COMPLETE;
 | 
| +  FramebufferManager framebuffer_manager1(1, 1);
 | 
| +  texture_manager1_->set_framebuffer_manager(&framebuffer_manager1);
 | 
| +  FramebufferManager framebuffer_manager2(1, 1);
 | 
| +  texture_manager2_->set_framebuffer_manager(&framebuffer_manager2);
 | 
| +
 | 
| +  scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
 | 
| +  framebuffer_manager1.CreateFramebuffer(10, 10);
 | 
| +  scoped_refptr<Framebuffer> framebuffer1 =
 | 
| +      framebuffer_manager1.GetFramebuffer(10);
 | 
| +  framebuffer1->AttachTexture(GL_COLOR_ATTACHMENT0, ref1, GL_TEXTURE_2D, 0);
 | 
| +  EXPECT_FALSE(framebuffer_manager1.IsComplete(framebuffer1));
 | 
| +  EXPECT_NE(kCompleteValue, framebuffer1->IsPossiblyComplete());
 | 
| +
 | 
| +  // Make FBO complete in manager 1.
 | 
| +  texture_manager1_->SetTarget(ref1, GL_TEXTURE_2D);
 | 
| +  texture_manager1_->SetLevelInfo(ref1, GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0,
 | 
| +                                  GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| +  EXPECT_EQ(kCompleteValue, framebuffer1->IsPossiblyComplete());
 | 
| +  framebuffer_manager1.MarkAsComplete(framebuffer1);
 | 
| +  EXPECT_TRUE(framebuffer_manager1.IsComplete(framebuffer1));
 | 
| +
 | 
| +  // Share texture with manager 2.
 | 
| +  scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(),
 | 
| +                                                  ref1->texture());
 | 
| +  framebuffer_manager2.CreateFramebuffer(20, 20);
 | 
| +  scoped_refptr<Framebuffer> framebuffer2 =
 | 
| +      framebuffer_manager2.GetFramebuffer(20);
 | 
| +  framebuffer2->AttachTexture(GL_COLOR_ATTACHMENT0, ref2, GL_TEXTURE_2D, 0);
 | 
| +  EXPECT_FALSE(framebuffer_manager2.IsComplete(framebuffer2));
 | 
| +  EXPECT_EQ(kCompleteValue, framebuffer2->IsPossiblyComplete());
 | 
| +  framebuffer_manager2.MarkAsComplete(framebuffer2);
 | 
| +  EXPECT_TRUE(framebuffer_manager2.IsComplete(framebuffer2));
 | 
| +
 | 
| +  // Change level for texture, both FBOs should be marked incomplete
 | 
| +  texture_manager1_->SetLevelInfo(ref1, GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0,
 | 
| +                                  GL_RGBA, GL_UNSIGNED_BYTE, true);
 | 
| +  EXPECT_FALSE(framebuffer_manager1.IsComplete(framebuffer1));
 | 
| +  EXPECT_EQ(kCompleteValue, framebuffer1->IsPossiblyComplete());
 | 
| +  framebuffer_manager1.MarkAsComplete(framebuffer1);
 | 
| +  EXPECT_TRUE(framebuffer_manager1.IsComplete(framebuffer1));
 | 
| +  EXPECT_FALSE(framebuffer_manager2.IsComplete(framebuffer2));
 | 
| +  EXPECT_EQ(kCompleteValue, framebuffer2->IsPossiblyComplete());
 | 
| +  framebuffer_manager2.MarkAsComplete(framebuffer2);
 | 
| +  EXPECT_TRUE(framebuffer_manager2.IsComplete(framebuffer2));
 | 
| +
 | 
| +  EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, _))
 | 
| +      .Times(2)
 | 
| +      .RetiresOnSaturation();
 | 
| +  framebuffer_manager1.RemoveFramebuffer(10);
 | 
| +  framebuffer_manager2.RemoveFramebuffer(20);
 | 
| +  EXPECT_CALL(*gl_, DeleteTextures(1, _))
 | 
| +      .Times(1)
 | 
| +      .RetiresOnSaturation();
 | 
| +  texture_manager1_->RemoveTexture(10);
 | 
| +}
 | 
| +
 | 
| +TEST_F(SharedTextureTest, Memory) {
 | 
| +  size_t initial_memory1 = memory_tracker1_->GetSize(MemoryTracker::kUnmanaged);
 | 
| +  size_t initial_memory2 = memory_tracker2_->GetSize(MemoryTracker::kUnmanaged);
 | 
| +
 | 
| +  // Newly created texture is unrenderable.
 | 
| +  scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
 | 
| +  texture_manager1_->SetTarget(ref1, GL_TEXTURE_2D);
 | 
| +  texture_manager1_->SetLevelInfo(ref1, GL_TEXTURE_2D, 0, GL_RGBA, 10, 10, 1, 0,
 | 
| +                                  GL_RGBA, GL_UNSIGNED_BYTE, false);
 | 
| +
 | 
| +  EXPECT_LT(0u, ref1->texture()->estimated_size());
 | 
| +  EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(),
 | 
| +            memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
 | 
| +
 | 
| +  // 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());
 | 
| +  EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(),
 | 
| +            memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
 | 
| +  EXPECT_EQ(initial_memory2,
 | 
| +            memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
 | 
| +
 | 
| +  // Delete the texture, memory should go to the remaining tracker.
 | 
| +  texture_manager1_->RemoveTexture(10);
 | 
| +  ref1 = NULL;
 | 
| +  EXPECT_EQ(initial_memory1,
 | 
| +            memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
 | 
| +  EXPECT_EQ(initial_memory2 + ref2->texture()->estimated_size(),
 | 
| +            memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
 | 
| +
 | 
| +  EXPECT_CALL(*gl_, DeleteTextures(1, _))
 | 
| +      .Times(1)
 | 
| +      .RetiresOnSaturation();
 | 
| +  ref2 = NULL;
 | 
| +  EXPECT_EQ(initial_memory2,
 | 
| +            memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
 | 
| +}
 | 
| +
 | 
| +}  // namespace gles2
 | 
| +}  // namespace gpu
 | 
| 
 |