Home | History | Annotate | Download | only in service
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "gpu/command_buffer/service/texture_manager.h"
      6 
      7 #include "base/memory/scoped_ptr.h"
      8 #include "gpu/command_buffer/service/error_state_mock.h"
      9 #include "gpu/command_buffer/service/feature_info.h"
     10 #include "gpu/command_buffer/service/framebuffer_manager.h"
     11 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h"
     12 #include "gpu/command_buffer/service/gpu_service_test.h"
     13 #include "gpu/command_buffer/service/mailbox_manager.h"
     14 #include "gpu/command_buffer/service/memory_tracking.h"
     15 #include "gpu/command_buffer/service/mocks.h"
     16 #include "gpu/command_buffer/service/test_helper.h"
     17 #include "testing/gtest/include/gtest/gtest.h"
     18 #include "ui/gl/gl_mock.h"
     19 
     20 using ::testing::AtLeast;
     21 using ::testing::Pointee;
     22 using ::testing::Return;
     23 using ::testing::SetArgumentPointee;
     24 using ::testing::StrictMock;
     25 using ::testing::_;
     26 
     27 namespace gpu {
     28 namespace gles2 {
     29 
     30 class TextureTestHelper {
     31  public:
     32   static bool IsNPOT(const Texture* texture) {
     33     return texture->npot();
     34   }
     35   static bool IsTextureComplete(const Texture* texture) {
     36     return texture->texture_complete();
     37   }
     38   static bool IsCubeComplete(const Texture* texture) {
     39     return texture->cube_complete();
     40   }
     41 };
     42 
     43 class TextureManagerTest : public GpuServiceTest {
     44  public:
     45   static const GLint kMaxTextureSize = 16;
     46   static const GLint kMaxCubeMapTextureSize = 8;
     47   static const GLint kMaxExternalTextureSize = 16;
     48   static const GLint kMax2dLevels = 5;
     49   static const GLint kMaxCubeMapLevels = 4;
     50   static const GLint kMaxExternalLevels = 1;
     51   static const bool kUseDefaultTextures = false;
     52 
     53   TextureManagerTest() : feature_info_(new FeatureInfo()) {}
     54 
     55   virtual ~TextureManagerTest() {
     56   }
     57 
     58  protected:
     59   virtual void SetUp() {
     60     GpuServiceTest::SetUp();
     61     manager_.reset(new TextureManager(NULL,
     62                                       feature_info_.get(),
     63                                       kMaxTextureSize,
     64                                       kMaxCubeMapTextureSize,
     65                                       kUseDefaultTextures));
     66     TestHelper::SetupTextureManagerInitExpectations(
     67         gl_.get(), "", kUseDefaultTextures);
     68     manager_->Initialize();
     69     error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>());
     70   }
     71 
     72   virtual void TearDown() {
     73     manager_->Destroy(false);
     74     manager_.reset();
     75     GpuServiceTest::TearDown();
     76   }
     77 
     78   void SetParameter(
     79       TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) {
     80     TestHelper::SetTexParameteriWithExpectations(
     81         gl_.get(), error_state_.get(), manager_.get(),
     82         texture_ref, pname, value, error);
     83   }
     84 
     85   scoped_refptr<FeatureInfo> feature_info_;
     86   scoped_ptr<TextureManager> manager_;
     87   scoped_ptr<MockErrorState> error_state_;
     88 };
     89 
     90 // GCC requires these declarations, but MSVC requires they not be present
     91 #ifndef COMPILER_MSVC
     92 const GLint TextureManagerTest::kMaxTextureSize;
     93 const GLint TextureManagerTest::kMaxCubeMapTextureSize;
     94 const GLint TextureManagerTest::kMaxExternalTextureSize;
     95 const GLint TextureManagerTest::kMax2dLevels;
     96 const GLint TextureManagerTest::kMaxCubeMapLevels;
     97 const GLint TextureManagerTest::kMaxExternalLevels;
     98 #endif
     99 
    100 TEST_F(TextureManagerTest, Basic) {
    101   const GLuint kClient1Id = 1;
    102   const GLuint kService1Id = 11;
    103   const GLuint kClient2Id = 2;
    104   EXPECT_FALSE(manager_->HaveUnrenderableTextures());
    105   EXPECT_FALSE(manager_->HaveUnsafeTextures());
    106   EXPECT_FALSE(manager_->HaveUnclearedMips());
    107   // Check we can create texture.
    108   manager_->CreateTexture(kClient1Id, kService1Id);
    109   // Check texture got created.
    110   scoped_refptr<TextureRef> texture = manager_->GetTexture(kClient1Id);
    111   ASSERT_TRUE(texture.get() != NULL);
    112   EXPECT_EQ(kService1Id, texture->service_id());
    113   EXPECT_EQ(kClient1Id, texture->client_id());
    114   EXPECT_EQ(texture->texture(), manager_->GetTextureForServiceId(
    115       texture->service_id()));
    116   // Check we get nothing for a non-existent texture.
    117   EXPECT_TRUE(manager_->GetTexture(kClient2Id) == NULL);
    118   // Check trying to a remove non-existent textures does not crash.
    119   manager_->RemoveTexture(kClient2Id);
    120   // Check that it gets deleted when the last reference is released.
    121   EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id)))
    122       .Times(1)
    123       .RetiresOnSaturation();
    124   // Check we can't get the texture after we remove it.
    125   manager_->RemoveTexture(kClient1Id);
    126   EXPECT_TRUE(manager_->GetTexture(kClient1Id) == NULL);
    127   EXPECT_EQ(0u, texture->client_id());
    128 }
    129 
    130 TEST_F(TextureManagerTest, SetParameter) {
    131   const GLuint kClient1Id = 1;
    132   const GLuint kService1Id = 11;
    133   // Check we can create texture.
    134   manager_->CreateTexture(kClient1Id, kService1Id);
    135   // Check texture got created.
    136   TextureRef* texture_ref = manager_->GetTexture(kClient1Id);
    137   ASSERT_TRUE(texture_ref != NULL);
    138   Texture* texture = texture_ref->texture();
    139   manager_->SetTarget(texture_ref, GL_TEXTURE_2D);
    140   SetParameter(texture_ref, GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR);
    141   EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter());
    142   SetParameter(texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
    143   EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->mag_filter());
    144   SetParameter(texture_ref, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
    145   EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_s());
    146   SetParameter(texture_ref, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
    147   EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_t());
    148   SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1, GL_NO_ERROR);
    149   SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2, GL_NO_ERROR);
    150   SetParameter(
    151       texture_ref, GL_TEXTURE_MIN_FILTER, GL_CLAMP_TO_EDGE, GL_INVALID_ENUM);
    152   EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter());
    153   SetParameter(
    154       texture_ref, GL_TEXTURE_MAG_FILTER, GL_CLAMP_TO_EDGE, GL_INVALID_ENUM);
    155   EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter());
    156   SetParameter(texture_ref, GL_TEXTURE_WRAP_S, GL_NEAREST, GL_INVALID_ENUM);
    157   EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_s());
    158   SetParameter(texture_ref, GL_TEXTURE_WRAP_T, GL_NEAREST, GL_INVALID_ENUM);
    159   EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_t());
    160   SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 0, GL_INVALID_VALUE);
    161 }
    162 
    163 TEST_F(TextureManagerTest, UseDefaultTexturesTrue) {
    164   bool use_default_textures = true;
    165   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
    166 
    167   TestHelper::SetupTextureManagerInitExpectations(
    168       gl_.get(), "GL_ANGLE_texture_usage", use_default_textures);
    169   TextureManager manager(NULL,
    170                          feature_info_.get(),
    171                          kMaxTextureSize,
    172                          kMaxCubeMapTextureSize,
    173                          use_default_textures);
    174   manager.Initialize();
    175 
    176   EXPECT_TRUE(manager.GetDefaultTextureInfo(GL_TEXTURE_2D) != NULL);
    177   EXPECT_TRUE(manager.GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP) != NULL);
    178 
    179   // TODO(vmiura): Test GL_TEXTURE_EXTERNAL_OES & GL_TEXTURE_RECTANGLE_ARB.
    180 
    181   manager.Destroy(false);
    182 }
    183 
    184 TEST_F(TextureManagerTest, UseDefaultTexturesFalse) {
    185   bool use_default_textures = false;
    186   TestHelper::SetupTextureManagerInitExpectations(
    187       gl_.get(), "GL_ANGLE_texture_usage", use_default_textures);
    188   TextureManager manager(NULL,
    189                          feature_info_.get(),
    190                          kMaxTextureSize,
    191                          kMaxCubeMapTextureSize,
    192                          use_default_textures);
    193   manager.Initialize();
    194 
    195   EXPECT_TRUE(manager.GetDefaultTextureInfo(GL_TEXTURE_2D) == NULL);
    196   EXPECT_TRUE(manager.GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP) == NULL);
    197 
    198   // TODO(vmiura): Test GL_TEXTURE_EXTERNAL_OES & GL_TEXTURE_RECTANGLE_ARB.
    199 
    200   manager.Destroy(false);
    201 }
    202 
    203 TEST_F(TextureManagerTest, TextureUsageExt) {
    204   TestHelper::SetupTextureManagerInitExpectations(
    205       gl_.get(), "GL_ANGLE_texture_usage", kUseDefaultTextures);
    206   TextureManager manager(NULL,
    207                          feature_info_.get(),
    208                          kMaxTextureSize,
    209                          kMaxCubeMapTextureSize,
    210                          kUseDefaultTextures);
    211   manager.Initialize();
    212   const GLuint kClient1Id = 1;
    213   const GLuint kService1Id = 11;
    214   // Check we can create texture.
    215   manager.CreateTexture(kClient1Id, kService1Id);
    216   // Check texture got created.
    217   TextureRef* texture_ref = manager.GetTexture(kClient1Id);
    218   ASSERT_TRUE(texture_ref != NULL);
    219   TestHelper::SetTexParameteriWithExpectations(
    220       gl_.get(), error_state_.get(), &manager, texture_ref,
    221       GL_TEXTURE_USAGE_ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE,GL_NO_ERROR);
    222   EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_ATTACHMENT_ANGLE),
    223             texture_ref->texture()->usage());
    224   manager.Destroy(false);
    225 }
    226 
    227 TEST_F(TextureManagerTest, Destroy) {
    228   const GLuint kClient1Id = 1;
    229   const GLuint kService1Id = 11;
    230   TestHelper::SetupTextureManagerInitExpectations(
    231       gl_.get(), "", kUseDefaultTextures);
    232   TextureManager manager(NULL,
    233                          feature_info_.get(),
    234                          kMaxTextureSize,
    235                          kMaxCubeMapTextureSize,
    236                          kUseDefaultTextures);
    237   manager.Initialize();
    238   // Check we can create texture.
    239   manager.CreateTexture(kClient1Id, kService1Id);
    240   // Check texture got created.
    241   TextureRef* texture = manager.GetTexture(kClient1Id);
    242   ASSERT_TRUE(texture != NULL);
    243   EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id)))
    244       .Times(1)
    245       .RetiresOnSaturation();
    246   TestHelper::SetupTextureManagerDestructionExpectations(
    247       gl_.get(), "", kUseDefaultTextures);
    248   manager.Destroy(true);
    249   // Check that resources got freed.
    250   texture = manager.GetTexture(kClient1Id);
    251   ASSERT_TRUE(texture == NULL);
    252 }
    253 
    254 TEST_F(TextureManagerTest, MaxValues) {
    255   // Check we get the right values for the max sizes.
    256   EXPECT_EQ(kMax2dLevels, manager_->MaxLevelsForTarget(GL_TEXTURE_2D));
    257   EXPECT_EQ(kMaxCubeMapLevels,
    258             manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP));
    259   EXPECT_EQ(kMaxCubeMapLevels,
    260             manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_X));
    261   EXPECT_EQ(kMaxCubeMapLevels,
    262             manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_X));
    263   EXPECT_EQ(kMaxCubeMapLevels,
    264             manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Y));
    265   EXPECT_EQ(kMaxCubeMapLevels,
    266             manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y));
    267   EXPECT_EQ(kMaxCubeMapLevels,
    268             manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Z));
    269   EXPECT_EQ(kMaxCubeMapLevels,
    270             manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z));
    271   EXPECT_EQ(kMaxExternalLevels,
    272             manager_->MaxLevelsForTarget(GL_TEXTURE_EXTERNAL_OES));
    273   EXPECT_EQ(kMaxTextureSize, manager_->MaxSizeForTarget(GL_TEXTURE_2D));
    274   EXPECT_EQ(kMaxCubeMapTextureSize,
    275             manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP));
    276   EXPECT_EQ(kMaxCubeMapTextureSize,
    277             manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_X));
    278   EXPECT_EQ(kMaxCubeMapTextureSize,
    279             manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_X));
    280   EXPECT_EQ(kMaxCubeMapTextureSize,
    281             manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Y));
    282   EXPECT_EQ(kMaxCubeMapTextureSize,
    283             manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y));
    284   EXPECT_EQ(kMaxCubeMapTextureSize,
    285             manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Z));
    286   EXPECT_EQ(kMaxCubeMapTextureSize,
    287             manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z));
    288   EXPECT_EQ(kMaxExternalTextureSize,
    289             manager_->MaxSizeForTarget(GL_TEXTURE_EXTERNAL_OES));
    290 }
    291 
    292 TEST_F(TextureManagerTest, ValidForTarget) {
    293   // check 2d
    294   EXPECT_TRUE(manager_->ValidForTarget(
    295       GL_TEXTURE_2D, 0, kMaxTextureSize, kMaxTextureSize, 1));
    296   EXPECT_TRUE(manager_->ValidForTarget(
    297       GL_TEXTURE_2D, kMax2dLevels - 1, 1, 1, 1));
    298   EXPECT_FALSE(manager_->ValidForTarget(
    299       GL_TEXTURE_2D, kMax2dLevels - 1, 1, 2, 1));
    300   EXPECT_FALSE(manager_->ValidForTarget(
    301       GL_TEXTURE_2D, kMax2dLevels - 1, 2, 1, 1));
    302   // check level out of range.
    303   EXPECT_FALSE(manager_->ValidForTarget(
    304       GL_TEXTURE_2D, kMax2dLevels, kMaxTextureSize, 1, 1));
    305   // check has depth.
    306   EXPECT_FALSE(manager_->ValidForTarget(
    307       GL_TEXTURE_2D, kMax2dLevels, kMaxTextureSize, 1, 2));
    308   // Check NPOT width on level 0
    309   EXPECT_TRUE(manager_->ValidForTarget(GL_TEXTURE_2D, 0, 5, 2, 1));
    310   // Check NPOT height on level 0
    311   EXPECT_TRUE(manager_->ValidForTarget(GL_TEXTURE_2D, 0, 2, 5, 1));
    312   // Check NPOT width on level 1
    313   EXPECT_FALSE(manager_->ValidForTarget(GL_TEXTURE_2D, 1, 5, 2, 1));
    314   // Check NPOT height on level 1
    315   EXPECT_FALSE(manager_->ValidForTarget(GL_TEXTURE_2D, 1, 2, 5, 1));
    316 
    317   // check cube
    318   EXPECT_TRUE(manager_->ValidForTarget(
    319       GL_TEXTURE_CUBE_MAP, 0,
    320       kMaxCubeMapTextureSize, kMaxCubeMapTextureSize, 1));
    321   EXPECT_TRUE(manager_->ValidForTarget(
    322       GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels - 1, 1, 1, 1));
    323   EXPECT_FALSE(manager_->ValidForTarget(
    324       GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels - 1, 2, 2, 1));
    325   // check level out of range.
    326   EXPECT_FALSE(manager_->ValidForTarget(
    327       GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels,
    328       kMaxCubeMapTextureSize, 1, 1));
    329   // check not square.
    330   EXPECT_FALSE(manager_->ValidForTarget(
    331       GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels,
    332       kMaxCubeMapTextureSize, 1, 1));
    333   // check has depth.
    334   EXPECT_FALSE(manager_->ValidForTarget(
    335       GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels,
    336       kMaxCubeMapTextureSize, 1, 2));
    337 
    338   for (GLint level = 0; level < kMax2dLevels; ++level) {
    339     EXPECT_TRUE(manager_->ValidForTarget(
    340         GL_TEXTURE_2D, level, kMaxTextureSize >> level, 1, 1));
    341     EXPECT_TRUE(manager_->ValidForTarget(
    342         GL_TEXTURE_2D, level, 1, kMaxTextureSize >> level, 1));
    343     EXPECT_FALSE(manager_->ValidForTarget(
    344         GL_TEXTURE_2D, level, (kMaxTextureSize >> level) + 1, 1, 1));
    345     EXPECT_FALSE(manager_->ValidForTarget(
    346         GL_TEXTURE_2D, level, 1, (kMaxTextureSize >> level) + 1, 1));
    347   }
    348 
    349   for (GLint level = 0; level < kMaxCubeMapLevels; ++level) {
    350     EXPECT_TRUE(manager_->ValidForTarget(
    351         GL_TEXTURE_CUBE_MAP, level,
    352         kMaxCubeMapTextureSize >> level,
    353         kMaxCubeMapTextureSize >> level,
    354         1));
    355     EXPECT_FALSE(manager_->ValidForTarget(
    356         GL_TEXTURE_CUBE_MAP, level,
    357         (kMaxCubeMapTextureSize >> level) * 2,
    358         (kMaxCubeMapTextureSize >> level) * 2,
    359         1));
    360   }
    361 }
    362 
    363 TEST_F(TextureManagerTest, ValidForTargetNPOT) {
    364   TestHelper::SetupFeatureInfoInitExpectations(
    365       gl_.get(), "GL_OES_texture_npot");
    366   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
    367   feature_info->Initialize();
    368   TextureManager manager(NULL,
    369                          feature_info.get(),
    370                          kMaxTextureSize,
    371                          kMaxCubeMapTextureSize,
    372                          kUseDefaultTextures);
    373   // Check NPOT width on level 0
    374   EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 0, 5, 2, 1));
    375   // Check NPOT height on level 0
    376   EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 0, 2, 5, 1));
    377   // Check NPOT width on level 1
    378   EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 1, 5, 2, 1));
    379   // Check NPOT height on level 1
    380   EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 1, 2, 5, 1));
    381   manager.Destroy(false);
    382 }
    383 
    384 class TextureTestBase : public GpuServiceTest {
    385  public:
    386   static const GLint kMaxTextureSize = 16;
    387   static const GLint kMaxCubeMapTextureSize = 8;
    388   static const GLint kMax2dLevels = 5;
    389   static const GLint kMaxCubeMapLevels = 4;
    390   static const GLuint kClient1Id = 1;
    391   static const GLuint kService1Id = 11;
    392   static const bool kUseDefaultTextures = false;
    393 
    394   TextureTestBase()
    395       : feature_info_(new FeatureInfo()) {
    396   }
    397   virtual ~TextureTestBase() {
    398     texture_ref_ = NULL;
    399   }
    400 
    401  protected:
    402   void SetUpBase(MemoryTracker* memory_tracker, std::string extensions) {
    403     GpuServiceTest::SetUp();
    404     if (!extensions.empty()) {
    405       TestHelper::SetupFeatureInfoInitExpectations(gl_.get(),
    406                                                    extensions.c_str());
    407       feature_info_->Initialize();
    408     }
    409 
    410     manager_.reset(new TextureManager(memory_tracker,
    411                                       feature_info_.get(),
    412                                       kMaxTextureSize,
    413                                       kMaxCubeMapTextureSize,
    414                                       kUseDefaultTextures));
    415     decoder_.reset(new ::testing::StrictMock<gles2::MockGLES2Decoder>());
    416     error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>());
    417     manager_->CreateTexture(kClient1Id, kService1Id);
    418     texture_ref_ = manager_->GetTexture(kClient1Id);
    419     ASSERT_TRUE(texture_ref_.get() != NULL);
    420   }
    421 
    422   virtual void TearDown() {
    423     if (texture_ref_.get()) {
    424       // If it's not in the manager then setting texture_ref_ to NULL will
    425       // delete the texture.
    426       if (!texture_ref_->client_id()) {
    427         // Check that it gets deleted when the last reference is released.
    428         EXPECT_CALL(*gl_,
    429             DeleteTextures(1, ::testing::Pointee(texture_ref_->service_id())))
    430             .Times(1)
    431             .RetiresOnSaturation();
    432       }
    433       texture_ref_ = NULL;
    434     }
    435     manager_->Destroy(false);
    436     manager_.reset();
    437     GpuServiceTest::TearDown();
    438   }
    439 
    440   void SetParameter(
    441       TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) {
    442     TestHelper::SetTexParameteriWithExpectations(
    443         gl_.get(), error_state_.get(), manager_.get(),
    444         texture_ref, pname, value, error);
    445   }
    446 
    447   scoped_ptr<MockGLES2Decoder> decoder_;
    448   scoped_ptr<MockErrorState> error_state_;
    449   scoped_refptr<FeatureInfo> feature_info_;
    450   scoped_ptr<TextureManager> manager_;
    451   scoped_refptr<TextureRef> texture_ref_;
    452 };
    453 
    454 class TextureTest : public TextureTestBase {
    455  protected:
    456   virtual void SetUp() {
    457     SetUpBase(NULL, std::string());
    458   }
    459 };
    460 
    461 class TextureMemoryTrackerTest : public TextureTestBase {
    462  protected:
    463   virtual void SetUp() {
    464     mock_memory_tracker_ = new StrictMock<MockMemoryTracker>();
    465     SetUpBase(mock_memory_tracker_.get(), std::string());
    466   }
    467 
    468   scoped_refptr<MockMemoryTracker> mock_memory_tracker_;
    469 };
    470 
    471 #define EXPECT_MEMORY_ALLOCATION_CHANGE(old_size, new_size, pool)   \
    472   EXPECT_CALL(*mock_memory_tracker_.get(),                          \
    473               TrackMemoryAllocatedChange(old_size, new_size, pool)) \
    474       .Times(1).RetiresOnSaturation()
    475 
    476 TEST_F(TextureTest, Basic) {
    477   Texture* texture = texture_ref_->texture();
    478   EXPECT_EQ(0u, texture->target());
    479   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
    480   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
    481   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
    482   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
    483   EXPECT_EQ(0, texture->num_uncleared_mips());
    484   EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
    485   EXPECT_TRUE(texture->SafeToRenderFrom());
    486   EXPECT_FALSE(texture->IsImmutable());
    487   EXPECT_EQ(static_cast<GLenum>(GL_NEAREST_MIPMAP_LINEAR),
    488             texture->min_filter());
    489   EXPECT_EQ(static_cast<GLenum>(GL_LINEAR), texture->mag_filter());
    490   EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture->wrap_s());
    491   EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture->wrap_t());
    492   EXPECT_FALSE(manager_->HaveUnrenderableTextures());
    493   EXPECT_FALSE(manager_->HaveUnsafeTextures());
    494   EXPECT_EQ(0u, texture->estimated_size());
    495 }
    496 
    497 TEST_F(TextureTest, SetTargetTexture2D) {
    498   Texture* texture = texture_ref_->texture();
    499   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
    500   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
    501   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
    502   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
    503   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
    504   EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
    505   EXPECT_TRUE(texture->SafeToRenderFrom());
    506   EXPECT_FALSE(texture->IsImmutable());
    507 }
    508 
    509 TEST_F(TextureTest, SetTargetTextureExternalOES) {
    510   Texture* texture = texture_ref_->texture();
    511   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_EXTERNAL_OES);
    512   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
    513   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
    514   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
    515   EXPECT_TRUE(TextureTestHelper::IsNPOT(texture));
    516   EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
    517   EXPECT_TRUE(texture->SafeToRenderFrom());
    518   EXPECT_TRUE(texture->IsImmutable());
    519 }
    520 
    521 TEST_F(TextureTest, ZeroSizeCanNotRender) {
    522   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
    523   EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
    524   manager_->SetLevelInfo(texture_ref_.get(),
    525                          GL_TEXTURE_2D,
    526                          0,
    527                          GL_RGBA,
    528                          1,
    529                          1,
    530                          1,
    531                          0,
    532                          GL_RGBA,
    533                          GL_UNSIGNED_BYTE,
    534                          true);
    535   EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
    536   manager_->SetLevelInfo(texture_ref_.get(),
    537                          GL_TEXTURE_2D,
    538                          0,
    539                          GL_RGBA,
    540                          0,
    541                          0,
    542                          1,
    543                          0,
    544                          GL_RGBA,
    545                          GL_UNSIGNED_BYTE,
    546                          true);
    547   EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
    548 }
    549 
    550 TEST_F(TextureTest, EstimatedSize) {
    551   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
    552   manager_->SetLevelInfo(texture_ref_.get(),
    553                          GL_TEXTURE_2D,
    554                          0,
    555                          GL_RGBA,
    556                          8,
    557                          4,
    558                          1,
    559                          0,
    560                          GL_RGBA,
    561                          GL_UNSIGNED_BYTE,
    562                          true);
    563   EXPECT_EQ(8u * 4u * 4u, texture_ref_->texture()->estimated_size());
    564   manager_->SetLevelInfo(texture_ref_.get(),
    565                          GL_TEXTURE_2D,
    566                          2,
    567                          GL_RGBA,
    568                          8,
    569                          4,
    570                          1,
    571                          0,
    572                          GL_RGBA,
    573                          GL_UNSIGNED_BYTE,
    574                          true);
    575   EXPECT_EQ(8u * 4u * 4u * 2u, texture_ref_->texture()->estimated_size());
    576 }
    577 
    578 TEST_F(TextureMemoryTrackerTest, EstimatedSize) {
    579   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
    580   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged);
    581   manager_->SetLevelInfo(texture_ref_.get(),
    582                          GL_TEXTURE_2D,
    583                          0,
    584                          GL_RGBA,
    585                          8,
    586                          4,
    587                          1,
    588                          0,
    589                          GL_RGBA,
    590                          GL_UNSIGNED_BYTE,
    591                          true);
    592   EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged);
    593   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 256, MemoryTracker::kUnmanaged);
    594   manager_->SetLevelInfo(texture_ref_.get(),
    595                          GL_TEXTURE_2D,
    596                          2,
    597                          GL_RGBA,
    598                          8,
    599                          4,
    600                          1,
    601                          0,
    602                          GL_RGBA,
    603                          GL_UNSIGNED_BYTE,
    604                          true);
    605   // Add expectation for texture deletion.
    606   EXPECT_MEMORY_ALLOCATION_CHANGE(256, 0, MemoryTracker::kUnmanaged);
    607   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged);
    608 }
    609 
    610 TEST_F(TextureMemoryTrackerTest, SetParameterPool) {
    611   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
    612   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged);
    613   manager_->SetLevelInfo(texture_ref_.get(),
    614                          GL_TEXTURE_2D,
    615                          0,
    616                          GL_RGBA,
    617                          8,
    618                          4,
    619                          1,
    620                          0,
    621                          GL_RGBA,
    622                          GL_UNSIGNED_BYTE,
    623                          true);
    624   EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged);
    625   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kManaged);
    626   SetParameter(texture_ref_.get(),
    627                GL_TEXTURE_POOL_CHROMIUM,
    628                GL_TEXTURE_POOL_MANAGED_CHROMIUM,
    629                GL_NO_ERROR);
    630   // Add expectation for texture deletion.
    631   EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kManaged);
    632   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged);
    633   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kManaged);
    634 }
    635 
    636 TEST_F(TextureTest, POT2D) {
    637   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
    638   Texture* texture = texture_ref_->texture();
    639   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
    640   // Check Setting level 0 to POT
    641   manager_->SetLevelInfo(texture_ref_.get(),
    642                          GL_TEXTURE_2D,
    643                          0,
    644                          GL_RGBA,
    645                          4,
    646                          4,
    647                          1,
    648                          0,
    649                          GL_RGBA,
    650                          GL_UNSIGNED_BYTE,
    651                          true);
    652   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
    653   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
    654   EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
    655   EXPECT_EQ(0, texture->num_uncleared_mips());
    656   EXPECT_TRUE(manager_->HaveUnrenderableTextures());
    657   // Set filters to something that will work with a single mip.
    658   SetParameter(
    659       texture_ref_.get(), GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR);
    660   EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
    661   EXPECT_FALSE(manager_->HaveUnrenderableTextures());
    662   // Set them back.
    663   SetParameter(texture_ref_.get(),
    664                GL_TEXTURE_MIN_FILTER,
    665                GL_LINEAR_MIPMAP_LINEAR,
    666                GL_NO_ERROR);
    667   EXPECT_TRUE(manager_->HaveUnrenderableTextures());
    668 
    669   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
    670   // Make mips.
    671   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
    672   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
    673   EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
    674   EXPECT_FALSE(manager_->HaveUnrenderableTextures());
    675   // Change a mip.
    676   manager_->SetLevelInfo(texture_ref_.get(),
    677                          GL_TEXTURE_2D,
    678                          1,
    679                          GL_RGBA,
    680                          4,
    681                          4,
    682                          1,
    683                          0,
    684                          GL_RGBA,
    685                          GL_UNSIGNED_BYTE,
    686                          true);
    687   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
    688   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
    689   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
    690   EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
    691   EXPECT_TRUE(manager_->HaveUnrenderableTextures());
    692   // Set a level past the number of mips that would get generated.
    693   manager_->SetLevelInfo(texture_ref_.get(),
    694                          GL_TEXTURE_2D,
    695                          3,
    696                          GL_RGBA,
    697                          4,
    698                          4,
    699                          1,
    700                          0,
    701                          GL_RGBA,
    702                          GL_UNSIGNED_BYTE,
    703                          true);
    704   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
    705   // Make mips.
    706   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
    707   EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
    708   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
    709   EXPECT_FALSE(manager_->HaveUnrenderableTextures());
    710 }
    711 
    712 TEST_F(TextureMemoryTrackerTest, MarkMipmapsGenerated) {
    713   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
    714   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 64, MemoryTracker::kUnmanaged);
    715   manager_->SetLevelInfo(texture_ref_.get(),
    716                          GL_TEXTURE_2D,
    717                          0,
    718                          GL_RGBA,
    719                          4,
    720                          4,
    721                          1,
    722                          0,
    723                          GL_RGBA,
    724                          GL_UNSIGNED_BYTE,
    725                          true);
    726   EXPECT_MEMORY_ALLOCATION_CHANGE(64, 0, MemoryTracker::kUnmanaged);
    727   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 84, MemoryTracker::kUnmanaged);
    728   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
    729   EXPECT_MEMORY_ALLOCATION_CHANGE(84, 0, MemoryTracker::kUnmanaged);
    730   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged);
    731 }
    732 
    733 TEST_F(TextureTest, UnusedMips) {
    734   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
    735   Texture* texture = texture_ref_->texture();
    736   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
    737   // Set level zero to large size.
    738   manager_->SetLevelInfo(texture_ref_.get(),
    739                          GL_TEXTURE_2D,
    740                          0,
    741                          GL_RGBA,
    742                          4,
    743                          4,
    744                          1,
    745                          0,
    746                          GL_RGBA,
    747                          GL_UNSIGNED_BYTE,
    748                          true);
    749   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
    750   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
    751   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
    752   EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
    753   EXPECT_FALSE(manager_->HaveUnrenderableTextures());
    754   // Set level zero to large smaller (levels unused mips)
    755   manager_->SetLevelInfo(texture_ref_.get(),
    756                          GL_TEXTURE_2D,
    757                          0,
    758                          GL_RGBA,
    759                          2,
    760                          2,
    761                          1,
    762                          0,
    763                          GL_RGBA,
    764                          GL_UNSIGNED_BYTE,
    765                          true);
    766   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
    767   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
    768   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
    769   EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
    770   EXPECT_FALSE(manager_->HaveUnrenderableTextures());
    771   // Set an unused level to some size
    772   manager_->SetLevelInfo(texture_ref_.get(),
    773                          GL_TEXTURE_2D,
    774                          4,
    775                          GL_RGBA,
    776                          16,
    777                          16,
    778                          1,
    779                          0,
    780                          GL_RGBA,
    781                          GL_UNSIGNED_BYTE,
    782                          true);
    783   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
    784   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
    785   EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
    786   EXPECT_FALSE(manager_->HaveUnrenderableTextures());
    787 }
    788 
    789 TEST_F(TextureTest, NPOT2D) {
    790   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
    791   Texture* texture = texture_ref_->texture();
    792   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
    793   // Check Setting level 0 to NPOT
    794   manager_->SetLevelInfo(texture_ref_.get(),
    795                          GL_TEXTURE_2D,
    796                          0,
    797                          GL_RGBA,
    798                          4,
    799                          5,
    800                          1,
    801                          0,
    802                          GL_RGBA,
    803                          GL_UNSIGNED_BYTE,
    804                          true);
    805   EXPECT_TRUE(TextureTestHelper::IsNPOT(texture));
    806   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
    807   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
    808   EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
    809   EXPECT_TRUE(manager_->HaveUnrenderableTextures());
    810   SetParameter(
    811       texture_ref_.get(), GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR);
    812   EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
    813   EXPECT_TRUE(manager_->HaveUnrenderableTextures());
    814   SetParameter(
    815       texture_ref_.get(), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
    816   EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
    817   EXPECT_TRUE(manager_->HaveUnrenderableTextures());
    818   SetParameter(
    819       texture_ref_.get(), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
    820   EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
    821   EXPECT_FALSE(manager_->HaveUnrenderableTextures());
    822   // Change it to POT.
    823   manager_->SetLevelInfo(texture_ref_.get(),
    824                          GL_TEXTURE_2D,
    825                          0,
    826                          GL_RGBA,
    827                          4,
    828                          4,
    829                          1,
    830                          0,
    831                          GL_RGBA,
    832                          GL_UNSIGNED_BYTE,
    833                          true);
    834   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
    835   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
    836   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
    837   EXPECT_FALSE(manager_->HaveUnrenderableTextures());
    838 }
    839 
    840 TEST_F(TextureTest, NPOT2DNPOTOK) {
    841   TestHelper::SetupFeatureInfoInitExpectations(
    842       gl_.get(), "GL_OES_texture_npot");
    843   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
    844   feature_info->Initialize();
    845   TextureManager manager(NULL,
    846                          feature_info.get(),
    847                          kMaxTextureSize,
    848                          kMaxCubeMapTextureSize,
    849                          kUseDefaultTextures);
    850   manager.CreateTexture(kClient1Id, kService1Id);
    851   TextureRef* texture_ref = manager.GetTexture(kClient1Id);
    852   ASSERT_TRUE(texture_ref != NULL);
    853   Texture* texture = texture_ref->texture();
    854 
    855   manager.SetTarget(texture_ref, GL_TEXTURE_2D);
    856   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
    857   // Check Setting level 0 to NPOT
    858   manager.SetLevelInfo(texture_ref,
    859       GL_TEXTURE_2D, 0, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
    860   EXPECT_TRUE(TextureTestHelper::IsNPOT(texture));
    861   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
    862   EXPECT_TRUE(manager.CanGenerateMipmaps(texture_ref));
    863   EXPECT_FALSE(manager.CanRender(texture_ref));
    864   EXPECT_TRUE(manager.HaveUnrenderableTextures());
    865   EXPECT_TRUE(manager.MarkMipmapsGenerated(texture_ref));
    866   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
    867   EXPECT_TRUE(manager.CanRender(texture_ref));
    868   EXPECT_FALSE(manager.HaveUnrenderableTextures());
    869   manager.Destroy(false);
    870 }
    871 
    872 TEST_F(TextureTest, POTCubeMap) {
    873   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_CUBE_MAP);
    874   Texture* texture = texture_ref_->texture();
    875   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target());
    876   // Check Setting level 0 each face to POT
    877   manager_->SetLevelInfo(texture_ref_.get(),
    878                          GL_TEXTURE_CUBE_MAP_POSITIVE_X,
    879                          0,
    880                          GL_RGBA,
    881                          4,
    882                          4,
    883                          1,
    884                          0,
    885                          GL_RGBA,
    886                          GL_UNSIGNED_BYTE,
    887                          true);
    888   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
    889   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
    890   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
    891   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
    892   EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
    893   EXPECT_TRUE(manager_->HaveUnrenderableTextures());
    894   manager_->SetLevelInfo(texture_ref_.get(),
    895                          GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
    896                          0,
    897                          GL_RGBA,
    898                          4,
    899                          4,
    900                          1,
    901                          0,
    902                          GL_RGBA,
    903                          GL_UNSIGNED_BYTE,
    904                          true);
    905   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
    906   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
    907   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
    908   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
    909   EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
    910   EXPECT_TRUE(manager_->HaveUnrenderableTextures());
    911   manager_->SetLevelInfo(texture_ref_.get(),
    912                          GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
    913                          0,
    914                          GL_RGBA,
    915                          4,
    916                          4,
    917                          1,
    918                          0,
    919                          GL_RGBA,
    920                          GL_UNSIGNED_BYTE,
    921                          true);
    922   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
    923   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
    924   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
    925   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
    926   EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
    927   EXPECT_TRUE(manager_->HaveUnrenderableTextures());
    928   manager_->SetLevelInfo(texture_ref_.get(),
    929                          GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
    930                          0,
    931                          GL_RGBA,
    932                          4,
    933                          4,
    934                          1,
    935                          0,
    936                          GL_RGBA,
    937                          GL_UNSIGNED_BYTE,
    938                          true);
    939   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
    940   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
    941   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
    942   EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
    943   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
    944   EXPECT_TRUE(manager_->HaveUnrenderableTextures());
    945   manager_->SetLevelInfo(texture_ref_.get(),
    946                          GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
    947                          0,
    948                          GL_RGBA,
    949                          4,
    950                          4,
    951                          1,
    952                          0,
    953                          GL_RGBA,
    954                          GL_UNSIGNED_BYTE,
    955                          true);
    956   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
    957   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
    958   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
    959   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
    960   EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
    961   EXPECT_TRUE(manager_->HaveUnrenderableTextures());
    962   manager_->SetLevelInfo(texture_ref_.get(),
    963                          GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
    964                          0,
    965                          GL_RGBA,
    966                          4,
    967                          4,
    968                          1,
    969                          0,
    970                          GL_RGBA,
    971                          GL_UNSIGNED_BYTE,
    972                          true);
    973   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
    974   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
    975   EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
    976   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
    977   EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
    978   EXPECT_TRUE(manager_->HaveUnrenderableTextures());
    979 
    980   // Make mips.
    981   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
    982   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
    983   EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
    984   EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
    985   EXPECT_FALSE(manager_->HaveUnrenderableTextures());
    986 
    987   // Change a mip.
    988   manager_->SetLevelInfo(texture_ref_.get(),
    989                          GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
    990                          1,
    991                          GL_RGBA,
    992                          4,
    993                          4,
    994                          1,
    995                          0,
    996                          GL_RGBA,
    997                          GL_UNSIGNED_BYTE,
    998                          true);
    999   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
   1000   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
   1001   EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
   1002   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
   1003   // Set a level past the number of mips that would get generated.
   1004   manager_->SetLevelInfo(texture_ref_.get(),
   1005                          GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
   1006                          3,
   1007                          GL_RGBA,
   1008                          4,
   1009                          4,
   1010                          1,
   1011                          0,
   1012                          GL_RGBA,
   1013                          GL_UNSIGNED_BYTE,
   1014                          true);
   1015   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
   1016   // Make mips.
   1017   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
   1018   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
   1019   EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
   1020 }
   1021 
   1022 TEST_F(TextureTest, GetLevelSize) {
   1023   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
   1024   manager_->SetLevelInfo(texture_ref_.get(),
   1025                          GL_TEXTURE_2D,
   1026                          1,
   1027                          GL_RGBA,
   1028                          4,
   1029                          5,
   1030                          1,
   1031                          0,
   1032                          GL_RGBA,
   1033                          GL_UNSIGNED_BYTE,
   1034                          true);
   1035   GLsizei width = -1;
   1036   GLsizei height = -1;
   1037   Texture* texture = texture_ref_->texture();
   1038   EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, -1, &width, &height));
   1039   EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 1000, &width, &height));
   1040   EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
   1041   EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
   1042   EXPECT_EQ(4, width);
   1043   EXPECT_EQ(5, height);
   1044   manager_->RemoveTexture(kClient1Id);
   1045   EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
   1046   EXPECT_EQ(4, width);
   1047   EXPECT_EQ(5, height);
   1048 }
   1049 
   1050 TEST_F(TextureTest, GetLevelType) {
   1051   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
   1052   manager_->SetLevelInfo(texture_ref_.get(),
   1053                          GL_TEXTURE_2D,
   1054                          1,
   1055                          GL_RGBA,
   1056                          4,
   1057                          5,
   1058                          1,
   1059                          0,
   1060                          GL_RGBA,
   1061                          GL_UNSIGNED_BYTE,
   1062                          true);
   1063   GLenum type = -1;
   1064   GLenum format = -1;
   1065   Texture* texture = texture_ref_->texture();
   1066   EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, -1, &type, &format));
   1067   EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, 1000, &type, &format));
   1068   EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &format));
   1069   EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &format));
   1070   EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
   1071   EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format);
   1072   manager_->RemoveTexture(kClient1Id);
   1073   EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &format));
   1074   EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
   1075   EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format);
   1076 }
   1077 
   1078 TEST_F(TextureTest, ValidForTexture) {
   1079   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
   1080   manager_->SetLevelInfo(texture_ref_.get(),
   1081                          GL_TEXTURE_2D,
   1082                          1,
   1083                          GL_RGBA,
   1084                          4,
   1085                          5,
   1086                          1,
   1087                          0,
   1088                          GL_RGBA,
   1089                          GL_UNSIGNED_BYTE,
   1090                          true);
   1091   // Check bad face.
   1092   Texture* texture = texture_ref_->texture();
   1093   EXPECT_FALSE(texture->ValidForTexture(
   1094       GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
   1095       1, 0, 0, 4, 5, GL_UNSIGNED_BYTE));
   1096   // Check bad level.
   1097   EXPECT_FALSE(texture->ValidForTexture(
   1098       GL_TEXTURE_2D, 0, 0, 0, 4, 5, GL_UNSIGNED_BYTE));
   1099   // Check bad xoffset.
   1100   EXPECT_FALSE(texture->ValidForTexture(
   1101       GL_TEXTURE_2D, 1, -1, 0, 4, 5, GL_UNSIGNED_BYTE));
   1102   // Check bad xoffset + width > width.
   1103   EXPECT_FALSE(texture->ValidForTexture(
   1104       GL_TEXTURE_2D, 1, 1, 0, 4, 5, GL_UNSIGNED_BYTE));
   1105   // Check bad yoffset.
   1106   EXPECT_FALSE(texture->ValidForTexture(
   1107       GL_TEXTURE_2D, 1, 0, -1, 4, 5, GL_UNSIGNED_BYTE));
   1108   // Check bad yoffset + height > height.
   1109   EXPECT_FALSE(texture->ValidForTexture(
   1110       GL_TEXTURE_2D, 1, 0, 1, 4, 5, GL_UNSIGNED_BYTE));
   1111   // Check bad width.
   1112   EXPECT_FALSE(texture->ValidForTexture(
   1113       GL_TEXTURE_2D, 1, 0, 0, 5, 5, GL_UNSIGNED_BYTE));
   1114   // Check bad height.
   1115   EXPECT_FALSE(texture->ValidForTexture(
   1116       GL_TEXTURE_2D, 1, 0, 0, 4, 6, GL_UNSIGNED_BYTE));
   1117   // Check bad type.
   1118   EXPECT_FALSE(texture->ValidForTexture(
   1119       GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_UNSIGNED_SHORT_4_4_4_4));
   1120   // Check valid full size
   1121   EXPECT_TRUE(texture->ValidForTexture(
   1122       GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_UNSIGNED_BYTE));
   1123   // Check valid particial size.
   1124   EXPECT_TRUE(texture->ValidForTexture(
   1125       GL_TEXTURE_2D, 1, 1, 1, 2, 3, GL_UNSIGNED_BYTE));
   1126   manager_->RemoveTexture(kClient1Id);
   1127   EXPECT_TRUE(texture->ValidForTexture(
   1128       GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_UNSIGNED_BYTE));
   1129 }
   1130 
   1131 TEST_F(TextureTest, FloatNotLinear) {
   1132   TestHelper::SetupFeatureInfoInitExpectations(
   1133       gl_.get(), "GL_OES_texture_float");
   1134   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
   1135   feature_info->Initialize();
   1136   TextureManager manager(NULL,
   1137                          feature_info.get(),
   1138                          kMaxTextureSize,
   1139                          kMaxCubeMapTextureSize,
   1140                          kUseDefaultTextures);
   1141   manager.CreateTexture(kClient1Id, kService1Id);
   1142   TextureRef* texture_ref = manager.GetTexture(kClient1Id);
   1143   ASSERT_TRUE(texture_ref != NULL);
   1144   manager.SetTarget(texture_ref, GL_TEXTURE_2D);
   1145   Texture* texture = texture_ref->texture();
   1146   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
   1147   manager.SetLevelInfo(texture_ref,
   1148       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true);
   1149   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
   1150   TestHelper::SetTexParameteriWithExpectations(
   1151       gl_.get(), error_state_.get(), &manager,
   1152       texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
   1153   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
   1154   TestHelper::SetTexParameteriWithExpectations(
   1155       gl_.get(), error_state_.get(), &manager, texture_ref,
   1156       GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR);
   1157   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
   1158   manager.Destroy(false);
   1159 }
   1160 
   1161 TEST_F(TextureTest, FloatLinear) {
   1162   TestHelper::SetupFeatureInfoInitExpectations(
   1163       gl_.get(), "GL_OES_texture_float GL_OES_texture_float_linear");
   1164   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
   1165   feature_info->Initialize();
   1166   TextureManager manager(NULL,
   1167                          feature_info.get(),
   1168                          kMaxTextureSize,
   1169                          kMaxCubeMapTextureSize,
   1170                          kUseDefaultTextures);
   1171   manager.CreateTexture(kClient1Id, kService1Id);
   1172   TextureRef* texture_ref = manager.GetTexture(kClient1Id);
   1173   ASSERT_TRUE(texture_ref != NULL);
   1174   manager.SetTarget(texture_ref, GL_TEXTURE_2D);
   1175   Texture* texture = texture_ref->texture();
   1176   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
   1177   manager.SetLevelInfo(texture_ref,
   1178       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true);
   1179   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
   1180   manager.Destroy(false);
   1181 }
   1182 
   1183 TEST_F(TextureTest, HalfFloatNotLinear) {
   1184   TestHelper::SetupFeatureInfoInitExpectations(
   1185       gl_.get(), "GL_OES_texture_half_float");
   1186   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
   1187   feature_info->Initialize();
   1188   TextureManager manager(NULL,
   1189                          feature_info.get(),
   1190                          kMaxTextureSize,
   1191                          kMaxCubeMapTextureSize,
   1192                          kUseDefaultTextures);
   1193   manager.CreateTexture(kClient1Id, kService1Id);
   1194   TextureRef* texture_ref = manager.GetTexture(kClient1Id);
   1195   ASSERT_TRUE(texture_ref != NULL);
   1196   manager.SetTarget(texture_ref, GL_TEXTURE_2D);
   1197   Texture* texture = texture_ref->texture();
   1198   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
   1199   manager.SetLevelInfo(texture_ref,
   1200       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true);
   1201   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
   1202   TestHelper::SetTexParameteriWithExpectations(
   1203       gl_.get(), error_state_.get(), &manager,
   1204       texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
   1205   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
   1206   TestHelper::SetTexParameteriWithExpectations(
   1207       gl_.get(), error_state_.get(), &manager, texture_ref,
   1208       GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR);
   1209   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
   1210   manager.Destroy(false);
   1211 }
   1212 
   1213 TEST_F(TextureTest, HalfFloatLinear) {
   1214   TestHelper::SetupFeatureInfoInitExpectations(
   1215       gl_.get(), "GL_OES_texture_half_float GL_OES_texture_half_float_linear");
   1216   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
   1217   feature_info->Initialize();
   1218   TextureManager manager(NULL,
   1219                          feature_info.get(),
   1220                          kMaxTextureSize,
   1221                          kMaxCubeMapTextureSize,
   1222                          kUseDefaultTextures);
   1223   manager.CreateTexture(kClient1Id, kService1Id);
   1224   TextureRef* texture_ref = manager.GetTexture(kClient1Id);
   1225   ASSERT_TRUE(texture_ref != NULL);
   1226   manager.SetTarget(texture_ref, GL_TEXTURE_2D);
   1227   Texture* texture = texture_ref->texture();
   1228   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
   1229   manager.SetLevelInfo(texture_ref,
   1230       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true);
   1231   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
   1232   manager.Destroy(false);
   1233 }
   1234 
   1235 TEST_F(TextureTest, EGLImageExternal) {
   1236   TestHelper::SetupFeatureInfoInitExpectations(
   1237       gl_.get(), "GL_OES_EGL_image_external");
   1238   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
   1239   feature_info->Initialize();
   1240   TextureManager manager(NULL,
   1241                          feature_info.get(),
   1242                          kMaxTextureSize,
   1243                          kMaxCubeMapTextureSize,
   1244                          kUseDefaultTextures);
   1245   manager.CreateTexture(kClient1Id, kService1Id);
   1246   TextureRef* texture_ref = manager.GetTexture(kClient1Id);
   1247   ASSERT_TRUE(texture_ref != NULL);
   1248   manager.SetTarget(texture_ref, GL_TEXTURE_EXTERNAL_OES);
   1249   Texture* texture = texture_ref->texture();
   1250   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target());
   1251   EXPECT_FALSE(manager.CanGenerateMipmaps(texture_ref));
   1252   manager.Destroy(false);
   1253 }
   1254 
   1255 TEST_F(TextureTest, DepthTexture) {
   1256   TestHelper::SetupFeatureInfoInitExpectations(
   1257       gl_.get(), "GL_ANGLE_depth_texture");
   1258   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
   1259   feature_info->Initialize();
   1260   TextureManager manager(NULL,
   1261                          feature_info.get(),
   1262                          kMaxTextureSize,
   1263                          kMaxCubeMapTextureSize,
   1264                          kUseDefaultTextures);
   1265   manager.CreateTexture(kClient1Id, kService1Id);
   1266   TextureRef* texture_ref = manager.GetTexture(kClient1Id);
   1267   ASSERT_TRUE(texture_ref != NULL);
   1268   manager.SetTarget(texture_ref, GL_TEXTURE_2D);
   1269   manager.SetLevelInfo(
   1270       texture_ref, GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 4, 4, 1, 0,
   1271       GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, false);
   1272   EXPECT_FALSE(manager.CanGenerateMipmaps(texture_ref));
   1273   manager.Destroy(false);
   1274 }
   1275 
   1276 TEST_F(TextureTest, SafeUnsafe) {
   1277   static const GLuint kClient2Id = 2;
   1278   static const GLuint kService2Id = 12;
   1279   static const GLuint kClient3Id = 3;
   1280   static const GLuint kService3Id = 13;
   1281   EXPECT_FALSE(manager_->HaveUnclearedMips());
   1282   Texture* texture = texture_ref_->texture();
   1283   EXPECT_EQ(0, texture->num_uncleared_mips());
   1284   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
   1285   manager_->SetLevelInfo(texture_ref_.get(),
   1286                          GL_TEXTURE_2D,
   1287                          0,
   1288                          GL_RGBA,
   1289                          4,
   1290                          4,
   1291                          1,
   1292                          0,
   1293                          GL_RGBA,
   1294                          GL_UNSIGNED_BYTE,
   1295                          false);
   1296   EXPECT_FALSE(texture->SafeToRenderFrom());
   1297   EXPECT_TRUE(manager_->HaveUnsafeTextures());
   1298   EXPECT_TRUE(manager_->HaveUnclearedMips());
   1299   EXPECT_EQ(1, texture->num_uncleared_mips());
   1300   manager_->SetLevelCleared(texture_ref_.get(), GL_TEXTURE_2D, 0, true);
   1301   EXPECT_TRUE(texture->SafeToRenderFrom());
   1302   EXPECT_FALSE(manager_->HaveUnsafeTextures());
   1303   EXPECT_FALSE(manager_->HaveUnclearedMips());
   1304   EXPECT_EQ(0, texture->num_uncleared_mips());
   1305   manager_->SetLevelInfo(texture_ref_.get(),
   1306                          GL_TEXTURE_2D,
   1307                          1,
   1308                          GL_RGBA,
   1309                          8,
   1310                          8,
   1311                          1,
   1312                          0,
   1313                          GL_RGBA,
   1314                          GL_UNSIGNED_BYTE,
   1315                          false);
   1316   EXPECT_FALSE(texture->SafeToRenderFrom());
   1317   EXPECT_TRUE(manager_->HaveUnsafeTextures());
   1318   EXPECT_TRUE(manager_->HaveUnclearedMips());
   1319   EXPECT_EQ(1, texture->num_uncleared_mips());
   1320   manager_->SetLevelCleared(texture_ref_.get(), GL_TEXTURE_2D, 1, true);
   1321   EXPECT_TRUE(texture->SafeToRenderFrom());
   1322   EXPECT_FALSE(manager_->HaveUnsafeTextures());
   1323   EXPECT_FALSE(manager_->HaveUnclearedMips());
   1324   EXPECT_EQ(0, texture->num_uncleared_mips());
   1325   manager_->SetLevelInfo(texture_ref_.get(),
   1326                          GL_TEXTURE_2D,
   1327                          0,
   1328                          GL_RGBA,
   1329                          4,
   1330                          4,
   1331                          1,
   1332                          0,
   1333                          GL_RGBA,
   1334                          GL_UNSIGNED_BYTE,
   1335                          false);
   1336   manager_->SetLevelInfo(texture_ref_.get(),
   1337                          GL_TEXTURE_2D,
   1338                          1,
   1339                          GL_RGBA,
   1340                          8,
   1341                          8,
   1342                          1,
   1343                          0,
   1344                          GL_RGBA,
   1345                          GL_UNSIGNED_BYTE,
   1346                          false);
   1347   EXPECT_FALSE(texture->SafeToRenderFrom());
   1348   EXPECT_TRUE(manager_->HaveUnsafeTextures());
   1349   EXPECT_TRUE(manager_->HaveUnclearedMips());
   1350   EXPECT_EQ(2, texture->num_uncleared_mips());
   1351   manager_->SetLevelCleared(texture_ref_.get(), GL_TEXTURE_2D, 0, true);
   1352   EXPECT_FALSE(texture->SafeToRenderFrom());
   1353   EXPECT_TRUE(manager_->HaveUnsafeTextures());
   1354   EXPECT_TRUE(manager_->HaveUnclearedMips());
   1355   EXPECT_EQ(1, texture->num_uncleared_mips());
   1356   manager_->SetLevelCleared(texture_ref_.get(), GL_TEXTURE_2D, 1, true);
   1357   EXPECT_TRUE(texture->SafeToRenderFrom());
   1358   EXPECT_FALSE(manager_->HaveUnsafeTextures());
   1359   EXPECT_FALSE(manager_->HaveUnclearedMips());
   1360   EXPECT_EQ(0, texture->num_uncleared_mips());
   1361   manager_->SetLevelInfo(texture_ref_.get(),
   1362                          GL_TEXTURE_2D,
   1363                          1,
   1364                          GL_RGBA,
   1365                          8,
   1366                          8,
   1367                          1,
   1368                          0,
   1369                          GL_RGBA,
   1370                          GL_UNSIGNED_BYTE,
   1371                          false);
   1372   EXPECT_FALSE(texture->SafeToRenderFrom());
   1373   EXPECT_TRUE(manager_->HaveUnsafeTextures());
   1374   EXPECT_TRUE(manager_->HaveUnclearedMips());
   1375   EXPECT_EQ(1, texture->num_uncleared_mips());
   1376   manager_->MarkMipmapsGenerated(texture_ref_.get());
   1377   EXPECT_TRUE(texture->SafeToRenderFrom());
   1378   EXPECT_FALSE(manager_->HaveUnsafeTextures());
   1379   EXPECT_FALSE(manager_->HaveUnclearedMips());
   1380   EXPECT_EQ(0, texture->num_uncleared_mips());
   1381 
   1382   manager_->CreateTexture(kClient2Id, kService2Id);
   1383   scoped_refptr<TextureRef> texture_ref2(
   1384       manager_->GetTexture(kClient2Id));
   1385   ASSERT_TRUE(texture_ref2.get() != NULL);
   1386   manager_->SetTarget(texture_ref2.get(), GL_TEXTURE_2D);
   1387   EXPECT_FALSE(manager_->HaveUnsafeTextures());
   1388   EXPECT_FALSE(manager_->HaveUnclearedMips());
   1389   Texture* texture2 = texture_ref2->texture();
   1390   EXPECT_EQ(0, texture2->num_uncleared_mips());
   1391   manager_->SetLevelInfo(texture_ref2.get(),
   1392                          GL_TEXTURE_2D,
   1393                          0,
   1394                          GL_RGBA,
   1395                          8,
   1396                          8,
   1397                          1,
   1398                          0,
   1399                          GL_RGBA,
   1400                          GL_UNSIGNED_BYTE,
   1401                          true);
   1402   EXPECT_FALSE(manager_->HaveUnsafeTextures());
   1403   EXPECT_FALSE(manager_->HaveUnclearedMips());
   1404   EXPECT_EQ(0, texture2->num_uncleared_mips());
   1405   manager_->SetLevelInfo(texture_ref2.get(),
   1406                          GL_TEXTURE_2D,
   1407                          0,
   1408                          GL_RGBA,
   1409                          8,
   1410                          8,
   1411                          1,
   1412                          0,
   1413                          GL_RGBA,
   1414                          GL_UNSIGNED_BYTE,
   1415                          false);
   1416   EXPECT_TRUE(manager_->HaveUnsafeTextures());
   1417   EXPECT_TRUE(manager_->HaveUnclearedMips());
   1418   EXPECT_EQ(1, texture2->num_uncleared_mips());
   1419 
   1420   manager_->CreateTexture(kClient3Id, kService3Id);
   1421   scoped_refptr<TextureRef> texture_ref3(
   1422       manager_->GetTexture(kClient3Id));
   1423   ASSERT_TRUE(texture_ref3.get() != NULL);
   1424   manager_->SetTarget(texture_ref3.get(), GL_TEXTURE_2D);
   1425   manager_->SetLevelInfo(texture_ref3.get(),
   1426                          GL_TEXTURE_2D,
   1427                          0,
   1428                          GL_RGBA,
   1429                          8,
   1430                          8,
   1431                          1,
   1432                          0,
   1433                          GL_RGBA,
   1434                          GL_UNSIGNED_BYTE,
   1435                          false);
   1436   EXPECT_TRUE(manager_->HaveUnsafeTextures());
   1437   EXPECT_TRUE(manager_->HaveUnclearedMips());
   1438   Texture* texture3 = texture_ref3->texture();
   1439   EXPECT_EQ(1, texture3->num_uncleared_mips());
   1440   manager_->SetLevelCleared(texture_ref2.get(), GL_TEXTURE_2D, 0, true);
   1441   EXPECT_TRUE(manager_->HaveUnsafeTextures());
   1442   EXPECT_TRUE(manager_->HaveUnclearedMips());
   1443   EXPECT_EQ(0, texture2->num_uncleared_mips());
   1444   manager_->SetLevelCleared(texture_ref3.get(), GL_TEXTURE_2D, 0, true);
   1445   EXPECT_FALSE(manager_->HaveUnsafeTextures());
   1446   EXPECT_FALSE(manager_->HaveUnclearedMips());
   1447   EXPECT_EQ(0, texture3->num_uncleared_mips());
   1448 
   1449   manager_->SetLevelInfo(texture_ref2.get(),
   1450                          GL_TEXTURE_2D,
   1451                          0,
   1452                          GL_RGBA,
   1453                          8,
   1454                          8,
   1455                          1,
   1456                          0,
   1457                          GL_RGBA,
   1458                          GL_UNSIGNED_BYTE,
   1459                          false);
   1460   manager_->SetLevelInfo(texture_ref3.get(),
   1461                          GL_TEXTURE_2D,
   1462                          0,
   1463                          GL_RGBA,
   1464                          8,
   1465                          8,
   1466                          1,
   1467                          0,
   1468                          GL_RGBA,
   1469                          GL_UNSIGNED_BYTE,
   1470                          false);
   1471   EXPECT_TRUE(manager_->HaveUnsafeTextures());
   1472   EXPECT_TRUE(manager_->HaveUnclearedMips());
   1473   EXPECT_EQ(1, texture2->num_uncleared_mips());
   1474   EXPECT_EQ(1, texture3->num_uncleared_mips());
   1475   manager_->RemoveTexture(kClient3Id);
   1476   EXPECT_TRUE(manager_->HaveUnsafeTextures());
   1477   EXPECT_TRUE(manager_->HaveUnclearedMips());
   1478   manager_->RemoveTexture(kClient2Id);
   1479   EXPECT_TRUE(manager_->HaveUnsafeTextures());
   1480   EXPECT_TRUE(manager_->HaveUnclearedMips());
   1481   EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService2Id)))
   1482       .Times(1)
   1483       .RetiresOnSaturation();
   1484   texture_ref2 = NULL;
   1485   EXPECT_TRUE(manager_->HaveUnsafeTextures());
   1486   EXPECT_TRUE(manager_->HaveUnclearedMips());
   1487   EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService3Id)))
   1488       .Times(1)
   1489       .RetiresOnSaturation();
   1490   texture_ref3 = NULL;
   1491   EXPECT_FALSE(manager_->HaveUnsafeTextures());
   1492   EXPECT_FALSE(manager_->HaveUnclearedMips());
   1493 }
   1494 
   1495 TEST_F(TextureTest, ClearTexture) {
   1496   EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _, _))
   1497       .WillRepeatedly(Return(true));
   1498   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
   1499   manager_->SetLevelInfo(texture_ref_.get(),
   1500                          GL_TEXTURE_2D,
   1501                          0,
   1502                          GL_RGBA,
   1503                          4,
   1504                          4,
   1505                          1,
   1506                          0,
   1507                          GL_RGBA,
   1508                          GL_UNSIGNED_BYTE,
   1509                          false);
   1510   manager_->SetLevelInfo(texture_ref_.get(),
   1511                          GL_TEXTURE_2D,
   1512                          1,
   1513                          GL_RGBA,
   1514                          4,
   1515                          4,
   1516                          1,
   1517                          0,
   1518                          GL_RGBA,
   1519                          GL_UNSIGNED_BYTE,
   1520                          false);
   1521   Texture* texture = texture_ref_->texture();
   1522   EXPECT_FALSE(texture->SafeToRenderFrom());
   1523   EXPECT_TRUE(manager_->HaveUnsafeTextures());
   1524   EXPECT_TRUE(manager_->HaveUnclearedMips());
   1525   EXPECT_EQ(2, texture->num_uncleared_mips());
   1526   manager_->ClearRenderableLevels(decoder_.get(), texture_ref_.get());
   1527   EXPECT_TRUE(texture->SafeToRenderFrom());
   1528   EXPECT_FALSE(manager_->HaveUnsafeTextures());
   1529   EXPECT_FALSE(manager_->HaveUnclearedMips());
   1530   EXPECT_EQ(0, texture->num_uncleared_mips());
   1531   manager_->SetLevelInfo(texture_ref_.get(),
   1532                          GL_TEXTURE_2D,
   1533                          0,
   1534                          GL_RGBA,
   1535                          4,
   1536                          4,
   1537                          1,
   1538                          0,
   1539                          GL_RGBA,
   1540                          GL_UNSIGNED_BYTE,
   1541                          false);
   1542   manager_->SetLevelInfo(texture_ref_.get(),
   1543                          GL_TEXTURE_2D,
   1544                          1,
   1545                          GL_RGBA,
   1546                          4,
   1547                          4,
   1548                          1,
   1549                          0,
   1550                          GL_RGBA,
   1551                          GL_UNSIGNED_BYTE,
   1552                          false);
   1553   EXPECT_FALSE(texture->SafeToRenderFrom());
   1554   EXPECT_TRUE(manager_->HaveUnsafeTextures());
   1555   EXPECT_TRUE(manager_->HaveUnclearedMips());
   1556   EXPECT_EQ(2, texture->num_uncleared_mips());
   1557   manager_->ClearTextureLevel(
   1558       decoder_.get(), texture_ref_.get(), GL_TEXTURE_2D, 0);
   1559   EXPECT_FALSE(texture->SafeToRenderFrom());
   1560   EXPECT_TRUE(manager_->HaveUnsafeTextures());
   1561   EXPECT_TRUE(manager_->HaveUnclearedMips());
   1562   EXPECT_EQ(1, texture->num_uncleared_mips());
   1563   manager_->ClearTextureLevel(
   1564       decoder_.get(), texture_ref_.get(), GL_TEXTURE_2D, 1);
   1565   EXPECT_TRUE(texture->SafeToRenderFrom());
   1566   EXPECT_FALSE(manager_->HaveUnsafeTextures());
   1567   EXPECT_FALSE(manager_->HaveUnclearedMips());
   1568   EXPECT_EQ(0, texture->num_uncleared_mips());
   1569 }
   1570 
   1571 TEST_F(TextureTest, UseDeletedTexture) {
   1572   static const GLuint kClient2Id = 2;
   1573   static const GLuint kService2Id = 12;
   1574   // Make the default texture renderable
   1575   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
   1576   manager_->SetLevelInfo(texture_ref_.get(),
   1577                          GL_TEXTURE_2D,
   1578                          0,
   1579                          GL_RGBA,
   1580                          1,
   1581                          1,
   1582                          1,
   1583                          0,
   1584                          GL_RGBA,
   1585                          GL_UNSIGNED_BYTE,
   1586                          false);
   1587   EXPECT_FALSE(manager_->HaveUnrenderableTextures());
   1588   // Make a new texture
   1589   manager_->CreateTexture(kClient2Id, kService2Id);
   1590   scoped_refptr<TextureRef> texture_ref(
   1591       manager_->GetTexture(kClient2Id));
   1592   manager_->SetTarget(texture_ref.get(), GL_TEXTURE_2D);
   1593   EXPECT_FALSE(manager_->CanRender(texture_ref.get()));
   1594   EXPECT_TRUE(manager_->HaveUnrenderableTextures());
   1595   // Remove it.
   1596   manager_->RemoveTexture(kClient2Id);
   1597   EXPECT_FALSE(manager_->CanRender(texture_ref.get()));
   1598   EXPECT_TRUE(manager_->HaveUnrenderableTextures());
   1599   // Check that we can still manipulate it and it effects the manager.
   1600   manager_->SetLevelInfo(texture_ref.get(),
   1601                          GL_TEXTURE_2D,
   1602                          0,
   1603                          GL_RGBA,
   1604                          1,
   1605                          1,
   1606                          1,
   1607                          0,
   1608                          GL_RGBA,
   1609                          GL_UNSIGNED_BYTE,
   1610                          false);
   1611   EXPECT_TRUE(manager_->CanRender(texture_ref.get()));
   1612   EXPECT_FALSE(manager_->HaveUnrenderableTextures());
   1613   EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService2Id)))
   1614       .Times(1)
   1615       .RetiresOnSaturation();
   1616   texture_ref = NULL;
   1617 }
   1618 
   1619 TEST_F(TextureTest, GetLevelImage) {
   1620   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
   1621   manager_->SetLevelInfo(texture_ref_.get(),
   1622                          GL_TEXTURE_2D,
   1623                          1,
   1624                          GL_RGBA,
   1625                          2,
   1626                          2,
   1627                          1,
   1628                          0,
   1629                          GL_RGBA,
   1630                          GL_UNSIGNED_BYTE,
   1631                          true);
   1632   Texture* texture = texture_ref_->texture();
   1633   EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
   1634   // Set image.
   1635   manager_->SetLevelImage(texture_ref_.get(),
   1636                           GL_TEXTURE_2D,
   1637                           1,
   1638                           gfx::GLImage::CreateGLImage(0).get());
   1639   EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
   1640   // Remove it.
   1641   manager_->SetLevelImage(texture_ref_.get(), GL_TEXTURE_2D, 1, NULL);
   1642   EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
   1643   manager_->SetLevelImage(texture_ref_.get(),
   1644                           GL_TEXTURE_2D,
   1645                           1,
   1646                           gfx::GLImage::CreateGLImage(0).get());
   1647   // Image should be reset when SetLevelInfo is called.
   1648   manager_->SetLevelInfo(texture_ref_.get(),
   1649                          GL_TEXTURE_2D,
   1650                          1,
   1651                          GL_RGBA,
   1652                          2,
   1653                          2,
   1654                          1,
   1655                          0,
   1656                          GL_RGBA,
   1657                          GL_UNSIGNED_BYTE,
   1658                          true);
   1659   EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
   1660 }
   1661 
   1662 namespace {
   1663 
   1664 bool InSet(std::set<std::string>* string_set, const std::string& str) {
   1665   std::pair<std::set<std::string>::iterator, bool> result =
   1666       string_set->insert(str);
   1667   return !result.second;
   1668 }
   1669 
   1670 }  // anonymous namespace
   1671 
   1672 TEST_F(TextureTest, AddToSignature) {
   1673   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
   1674   manager_->SetLevelInfo(texture_ref_.get(),
   1675                          GL_TEXTURE_2D,
   1676                          1,
   1677                          GL_RGBA,
   1678                          2,
   1679                          2,
   1680                          1,
   1681                          0,
   1682                          GL_RGBA,
   1683                          GL_UNSIGNED_BYTE,
   1684                          true);
   1685   std::string signature1;
   1686   std::string signature2;
   1687   manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature1);
   1688 
   1689   std::set<std::string> string_set;
   1690   EXPECT_FALSE(InSet(&string_set, signature1));
   1691 
   1692   // check changing 1 thing makes a different signature.
   1693   manager_->SetLevelInfo(texture_ref_.get(),
   1694                          GL_TEXTURE_2D,
   1695                          1,
   1696                          GL_RGBA,
   1697                          4,
   1698                          2,
   1699                          1,
   1700                          0,
   1701                          GL_RGBA,
   1702                          GL_UNSIGNED_BYTE,
   1703                          true);
   1704   manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
   1705   EXPECT_FALSE(InSet(&string_set, signature2));
   1706 
   1707   // check putting it back makes the same signature.
   1708   manager_->SetLevelInfo(texture_ref_.get(),
   1709                          GL_TEXTURE_2D,
   1710                          1,
   1711                          GL_RGBA,
   1712                          2,
   1713                          2,
   1714                          1,
   1715                          0,
   1716                          GL_RGBA,
   1717                          GL_UNSIGNED_BYTE,
   1718                          true);
   1719   signature2.clear();
   1720   manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
   1721   EXPECT_EQ(signature1, signature2);
   1722 
   1723   // Check setting cleared status does not change signature.
   1724   manager_->SetLevelInfo(texture_ref_.get(),
   1725                          GL_TEXTURE_2D,
   1726                          1,
   1727                          GL_RGBA,
   1728                          2,
   1729                          2,
   1730                          1,
   1731                          0,
   1732                          GL_RGBA,
   1733                          GL_UNSIGNED_BYTE,
   1734                          false);
   1735   signature2.clear();
   1736   manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
   1737   EXPECT_EQ(signature1, signature2);
   1738 
   1739   // Check changing other settings changes signature.
   1740   manager_->SetLevelInfo(texture_ref_.get(),
   1741                          GL_TEXTURE_2D,
   1742                          1,
   1743                          GL_RGBA,
   1744                          2,
   1745                          4,
   1746                          1,
   1747                          0,
   1748                          GL_RGBA,
   1749                          GL_UNSIGNED_BYTE,
   1750                          false);
   1751   signature2.clear();
   1752   manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
   1753   EXPECT_FALSE(InSet(&string_set, signature2));
   1754 
   1755   manager_->SetLevelInfo(texture_ref_.get(),
   1756                          GL_TEXTURE_2D,
   1757                          1,
   1758                          GL_RGBA,
   1759                          2,
   1760                          2,
   1761                          2,
   1762                          0,
   1763                          GL_RGBA,
   1764                          GL_UNSIGNED_BYTE,
   1765                          false);
   1766   signature2.clear();
   1767   manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
   1768   EXPECT_FALSE(InSet(&string_set, signature2));
   1769 
   1770   manager_->SetLevelInfo(texture_ref_.get(),
   1771                          GL_TEXTURE_2D,
   1772                          1,
   1773                          GL_RGBA,
   1774                          2,
   1775                          2,
   1776                          1,
   1777                          1,
   1778                          GL_RGBA,
   1779                          GL_UNSIGNED_BYTE,
   1780                          false);
   1781   signature2.clear();
   1782   manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
   1783   EXPECT_FALSE(InSet(&string_set, signature2));
   1784 
   1785   manager_->SetLevelInfo(texture_ref_.get(),
   1786                          GL_TEXTURE_2D,
   1787                          1,
   1788                          GL_RGBA,
   1789                          2,
   1790                          2,
   1791                          1,
   1792                          0,
   1793                          GL_RGB,
   1794                          GL_UNSIGNED_BYTE,
   1795                          false);
   1796   signature2.clear();
   1797   manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
   1798   EXPECT_FALSE(InSet(&string_set, signature2));
   1799 
   1800   manager_->SetLevelInfo(texture_ref_.get(),
   1801                          GL_TEXTURE_2D,
   1802                          1,
   1803                          GL_RGBA,
   1804                          2,
   1805                          2,
   1806                          1,
   1807                          0,
   1808                          GL_RGBA,
   1809                          GL_FLOAT,
   1810                          false);
   1811   signature2.clear();
   1812   manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
   1813   EXPECT_FALSE(InSet(&string_set, signature2));
   1814 
   1815   // put it back
   1816   manager_->SetLevelInfo(texture_ref_.get(),
   1817                          GL_TEXTURE_2D,
   1818                          1,
   1819                          GL_RGBA,
   1820                          2,
   1821                          2,
   1822                          1,
   1823                          0,
   1824                          GL_RGBA,
   1825                          GL_UNSIGNED_BYTE,
   1826                          false);
   1827   signature2.clear();
   1828   manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
   1829   EXPECT_EQ(signature1, signature2);
   1830 
   1831   // check changing parameters changes signature.
   1832   SetParameter(
   1833       texture_ref_.get(), GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR);
   1834   signature2.clear();
   1835   manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
   1836   EXPECT_FALSE(InSet(&string_set, signature2));
   1837 
   1838   SetParameter(texture_ref_.get(),
   1839                GL_TEXTURE_MIN_FILTER,
   1840                GL_NEAREST_MIPMAP_LINEAR,
   1841                GL_NO_ERROR);
   1842   SetParameter(
   1843       texture_ref_.get(), GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
   1844   signature2.clear();
   1845   manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
   1846   EXPECT_FALSE(InSet(&string_set, signature2));
   1847 
   1848   SetParameter(
   1849       texture_ref_.get(), GL_TEXTURE_MAG_FILTER, GL_LINEAR, GL_NO_ERROR);
   1850   SetParameter(
   1851       texture_ref_.get(), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
   1852   signature2.clear();
   1853   manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
   1854   EXPECT_FALSE(InSet(&string_set, signature2));
   1855 
   1856   SetParameter(texture_ref_.get(), GL_TEXTURE_WRAP_S, GL_REPEAT, GL_NO_ERROR);
   1857   SetParameter(
   1858       texture_ref_.get(), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
   1859   signature2.clear();
   1860   manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
   1861   EXPECT_FALSE(InSet(&string_set, signature2));
   1862 
   1863   // Check putting it back genenerates the same signature
   1864   SetParameter(texture_ref_.get(), GL_TEXTURE_WRAP_T, GL_REPEAT, GL_NO_ERROR);
   1865   signature2.clear();
   1866   manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
   1867   EXPECT_EQ(signature1, signature2);
   1868 
   1869   // Check the set was acutally getting different signatures.
   1870   EXPECT_EQ(11u, string_set.size());
   1871 }
   1872 
   1873 class ProduceConsumeTextureTest : public TextureTest,
   1874                                   public ::testing::WithParamInterface<GLenum> {
   1875  public:
   1876   virtual void SetUp() {
   1877     TextureTest::SetUpBase(NULL, "GL_OES_EGL_image_external");
   1878     manager_->CreateTexture(kClient2Id, kService2Id);
   1879     texture2_ = manager_->GetTexture(kClient2Id);
   1880 
   1881     EXPECT_CALL(*decoder_.get(), GetErrorState())
   1882       .WillRepeatedly(Return(error_state_.get()));
   1883   }
   1884 
   1885   virtual void TearDown() {
   1886     if (texture2_.get()) {
   1887       // If it's not in the manager then setting texture2_ to NULL will
   1888       // delete the texture.
   1889       if (!texture2_->client_id()) {
   1890         // Check that it gets deleted when the last reference is released.
   1891         EXPECT_CALL(
   1892             *gl_,
   1893             DeleteTextures(1, ::testing::Pointee(texture2_->service_id())))
   1894             .Times(1).RetiresOnSaturation();
   1895       }
   1896       texture2_ = NULL;
   1897     }
   1898     TextureTest::TearDown();
   1899   }
   1900 
   1901  protected:
   1902   struct LevelInfo {
   1903     LevelInfo(GLenum target,
   1904               GLenum format,
   1905               GLsizei width,
   1906               GLsizei height,
   1907               GLsizei depth,
   1908               GLint border,
   1909               GLenum type,
   1910               bool cleared)
   1911         : target(target),
   1912           format(format),
   1913           width(width),
   1914           height(height),
   1915           depth(depth),
   1916           border(border),
   1917           type(type),
   1918           cleared(cleared) {}
   1919 
   1920     LevelInfo()
   1921         : target(0),
   1922           format(0),
   1923           width(-1),
   1924           height(-1),
   1925           depth(1),
   1926           border(0),
   1927           type(0),
   1928           cleared(false) {}
   1929 
   1930     bool operator==(const LevelInfo& other) const {
   1931       return target == other.target && format == other.format &&
   1932              width == other.width && height == other.height &&
   1933              depth == other.depth && border == other.border &&
   1934              type == other.type && cleared == other.cleared;
   1935     }
   1936 
   1937     GLenum target;
   1938     GLenum format;
   1939     GLsizei width;
   1940     GLsizei height;
   1941     GLsizei depth;
   1942     GLint border;
   1943     GLenum type;
   1944     bool cleared;
   1945   };
   1946 
   1947   void SetLevelInfo(TextureRef* texture_ref,
   1948                     GLint level,
   1949                     const LevelInfo& info) {
   1950     manager_->SetLevelInfo(texture_ref,
   1951                            info.target,
   1952                            level,
   1953                            info.format,
   1954                            info.width,
   1955                            info.height,
   1956                            info.depth,
   1957                            info.border,
   1958                            info.format,
   1959                            info.type,
   1960                            info.cleared);
   1961   }
   1962 
   1963   static LevelInfo GetLevelInfo(const TextureRef* texture_ref,
   1964                                 GLint target,
   1965                                 GLint level) {
   1966     const Texture* texture = texture_ref->texture();
   1967     LevelInfo info;
   1968     info.target = target;
   1969     EXPECT_TRUE(texture->GetLevelSize(target, level, &info.width,
   1970                                       &info.height));
   1971     EXPECT_TRUE(texture->GetLevelType(target, level, &info.type,
   1972                                       &info.format));
   1973     info.cleared = texture->IsLevelCleared(target, level);
   1974     return info;
   1975   }
   1976 
   1977   Texture* Produce(TextureRef* texture_ref) {
   1978     Texture* texture = manager_->Produce(texture_ref);
   1979     EXPECT_TRUE(texture != NULL);
   1980     return texture;
   1981   }
   1982 
   1983   void Consume(GLuint client_id, Texture* texture) {
   1984     EXPECT_TRUE(manager_->Consume(client_id, texture));
   1985   }
   1986 
   1987   scoped_refptr<TextureRef> texture2_;
   1988 
   1989  private:
   1990   static const GLuint kClient2Id;
   1991   static const GLuint kService2Id;
   1992 };
   1993 
   1994 const GLuint ProduceConsumeTextureTest::kClient2Id = 2;
   1995 const GLuint ProduceConsumeTextureTest::kService2Id = 12;
   1996 
   1997 TEST_F(ProduceConsumeTextureTest, ProduceConsume2D) {
   1998   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
   1999   Texture* texture = texture_ref_->texture();
   2000   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
   2001   LevelInfo level0(
   2002       GL_TEXTURE_2D, GL_RGBA, 4, 4, 1, 0, GL_UNSIGNED_BYTE, true);
   2003   SetLevelInfo(texture_ref_.get(), 0, level0);
   2004   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
   2005   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
   2006   LevelInfo level1 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 1);
   2007   LevelInfo level2 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 2);
   2008   Texture* produced_texture = Produce(texture_ref_.get());
   2009   EXPECT_EQ(produced_texture, texture);
   2010 
   2011   // Make this texture bigger with more levels, and make sure they get
   2012   // clobbered correctly during Consume().
   2013   manager_->SetTarget(texture2_.get(), GL_TEXTURE_2D);
   2014   SetLevelInfo(
   2015       texture2_.get(),
   2016       0,
   2017       LevelInfo(GL_TEXTURE_2D, GL_RGBA, 16, 16, 1, 0, GL_UNSIGNED_BYTE, false));
   2018   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture2_.get()));
   2019   texture = texture2_->texture();
   2020   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
   2021   EXPECT_EQ(1024U + 256U + 64U + 16U + 4U, texture->estimated_size());
   2022 
   2023   GLuint client_id = texture2_->client_id();
   2024   manager_->RemoveTexture(client_id);
   2025   Consume(client_id, produced_texture);
   2026   scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
   2027   EXPECT_EQ(produced_texture, restored_texture->texture());
   2028   EXPECT_EQ(level0, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 0));
   2029   EXPECT_EQ(level1, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 1));
   2030   EXPECT_EQ(level2, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 2));
   2031   texture = restored_texture->texture();
   2032   EXPECT_EQ(64U + 16U + 4U, texture->estimated_size());
   2033   GLint w, h;
   2034   EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 3, &w, &h));
   2035 
   2036   // However the old texture ref still exists if it was referenced somewhere.
   2037   EXPECT_EQ(1024U + 256U + 64U + 16U + 4U,
   2038             texture2_->texture()->estimated_size());
   2039 }
   2040 
   2041 TEST_F(ProduceConsumeTextureTest, ProduceConsumeClearRectangle) {
   2042   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_RECTANGLE_ARB);
   2043   Texture* texture = texture_ref_->texture();
   2044   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), texture->target());
   2045   LevelInfo level0(
   2046       GL_TEXTURE_RECTANGLE_ARB, GL_RGBA, 1, 1, 1, 0, GL_UNSIGNED_BYTE, false);
   2047   SetLevelInfo(texture_ref_.get(), 0, level0);
   2048   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
   2049   Texture* produced_texture = Produce(texture_ref_.get());
   2050   EXPECT_EQ(produced_texture, texture);
   2051   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB),
   2052             produced_texture->target());
   2053 
   2054   GLuint client_id = texture2_->client_id();
   2055   manager_->RemoveTexture(client_id);
   2056   Consume(client_id, produced_texture);
   2057   scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
   2058   EXPECT_EQ(produced_texture, restored_texture->texture());
   2059 
   2060   // See if we can clear the previously uncleared level now.
   2061   EXPECT_EQ(level0,
   2062             GetLevelInfo(restored_texture.get(), GL_TEXTURE_RECTANGLE_ARB, 0));
   2063   EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _, _))
   2064       .WillRepeatedly(Return(true));
   2065   EXPECT_TRUE(manager_->ClearTextureLevel(
   2066       decoder_.get(), restored_texture.get(), GL_TEXTURE_RECTANGLE_ARB, 0));
   2067 }
   2068 
   2069 TEST_F(ProduceConsumeTextureTest, ProduceConsumeExternal) {
   2070   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_EXTERNAL_OES);
   2071   Texture* texture = texture_ref_->texture();
   2072   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target());
   2073   LevelInfo level0(
   2074       GL_TEXTURE_EXTERNAL_OES, GL_RGBA, 1, 1, 1, 0, GL_UNSIGNED_BYTE, false);
   2075   SetLevelInfo(texture_ref_.get(), 0, level0);
   2076   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
   2077   Texture* produced_texture = Produce(texture_ref_.get());
   2078   EXPECT_EQ(produced_texture, texture);
   2079 
   2080   GLuint client_id = texture2_->client_id();
   2081   manager_->RemoveTexture(client_id);
   2082   Consume(client_id, produced_texture);
   2083   scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
   2084   EXPECT_EQ(produced_texture, restored_texture->texture());
   2085   EXPECT_EQ(level0,
   2086             GetLevelInfo(restored_texture.get(), GL_TEXTURE_EXTERNAL_OES, 0));
   2087 }
   2088 
   2089 TEST_P(ProduceConsumeTextureTest, ProduceConsumeTextureWithImage) {
   2090   GLenum target = GetParam();
   2091   manager_->SetTarget(texture_ref_.get(), target);
   2092   Texture* texture = texture_ref_->texture();
   2093   EXPECT_EQ(static_cast<GLenum>(target), texture->target());
   2094   scoped_refptr<gfx::GLImage> image(gfx::GLImage::CreateGLImage(0));
   2095   manager_->SetLevelInfo(texture_ref_.get(),
   2096                          target,
   2097                          0,
   2098                          GL_RGBA,
   2099                          0,
   2100                          0,
   2101                          1,
   2102                          0,
   2103                          GL_RGBA,
   2104                          GL_UNSIGNED_BYTE,
   2105                          true);
   2106   manager_->SetLevelImage(texture_ref_.get(), target, 0, image);
   2107   GLuint service_id = texture->service_id();
   2108   Texture* produced_texture = Produce(texture_ref_.get());
   2109 
   2110   GLuint client_id = texture2_->client_id();
   2111   manager_->RemoveTexture(client_id);
   2112   Consume(client_id, produced_texture);
   2113   scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
   2114   EXPECT_EQ(produced_texture, restored_texture->texture());
   2115   EXPECT_EQ(service_id, restored_texture->service_id());
   2116   EXPECT_EQ(image.get(), restored_texture->texture()->GetLevelImage(target, 0));
   2117 }
   2118 
   2119 static const GLenum kTextureTargets[] = {GL_TEXTURE_2D, GL_TEXTURE_EXTERNAL_OES,
   2120                                          GL_TEXTURE_RECTANGLE_ARB, };
   2121 
   2122 INSTANTIATE_TEST_CASE_P(Target,
   2123                         ProduceConsumeTextureTest,
   2124                         ::testing::ValuesIn(kTextureTargets));
   2125 
   2126 TEST_F(ProduceConsumeTextureTest, ProduceConsumeCube) {
   2127   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_CUBE_MAP);
   2128   Texture* texture = texture_ref_->texture();
   2129   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target());
   2130   LevelInfo face0(GL_TEXTURE_CUBE_MAP_POSITIVE_X,
   2131                   GL_RGBA,
   2132                   1,
   2133                   1,
   2134                   1,
   2135                   0,
   2136                   GL_UNSIGNED_BYTE,
   2137                   true);
   2138   LevelInfo face5(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
   2139                   GL_RGBA,
   2140                   3,
   2141                   3,
   2142                   1,
   2143                   0,
   2144                   GL_UNSIGNED_BYTE,
   2145                   true);
   2146   SetLevelInfo(texture_ref_.get(), 0, face0);
   2147   SetLevelInfo(texture_ref_.get(), 0, face5);
   2148   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
   2149   Texture* produced_texture = Produce(texture_ref_.get());
   2150   EXPECT_EQ(produced_texture, texture);
   2151 
   2152   GLuint client_id = texture2_->client_id();
   2153   manager_->RemoveTexture(client_id);
   2154   Consume(client_id, produced_texture);
   2155   scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
   2156   EXPECT_EQ(produced_texture, restored_texture->texture());
   2157   EXPECT_EQ(
   2158       face0,
   2159       GetLevelInfo(restored_texture.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0));
   2160   EXPECT_EQ(
   2161       face5,
   2162       GetLevelInfo(restored_texture.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0));
   2163 }
   2164 
   2165 class CountingMemoryTracker : public MemoryTracker {
   2166  public:
   2167   CountingMemoryTracker() {
   2168     current_size_[0] = 0;
   2169     current_size_[1] = 0;
   2170   }
   2171 
   2172   virtual void TrackMemoryAllocatedChange(size_t old_size,
   2173                                           size_t new_size,
   2174                                           Pool pool)  OVERRIDE {
   2175     DCHECK_LT(static_cast<size_t>(pool), arraysize(current_size_));
   2176     current_size_[pool] += new_size - old_size;
   2177   }
   2178 
   2179   virtual bool EnsureGPUMemoryAvailable(size_t size_needed) OVERRIDE {
   2180     return true;
   2181   }
   2182 
   2183   size_t GetSize(Pool pool) {
   2184     DCHECK_LT(static_cast<size_t>(pool), arraysize(current_size_));
   2185     return current_size_[pool];
   2186   }
   2187 
   2188  private:
   2189   virtual ~CountingMemoryTracker() {}
   2190 
   2191   size_t current_size_[2];
   2192   DISALLOW_COPY_AND_ASSIGN(CountingMemoryTracker);
   2193 };
   2194 
   2195 class SharedTextureTest : public GpuServiceTest {
   2196  public:
   2197   static const bool kUseDefaultTextures = false;
   2198 
   2199   SharedTextureTest() : feature_info_(new FeatureInfo()) {}
   2200 
   2201   virtual ~SharedTextureTest() {
   2202   }
   2203 
   2204   virtual void SetUp() {
   2205     GpuServiceTest::SetUp();
   2206     memory_tracker1_ = new CountingMemoryTracker;
   2207     texture_manager1_.reset(
   2208         new TextureManager(memory_tracker1_.get(),
   2209                            feature_info_.get(),
   2210                            TextureManagerTest::kMaxTextureSize,
   2211                            TextureManagerTest::kMaxCubeMapTextureSize,
   2212                            kUseDefaultTextures));
   2213     memory_tracker2_ = new CountingMemoryTracker;
   2214     texture_manager2_.reset(
   2215         new TextureManager(memory_tracker2_.get(),
   2216                            feature_info_.get(),
   2217                            TextureManagerTest::kMaxTextureSize,
   2218                            TextureManagerTest::kMaxCubeMapTextureSize,
   2219                            kUseDefaultTextures));
   2220     TestHelper::SetupTextureManagerInitExpectations(
   2221         gl_.get(), "", kUseDefaultTextures);
   2222     texture_manager1_->Initialize();
   2223     TestHelper::SetupTextureManagerInitExpectations(
   2224         gl_.get(), "", kUseDefaultTextures);
   2225     texture_manager2_->Initialize();
   2226   }
   2227 
   2228   virtual void TearDown() {
   2229     texture_manager2_->Destroy(false);
   2230     texture_manager2_.reset();
   2231     texture_manager1_->Destroy(false);
   2232     texture_manager1_.reset();
   2233     GpuServiceTest::TearDown();
   2234   }
   2235 
   2236  protected:
   2237   scoped_refptr<FeatureInfo> feature_info_;
   2238   scoped_refptr<CountingMemoryTracker> memory_tracker1_;
   2239   scoped_ptr<TextureManager> texture_manager1_;
   2240   scoped_refptr<CountingMemoryTracker> memory_tracker2_;
   2241   scoped_ptr<TextureManager> texture_manager2_;
   2242 };
   2243 
   2244 TEST_F(SharedTextureTest, DeleteTextures) {
   2245   scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
   2246   scoped_refptr<TextureRef> ref2 =
   2247       texture_manager2_->Consume(20, ref1->texture());
   2248   EXPECT_CALL(*gl_, DeleteTextures(1, _))
   2249       .Times(0);
   2250   ref1 = NULL;
   2251   texture_manager1_->RemoveTexture(10);
   2252   testing::Mock::VerifyAndClearExpectations(gl_.get());
   2253 
   2254   EXPECT_CALL(*gl_, DeleteTextures(1, _))
   2255       .Times(1)
   2256       .RetiresOnSaturation();
   2257   ref2 = NULL;
   2258   texture_manager2_->RemoveTexture(20);
   2259   testing::Mock::VerifyAndClearExpectations(gl_.get());
   2260 }
   2261 
   2262 TEST_F(SharedTextureTest, TextureSafetyAccounting) {
   2263   EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures());
   2264   EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
   2265   EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
   2266   EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures());
   2267   EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
   2268   EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
   2269 
   2270   // Newly created texture is renderable.
   2271   scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
   2272   EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures());
   2273   EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
   2274   EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
   2275 
   2276   // Associate new texture ref to other texture manager, should account for it
   2277   // too.
   2278   scoped_refptr<TextureRef> ref2 =
   2279       texture_manager2_->Consume(20, ref1->texture());
   2280   EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures());
   2281   EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
   2282   EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
   2283 
   2284   // Make texture renderable but uncleared on one texture manager, should affect
   2285   // other one.
   2286   texture_manager1_->SetTarget(ref1.get(), GL_TEXTURE_2D);
   2287   EXPECT_TRUE(texture_manager1_->HaveUnrenderableTextures());
   2288   EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
   2289   EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
   2290   EXPECT_TRUE(texture_manager2_->HaveUnrenderableTextures());
   2291   EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
   2292   EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
   2293 
   2294   texture_manager1_->SetLevelInfo(ref1.get(),
   2295                                   GL_TEXTURE_2D,
   2296                                   0,
   2297                                   GL_RGBA,
   2298                                   1,
   2299                                   1,
   2300                                   1,
   2301                                   0,
   2302                                   GL_RGBA,
   2303                                   GL_UNSIGNED_BYTE,
   2304                                   false);
   2305   EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures());
   2306   EXPECT_TRUE(texture_manager1_->HaveUnsafeTextures());
   2307   EXPECT_TRUE(texture_manager1_->HaveUnclearedMips());
   2308   EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures());
   2309   EXPECT_TRUE(texture_manager2_->HaveUnsafeTextures());
   2310   EXPECT_TRUE(texture_manager2_->HaveUnclearedMips());
   2311 
   2312   // Make texture cleared on one texture manager, should affect other one.
   2313   texture_manager1_->SetLevelCleared(ref1.get(), GL_TEXTURE_2D, 0, true);
   2314   EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
   2315   EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
   2316   EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
   2317   EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
   2318 
   2319   EXPECT_CALL(*gl_, DeleteTextures(1, _))
   2320       .Times(1)
   2321       .RetiresOnSaturation();
   2322   texture_manager1_->RemoveTexture(10);
   2323   texture_manager2_->RemoveTexture(20);
   2324 }
   2325 
   2326 TEST_F(SharedTextureTest, FBOCompletenessCheck) {
   2327   const GLenum kCompleteValue = GL_FRAMEBUFFER_COMPLETE;
   2328   FramebufferManager framebuffer_manager1(1, 1);
   2329   texture_manager1_->set_framebuffer_manager(&framebuffer_manager1);
   2330   FramebufferManager framebuffer_manager2(1, 1);
   2331   texture_manager2_->set_framebuffer_manager(&framebuffer_manager2);
   2332 
   2333   scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
   2334   framebuffer_manager1.CreateFramebuffer(10, 10);
   2335   scoped_refptr<Framebuffer> framebuffer1 =
   2336       framebuffer_manager1.GetFramebuffer(10);
   2337   framebuffer1->AttachTexture(
   2338       GL_COLOR_ATTACHMENT0, ref1.get(), GL_TEXTURE_2D, 0, 0);
   2339   EXPECT_FALSE(framebuffer_manager1.IsComplete(framebuffer1.get()));
   2340   EXPECT_NE(kCompleteValue, framebuffer1->IsPossiblyComplete());
   2341 
   2342   // Make FBO complete in manager 1.
   2343   texture_manager1_->SetTarget(ref1.get(), GL_TEXTURE_2D);
   2344   texture_manager1_->SetLevelInfo(ref1.get(),
   2345                                   GL_TEXTURE_2D,
   2346                                   0,
   2347                                   GL_RGBA,
   2348                                   1,
   2349                                   1,
   2350                                   1,
   2351                                   0,
   2352                                   GL_RGBA,
   2353                                   GL_UNSIGNED_BYTE,
   2354                                   true);
   2355   EXPECT_EQ(kCompleteValue, framebuffer1->IsPossiblyComplete());
   2356   framebuffer_manager1.MarkAsComplete(framebuffer1.get());
   2357   EXPECT_TRUE(framebuffer_manager1.IsComplete(framebuffer1.get()));
   2358 
   2359   // Share texture with manager 2.
   2360   scoped_refptr<TextureRef> ref2 =
   2361       texture_manager2_->Consume(20, ref1->texture());
   2362   framebuffer_manager2.CreateFramebuffer(20, 20);
   2363   scoped_refptr<Framebuffer> framebuffer2 =
   2364       framebuffer_manager2.GetFramebuffer(20);
   2365   framebuffer2->AttachTexture(
   2366       GL_COLOR_ATTACHMENT0, ref2.get(), GL_TEXTURE_2D, 0, 0);
   2367   EXPECT_FALSE(framebuffer_manager2.IsComplete(framebuffer2.get()));
   2368   EXPECT_EQ(kCompleteValue, framebuffer2->IsPossiblyComplete());
   2369   framebuffer_manager2.MarkAsComplete(framebuffer2.get());
   2370   EXPECT_TRUE(framebuffer_manager2.IsComplete(framebuffer2.get()));
   2371 
   2372   // Change level for texture, both FBOs should be marked incomplete
   2373   texture_manager1_->SetLevelInfo(ref1.get(),
   2374                                   GL_TEXTURE_2D,
   2375                                   0,
   2376                                   GL_RGBA,
   2377                                   1,
   2378                                   1,
   2379                                   1,
   2380                                   0,
   2381                                   GL_RGBA,
   2382                                   GL_UNSIGNED_BYTE,
   2383                                   true);
   2384   EXPECT_FALSE(framebuffer_manager1.IsComplete(framebuffer1.get()));
   2385   EXPECT_EQ(kCompleteValue, framebuffer1->IsPossiblyComplete());
   2386   framebuffer_manager1.MarkAsComplete(framebuffer1.get());
   2387   EXPECT_TRUE(framebuffer_manager1.IsComplete(framebuffer1.get()));
   2388   EXPECT_FALSE(framebuffer_manager2.IsComplete(framebuffer2.get()));
   2389   EXPECT_EQ(kCompleteValue, framebuffer2->IsPossiblyComplete());
   2390   framebuffer_manager2.MarkAsComplete(framebuffer2.get());
   2391   EXPECT_TRUE(framebuffer_manager2.IsComplete(framebuffer2.get()));
   2392 
   2393   EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, _))
   2394       .Times(2)
   2395       .RetiresOnSaturation();
   2396   framebuffer_manager1.RemoveFramebuffer(10);
   2397   framebuffer_manager2.RemoveFramebuffer(20);
   2398   EXPECT_CALL(*gl_, DeleteTextures(1, _))
   2399       .Times(1)
   2400       .RetiresOnSaturation();
   2401   texture_manager1_->RemoveTexture(10);
   2402   texture_manager2_->RemoveTexture(20);
   2403 }
   2404 
   2405 TEST_F(SharedTextureTest, Memory) {
   2406   size_t initial_memory1 = memory_tracker1_->GetSize(MemoryTracker::kUnmanaged);
   2407   size_t initial_memory2 = memory_tracker2_->GetSize(MemoryTracker::kUnmanaged);
   2408 
   2409   // Newly created texture is unrenderable.
   2410   scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
   2411   texture_manager1_->SetTarget(ref1.get(), GL_TEXTURE_2D);
   2412   texture_manager1_->SetLevelInfo(ref1.get(),
   2413                                   GL_TEXTURE_2D,
   2414                                   0,
   2415                                   GL_RGBA,
   2416                                   10,
   2417                                   10,
   2418                                   1,
   2419                                   0,
   2420                                   GL_RGBA,
   2421                                   GL_UNSIGNED_BYTE,
   2422                                   false);
   2423 
   2424   EXPECT_LT(0u, ref1->texture()->estimated_size());
   2425   EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(),
   2426             memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
   2427 
   2428   // Associate new texture ref to other texture manager, it doesn't account for
   2429   // the texture memory, the first memory tracker still has it.
   2430   scoped_refptr<TextureRef> ref2 =
   2431       texture_manager2_->Consume(20, ref1->texture());
   2432   EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(),
   2433             memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
   2434   EXPECT_EQ(initial_memory2,
   2435             memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
   2436 
   2437   // Delete the texture, memory should go to the remaining tracker.
   2438   texture_manager1_->RemoveTexture(10);
   2439   ref1 = NULL;
   2440   EXPECT_EQ(initial_memory1,
   2441             memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
   2442   EXPECT_EQ(initial_memory2 + ref2->texture()->estimated_size(),
   2443             memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
   2444 
   2445   EXPECT_CALL(*gl_, DeleteTextures(1, _))
   2446       .Times(1)
   2447       .RetiresOnSaturation();
   2448   ref2 = NULL;
   2449   texture_manager2_->RemoveTexture(20);
   2450   EXPECT_EQ(initial_memory2,
   2451             memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
   2452 }
   2453 
   2454 TEST_F(SharedTextureTest, Images) {
   2455   scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
   2456   scoped_refptr<TextureRef> ref2 =
   2457       texture_manager2_->Consume(20, ref1->texture());
   2458 
   2459   texture_manager1_->SetTarget(ref1.get(), GL_TEXTURE_2D);
   2460   texture_manager1_->SetLevelInfo(ref1.get(),
   2461                                   GL_TEXTURE_2D,
   2462                                   1,
   2463                                   GL_RGBA,
   2464                                   2,
   2465                                   2,
   2466                                   1,
   2467                                   0,
   2468                                   GL_RGBA,
   2469                                   GL_UNSIGNED_BYTE,
   2470                                   true);
   2471   EXPECT_FALSE(ref1->texture()->HasImages());
   2472   EXPECT_FALSE(ref2->texture()->HasImages());
   2473   EXPECT_FALSE(texture_manager1_->HaveImages());
   2474   EXPECT_FALSE(texture_manager2_->HaveImages());
   2475   texture_manager1_->SetLevelImage(ref1.get(),
   2476                                    GL_TEXTURE_2D,
   2477                                    1,
   2478                                    gfx::GLImage::CreateGLImage(0).get());
   2479   EXPECT_TRUE(ref1->texture()->HasImages());
   2480   EXPECT_TRUE(ref2->texture()->HasImages());
   2481   EXPECT_TRUE(texture_manager1_->HaveImages());
   2482   EXPECT_TRUE(texture_manager2_->HaveImages());
   2483   texture_manager1_->SetLevelImage(ref1.get(),
   2484                                    GL_TEXTURE_2D,
   2485                                    1,
   2486                                    gfx::GLImage::CreateGLImage(0).get());
   2487   EXPECT_TRUE(ref1->texture()->HasImages());
   2488   EXPECT_TRUE(ref2->texture()->HasImages());
   2489   EXPECT_TRUE(texture_manager1_->HaveImages());
   2490   EXPECT_TRUE(texture_manager2_->HaveImages());
   2491   texture_manager1_->SetLevelInfo(ref1.get(),
   2492                                   GL_TEXTURE_2D,
   2493                                   1,
   2494                                   GL_RGBA,
   2495                                   2,
   2496                                   2,
   2497                                   1,
   2498                                   0,
   2499                                   GL_RGBA,
   2500                                   GL_UNSIGNED_BYTE,
   2501                                   true);
   2502   EXPECT_FALSE(ref1->texture()->HasImages());
   2503   EXPECT_FALSE(ref2->texture()->HasImages());
   2504   EXPECT_FALSE(texture_manager1_->HaveImages());
   2505   EXPECT_FALSE(texture_manager1_->HaveImages());
   2506 
   2507   EXPECT_CALL(*gl_, DeleteTextures(1, _))
   2508       .Times(1)
   2509       .RetiresOnSaturation();
   2510   texture_manager1_->RemoveTexture(10);
   2511   texture_manager2_->RemoveTexture(20);
   2512 }
   2513 
   2514 }  // namespace gles2
   2515 }  // namespace gpu
   2516