| OLD | NEW | 
|     1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |     1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|     2 // Use of this source code is governed by a BSD-style license that can be |     2 // Use of this source code is governed by a BSD-style license that can be | 
|     3 // found in the LICENSE file. |     3 // found in the LICENSE file. | 
|     4  |     4  | 
|     5 #include "gpu/command_buffer/service/texture_manager.h" |     5 #include "gpu/command_buffer/service/texture_manager.h" | 
|     6  |     6  | 
|     7 #include "base/memory/scoped_ptr.h" |     7 #include "base/memory/scoped_ptr.h" | 
|     8 #include "gpu/command_buffer/service/error_state_mock.h" |     8 #include "gpu/command_buffer/service/error_state_mock.h" | 
|     9 #include "gpu/command_buffer/service/feature_info.h" |     9 #include "gpu/command_buffer/service/feature_info.h" | 
|    10 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" |    10 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" | 
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|    68   } |    68   } | 
|    69  |    69  | 
|    70   virtual void TearDown() { |    70   virtual void TearDown() { | 
|    71     manager_->Destroy(false); |    71     manager_->Destroy(false); | 
|    72     manager_.reset(); |    72     manager_.reset(); | 
|    73     ::gfx::GLInterface::SetGLInterface(NULL); |    73     ::gfx::GLInterface::SetGLInterface(NULL); | 
|    74     gl_.reset(); |    74     gl_.reset(); | 
|    75   } |    75   } | 
|    76  |    76  | 
|    77   void SetParameter( |    77   void SetParameter( | 
|    78       Texture* texture, GLenum pname, GLint value, GLenum error) { |    78       TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) { | 
|    79     TestHelper::SetTexParameterWithExpectations( |    79     TestHelper::SetTexParameterWithExpectations( | 
|    80         gl_.get(), error_state_.get(), manager_.get(), |    80         gl_.get(), error_state_.get(), manager_.get(), | 
|    81         texture, pname, value, error); |    81         texture_ref, pname, value, error); | 
|    82   } |    82   } | 
|    83  |    83  | 
|    84   // Use StrictMock to make 100% sure we know how GL will be called. |    84   // Use StrictMock to make 100% sure we know how GL will be called. | 
|    85   scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; |    85   scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; | 
|    86   scoped_refptr<FeatureInfo> feature_info_; |    86   scoped_refptr<FeatureInfo> feature_info_; | 
|    87   scoped_ptr<TextureManager> manager_; |    87   scoped_ptr<TextureManager> manager_; | 
|    88   scoped_ptr<MockErrorState> error_state_; |    88   scoped_ptr<MockErrorState> error_state_; | 
|    89 }; |    89 }; | 
|    90  |    90  | 
|    91 // GCC requires these declarations, but MSVC requires they not be present |    91 // GCC requires these declarations, but MSVC requires they not be present | 
|    92 #ifndef COMPILER_MSVC |    92 #ifndef COMPILER_MSVC | 
|    93 const GLint TextureManagerTest::kMaxTextureSize; |    93 const GLint TextureManagerTest::kMaxTextureSize; | 
|    94 const GLint TextureManagerTest::kMaxCubeMapTextureSize; |    94 const GLint TextureManagerTest::kMaxCubeMapTextureSize; | 
|    95 const GLint TextureManagerTest::kMaxExternalTextureSize; |    95 const GLint TextureManagerTest::kMaxExternalTextureSize; | 
|    96 const GLint TextureManagerTest::kMax2dLevels; |    96 const GLint TextureManagerTest::kMax2dLevels; | 
|    97 const GLint TextureManagerTest::kMaxCubeMapLevels; |    97 const GLint TextureManagerTest::kMaxCubeMapLevels; | 
|    98 const GLint TextureManagerTest::kMaxExternalLevels; |    98 const GLint TextureManagerTest::kMaxExternalLevels; | 
|    99 #endif |    99 #endif | 
|   100  |   100  | 
|   101 TEST_F(TextureManagerTest, Basic) { |   101 TEST_F(TextureManagerTest, Basic) { | 
|   102   const GLuint kClient1Id = 1; |   102   const GLuint kClient1Id = 1; | 
|   103   const GLuint kService1Id = 11; |   103   const GLuint kService1Id = 11; | 
|   104   const GLuint kClient2Id = 2; |   104   const GLuint kClient2Id = 2; | 
|   105   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); |   105   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); | 
|   106   EXPECT_FALSE(manager_->HaveUnsafeTextures()); |   106   EXPECT_FALSE(manager_->HaveUnsafeTextures()); | 
|   107   EXPECT_FALSE(manager_->HaveUnclearedMips()); |   107   EXPECT_FALSE(manager_->HaveUnclearedMips()); | 
|   108   // Check we can create texture. |   108   // Check we can create texture. | 
|   109   manager_->CreateTexture(kClient1Id, kService1Id); |   109   manager_->CreateTexture(kClient1Id, kService1Id); | 
|   110   // Check texture got created. |   110   // Check texture got created. | 
|   111   Texture* texture = manager_->GetTexture(kClient1Id); |   111   TextureRef* texture = manager_->GetTexture(kClient1Id); | 
|   112   ASSERT_TRUE(texture != NULL); |   112   ASSERT_TRUE(texture != NULL); | 
|   113   EXPECT_EQ(kService1Id, texture->service_id()); |   113   EXPECT_EQ(kService1Id, texture->service_id()); | 
|   114   GLuint client_id = 0; |   114   GLuint client_id = 0; | 
|   115   EXPECT_TRUE(manager_->GetClientId(texture->service_id(), &client_id)); |   115   EXPECT_TRUE(manager_->GetClientId(texture->service_id(), &client_id)); | 
|   116   EXPECT_EQ(kClient1Id, client_id); |   116   EXPECT_EQ(kClient1Id, client_id); | 
|   117   // Check we get nothing for a non-existent texture. |   117   // Check we get nothing for a non-existent texture. | 
|   118   EXPECT_TRUE(manager_->GetTexture(kClient2Id) == NULL); |   118   EXPECT_TRUE(manager_->GetTexture(kClient2Id) == NULL); | 
|   119   // Check trying to a remove non-existent textures does not crash. |   119   // Check trying to a remove non-existent textures does not crash. | 
|   120   manager_->RemoveTexture(kClient2Id); |   120   manager_->RemoveTexture(kClient2Id); | 
|   121   // Check that it gets deleted when the last reference is released. |   121   // Check that it gets deleted when the last reference is released. | 
|   122   EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id))) |   122   EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id))) | 
|   123       .Times(1) |   123       .Times(1) | 
|   124       .RetiresOnSaturation(); |   124       .RetiresOnSaturation(); | 
|   125   // Check we can't get the texture after we remove it. |   125   // Check we can't get the texture after we remove it. | 
|   126   manager_->RemoveTexture(kClient1Id); |   126   manager_->RemoveTexture(kClient1Id); | 
|   127   EXPECT_TRUE(manager_->GetTexture(kClient1Id) == NULL); |   127   EXPECT_TRUE(manager_->GetTexture(kClient1Id) == NULL); | 
|   128 } |   128 } | 
|   129  |   129  | 
|   130 TEST_F(TextureManagerTest, SetParameter) { |   130 TEST_F(TextureManagerTest, SetParameter) { | 
|   131   const GLuint kClient1Id = 1; |   131   const GLuint kClient1Id = 1; | 
|   132   const GLuint kService1Id = 11; |   132   const GLuint kService1Id = 11; | 
|   133   // Check we can create texture. |   133   // Check we can create texture. | 
|   134   manager_->CreateTexture(kClient1Id, kService1Id); |   134   manager_->CreateTexture(kClient1Id, kService1Id); | 
|   135   // Check texture got created. |   135   // Check texture got created. | 
|   136   Texture* texture = manager_->GetTexture(kClient1Id); |   136   TextureRef* texture_ref = manager_->GetTexture(kClient1Id); | 
|   137   manager_->SetTarget(texture, GL_TEXTURE_2D); |   137   ASSERT_TRUE(texture_ref != NULL); | 
|   138   ASSERT_TRUE(texture != NULL); |   138   Texture* texture = texture_ref->texture(); | 
|   139   SetParameter(texture, GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR); |   139   manager_->SetTarget(texture_ref, GL_TEXTURE_2D); | 
 |   140   SetParameter(texture_ref, GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR); | 
|   140   EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter()); |   141   EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter()); | 
|   141   SetParameter(texture, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR); |   142   SetParameter(texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR); | 
|   142   EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->mag_filter()); |   143   EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->mag_filter()); | 
|   143   SetParameter(texture, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR); |   144   SetParameter(texture_ref, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR); | 
|   144   EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_s()); |   145   EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_s()); | 
|   145   SetParameter(texture, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR); |   146   SetParameter(texture_ref, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR); | 
|   146   EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_t()); |   147   EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_t()); | 
|   147   SetParameter(texture, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1, GL_NO_ERROR); |   148   SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1, GL_NO_ERROR); | 
|   148   SetParameter(texture, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2, GL_NO_ERROR); |   149   SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2, GL_NO_ERROR); | 
|   149   SetParameter( |   150   SetParameter( | 
|   150       texture, GL_TEXTURE_MIN_FILTER, GL_CLAMP_TO_EDGE, GL_INVALID_ENUM); |   151       texture_ref, GL_TEXTURE_MIN_FILTER, GL_CLAMP_TO_EDGE, GL_INVALID_ENUM); | 
|   151   EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter()); |   152   EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter()); | 
|   152   SetParameter( |   153   SetParameter( | 
|   153       texture, GL_TEXTURE_MAG_FILTER, GL_CLAMP_TO_EDGE, GL_INVALID_ENUM); |   154       texture_ref, GL_TEXTURE_MAG_FILTER, GL_CLAMP_TO_EDGE, GL_INVALID_ENUM); | 
|   154   EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter()); |   155   EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter()); | 
|   155   SetParameter(texture, GL_TEXTURE_WRAP_S, GL_NEAREST, GL_INVALID_ENUM); |   156   SetParameter(texture_ref, GL_TEXTURE_WRAP_S, GL_NEAREST, GL_INVALID_ENUM); | 
|   156   EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_s()); |   157   EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_s()); | 
|   157   SetParameter(texture, GL_TEXTURE_WRAP_T, GL_NEAREST, GL_INVALID_ENUM); |   158   SetParameter(texture_ref, GL_TEXTURE_WRAP_T, GL_NEAREST, GL_INVALID_ENUM); | 
|   158   EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_t()); |   159   EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_t()); | 
|   159   SetParameter(texture, GL_TEXTURE_MAX_ANISOTROPY_EXT, 0, GL_INVALID_VALUE); |   160   SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 0, GL_INVALID_VALUE); | 
|   160 } |   161 } | 
|   161  |   162  | 
|   162 TEST_F(TextureManagerTest, TextureUsageExt) { |   163 TEST_F(TextureManagerTest, TextureUsageExt) { | 
|   163   TestHelper::SetupTextureManagerInitExpectations(gl_.get(), |   164   TestHelper::SetupTextureManagerInitExpectations(gl_.get(), | 
|   164                                                   "GL_ANGLE_texture_usage"); |   165                                                   "GL_ANGLE_texture_usage"); | 
|   165   TextureManager manager( |   166   TextureManager manager( | 
|   166       NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize); |   167       NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize); | 
|   167   manager.Initialize(); |   168   manager.Initialize(); | 
|   168   const GLuint kClient1Id = 1; |   169   const GLuint kClient1Id = 1; | 
|   169   const GLuint kService1Id = 11; |   170   const GLuint kService1Id = 11; | 
|   170   // Check we can create texture. |   171   // Check we can create texture. | 
|   171   manager.CreateTexture(kClient1Id, kService1Id); |   172   manager.CreateTexture(kClient1Id, kService1Id); | 
|   172   // Check texture got created. |   173   // Check texture got created. | 
|   173   Texture* texture = manager.GetTexture(kClient1Id); |   174   TextureRef* texture_ref = manager.GetTexture(kClient1Id); | 
|   174   ASSERT_TRUE(texture != NULL); |   175   ASSERT_TRUE(texture_ref != NULL); | 
|   175   TestHelper::SetTexParameterWithExpectations( |   176   TestHelper::SetTexParameterWithExpectations( | 
|   176       gl_.get(), error_state_.get(), &manager, texture, |   177       gl_.get(), error_state_.get(), &manager, texture_ref, | 
|   177       GL_TEXTURE_USAGE_ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE,GL_NO_ERROR); |   178       GL_TEXTURE_USAGE_ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE,GL_NO_ERROR); | 
|   178   EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_ATTACHMENT_ANGLE), |   179   EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_ATTACHMENT_ANGLE), | 
|   179             texture->usage()); |   180             texture_ref->texture()->usage()); | 
|   180   manager.Destroy(false); |   181   manager.Destroy(false); | 
|   181 } |   182 } | 
|   182  |   183  | 
|   183 TEST_F(TextureManagerTest, Destroy) { |   184 TEST_F(TextureManagerTest, Destroy) { | 
|   184   const GLuint kClient1Id = 1; |   185   const GLuint kClient1Id = 1; | 
|   185   const GLuint kService1Id = 11; |   186   const GLuint kService1Id = 11; | 
|   186   TestHelper::SetupTextureManagerInitExpectations(gl_.get(), ""); |   187   TestHelper::SetupTextureManagerInitExpectations(gl_.get(), ""); | 
|   187   TextureManager manager( |   188   TextureManager manager( | 
|   188       NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize); |   189       NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize); | 
|   189   manager.Initialize(); |   190   manager.Initialize(); | 
|   190   // Check we can create texture. |   191   // Check we can create texture. | 
|   191   manager.CreateTexture(kClient1Id, kService1Id); |   192   manager.CreateTexture(kClient1Id, kService1Id); | 
|   192   // Check texture got created. |   193   // Check texture got created. | 
|   193   Texture* texture = manager.GetTexture(kClient1Id); |   194   TextureRef* texture = manager.GetTexture(kClient1Id); | 
|   194   ASSERT_TRUE(texture != NULL); |   195   ASSERT_TRUE(texture != NULL); | 
|   195   EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id))) |   196   EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id))) | 
|   196       .Times(1) |   197       .Times(1) | 
|   197       .RetiresOnSaturation(); |   198       .RetiresOnSaturation(); | 
|   198   TestHelper::SetupTextureManagerDestructionExpectations(gl_.get(), ""); |   199   TestHelper::SetupTextureManagerDestructionExpectations(gl_.get(), ""); | 
|   199   manager.Destroy(true); |   200   manager.Destroy(true); | 
|   200   // Check that resources got freed. |   201   // Check that resources got freed. | 
|   201   texture = manager.GetTexture(kClient1Id); |   202   texture = manager.GetTexture(kClient1Id); | 
|   202   ASSERT_TRUE(texture == NULL); |   203   ASSERT_TRUE(texture == NULL); | 
|   203 } |   204 } | 
|   204  |   205  | 
|   205 TEST_F(TextureManagerTest, DestroyUnowned) { |   206 TEST_F(TextureManagerTest, DestroyUnowned) { | 
|   206   const GLuint kClient1Id = 1; |   207   const GLuint kClient1Id = 1; | 
|   207   const GLuint kService1Id = 11; |   208   const GLuint kService1Id = 11; | 
|   208   TestHelper::SetupTextureManagerInitExpectations(gl_.get(), ""); |   209   TestHelper::SetupTextureManagerInitExpectations(gl_.get(), ""); | 
|   209   TextureManager manager( |   210   TextureManager manager( | 
|   210       NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize); |   211       NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize); | 
|   211   manager.Initialize(); |   212   manager.Initialize(); | 
|   212   // Check we can create texture. |   213   // Check we can create texture. | 
|   213   Texture* created_texture = |   214   TextureRef* created_texture = | 
|   214       manager.CreateTexture(kClient1Id, kService1Id); |   215       manager.CreateTexture(kClient1Id, kService1Id); | 
|   215   created_texture->SetNotOwned(); |   216   created_texture->texture()->SetNotOwned(); | 
|   216  |   217  | 
|   217   // Check texture got created. |   218   // Check texture got created. | 
|   218   Texture* texture = manager.GetTexture(kClient1Id); |   219   TextureRef* texture = manager.GetTexture(kClient1Id); | 
|   219   ASSERT_TRUE(texture != NULL); |   220   ASSERT_TRUE(texture != NULL); | 
|   220  |   221  | 
|   221   // Check that it is not freed if it is not owned. |   222   // Check that it is not freed if it is not owned. | 
|   222   TestHelper::SetupTextureManagerDestructionExpectations(gl_.get(), ""); |   223   TestHelper::SetupTextureManagerDestructionExpectations(gl_.get(), ""); | 
|   223   manager.Destroy(true); |   224   manager.Destroy(true); | 
|   224   texture = manager.GetTexture(kClient1Id); |   225   texture = manager.GetTexture(kClient1Id); | 
|   225   ASSERT_TRUE(texture == NULL); |   226   ASSERT_TRUE(texture == NULL); | 
|   226 } |   227 } | 
|   227  |   228  | 
|   228 TEST_F(TextureManagerTest, MaxValues) { |   229 TEST_F(TextureManagerTest, MaxValues) { | 
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   358   static const GLint kMaxCubeMapTextureSize = 8; |   359   static const GLint kMaxCubeMapTextureSize = 8; | 
|   359   static const GLint kMax2dLevels = 5; |   360   static const GLint kMax2dLevels = 5; | 
|   360   static const GLint kMaxCubeMapLevels = 4; |   361   static const GLint kMaxCubeMapLevels = 4; | 
|   361   static const GLuint kClient1Id = 1; |   362   static const GLuint kClient1Id = 1; | 
|   362   static const GLuint kService1Id = 11; |   363   static const GLuint kService1Id = 11; | 
|   363  |   364  | 
|   364   TextureTestBase() |   365   TextureTestBase() | 
|   365       : feature_info_(new FeatureInfo()) { |   366       : feature_info_(new FeatureInfo()) { | 
|   366   } |   367   } | 
|   367   virtual ~TextureTestBase() { |   368   virtual ~TextureTestBase() { | 
|   368     texture_ = NULL; |   369     texture_ref_ = NULL; | 
|   369   } |   370   } | 
|   370  |   371  | 
|   371  protected: |   372  protected: | 
|   372   void SetUpBase(MemoryTracker* memory_tracker, std::string extensions) { |   373   void SetUpBase(MemoryTracker* memory_tracker, std::string extensions) { | 
|   373     gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); |   374     gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); | 
|   374     ::gfx::GLInterface::SetGLInterface(gl_.get()); |   375     ::gfx::GLInterface::SetGLInterface(gl_.get()); | 
|   375  |   376  | 
|   376     if (!extensions.empty()) { |   377     if (!extensions.empty()) { | 
|   377       TestHelper::SetupFeatureInfoInitExpectations(gl_.get(), |   378       TestHelper::SetupFeatureInfoInitExpectations(gl_.get(), | 
|   378                                                    extensions.c_str()); |   379                                                    extensions.c_str()); | 
|   379       feature_info_->Initialize(NULL); |   380       feature_info_->Initialize(NULL); | 
|   380     } |   381     } | 
|   381  |   382  | 
|   382     manager_.reset(new TextureManager( |   383     manager_.reset(new TextureManager( | 
|   383         memory_tracker, feature_info_.get(), |   384         memory_tracker, feature_info_.get(), | 
|   384         kMaxTextureSize, kMaxCubeMapTextureSize)); |   385         kMaxTextureSize, kMaxCubeMapTextureSize)); | 
|   385     decoder_.reset(new ::testing::StrictMock<gles2::MockGLES2Decoder>()); |   386     decoder_.reset(new ::testing::StrictMock<gles2::MockGLES2Decoder>()); | 
|   386     error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>()); |   387     error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>()); | 
|   387     manager_->CreateTexture(kClient1Id, kService1Id); |   388     manager_->CreateTexture(kClient1Id, kService1Id); | 
|   388     texture_ = manager_->GetTexture(kClient1Id); |   389     texture_ref_ = manager_->GetTexture(kClient1Id); | 
|   389     ASSERT_TRUE(texture_.get() != NULL); |   390     ASSERT_TRUE(texture_ref_.get() != NULL); | 
|   390   } |   391   } | 
|   391  |   392  | 
|   392   virtual void TearDown() { |   393   virtual void TearDown() { | 
|   393     if (texture_.get()) { |   394     if (texture_ref_.get()) { | 
|   394       GLuint client_id = 0; |   395       GLuint client_id = 0; | 
|   395       // If it's not in the manager then setting texture_ to NULL will |   396       // If it's not in the manager then setting texture_ref_ to NULL will | 
|   396       // delete the texture. |   397       // delete the texture. | 
|   397       if (!manager_->GetClientId(texture_->service_id(), &client_id)) { |   398       if (!manager_->GetClientId(texture_ref_->service_id(), &client_id)) { | 
|   398         // Check that it gets deleted when the last reference is released. |   399         // Check that it gets deleted when the last reference is released. | 
|   399         EXPECT_CALL(*gl_, |   400         EXPECT_CALL(*gl_, | 
|   400             DeleteTextures(1, ::testing::Pointee(texture_->service_id()))) |   401             DeleteTextures(1, ::testing::Pointee(texture_ref_->service_id()))) | 
|   401             .Times(1) |   402             .Times(1) | 
|   402             .RetiresOnSaturation(); |   403             .RetiresOnSaturation(); | 
|   403       } |   404       } | 
|   404       texture_ = NULL; |   405       texture_ref_ = NULL; | 
|   405     } |   406     } | 
|   406     manager_->Destroy(false); |   407     manager_->Destroy(false); | 
|   407     manager_.reset(); |   408     manager_.reset(); | 
|   408     ::gfx::GLInterface::SetGLInterface(NULL); |   409     ::gfx::GLInterface::SetGLInterface(NULL); | 
|   409     gl_.reset(); |   410     gl_.reset(); | 
|   410   } |   411   } | 
|   411  |   412  | 
|   412   void SetParameter( |   413   void SetParameter( | 
|   413       Texture* texture, GLenum pname, GLint value, GLenum error) { |   414       TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) { | 
|   414     TestHelper::SetTexParameterWithExpectations( |   415     TestHelper::SetTexParameterWithExpectations( | 
|   415         gl_.get(), error_state_.get(), manager_.get(), |   416         gl_.get(), error_state_.get(), manager_.get(), | 
|   416         texture, pname, value, error); |   417         texture_ref, pname, value, error); | 
|   417   } |   418   } | 
|   418  |   419  | 
|   419   scoped_ptr<MockGLES2Decoder> decoder_; |   420   scoped_ptr<MockGLES2Decoder> decoder_; | 
|   420   scoped_ptr<MockErrorState> error_state_; |   421   scoped_ptr<MockErrorState> error_state_; | 
|   421   // Use StrictMock to make 100% sure we know how GL will be called. |   422   // Use StrictMock to make 100% sure we know how GL will be called. | 
|   422   scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; |   423   scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; | 
|   423   scoped_refptr<FeatureInfo> feature_info_; |   424   scoped_refptr<FeatureInfo> feature_info_; | 
|   424   scoped_ptr<TextureManager> manager_; |   425   scoped_ptr<TextureManager> manager_; | 
|   425   scoped_refptr<Texture> texture_; |   426   scoped_refptr<TextureRef> texture_ref_; | 
|   426 }; |   427 }; | 
|   427  |   428  | 
|   428 class TextureTest : public TextureTestBase { |   429 class TextureTest : public TextureTestBase { | 
|   429  protected: |   430  protected: | 
|   430   virtual void SetUp() { |   431   virtual void SetUp() { | 
|   431     SetUpBase(NULL, std::string()); |   432     SetUpBase(NULL, std::string()); | 
|   432   } |   433   } | 
|   433 }; |   434 }; | 
|   434  |   435  | 
|   435 class TextureMemoryTrackerTest : public TextureTestBase { |   436 class TextureMemoryTrackerTest : public TextureTestBase { | 
|   436  protected: |   437  protected: | 
|   437   virtual void SetUp() { |   438   virtual void SetUp() { | 
|   438     mock_memory_tracker_ = new StrictMock<MockMemoryTracker>(); |   439     mock_memory_tracker_ = new StrictMock<MockMemoryTracker>(); | 
|   439     SetUpBase(mock_memory_tracker_.get(), std::string()); |   440     SetUpBase(mock_memory_tracker_.get(), std::string()); | 
|   440   } |   441   } | 
|   441  |   442  | 
|   442   scoped_refptr<MockMemoryTracker> mock_memory_tracker_; |   443   scoped_refptr<MockMemoryTracker> mock_memory_tracker_; | 
|   443 }; |   444 }; | 
|   444  |   445  | 
|   445 #define EXPECT_MEMORY_ALLOCATION_CHANGE(old_size, new_size, pool) \ |   446 #define EXPECT_MEMORY_ALLOCATION_CHANGE(old_size, new_size, pool) \ | 
|   446     EXPECT_CALL(*mock_memory_tracker_, \ |   447     EXPECT_CALL(*mock_memory_tracker_, \ | 
|   447                 TrackMemoryAllocatedChange(old_size, new_size, pool)) \ |   448                 TrackMemoryAllocatedChange(old_size, new_size, pool)) \ | 
|   448         .Times(1) \ |   449         .Times(1) \ | 
|   449         .RetiresOnSaturation() \ |   450         .RetiresOnSaturation() \ | 
|   450  |   451  | 
|   451 TEST_F(TextureTest, Basic) { |   452 TEST_F(TextureTest, Basic) { | 
|   452   EXPECT_EQ(0u, texture_->target()); |   453   Texture* texture = texture_ref_->texture(); | 
|   453   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); |   454   EXPECT_EQ(0u, texture->target()); | 
|   454   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_)); |   455   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   455   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_)); |   456   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture)); | 
|   456   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); |   457   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_)); | 
|   457   EXPECT_EQ(0, texture_->num_uncleared_mips()); |   458   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); | 
|   458   EXPECT_FALSE(manager_->CanRender(texture_)); |   459   EXPECT_EQ(0, texture->num_uncleared_mips()); | 
|   459   EXPECT_TRUE(texture_->SafeToRenderFrom()); |   460   EXPECT_FALSE(manager_->CanRender(texture_ref_)); | 
|   460   EXPECT_FALSE(texture_->IsImmutable()); |   461   EXPECT_TRUE(texture->SafeToRenderFrom()); | 
 |   462   EXPECT_FALSE(texture->IsImmutable()); | 
|   461   EXPECT_EQ(static_cast<GLenum>(GL_NEAREST_MIPMAP_LINEAR), |   463   EXPECT_EQ(static_cast<GLenum>(GL_NEAREST_MIPMAP_LINEAR), | 
|   462             texture_->min_filter()); |   464             texture->min_filter()); | 
|   463   EXPECT_EQ(static_cast<GLenum>(GL_LINEAR), texture_->mag_filter()); |   465   EXPECT_EQ(static_cast<GLenum>(GL_LINEAR), texture->mag_filter()); | 
|   464   EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture_->wrap_s()); |   466   EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture->wrap_s()); | 
|   465   EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture_->wrap_t()); |   467   EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture->wrap_t()); | 
|   466   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); |   468   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); | 
|   467   EXPECT_FALSE(manager_->HaveUnsafeTextures()); |   469   EXPECT_FALSE(manager_->HaveUnsafeTextures()); | 
|   468   EXPECT_EQ(0u, texture_->estimated_size()); |   470   EXPECT_EQ(0u, texture->estimated_size()); | 
|   469 } |   471 } | 
|   470  |   472  | 
|   471 TEST_F(TextureTest, SetTargetTexture2D) { |   473 TEST_F(TextureTest, SetTargetTexture2D) { | 
|   472   manager_->SetTarget(texture_, GL_TEXTURE_2D); |   474   Texture* texture = texture_ref_->texture(); | 
|   473   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); |   475   manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); | 
|   474   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_)); |   476   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   475   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_)); |   477   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture)); | 
|   476   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); |   478   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_)); | 
|   477   EXPECT_FALSE(manager_->CanRender(texture_)); |   479   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); | 
|   478   EXPECT_TRUE(texture_->SafeToRenderFrom()); |   480   EXPECT_FALSE(manager_->CanRender(texture_ref_)); | 
|   479   EXPECT_FALSE(texture_->IsImmutable()); |   481   EXPECT_TRUE(texture->SafeToRenderFrom()); | 
 |   482   EXPECT_FALSE(texture->IsImmutable()); | 
|   480 } |   483 } | 
|   481  |   484  | 
|   482 TEST_F(TextureTest, SetTargetTextureExternalOES) { |   485 TEST_F(TextureTest, SetTargetTextureExternalOES) { | 
|   483   manager_->SetTarget(texture_, GL_TEXTURE_EXTERNAL_OES); |   486   Texture* texture = texture_ref_->texture(); | 
|   484   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); |   487   manager_->SetTarget(texture_ref_, GL_TEXTURE_EXTERNAL_OES); | 
|   485   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_)); |   488   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   486   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_)); |   489   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture)); | 
|   487   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); |   490   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_)); | 
|   488   EXPECT_TRUE(manager_->CanRender(texture_)); |   491   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); | 
|   489   EXPECT_TRUE(texture_->SafeToRenderFrom()); |   492   EXPECT_TRUE(manager_->CanRender(texture_ref_)); | 
|   490   EXPECT_TRUE(texture_->IsImmutable()); |   493   EXPECT_TRUE(texture->SafeToRenderFrom()); | 
 |   494   EXPECT_TRUE(texture->IsImmutable()); | 
|   491 } |   495 } | 
|   492  |   496  | 
|   493 TEST_F(TextureTest, EstimatedSize) { |   497 TEST_F(TextureTest, EstimatedSize) { | 
|   494   manager_->SetTarget(texture_, GL_TEXTURE_2D); |   498   manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); | 
|   495   manager_->SetLevelInfo(texture_, |   499   manager_->SetLevelInfo(texture_ref_, | 
|   496       GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   500       GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   497   EXPECT_EQ(8u * 4u * 4u, texture_->estimated_size()); |   501   EXPECT_EQ(8u * 4u * 4u, texture_ref_->texture()->estimated_size()); | 
|   498   manager_->SetLevelInfo(texture_, |   502   manager_->SetLevelInfo(texture_ref_, | 
|   499       GL_TEXTURE_2D, 2, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   503       GL_TEXTURE_2D, 2, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   500   EXPECT_EQ(8u * 4u * 4u * 2u, texture_->estimated_size()); |   504   EXPECT_EQ(8u * 4u * 4u * 2u, texture_ref_->texture()->estimated_size()); | 
|   501 } |   505 } | 
|   502  |   506  | 
|   503 TEST_F(TextureMemoryTrackerTest, EstimatedSize) { |   507 TEST_F(TextureMemoryTrackerTest, EstimatedSize) { | 
|   504   manager_->SetTarget(texture_, GL_TEXTURE_2D); |   508   manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); | 
|   505   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged); |   509   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged); | 
|   506   manager_->SetLevelInfo(texture_, |   510   manager_->SetLevelInfo(texture_ref_, | 
|   507       GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   511       GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   508   EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged); |   512   EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged); | 
|   509   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 256, MemoryTracker::kUnmanaged); |   513   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 256, MemoryTracker::kUnmanaged); | 
|   510   manager_->SetLevelInfo(texture_, |   514   manager_->SetLevelInfo(texture_ref_, | 
|   511       GL_TEXTURE_2D, 2, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   515       GL_TEXTURE_2D, 2, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   512   // Add expectation for texture deletion. |   516   // Add expectation for texture deletion. | 
|   513   EXPECT_MEMORY_ALLOCATION_CHANGE(256, 0, MemoryTracker::kUnmanaged); |   517   EXPECT_MEMORY_ALLOCATION_CHANGE(256, 0, MemoryTracker::kUnmanaged); | 
|   514   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged); |   518   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged); | 
|   515 } |   519 } | 
|   516  |   520  | 
|   517 TEST_F(TextureMemoryTrackerTest, SetParameterPool) { |   521 TEST_F(TextureMemoryTrackerTest, SetParameterPool) { | 
|   518   manager_->SetTarget(texture_, GL_TEXTURE_2D); |   522   manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); | 
|   519   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged); |   523   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged); | 
|   520   manager_->SetLevelInfo(texture_, |   524   manager_->SetLevelInfo(texture_ref_, | 
|   521       GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   525       GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   522   EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged); |   526   EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged); | 
|   523   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kManaged); |   527   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kManaged); | 
|   524   SetParameter( |   528   SetParameter( | 
|   525       texture_, GL_TEXTURE_POOL_CHROMIUM, GL_TEXTURE_POOL_MANAGED_CHROMIUM, |   529       texture_ref_, GL_TEXTURE_POOL_CHROMIUM, GL_TEXTURE_POOL_MANAGED_CHROMIUM, | 
|   526       GL_NO_ERROR); |   530       GL_NO_ERROR); | 
|   527   // Add expectation for texture deletion. |   531   // Add expectation for texture deletion. | 
|   528   EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kManaged); |   532   EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kManaged); | 
|   529   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged); |   533   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged); | 
|   530   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kManaged); |   534   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kManaged); | 
|   531 } |   535 } | 
|   532  |   536  | 
|   533 TEST_F(TextureTest, POT2D) { |   537 TEST_F(TextureTest, POT2D) { | 
|   534   manager_->SetTarget(texture_, GL_TEXTURE_2D); |   538   manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); | 
|   535   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture_->target()); |   539   Texture* texture = texture_ref_->texture(); | 
 |   540   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); | 
|   536   // Check Setting level 0 to POT |   541   // Check Setting level 0 to POT | 
|   537   manager_->SetLevelInfo(texture_, |   542   manager_->SetLevelInfo(texture_ref_, | 
|   538       GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   543       GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   539   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); |   544   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); | 
|   540   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); |   545   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   541   EXPECT_FALSE(manager_->CanRender(texture_)); |   546   EXPECT_FALSE(manager_->CanRender(texture_ref_)); | 
|   542   EXPECT_EQ(0, texture_->num_uncleared_mips()); |   547   EXPECT_EQ(0, texture->num_uncleared_mips()); | 
|   543   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); |   548   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); | 
|   544   // Set filters to something that will work with a single mip. |   549   // Set filters to something that will work with a single mip. | 
|   545   SetParameter(texture_, GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR); |   550   SetParameter(texture_ref_, GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR); | 
|   546   EXPECT_TRUE(manager_->CanRender(texture_)); |   551   EXPECT_TRUE(manager_->CanRender(texture_ref_)); | 
|   547   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); |   552   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); | 
|   548   // Set them back. |   553   // Set them back. | 
|   549   SetParameter( |   554   SetParameter(texture_ref_, GL_TEXTURE_MIN_FILTER, | 
|   550       texture_, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR, GL_NO_ERROR); |   555                GL_LINEAR_MIPMAP_LINEAR, GL_NO_ERROR); | 
|   551   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); |   556   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); | 
|   552  |   557  | 
|   553   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_)); |   558   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_)); | 
|   554   // Make mips. |   559   // Make mips. | 
|   555   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_)); |   560   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_)); | 
|   556   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); |   561   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 
|   557   EXPECT_TRUE(manager_->CanRender(texture_)); |   562   EXPECT_TRUE(manager_->CanRender(texture_ref_)); | 
|   558   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); |   563   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); | 
|   559   // Change a mip. |   564   // Change a mip. | 
|   560   manager_->SetLevelInfo(texture_, |   565   manager_->SetLevelInfo(texture_ref_, | 
|   561       GL_TEXTURE_2D, 1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   566       GL_TEXTURE_2D, 1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   562   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); |   567   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); | 
|   563   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); |   568   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   564   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_)); |   569   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_)); | 
|   565   EXPECT_FALSE(manager_->CanRender(texture_)); |   570   EXPECT_FALSE(manager_->CanRender(texture_ref_)); | 
|   566   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); |   571   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); | 
|   567   // Set a level past the number of mips that would get generated. |   572   // Set a level past the number of mips that would get generated. | 
|   568   manager_->SetLevelInfo(texture_, |   573   manager_->SetLevelInfo(texture_ref_, | 
|   569       GL_TEXTURE_2D, 3, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   574       GL_TEXTURE_2D, 3, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   570   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_)); |   575   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_)); | 
|   571   // Make mips. |   576   // Make mips. | 
|   572   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_)); |   577   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_)); | 
|   573   EXPECT_TRUE(manager_->CanRender(texture_)); |   578   EXPECT_TRUE(manager_->CanRender(texture_ref_)); | 
|   574   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); |   579   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 
|   575   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); |   580   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); | 
|   576 } |   581 } | 
|   577  |   582  | 
|   578 TEST_F(TextureMemoryTrackerTest, MarkMipmapsGenerated) { |   583 TEST_F(TextureMemoryTrackerTest, MarkMipmapsGenerated) { | 
|   579   manager_->SetTarget(texture_, GL_TEXTURE_2D); |   584   manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); | 
|   580   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 64, MemoryTracker::kUnmanaged); |   585   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 64, MemoryTracker::kUnmanaged); | 
|   581   manager_->SetLevelInfo(texture_, |   586   manager_->SetLevelInfo(texture_ref_, | 
|   582       GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   587       GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   583   EXPECT_MEMORY_ALLOCATION_CHANGE(64, 0, MemoryTracker::kUnmanaged); |   588   EXPECT_MEMORY_ALLOCATION_CHANGE(64, 0, MemoryTracker::kUnmanaged); | 
|   584   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 84, MemoryTracker::kUnmanaged); |   589   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 84, MemoryTracker::kUnmanaged); | 
|   585   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_)); |   590   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_)); | 
|   586   EXPECT_MEMORY_ALLOCATION_CHANGE(84, 0, MemoryTracker::kUnmanaged); |   591   EXPECT_MEMORY_ALLOCATION_CHANGE(84, 0, MemoryTracker::kUnmanaged); | 
|   587   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged); |   592   EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged); | 
|   588 } |   593 } | 
|   589  |   594  | 
|   590 TEST_F(TextureTest, UnusedMips) { |   595 TEST_F(TextureTest, UnusedMips) { | 
|   591   manager_->SetTarget(texture_, GL_TEXTURE_2D); |   596   manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); | 
|   592   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture_->target()); |   597   Texture* texture = texture_ref_->texture(); | 
 |   598   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); | 
|   593   // Set level zero to large size. |   599   // Set level zero to large size. | 
|   594   manager_->SetLevelInfo(texture_, |   600   manager_->SetLevelInfo(texture_ref_, | 
|   595       GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   601       GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   596   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_)); |   602   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_)); | 
|   597   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); |   603   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); | 
|   598   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); |   604   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 
|   599   EXPECT_TRUE(manager_->CanRender(texture_)); |   605   EXPECT_TRUE(manager_->CanRender(texture_ref_)); | 
|   600   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); |   606   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); | 
|   601   // Set level zero to large smaller (levels unused mips) |   607   // Set level zero to large smaller (levels unused mips) | 
|   602   manager_->SetLevelInfo(texture_, |   608   manager_->SetLevelInfo(texture_ref_, | 
|   603       GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   609       GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   604   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_)); |   610   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_)); | 
|   605   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); |   611   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); | 
|   606   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); |   612   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 
|   607   EXPECT_TRUE(manager_->CanRender(texture_)); |   613   EXPECT_TRUE(manager_->CanRender(texture_ref_)); | 
|   608   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); |   614   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); | 
|   609   // Set an unused level to some size |   615   // Set an unused level to some size | 
|   610   manager_->SetLevelInfo(texture_, |   616   manager_->SetLevelInfo(texture_ref_, | 
|   611       GL_TEXTURE_2D, 4, GL_RGBA, 16, 16, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   617       GL_TEXTURE_2D, 4, GL_RGBA, 16, 16, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   612   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); |   618   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); | 
|   613   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); |   619   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 
|   614   EXPECT_TRUE(manager_->CanRender(texture_)); |   620   EXPECT_TRUE(manager_->CanRender(texture_ref_)); | 
|   615   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); |   621   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); | 
|   616 } |   622 } | 
|   617  |   623  | 
|   618 TEST_F(TextureTest, NPOT2D) { |   624 TEST_F(TextureTest, NPOT2D) { | 
|   619   manager_->SetTarget(texture_, GL_TEXTURE_2D); |   625   manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); | 
|   620   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture_->target()); |   626   Texture* texture = texture_ref_->texture(); | 
 |   627   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); | 
|   621   // Check Setting level 0 to NPOT |   628   // Check Setting level 0 to NPOT | 
|   622   manager_->SetLevelInfo(texture_, |   629   manager_->SetLevelInfo(texture_ref_, | 
|   623       GL_TEXTURE_2D, 0, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   630       GL_TEXTURE_2D, 0, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   624   EXPECT_TRUE(TextureTestHelper::IsNPOT(texture_)); |   631   EXPECT_TRUE(TextureTestHelper::IsNPOT(texture)); | 
|   625   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); |   632   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   626   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_)); |   633   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_)); | 
|   627   EXPECT_FALSE(manager_->CanRender(texture_)); |   634   EXPECT_FALSE(manager_->CanRender(texture_ref_)); | 
|   628   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); |   635   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); | 
|   629   SetParameter(texture_, GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR); |   636   SetParameter(texture_ref_, GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR); | 
|   630   EXPECT_FALSE(manager_->CanRender(texture_)); |   637   EXPECT_FALSE(manager_->CanRender(texture_ref_)); | 
|   631   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); |   638   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); | 
|   632   SetParameter(texture_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR); |   639   SetParameter(texture_ref_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR); | 
|   633   EXPECT_FALSE(manager_->CanRender(texture_)); |   640   EXPECT_FALSE(manager_->CanRender(texture_ref_)); | 
|   634   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); |   641   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); | 
|   635   SetParameter(texture_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR); |   642   SetParameter(texture_ref_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR); | 
|   636   EXPECT_TRUE(manager_->CanRender(texture_)); |   643   EXPECT_TRUE(manager_->CanRender(texture_ref_)); | 
|   637   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); |   644   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); | 
|   638   // Change it to POT. |   645   // Change it to POT. | 
|   639   manager_->SetLevelInfo(texture_, |   646   manager_->SetLevelInfo(texture_ref_, | 
|   640       GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   647       GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   641   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); |   648   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); | 
|   642   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); |   649   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   643   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_)); |   650   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_)); | 
|   644   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); |   651   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); | 
|   645 } |   652 } | 
|   646  |   653  | 
|   647 TEST_F(TextureTest, NPOT2DNPOTOK) { |   654 TEST_F(TextureTest, NPOT2DNPOTOK) { | 
|   648   TestHelper::SetupFeatureInfoInitExpectations( |   655   TestHelper::SetupFeatureInfoInitExpectations( | 
|   649       gl_.get(), "GL_OES_texture_npot"); |   656       gl_.get(), "GL_OES_texture_npot"); | 
|   650   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); |   657   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); | 
|   651   feature_info->Initialize(NULL); |   658   feature_info->Initialize(NULL); | 
|   652   TextureManager manager( |   659   TextureManager manager( | 
|   653       NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); |   660       NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); | 
|   654   manager.CreateTexture(kClient1Id, kService1Id); |   661   manager.CreateTexture(kClient1Id, kService1Id); | 
|   655   Texture* texture = manager.GetTexture(kClient1Id); |   662   TextureRef* texture_ref = manager.GetTexture(kClient1Id); | 
|   656   ASSERT_TRUE(texture != NULL); |   663   ASSERT_TRUE(texture_ref != NULL); | 
 |   664   Texture* texture = texture_ref->texture(); | 
|   657  |   665  | 
|   658   manager.SetTarget(texture, GL_TEXTURE_2D); |   666   manager.SetTarget(texture_ref, GL_TEXTURE_2D); | 
|   659   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); |   667   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); | 
|   660   // Check Setting level 0 to NPOT |   668   // Check Setting level 0 to NPOT | 
|   661   manager.SetLevelInfo(texture, |   669   manager.SetLevelInfo(texture_ref, | 
|   662       GL_TEXTURE_2D, 0, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   670       GL_TEXTURE_2D, 0, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   663   EXPECT_TRUE(TextureTestHelper::IsNPOT(texture)); |   671   EXPECT_TRUE(TextureTestHelper::IsNPOT(texture)); | 
|   664   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); |   672   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   665   EXPECT_TRUE(manager.CanGenerateMipmaps(texture)); |   673   EXPECT_TRUE(manager.CanGenerateMipmaps(texture_ref)); | 
|   666   EXPECT_FALSE(manager.CanRender(texture)); |   674   EXPECT_FALSE(manager.CanRender(texture_ref)); | 
|   667   EXPECT_TRUE(manager.HaveUnrenderableTextures()); |   675   EXPECT_TRUE(manager.HaveUnrenderableTextures()); | 
|   668   EXPECT_TRUE(manager.MarkMipmapsGenerated(texture)); |   676   EXPECT_TRUE(manager.MarkMipmapsGenerated(texture_ref)); | 
|   669   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); |   677   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 
|   670   EXPECT_TRUE(manager.CanRender(texture)); |   678   EXPECT_TRUE(manager.CanRender(texture_ref)); | 
|   671   EXPECT_FALSE(manager.HaveUnrenderableTextures()); |   679   EXPECT_FALSE(manager.HaveUnrenderableTextures()); | 
|   672   manager.Destroy(false); |   680   manager.Destroy(false); | 
|   673 } |   681 } | 
|   674  |   682  | 
|   675 TEST_F(TextureTest, POTCubeMap) { |   683 TEST_F(TextureTest, POTCubeMap) { | 
|   676   manager_->SetTarget(texture_, GL_TEXTURE_CUBE_MAP); |   684   manager_->SetTarget(texture_ref_, GL_TEXTURE_CUBE_MAP); | 
|   677   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture_->target()); |   685   Texture* texture = texture_ref_->texture(); | 
 |   686   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target()); | 
|   678   // Check Setting level 0 each face to POT |   687   // Check Setting level 0 each face to POT | 
|   679   manager_->SetLevelInfo(texture_, |   688   manager_->SetLevelInfo(texture_ref_, | 
|   680       GL_TEXTURE_CUBE_MAP_POSITIVE_X, |   689       GL_TEXTURE_CUBE_MAP_POSITIVE_X, | 
|   681       0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   690       0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   682   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); |   691   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); | 
|   683   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); |   692   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   684   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_)); |   693   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture)); | 
|   685   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_)); |   694   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_)); | 
|   686   EXPECT_FALSE(manager_->CanRender(texture_)); |   695   EXPECT_FALSE(manager_->CanRender(texture_ref_)); | 
|   687   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); |   696   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); | 
|   688   manager_->SetLevelInfo(texture_, |   697   manager_->SetLevelInfo(texture_ref_, | 
|   689       GL_TEXTURE_CUBE_MAP_NEGATIVE_X, |   698       GL_TEXTURE_CUBE_MAP_NEGATIVE_X, | 
|   690       0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   699       0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   691   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); |   700   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); | 
|   692   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); |   701   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   693   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_)); |   702   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture)); | 
|   694   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_)); |   703   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_)); | 
|   695   EXPECT_FALSE(manager_->CanRender(texture_)); |   704   EXPECT_FALSE(manager_->CanRender(texture_ref_)); | 
|   696   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); |   705   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); | 
|   697   manager_->SetLevelInfo(texture_, |   706   manager_->SetLevelInfo(texture_ref_, | 
|   698       GL_TEXTURE_CUBE_MAP_POSITIVE_Y, |   707       GL_TEXTURE_CUBE_MAP_POSITIVE_Y, | 
|   699       0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   708       0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   700   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); |   709   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); | 
|   701   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); |   710   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   702   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_)); |   711   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture)); | 
|   703   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_)); |   712   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_)); | 
|   704   EXPECT_FALSE(manager_->CanRender(texture_)); |   713   EXPECT_FALSE(manager_->CanRender(texture_ref_)); | 
|   705   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); |   714   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); | 
|   706   manager_->SetLevelInfo(texture_, |   715   manager_->SetLevelInfo(texture_ref_, | 
|   707       GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, |   716       GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, | 
|   708       0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   717       0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   709   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); |   718   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); | 
|   710   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); |   719   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   711   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_)); |   720   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture)); | 
|   712   EXPECT_FALSE(manager_->CanRender(texture_)); |   721   EXPECT_FALSE(manager_->CanRender(texture_ref_)); | 
|   713   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_)); |   722   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_)); | 
|   714   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); |   723   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); | 
|   715   manager_->SetLevelInfo(texture_, |   724   manager_->SetLevelInfo(texture_ref_, | 
|   716       GL_TEXTURE_CUBE_MAP_POSITIVE_Z, |   725       GL_TEXTURE_CUBE_MAP_POSITIVE_Z, | 
|   717       0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   726       0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   718   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); |   727   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); | 
|   719   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); |   728   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   720   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_)); |   729   EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture)); | 
|   721   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_)); |   730   EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_)); | 
|   722   EXPECT_FALSE(manager_->CanRender(texture_)); |   731   EXPECT_FALSE(manager_->CanRender(texture_ref_)); | 
|   723   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); |   732   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); | 
|   724   manager_->SetLevelInfo(texture_, |   733   manager_->SetLevelInfo(texture_ref_, | 
|   725       GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, |   734       GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, | 
|   726       0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   735       0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   727   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); |   736   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); | 
|   728   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); |   737   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   729   EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture_)); |   738   EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture)); | 
|   730   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_)); |   739   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_)); | 
|   731   EXPECT_FALSE(manager_->CanRender(texture_)); |   740   EXPECT_FALSE(manager_->CanRender(texture_ref_)); | 
|   732   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); |   741   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); | 
|   733  |   742  | 
|   734   // Make mips. |   743   // Make mips. | 
|   735   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_)); |   744   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_)); | 
|   736   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); |   745   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 
|   737   EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture_)); |   746   EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture)); | 
|   738   EXPECT_TRUE(manager_->CanRender(texture_)); |   747   EXPECT_TRUE(manager_->CanRender(texture_ref_)); | 
|   739   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); |   748   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); | 
|   740  |   749  | 
|   741   // Change a mip. |   750   // Change a mip. | 
|   742   manager_->SetLevelInfo(texture_, |   751   manager_->SetLevelInfo(texture_ref_, | 
|   743       GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, |   752       GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, | 
|   744       1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   753       1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   745   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); |   754   EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); | 
|   746   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); |   755   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   747   EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture_)); |   756   EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture)); | 
|   748   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_)); |   757   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_)); | 
|   749   // Set a level past the number of mips that would get generated. |   758   // Set a level past the number of mips that would get generated. | 
|   750   manager_->SetLevelInfo(texture_, |   759   manager_->SetLevelInfo(texture_ref_, | 
|   751       GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, |   760       GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, | 
|   752       3, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   761       3, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   753   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_)); |   762   EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_)); | 
|   754   // Make mips. |   763   // Make mips. | 
|   755   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_)); |   764   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_)); | 
|   756   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); |   765   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 
|   757   EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture_)); |   766   EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture)); | 
|   758 } |   767 } | 
|   759  |   768  | 
|   760 TEST_F(TextureTest, GetLevelSize) { |   769 TEST_F(TextureTest, GetLevelSize) { | 
|   761   manager_->SetTarget(texture_, GL_TEXTURE_2D); |   770   manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); | 
|   762   manager_->SetLevelInfo(texture_, |   771   manager_->SetLevelInfo(texture_ref_, | 
|   763       GL_TEXTURE_2D, 1, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   772       GL_TEXTURE_2D, 1, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   764   GLsizei width = -1; |   773   GLsizei width = -1; | 
|   765   GLsizei height = -1; |   774   GLsizei height = -1; | 
|   766   EXPECT_FALSE(texture_->GetLevelSize(GL_TEXTURE_2D, -1, &width, &height)); |   775   Texture* texture = texture_ref_->texture(); | 
|   767   EXPECT_FALSE(texture_->GetLevelSize(GL_TEXTURE_2D, 1000, &width, &height)); |   776   EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, -1, &width, &height)); | 
|   768   EXPECT_FALSE(texture_->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); |   777   EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 1000, &width, &height)); | 
|   769   EXPECT_TRUE(texture_->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height)); |   778   EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); | 
 |   779   EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height)); | 
|   770   EXPECT_EQ(4, width); |   780   EXPECT_EQ(4, width); | 
|   771   EXPECT_EQ(5, height); |   781   EXPECT_EQ(5, height); | 
|   772   manager_->RemoveTexture(kClient1Id); |   782   manager_->RemoveTexture(kClient1Id); | 
|   773   EXPECT_TRUE(texture_->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height)); |   783   EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height)); | 
|   774   EXPECT_EQ(4, width); |   784   EXPECT_EQ(4, width); | 
|   775   EXPECT_EQ(5, height); |   785   EXPECT_EQ(5, height); | 
|   776 } |   786 } | 
|   777  |   787  | 
|   778 TEST_F(TextureTest, GetLevelType) { |   788 TEST_F(TextureTest, GetLevelType) { | 
|   779   manager_->SetTarget(texture_, GL_TEXTURE_2D); |   789   manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); | 
|   780   manager_->SetLevelInfo(texture_, |   790   manager_->SetLevelInfo(texture_ref_, | 
|   781       GL_TEXTURE_2D, 1, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   791       GL_TEXTURE_2D, 1, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   782   GLenum type = -1; |   792   GLenum type = -1; | 
|   783   GLenum format = -1; |   793   GLenum format = -1; | 
|   784   EXPECT_FALSE(texture_->GetLevelType(GL_TEXTURE_2D, -1, &type, &format)); |   794   Texture* texture = texture_ref_->texture(); | 
|   785   EXPECT_FALSE(texture_->GetLevelType(GL_TEXTURE_2D, 1000, &type, &format)); |   795   EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, -1, &type, &format)); | 
|   786   EXPECT_FALSE(texture_->GetLevelType(GL_TEXTURE_2D, 0, &type, &format)); |   796   EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, 1000, &type, &format)); | 
|   787   EXPECT_TRUE(texture_->GetLevelType(GL_TEXTURE_2D, 1, &type, &format)); |   797   EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &format)); | 
 |   798   EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &format)); | 
|   788   EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); |   799   EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); | 
|   789   EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format); |   800   EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format); | 
|   790   manager_->RemoveTexture(kClient1Id); |   801   manager_->RemoveTexture(kClient1Id); | 
|   791   EXPECT_TRUE(texture_->GetLevelType(GL_TEXTURE_2D, 1, &type, &format)); |   802   EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &format)); | 
|   792   EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); |   803   EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); | 
|   793   EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format); |   804   EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format); | 
|   794 } |   805 } | 
|   795  |   806  | 
|   796 TEST_F(TextureTest, ValidForTexture) { |   807 TEST_F(TextureTest, ValidForTexture) { | 
|   797   manager_->SetTarget(texture_, GL_TEXTURE_2D); |   808   manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); | 
|   798   manager_->SetLevelInfo(texture_, |   809   manager_->SetLevelInfo(texture_ref_, | 
|   799       GL_TEXTURE_2D, 1, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |   810       GL_TEXTURE_2D, 1, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|   800   // Check bad face. |   811   // Check bad face. | 
|   801   EXPECT_FALSE(texture_->ValidForTexture( |   812   Texture* texture = texture_ref_->texture(); | 
 |   813   EXPECT_FALSE(texture->ValidForTexture( | 
|   802       GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, |   814       GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, | 
|   803       1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); |   815       1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); | 
|   804   // Check bad level. |   816   // Check bad level. | 
|   805   EXPECT_FALSE(texture_->ValidForTexture( |   817   EXPECT_FALSE(texture->ValidForTexture( | 
|   806       GL_TEXTURE_2D, 0, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); |   818       GL_TEXTURE_2D, 0, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); | 
|   807   // Check bad xoffset. |   819   // Check bad xoffset. | 
|   808   EXPECT_FALSE(texture_->ValidForTexture( |   820   EXPECT_FALSE(texture->ValidForTexture( | 
|   809       GL_TEXTURE_2D, 1, -1, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); |   821       GL_TEXTURE_2D, 1, -1, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); | 
|   810   // Check bad xoffset + width > width. |   822   // Check bad xoffset + width > width. | 
|   811   EXPECT_FALSE(texture_->ValidForTexture( |   823   EXPECT_FALSE(texture->ValidForTexture( | 
|   812       GL_TEXTURE_2D, 1, 1, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); |   824       GL_TEXTURE_2D, 1, 1, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); | 
|   813   // Check bad yoffset. |   825   // Check bad yoffset. | 
|   814   EXPECT_FALSE(texture_->ValidForTexture( |   826   EXPECT_FALSE(texture->ValidForTexture( | 
|   815       GL_TEXTURE_2D, 1, 0, -1, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); |   827       GL_TEXTURE_2D, 1, 0, -1, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); | 
|   816   // Check bad yoffset + height > height. |   828   // Check bad yoffset + height > height. | 
|   817   EXPECT_FALSE(texture_->ValidForTexture( |   829   EXPECT_FALSE(texture->ValidForTexture( | 
|   818       GL_TEXTURE_2D, 1, 0, 1, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); |   830       GL_TEXTURE_2D, 1, 0, 1, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); | 
|   819   // Check bad width. |   831   // Check bad width. | 
|   820   EXPECT_FALSE(texture_->ValidForTexture( |   832   EXPECT_FALSE(texture->ValidForTexture( | 
|   821       GL_TEXTURE_2D, 1, 0, 0, 5, 5, GL_RGBA, GL_UNSIGNED_BYTE)); |   833       GL_TEXTURE_2D, 1, 0, 0, 5, 5, GL_RGBA, GL_UNSIGNED_BYTE)); | 
|   822   // Check bad height. |   834   // Check bad height. | 
|   823   EXPECT_FALSE(texture_->ValidForTexture( |   835   EXPECT_FALSE(texture->ValidForTexture( | 
|   824       GL_TEXTURE_2D, 1, 0, 0, 4, 6, GL_RGBA, GL_UNSIGNED_BYTE)); |   836       GL_TEXTURE_2D, 1, 0, 0, 4, 6, GL_RGBA, GL_UNSIGNED_BYTE)); | 
|   825   // Check bad format. |   837   // Check bad format. | 
|   826   EXPECT_FALSE(texture_->ValidForTexture( |   838   EXPECT_FALSE(texture->ValidForTexture( | 
|   827       GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGB, GL_UNSIGNED_BYTE)); |   839       GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGB, GL_UNSIGNED_BYTE)); | 
|   828   // Check bad type. |   840   // Check bad type. | 
|   829   EXPECT_FALSE(texture_->ValidForTexture( |   841   EXPECT_FALSE(texture->ValidForTexture( | 
|   830       GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4)); |   842       GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4)); | 
|   831   // Check valid full size |   843   // Check valid full size | 
|   832   EXPECT_TRUE(texture_->ValidForTexture( |   844   EXPECT_TRUE(texture->ValidForTexture( | 
|   833       GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); |   845       GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); | 
|   834   // Check valid particial size. |   846   // Check valid particial size. | 
|   835   EXPECT_TRUE(texture_->ValidForTexture( |   847   EXPECT_TRUE(texture->ValidForTexture( | 
|   836       GL_TEXTURE_2D, 1, 1, 1, 2, 3, GL_RGBA, GL_UNSIGNED_BYTE)); |   848       GL_TEXTURE_2D, 1, 1, 1, 2, 3, GL_RGBA, GL_UNSIGNED_BYTE)); | 
|   837   manager_->RemoveTexture(kClient1Id); |   849   manager_->RemoveTexture(kClient1Id); | 
|   838   EXPECT_TRUE(texture_->ValidForTexture( |   850   EXPECT_TRUE(texture->ValidForTexture( | 
|   839       GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); |   851       GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); | 
|   840 } |   852 } | 
|   841  |   853  | 
|   842 TEST_F(TextureTest, FloatNotLinear) { |   854 TEST_F(TextureTest, FloatNotLinear) { | 
|   843   TestHelper::SetupFeatureInfoInitExpectations( |   855   TestHelper::SetupFeatureInfoInitExpectations( | 
|   844       gl_.get(), "GL_OES_texture_float"); |   856       gl_.get(), "GL_OES_texture_float"); | 
|   845   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); |   857   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); | 
|   846   feature_info->Initialize(NULL); |   858   feature_info->Initialize(NULL); | 
|   847   TextureManager manager( |   859   TextureManager manager( | 
|   848       NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); |   860       NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); | 
|   849   manager.CreateTexture(kClient1Id, kService1Id); |   861   manager.CreateTexture(kClient1Id, kService1Id); | 
|   850   Texture* texture = manager.GetTexture(kClient1Id); |   862   TextureRef* texture_ref = manager.GetTexture(kClient1Id); | 
|   851   ASSERT_TRUE(texture != NULL); |   863   ASSERT_TRUE(texture_ref != NULL); | 
|   852   manager.SetTarget(texture, GL_TEXTURE_2D); |   864   manager.SetTarget(texture_ref, GL_TEXTURE_2D); | 
 |   865   Texture* texture = texture_ref->texture(); | 
|   853   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); |   866   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); | 
|   854   manager.SetLevelInfo(texture, |   867   manager.SetLevelInfo(texture_ref, | 
|   855       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true); |   868       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true); | 
|   856   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); |   869   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   857   TestHelper::SetTexParameterWithExpectations( |   870   TestHelper::SetTexParameterWithExpectations( | 
|   858       gl_.get(), error_state_.get(), &manager, |   871       gl_.get(), error_state_.get(), &manager, | 
|   859       texture, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR); |   872       texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR); | 
|   860   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); |   873   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   861   TestHelper::SetTexParameterWithExpectations( |   874   TestHelper::SetTexParameterWithExpectations( | 
|   862       gl_.get(), error_state_.get(), &manager, |   875       gl_.get(), error_state_.get(), &manager, texture_ref, | 
|   863       texture, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR); |   876       GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR); | 
|   864   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); |   877   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 
|   865   manager.Destroy(false); |   878   manager.Destroy(false); | 
|   866 } |   879 } | 
|   867  |   880  | 
|   868 TEST_F(TextureTest, FloatLinear) { |   881 TEST_F(TextureTest, FloatLinear) { | 
|   869   TestHelper::SetupFeatureInfoInitExpectations( |   882   TestHelper::SetupFeatureInfoInitExpectations( | 
|   870       gl_.get(), "GL_OES_texture_float GL_OES_texture_float_linear"); |   883       gl_.get(), "GL_OES_texture_float GL_OES_texture_float_linear"); | 
|   871   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); |   884   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); | 
|   872   feature_info->Initialize(NULL); |   885   feature_info->Initialize(NULL); | 
|   873   TextureManager manager( |   886   TextureManager manager( | 
|   874       NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); |   887       NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); | 
|   875   manager.CreateTexture(kClient1Id, kService1Id); |   888   manager.CreateTexture(kClient1Id, kService1Id); | 
|   876   Texture* texture = manager.GetTexture(kClient1Id); |   889   TextureRef* texture_ref = manager.GetTexture(kClient1Id); | 
|   877   ASSERT_TRUE(texture != NULL); |   890   ASSERT_TRUE(texture_ref != NULL); | 
|   878   manager.SetTarget(texture, GL_TEXTURE_2D); |   891   manager.SetTarget(texture_ref, GL_TEXTURE_2D); | 
 |   892   Texture* texture = texture_ref->texture(); | 
|   879   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); |   893   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); | 
|   880   manager.SetLevelInfo(texture, |   894   manager.SetLevelInfo(texture_ref, | 
|   881       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true); |   895       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true); | 
|   882   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); |   896   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 
|   883   manager.Destroy(false); |   897   manager.Destroy(false); | 
|   884 } |   898 } | 
|   885  |   899  | 
|   886 TEST_F(TextureTest, HalfFloatNotLinear) { |   900 TEST_F(TextureTest, HalfFloatNotLinear) { | 
|   887   TestHelper::SetupFeatureInfoInitExpectations( |   901   TestHelper::SetupFeatureInfoInitExpectations( | 
|   888       gl_.get(), "GL_OES_texture_half_float"); |   902       gl_.get(), "GL_OES_texture_half_float"); | 
|   889   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); |   903   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); | 
|   890   feature_info->Initialize(NULL); |   904   feature_info->Initialize(NULL); | 
|   891   TextureManager manager( |   905   TextureManager manager( | 
|   892       NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); |   906       NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); | 
|   893   manager.CreateTexture(kClient1Id, kService1Id); |   907   manager.CreateTexture(kClient1Id, kService1Id); | 
|   894   Texture* texture = manager.GetTexture(kClient1Id); |   908   TextureRef* texture_ref = manager.GetTexture(kClient1Id); | 
|   895   ASSERT_TRUE(texture != NULL); |   909   ASSERT_TRUE(texture_ref != NULL); | 
|   896   manager.SetTarget(texture, GL_TEXTURE_2D); |   910   manager.SetTarget(texture_ref, GL_TEXTURE_2D); | 
 |   911   Texture* texture = texture_ref->texture(); | 
|   897   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); |   912   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); | 
|   898   manager.SetLevelInfo(texture, |   913   manager.SetLevelInfo(texture_ref, | 
|   899       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true); |   914       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true); | 
|   900   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); |   915   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   901   TestHelper::SetTexParameterWithExpectations( |   916   TestHelper::SetTexParameterWithExpectations( | 
|   902       gl_.get(), error_state_.get(), &manager, |   917       gl_.get(), error_state_.get(), &manager, | 
|   903       texture, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR); |   918       texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR); | 
|   904   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); |   919   EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); | 
|   905   TestHelper::SetTexParameterWithExpectations( |   920   TestHelper::SetTexParameterWithExpectations( | 
|   906       gl_.get(), error_state_.get(), &manager, |   921       gl_.get(), error_state_.get(), &manager, texture_ref, | 
|   907       texture, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR); |   922       GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR); | 
|   908   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); |   923   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 
|   909   manager.Destroy(false); |   924   manager.Destroy(false); | 
|   910 } |   925 } | 
|   911  |   926  | 
|   912 TEST_F(TextureTest, HalfFloatLinear) { |   927 TEST_F(TextureTest, HalfFloatLinear) { | 
|   913   TestHelper::SetupFeatureInfoInitExpectations( |   928   TestHelper::SetupFeatureInfoInitExpectations( | 
|   914       gl_.get(), "GL_OES_texture_half_float GL_OES_texture_half_float_linear"); |   929       gl_.get(), "GL_OES_texture_half_float GL_OES_texture_half_float_linear"); | 
|   915   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); |   930   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); | 
|   916   feature_info->Initialize(NULL); |   931   feature_info->Initialize(NULL); | 
|   917   TextureManager manager( |   932   TextureManager manager( | 
|   918       NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); |   933       NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); | 
|   919   manager.CreateTexture(kClient1Id, kService1Id); |   934   manager.CreateTexture(kClient1Id, kService1Id); | 
|   920   Texture* texture = manager.GetTexture(kClient1Id); |   935   TextureRef* texture_ref = manager.GetTexture(kClient1Id); | 
|   921   ASSERT_TRUE(texture != NULL); |   936   ASSERT_TRUE(texture_ref != NULL); | 
|   922   manager.SetTarget(texture, GL_TEXTURE_2D); |   937   manager.SetTarget(texture_ref, GL_TEXTURE_2D); | 
 |   938   Texture* texture = texture_ref->texture(); | 
|   923   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); |   939   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); | 
|   924   manager.SetLevelInfo(texture, |   940   manager.SetLevelInfo(texture_ref, | 
|   925       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true); |   941       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true); | 
|   926   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); |   942   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 
|   927   manager.Destroy(false); |   943   manager.Destroy(false); | 
|   928 } |   944 } | 
|   929  |   945  | 
|   930 TEST_F(TextureTest, EGLImageExternal) { |   946 TEST_F(TextureTest, EGLImageExternal) { | 
|   931   TestHelper::SetupFeatureInfoInitExpectations( |   947   TestHelper::SetupFeatureInfoInitExpectations( | 
|   932       gl_.get(), "GL_OES_EGL_image_external"); |   948       gl_.get(), "GL_OES_EGL_image_external"); | 
|   933   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); |   949   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); | 
|   934   feature_info->Initialize(NULL); |   950   feature_info->Initialize(NULL); | 
|   935   TextureManager manager( |   951   TextureManager manager( | 
|   936       NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); |   952       NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); | 
|   937   manager.CreateTexture(kClient1Id, kService1Id); |   953   manager.CreateTexture(kClient1Id, kService1Id); | 
|   938   Texture* texture = manager.GetTexture(kClient1Id); |   954   TextureRef* texture_ref = manager.GetTexture(kClient1Id); | 
|   939   ASSERT_TRUE(texture != NULL); |   955   ASSERT_TRUE(texture_ref != NULL); | 
|   940   manager.SetTarget(texture, GL_TEXTURE_EXTERNAL_OES); |   956   manager.SetTarget(texture_ref, GL_TEXTURE_EXTERNAL_OES); | 
 |   957   Texture* texture = texture_ref->texture(); | 
|   941   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target()); |   958   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target()); | 
|   942   EXPECT_FALSE(manager.CanGenerateMipmaps(texture)); |   959   EXPECT_FALSE(manager.CanGenerateMipmaps(texture_ref)); | 
|   943   manager.Destroy(false); |   960   manager.Destroy(false); | 
|   944 } |   961 } | 
|   945  |   962  | 
|   946 TEST_F(TextureTest, DepthTexture) { |   963 TEST_F(TextureTest, DepthTexture) { | 
|   947   TestHelper::SetupFeatureInfoInitExpectations( |   964   TestHelper::SetupFeatureInfoInitExpectations( | 
|   948       gl_.get(), "GL_ANGLE_depth_texture"); |   965       gl_.get(), "GL_ANGLE_depth_texture"); | 
|   949   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); |   966   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); | 
|   950   feature_info->Initialize(NULL); |   967   feature_info->Initialize(NULL); | 
|   951   TextureManager manager( |   968   TextureManager manager( | 
|   952       NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); |   969       NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); | 
|   953   manager.CreateTexture(kClient1Id, kService1Id); |   970   manager.CreateTexture(kClient1Id, kService1Id); | 
|   954   Texture* texture = manager.GetTexture(kClient1Id); |   971   TextureRef* texture_ref = manager.GetTexture(kClient1Id); | 
|   955   ASSERT_TRUE(texture != NULL); |   972   ASSERT_TRUE(texture_ref != NULL); | 
|   956   manager.SetTarget(texture, GL_TEXTURE_2D); |   973   manager.SetTarget(texture_ref, GL_TEXTURE_2D); | 
|   957   manager.SetLevelInfo( |   974   manager.SetLevelInfo( | 
|   958       texture, GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 4, 4, 1, 0, |   975       texture_ref, GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 4, 4, 1, 0, | 
|   959       GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, false); |   976       GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, false); | 
|   960   EXPECT_FALSE(manager.CanGenerateMipmaps(texture)); |   977   EXPECT_FALSE(manager.CanGenerateMipmaps(texture_ref)); | 
|   961   manager.Destroy(false); |   978   manager.Destroy(false); | 
|   962 } |   979 } | 
|   963  |   980  | 
|   964 TEST_F(TextureTest, SafeUnsafe) { |   981 TEST_F(TextureTest, SafeUnsafe) { | 
|   965   static const GLuint kClient2Id = 2; |   982   static const GLuint kClient2Id = 2; | 
|   966   static const GLuint kService2Id = 12; |   983   static const GLuint kService2Id = 12; | 
|   967   static const GLuint kClient3Id = 3; |   984   static const GLuint kClient3Id = 3; | 
|   968   static const GLuint kService3Id = 13; |   985   static const GLuint kService3Id = 13; | 
|   969   EXPECT_FALSE(manager_->HaveUnclearedMips()); |   986   EXPECT_FALSE(manager_->HaveUnclearedMips()); | 
|   970   EXPECT_EQ(0, texture_->num_uncleared_mips()); |   987   Texture* texture = texture_ref_->texture(); | 
|   971   manager_->SetTarget(texture_, GL_TEXTURE_2D); |   988   EXPECT_EQ(0, texture->num_uncleared_mips()); | 
|   972   manager_->SetLevelInfo(texture_, |   989   manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); | 
 |   990   manager_->SetLevelInfo(texture_ref_, | 
|   973       GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); |   991       GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|   974   EXPECT_FALSE(texture_->SafeToRenderFrom()); |   992   EXPECT_FALSE(texture->SafeToRenderFrom()); | 
|   975   EXPECT_TRUE(manager_->HaveUnsafeTextures()); |   993   EXPECT_TRUE(manager_->HaveUnsafeTextures()); | 
|   976   EXPECT_TRUE(manager_->HaveUnclearedMips()); |   994   EXPECT_TRUE(manager_->HaveUnclearedMips()); | 
|   977   EXPECT_EQ(1, texture_->num_uncleared_mips()); |   995   EXPECT_EQ(1, texture->num_uncleared_mips()); | 
|   978   manager_->SetLevelCleared(texture_, GL_TEXTURE_2D, 0, true); |   996   manager_->SetLevelCleared(texture_ref_, GL_TEXTURE_2D, 0, true); | 
|   979   EXPECT_TRUE(texture_->SafeToRenderFrom()); |   997   EXPECT_TRUE(texture->SafeToRenderFrom()); | 
|   980   EXPECT_FALSE(manager_->HaveUnsafeTextures()); |   998   EXPECT_FALSE(manager_->HaveUnsafeTextures()); | 
|   981   EXPECT_FALSE(manager_->HaveUnclearedMips()); |   999   EXPECT_FALSE(manager_->HaveUnclearedMips()); | 
|   982   EXPECT_EQ(0, texture_->num_uncleared_mips()); |  1000   EXPECT_EQ(0, texture->num_uncleared_mips()); | 
|   983   manager_->SetLevelInfo(texture_, |  1001   manager_->SetLevelInfo(texture_ref_, | 
|   984       GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); |  1002       GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|   985   EXPECT_FALSE(texture_->SafeToRenderFrom()); |  1003   EXPECT_FALSE(texture->SafeToRenderFrom()); | 
|   986   EXPECT_TRUE(manager_->HaveUnsafeTextures()); |  1004   EXPECT_TRUE(manager_->HaveUnsafeTextures()); | 
|   987   EXPECT_TRUE(manager_->HaveUnclearedMips()); |  1005   EXPECT_TRUE(manager_->HaveUnclearedMips()); | 
|   988   EXPECT_EQ(1, texture_->num_uncleared_mips()); |  1006   EXPECT_EQ(1, texture->num_uncleared_mips()); | 
|   989   manager_->SetLevelCleared(texture_, GL_TEXTURE_2D, 1, true); |  1007   manager_->SetLevelCleared(texture_ref_, GL_TEXTURE_2D, 1, true); | 
|   990   EXPECT_TRUE(texture_->SafeToRenderFrom()); |  1008   EXPECT_TRUE(texture->SafeToRenderFrom()); | 
|   991   EXPECT_FALSE(manager_->HaveUnsafeTextures()); |  1009   EXPECT_FALSE(manager_->HaveUnsafeTextures()); | 
|   992   EXPECT_FALSE(manager_->HaveUnclearedMips()); |  1010   EXPECT_FALSE(manager_->HaveUnclearedMips()); | 
|   993   EXPECT_EQ(0, texture_->num_uncleared_mips()); |  1011   EXPECT_EQ(0, texture->num_uncleared_mips()); | 
|   994   manager_->SetLevelInfo(texture_, |  1012   manager_->SetLevelInfo(texture_ref_, | 
|   995       GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); |  1013       GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|   996   manager_->SetLevelInfo(texture_, |  1014   manager_->SetLevelInfo(texture_ref_, | 
|   997       GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); |  1015       GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|   998   EXPECT_FALSE(texture_->SafeToRenderFrom()); |  1016   EXPECT_FALSE(texture->SafeToRenderFrom()); | 
|   999   EXPECT_TRUE(manager_->HaveUnsafeTextures()); |  1017   EXPECT_TRUE(manager_->HaveUnsafeTextures()); | 
|  1000   EXPECT_TRUE(manager_->HaveUnclearedMips()); |  1018   EXPECT_TRUE(manager_->HaveUnclearedMips()); | 
|  1001   EXPECT_EQ(2, texture_->num_uncleared_mips()); |  1019   EXPECT_EQ(2, texture->num_uncleared_mips()); | 
|  1002   manager_->SetLevelCleared(texture_, GL_TEXTURE_2D, 0, true); |  1020   manager_->SetLevelCleared(texture_ref_, GL_TEXTURE_2D, 0, true); | 
|  1003   EXPECT_FALSE(texture_->SafeToRenderFrom()); |  1021   EXPECT_FALSE(texture->SafeToRenderFrom()); | 
|  1004   EXPECT_TRUE(manager_->HaveUnsafeTextures()); |  1022   EXPECT_TRUE(manager_->HaveUnsafeTextures()); | 
|  1005   EXPECT_TRUE(manager_->HaveUnclearedMips()); |  1023   EXPECT_TRUE(manager_->HaveUnclearedMips()); | 
|  1006   EXPECT_EQ(1, texture_->num_uncleared_mips()); |  1024   EXPECT_EQ(1, texture->num_uncleared_mips()); | 
|  1007   manager_->SetLevelCleared(texture_, GL_TEXTURE_2D, 1, true); |  1025   manager_->SetLevelCleared(texture_ref_, GL_TEXTURE_2D, 1, true); | 
|  1008   EXPECT_TRUE(texture_->SafeToRenderFrom()); |  1026   EXPECT_TRUE(texture->SafeToRenderFrom()); | 
|  1009   EXPECT_FALSE(manager_->HaveUnsafeTextures()); |  1027   EXPECT_FALSE(manager_->HaveUnsafeTextures()); | 
|  1010   EXPECT_FALSE(manager_->HaveUnclearedMips()); |  1028   EXPECT_FALSE(manager_->HaveUnclearedMips()); | 
|  1011   EXPECT_EQ(0, texture_->num_uncleared_mips()); |  1029   EXPECT_EQ(0, texture->num_uncleared_mips()); | 
|  1012   manager_->SetLevelInfo(texture_, |  1030   manager_->SetLevelInfo(texture_ref_, | 
|  1013       GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); |  1031       GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|  1014   EXPECT_FALSE(texture_->SafeToRenderFrom()); |  1032   EXPECT_FALSE(texture->SafeToRenderFrom()); | 
|  1015   EXPECT_TRUE(manager_->HaveUnsafeTextures()); |  1033   EXPECT_TRUE(manager_->HaveUnsafeTextures()); | 
|  1016   EXPECT_TRUE(manager_->HaveUnclearedMips()); |  1034   EXPECT_TRUE(manager_->HaveUnclearedMips()); | 
|  1017   EXPECT_EQ(1, texture_->num_uncleared_mips()); |  1035   EXPECT_EQ(1, texture->num_uncleared_mips()); | 
|  1018   manager_->MarkMipmapsGenerated(texture_); |  1036   manager_->MarkMipmapsGenerated(texture_ref_); | 
|  1019   EXPECT_TRUE(texture_->SafeToRenderFrom()); |  1037   EXPECT_TRUE(texture->SafeToRenderFrom()); | 
|  1020   EXPECT_FALSE(manager_->HaveUnsafeTextures()); |  1038   EXPECT_FALSE(manager_->HaveUnsafeTextures()); | 
|  1021   EXPECT_FALSE(manager_->HaveUnclearedMips()); |  1039   EXPECT_FALSE(manager_->HaveUnclearedMips()); | 
|  1022   EXPECT_EQ(0, texture_->num_uncleared_mips()); |  1040   EXPECT_EQ(0, texture->num_uncleared_mips()); | 
|  1023  |  1041  | 
|  1024   manager_->CreateTexture(kClient2Id, kService2Id); |  1042   manager_->CreateTexture(kClient2Id, kService2Id); | 
|  1025   scoped_refptr<Texture> texture2( |  1043   scoped_refptr<TextureRef> texture_ref2( | 
|  1026       manager_->GetTexture(kClient2Id)); |  1044       manager_->GetTexture(kClient2Id)); | 
|  1027   ASSERT_TRUE(texture2.get() != NULL); |  1045   ASSERT_TRUE(texture_ref2.get() != NULL); | 
|  1028   manager_->SetTarget(texture2, GL_TEXTURE_2D); |  1046   manager_->SetTarget(texture_ref2, GL_TEXTURE_2D); | 
|  1029   EXPECT_FALSE(manager_->HaveUnsafeTextures()); |  1047   EXPECT_FALSE(manager_->HaveUnsafeTextures()); | 
|  1030   EXPECT_FALSE(manager_->HaveUnclearedMips()); |  1048   EXPECT_FALSE(manager_->HaveUnclearedMips()); | 
 |  1049   Texture* texture2 = texture_ref2->texture(); | 
|  1031   EXPECT_EQ(0, texture2->num_uncleared_mips()); |  1050   EXPECT_EQ(0, texture2->num_uncleared_mips()); | 
|  1032   manager_->SetLevelInfo(texture2, |  1051   manager_->SetLevelInfo(texture_ref2, | 
|  1033       GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |  1052       GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|  1034   EXPECT_FALSE(manager_->HaveUnsafeTextures()); |  1053   EXPECT_FALSE(manager_->HaveUnsafeTextures()); | 
|  1035   EXPECT_FALSE(manager_->HaveUnclearedMips()); |  1054   EXPECT_FALSE(manager_->HaveUnclearedMips()); | 
|  1036   EXPECT_EQ(0, texture2->num_uncleared_mips()); |  1055   EXPECT_EQ(0, texture2->num_uncleared_mips()); | 
|  1037   manager_->SetLevelInfo(texture2, |  1056   manager_->SetLevelInfo(texture_ref2, | 
|  1038       GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); |  1057       GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|  1039   EXPECT_TRUE(manager_->HaveUnsafeTextures()); |  1058   EXPECT_TRUE(manager_->HaveUnsafeTextures()); | 
|  1040   EXPECT_TRUE(manager_->HaveUnclearedMips()); |  1059   EXPECT_TRUE(manager_->HaveUnclearedMips()); | 
|  1041   EXPECT_EQ(1, texture2->num_uncleared_mips()); |  1060   EXPECT_EQ(1, texture2->num_uncleared_mips()); | 
|  1042  |  1061  | 
|  1043   manager_->CreateTexture(kClient3Id, kService3Id); |  1062   manager_->CreateTexture(kClient3Id, kService3Id); | 
|  1044   scoped_refptr<Texture> texture3( |  1063   scoped_refptr<TextureRef> texture_ref3( | 
|  1045       manager_->GetTexture(kClient3Id)); |  1064       manager_->GetTexture(kClient3Id)); | 
|  1046   ASSERT_TRUE(texture3.get() != NULL); |  1065   ASSERT_TRUE(texture_ref3.get() != NULL); | 
|  1047   manager_->SetTarget(texture3, GL_TEXTURE_2D); |  1066   manager_->SetTarget(texture_ref3, GL_TEXTURE_2D); | 
|  1048   manager_->SetLevelInfo(texture3, |  1067   manager_->SetLevelInfo(texture_ref3, | 
|  1049       GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); |  1068       GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|  1050   EXPECT_TRUE(manager_->HaveUnsafeTextures()); |  1069   EXPECT_TRUE(manager_->HaveUnsafeTextures()); | 
|  1051   EXPECT_TRUE(manager_->HaveUnclearedMips()); |  1070   EXPECT_TRUE(manager_->HaveUnclearedMips()); | 
 |  1071   Texture* texture3 = texture_ref3->texture(); | 
|  1052   EXPECT_EQ(1, texture3->num_uncleared_mips()); |  1072   EXPECT_EQ(1, texture3->num_uncleared_mips()); | 
|  1053   manager_->SetLevelCleared(texture2, GL_TEXTURE_2D, 0, true); |  1073   manager_->SetLevelCleared(texture_ref2, GL_TEXTURE_2D, 0, true); | 
|  1054   EXPECT_TRUE(manager_->HaveUnsafeTextures()); |  1074   EXPECT_TRUE(manager_->HaveUnsafeTextures()); | 
|  1055   EXPECT_TRUE(manager_->HaveUnclearedMips()); |  1075   EXPECT_TRUE(manager_->HaveUnclearedMips()); | 
|  1056   EXPECT_EQ(0, texture2->num_uncleared_mips()); |  1076   EXPECT_EQ(0, texture2->num_uncleared_mips()); | 
|  1057   manager_->SetLevelCleared(texture3, GL_TEXTURE_2D, 0, true); |  1077   manager_->SetLevelCleared(texture_ref3, GL_TEXTURE_2D, 0, true); | 
|  1058   EXPECT_FALSE(manager_->HaveUnsafeTextures()); |  1078   EXPECT_FALSE(manager_->HaveUnsafeTextures()); | 
|  1059   EXPECT_FALSE(manager_->HaveUnclearedMips()); |  1079   EXPECT_FALSE(manager_->HaveUnclearedMips()); | 
|  1060   EXPECT_EQ(0, texture3->num_uncleared_mips()); |  1080   EXPECT_EQ(0, texture3->num_uncleared_mips()); | 
|  1061  |  1081  | 
|  1062   manager_->SetLevelInfo(texture2, |  1082   manager_->SetLevelInfo(texture_ref2, | 
|  1063       GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); |  1083       GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|  1064   manager_->SetLevelInfo(texture3, |  1084   manager_->SetLevelInfo(texture_ref3, | 
|  1065       GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); |  1085       GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|  1066   EXPECT_TRUE(manager_->HaveUnsafeTextures()); |  1086   EXPECT_TRUE(manager_->HaveUnsafeTextures()); | 
|  1067   EXPECT_TRUE(manager_->HaveUnclearedMips()); |  1087   EXPECT_TRUE(manager_->HaveUnclearedMips()); | 
|  1068   EXPECT_EQ(1, texture2->num_uncleared_mips()); |  1088   EXPECT_EQ(1, texture2->num_uncleared_mips()); | 
|  1069   EXPECT_EQ(1, texture3->num_uncleared_mips()); |  1089   EXPECT_EQ(1, texture3->num_uncleared_mips()); | 
|  1070   manager_->RemoveTexture(kClient3Id); |  1090   manager_->RemoveTexture(kClient3Id); | 
|  1071   EXPECT_TRUE(manager_->HaveUnsafeTextures()); |  1091   EXPECT_TRUE(manager_->HaveUnsafeTextures()); | 
|  1072   EXPECT_TRUE(manager_->HaveUnclearedMips()); |  1092   EXPECT_TRUE(manager_->HaveUnclearedMips()); | 
|  1073   manager_->RemoveTexture(kClient2Id); |  1093   manager_->RemoveTexture(kClient2Id); | 
|  1074   EXPECT_TRUE(manager_->HaveUnsafeTextures()); |  1094   EXPECT_TRUE(manager_->HaveUnsafeTextures()); | 
|  1075   EXPECT_TRUE(manager_->HaveUnclearedMips()); |  1095   EXPECT_TRUE(manager_->HaveUnclearedMips()); | 
|  1076   EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService2Id))) |  1096   EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService2Id))) | 
|  1077       .Times(1) |  1097       .Times(1) | 
|  1078       .RetiresOnSaturation(); |  1098       .RetiresOnSaturation(); | 
|  1079   texture2 = NULL; |  1099   texture_ref2 = NULL; | 
|  1080   EXPECT_TRUE(manager_->HaveUnsafeTextures()); |  1100   EXPECT_TRUE(manager_->HaveUnsafeTextures()); | 
|  1081   EXPECT_TRUE(manager_->HaveUnclearedMips()); |  1101   EXPECT_TRUE(manager_->HaveUnclearedMips()); | 
|  1082   EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService3Id))) |  1102   EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService3Id))) | 
|  1083       .Times(1) |  1103       .Times(1) | 
|  1084       .RetiresOnSaturation(); |  1104       .RetiresOnSaturation(); | 
|  1085   texture3 = NULL; |  1105   texture_ref3 = NULL; | 
|  1086   EXPECT_FALSE(manager_->HaveUnsafeTextures()); |  1106   EXPECT_FALSE(manager_->HaveUnsafeTextures()); | 
|  1087   EXPECT_FALSE(manager_->HaveUnclearedMips()); |  1107   EXPECT_FALSE(manager_->HaveUnclearedMips()); | 
|  1088 } |  1108 } | 
|  1089  |  1109  | 
|  1090 TEST_F(TextureTest, ClearTexture) { |  1110 TEST_F(TextureTest, ClearTexture) { | 
|  1091   EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _)) |  1111   EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _)) | 
|  1092       .WillRepeatedly(Return(true)); |  1112       .WillRepeatedly(Return(true)); | 
|  1093   manager_->SetTarget(texture_, GL_TEXTURE_2D); |  1113   manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); | 
|  1094   manager_->SetLevelInfo(texture_, |  1114   manager_->SetLevelInfo(texture_ref_, | 
|  1095       GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); |  1115       GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|  1096   manager_->SetLevelInfo(texture_, |  1116   manager_->SetLevelInfo(texture_ref_, | 
|  1097       GL_TEXTURE_2D, 1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); |  1117       GL_TEXTURE_2D, 1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|  1098   EXPECT_FALSE(texture_->SafeToRenderFrom()); |  1118   Texture* texture = texture_ref_->texture(); | 
 |  1119   EXPECT_FALSE(texture->SafeToRenderFrom()); | 
|  1099   EXPECT_TRUE(manager_->HaveUnsafeTextures()); |  1120   EXPECT_TRUE(manager_->HaveUnsafeTextures()); | 
|  1100   EXPECT_TRUE(manager_->HaveUnclearedMips()); |  1121   EXPECT_TRUE(manager_->HaveUnclearedMips()); | 
|  1101   EXPECT_EQ(2, texture_->num_uncleared_mips()); |  1122   EXPECT_EQ(2, texture->num_uncleared_mips()); | 
|  1102   manager_->ClearRenderableLevels(decoder_.get(), texture_); |  1123   manager_->ClearRenderableLevels(decoder_.get(), texture_ref_); | 
|  1103   EXPECT_TRUE(texture_->SafeToRenderFrom()); |  1124   EXPECT_TRUE(texture->SafeToRenderFrom()); | 
|  1104   EXPECT_FALSE(manager_->HaveUnsafeTextures()); |  1125   EXPECT_FALSE(manager_->HaveUnsafeTextures()); | 
|  1105   EXPECT_FALSE(manager_->HaveUnclearedMips()); |  1126   EXPECT_FALSE(manager_->HaveUnclearedMips()); | 
|  1106   EXPECT_EQ(0, texture_->num_uncleared_mips()); |  1127   EXPECT_EQ(0, texture->num_uncleared_mips()); | 
|  1107   manager_->SetLevelInfo(texture_, |  1128   manager_->SetLevelInfo(texture_ref_, | 
|  1108       GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); |  1129       GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|  1109   manager_->SetLevelInfo(texture_, |  1130   manager_->SetLevelInfo(texture_ref_, | 
|  1110       GL_TEXTURE_2D, 1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); |  1131       GL_TEXTURE_2D, 1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|  1111   EXPECT_FALSE(texture_->SafeToRenderFrom()); |  1132   EXPECT_FALSE(texture->SafeToRenderFrom()); | 
|  1112   EXPECT_TRUE(manager_->HaveUnsafeTextures()); |  1133   EXPECT_TRUE(manager_->HaveUnsafeTextures()); | 
|  1113   EXPECT_TRUE(manager_->HaveUnclearedMips()); |  1134   EXPECT_TRUE(manager_->HaveUnclearedMips()); | 
|  1114   EXPECT_EQ(2, texture_->num_uncleared_mips()); |  1135   EXPECT_EQ(2, texture->num_uncleared_mips()); | 
|  1115   manager_->ClearTextureLevel(decoder_.get(), texture_, GL_TEXTURE_2D, 0); |  1136   manager_->ClearTextureLevel(decoder_.get(), texture_ref_, GL_TEXTURE_2D, 0); | 
|  1116   EXPECT_FALSE(texture_->SafeToRenderFrom()); |  1137   EXPECT_FALSE(texture->SafeToRenderFrom()); | 
|  1117   EXPECT_TRUE(manager_->HaveUnsafeTextures()); |  1138   EXPECT_TRUE(manager_->HaveUnsafeTextures()); | 
|  1118   EXPECT_TRUE(manager_->HaveUnclearedMips()); |  1139   EXPECT_TRUE(manager_->HaveUnclearedMips()); | 
|  1119   EXPECT_EQ(1, texture_->num_uncleared_mips()); |  1140   EXPECT_EQ(1, texture->num_uncleared_mips()); | 
|  1120   manager_->ClearTextureLevel(decoder_.get(), texture_, GL_TEXTURE_2D, 1); |  1141   manager_->ClearTextureLevel(decoder_.get(), texture_ref_, GL_TEXTURE_2D, 1); | 
|  1121   EXPECT_TRUE(texture_->SafeToRenderFrom()); |  1142   EXPECT_TRUE(texture->SafeToRenderFrom()); | 
|  1122   EXPECT_FALSE(manager_->HaveUnsafeTextures()); |  1143   EXPECT_FALSE(manager_->HaveUnsafeTextures()); | 
|  1123   EXPECT_FALSE(manager_->HaveUnclearedMips()); |  1144   EXPECT_FALSE(manager_->HaveUnclearedMips()); | 
|  1124   EXPECT_EQ(0, texture_->num_uncleared_mips()); |  1145   EXPECT_EQ(0, texture->num_uncleared_mips()); | 
|  1125 } |  1146 } | 
|  1126  |  1147  | 
|  1127 TEST_F(TextureTest, UseDeletedTexture) { |  1148 TEST_F(TextureTest, UseDeletedTexture) { | 
|  1128   static const GLuint kClient2Id = 2; |  1149   static const GLuint kClient2Id = 2; | 
|  1129   static const GLuint kService2Id = 12; |  1150   static const GLuint kService2Id = 12; | 
|  1130   // Make the default texture renderable |  1151   // Make the default texture renderable | 
|  1131   manager_->SetTarget(texture_, GL_TEXTURE_2D); |  1152   manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); | 
|  1132   manager_->SetLevelInfo(texture_, |  1153   manager_->SetLevelInfo(texture_ref_, | 
|  1133       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); |  1154       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|  1134   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); |  1155   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); | 
|  1135   // Make a new texture |  1156   // Make a new texture | 
|  1136   manager_->CreateTexture(kClient2Id, kService2Id); |  1157   manager_->CreateTexture(kClient2Id, kService2Id); | 
|  1137   scoped_refptr<Texture> texture( |  1158   scoped_refptr<TextureRef> texture_ref( | 
|  1138       manager_->GetTexture(kClient2Id)); |  1159       manager_->GetTexture(kClient2Id)); | 
|  1139   manager_->SetTarget(texture, GL_TEXTURE_2D); |  1160   manager_->SetTarget(texture_ref, GL_TEXTURE_2D); | 
|  1140   EXPECT_FALSE(manager_->CanRender(texture)); |  1161   EXPECT_FALSE(manager_->CanRender(texture_ref)); | 
|  1141   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); |  1162   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); | 
|  1142   // Remove it. |  1163   // Remove it. | 
|  1143   manager_->RemoveTexture(kClient2Id); |  1164   manager_->RemoveTexture(kClient2Id); | 
|  1144   EXPECT_FALSE(manager_->CanRender(texture)); |  1165   EXPECT_FALSE(manager_->CanRender(texture_ref)); | 
|  1145   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); |  1166   EXPECT_TRUE(manager_->HaveUnrenderableTextures()); | 
|  1146   // Check that we can still manipulate it and it effects the manager. |  1167   // Check that we can still manipulate it and it effects the manager. | 
|  1147   manager_->SetLevelInfo(texture, |  1168   manager_->SetLevelInfo(texture_ref, | 
|  1148       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); |  1169       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|  1149   EXPECT_TRUE(manager_->CanRender(texture)); |  1170   EXPECT_TRUE(manager_->CanRender(texture_ref)); | 
|  1150   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); |  1171   EXPECT_FALSE(manager_->HaveUnrenderableTextures()); | 
|  1151   EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService2Id))) |  1172   EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService2Id))) | 
|  1152       .Times(1) |  1173       .Times(1) | 
|  1153       .RetiresOnSaturation(); |  1174       .RetiresOnSaturation(); | 
|  1154   texture = NULL; |  1175   texture_ref = NULL; | 
|  1155 } |  1176 } | 
|  1156  |  1177  | 
|  1157 TEST_F(TextureTest, GetLevelImage) { |  1178 TEST_F(TextureTest, GetLevelImage) { | 
|  1158   manager_->SetTarget(texture_, GL_TEXTURE_2D); |  1179   manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); | 
|  1159   manager_->SetLevelInfo(texture_, |  1180   manager_->SetLevelInfo(texture_ref_, | 
|  1160       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |  1181       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|  1161   EXPECT_TRUE(texture_->GetLevelImage(GL_TEXTURE_2D, 1) == NULL); |  1182   Texture* texture = texture_ref_->texture(); | 
 |  1183   EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL); | 
|  1162   // Set image. |  1184   // Set image. | 
|  1163   manager_->SetLevelImage(texture_, |  1185   manager_->SetLevelImage(texture_ref_, | 
|  1164       GL_TEXTURE_2D, 1, gfx::GLImage::CreateGLImage(0)); |  1186       GL_TEXTURE_2D, 1, gfx::GLImage::CreateGLImage(0)); | 
|  1165   EXPECT_FALSE(texture_->GetLevelImage(GL_TEXTURE_2D, 1) == NULL); |  1187   EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL); | 
|  1166   // Remove it. |  1188   // Remove it. | 
|  1167   manager_->SetLevelImage(texture_, GL_TEXTURE_2D, 1, NULL); |  1189   manager_->SetLevelImage(texture_ref_, GL_TEXTURE_2D, 1, NULL); | 
|  1168   EXPECT_TRUE(texture_->GetLevelImage(GL_TEXTURE_2D, 1) == NULL); |  1190   EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL); | 
|  1169   manager_->SetLevelImage(texture_, |  1191   manager_->SetLevelImage(texture_ref_, | 
|  1170       GL_TEXTURE_2D, 1, gfx::GLImage::CreateGLImage(0)); |  1192       GL_TEXTURE_2D, 1, gfx::GLImage::CreateGLImage(0)); | 
|  1171   // Image should be reset when SetLevelInfo is called. |  1193   // Image should be reset when SetLevelInfo is called. | 
|  1172   manager_->SetLevelInfo(texture_, |  1194   manager_->SetLevelInfo(texture_ref_, | 
|  1173       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |  1195       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|  1174   EXPECT_TRUE(texture_->GetLevelImage(GL_TEXTURE_2D, 1) == NULL); |  1196   EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL); | 
|  1175 } |  1197 } | 
|  1176  |  1198  | 
|  1177 namespace { |  1199 namespace { | 
|  1178  |  1200  | 
|  1179 bool InSet(std::set<std::string>* string_set, const std::string& str) { |  1201 bool InSet(std::set<std::string>* string_set, const std::string& str) { | 
|  1180   std::pair<std::set<std::string>::iterator, bool> result = |  1202   std::pair<std::set<std::string>::iterator, bool> result = | 
|  1181       string_set->insert(str); |  1203       string_set->insert(str); | 
|  1182   return !result.second; |  1204   return !result.second; | 
|  1183 } |  1205 } | 
|  1184  |  1206  | 
|  1185 }  // anonymous namespace |  1207 }  // anonymous namespace | 
|  1186  |  1208  | 
|  1187 TEST_F(TextureTest, AddToSignature) { |  1209 TEST_F(TextureTest, AddToSignature) { | 
|  1188   manager_->SetTarget(texture_, GL_TEXTURE_2D); |  1210   manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); | 
|  1189   manager_->SetLevelInfo(texture_, |  1211   manager_->SetLevelInfo(texture_ref_, | 
|  1190       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |  1212       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|  1191   std::string signature1; |  1213   std::string signature1; | 
|  1192   std::string signature2; |  1214   std::string signature2; | 
|  1193   manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature1); |  1215   manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature1); | 
|  1194  |  1216  | 
|  1195   std::set<std::string> string_set; |  1217   std::set<std::string> string_set; | 
|  1196   EXPECT_FALSE(InSet(&string_set, signature1)); |  1218   EXPECT_FALSE(InSet(&string_set, signature1)); | 
|  1197  |  1219  | 
|  1198   // check changing 1 thing makes a different signature. |  1220   // check changing 1 thing makes a different signature. | 
|  1199   manager_->SetLevelInfo(texture_, |  1221   manager_->SetLevelInfo(texture_ref_, | 
|  1200       GL_TEXTURE_2D, 1, GL_RGBA, 4, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |  1222       GL_TEXTURE_2D, 1, GL_RGBA, 4, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|  1201   manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); |  1223   manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2); | 
|  1202   EXPECT_FALSE(InSet(&string_set, signature2)); |  1224   EXPECT_FALSE(InSet(&string_set, signature2)); | 
|  1203  |  1225  | 
|  1204   // check putting it back makes the same signature. |  1226   // check putting it back makes the same signature. | 
|  1205   manager_->SetLevelInfo(texture_, |  1227   manager_->SetLevelInfo(texture_ref_, | 
|  1206       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); |  1228       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); | 
|  1207   signature2.clear(); |  1229   signature2.clear(); | 
|  1208   manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); |  1230   manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2); | 
|  1209   EXPECT_EQ(signature1, signature2); |  1231   EXPECT_EQ(signature1, signature2); | 
|  1210  |  1232  | 
|  1211   // Check setting cleared status does not change signature. |  1233   // Check setting cleared status does not change signature. | 
|  1212   manager_->SetLevelInfo(texture_, |  1234   manager_->SetLevelInfo(texture_ref_, | 
|  1213       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); |  1235       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|  1214   signature2.clear(); |  1236   signature2.clear(); | 
|  1215   manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); |  1237   manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2); | 
|  1216   EXPECT_EQ(signature1, signature2); |  1238   EXPECT_EQ(signature1, signature2); | 
|  1217  |  1239  | 
|  1218   // Check changing other settings changes signature. |  1240   // Check changing other settings changes signature. | 
|  1219   manager_->SetLevelInfo(texture_, |  1241   manager_->SetLevelInfo(texture_ref_, | 
|  1220       GL_TEXTURE_2D, 1, GL_RGBA, 2, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); |  1242       GL_TEXTURE_2D, 1, GL_RGBA, 2, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|  1221   signature2.clear(); |  1243   signature2.clear(); | 
|  1222   manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); |  1244   manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2); | 
|  1223   EXPECT_FALSE(InSet(&string_set, signature2)); |  1245   EXPECT_FALSE(InSet(&string_set, signature2)); | 
|  1224  |  1246  | 
|  1225   manager_->SetLevelInfo(texture_, |  1247   manager_->SetLevelInfo(texture_ref_, | 
|  1226       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); |  1248       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|  1227   signature2.clear(); |  1249   signature2.clear(); | 
|  1228   manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); |  1250   manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2); | 
|  1229   EXPECT_FALSE(InSet(&string_set, signature2)); |  1251   EXPECT_FALSE(InSet(&string_set, signature2)); | 
|  1230  |  1252  | 
|  1231   manager_->SetLevelInfo(texture_, |  1253   manager_->SetLevelInfo(texture_ref_, | 
|  1232       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, false); |  1254       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, false); | 
|  1233   signature2.clear(); |  1255   signature2.clear(); | 
|  1234   manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); |  1256   manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2); | 
|  1235   EXPECT_FALSE(InSet(&string_set, signature2)); |  1257   EXPECT_FALSE(InSet(&string_set, signature2)); | 
|  1236  |  1258  | 
|  1237   manager_->SetLevelInfo(texture_, |  1259   manager_->SetLevelInfo(texture_ref_, | 
|  1238       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, false); |  1260       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, false); | 
|  1239   signature2.clear(); |  1261   signature2.clear(); | 
|  1240   manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); |  1262   manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2); | 
|  1241   EXPECT_FALSE(InSet(&string_set, signature2)); |  1263   EXPECT_FALSE(InSet(&string_set, signature2)); | 
|  1242  |  1264  | 
|  1243   manager_->SetLevelInfo(texture_, |  1265   manager_->SetLevelInfo(texture_ref_, | 
|  1244       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_FLOAT, |  1266       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_FLOAT, | 
|  1245       false); |  1267       false); | 
|  1246   signature2.clear(); |  1268   signature2.clear(); | 
|  1247   manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); |  1269   manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2); | 
|  1248   EXPECT_FALSE(InSet(&string_set, signature2)); |  1270   EXPECT_FALSE(InSet(&string_set, signature2)); | 
|  1249  |  1271  | 
|  1250   // put it back |  1272   // put it back | 
|  1251   manager_->SetLevelInfo(texture_, |  1273   manager_->SetLevelInfo(texture_ref_, | 
|  1252       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, |  1274       GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, | 
|  1253       false); |  1275       false); | 
|  1254   signature2.clear(); |  1276   signature2.clear(); | 
|  1255   manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); |  1277   manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2); | 
|  1256   EXPECT_EQ(signature1, signature2); |  1278   EXPECT_EQ(signature1, signature2); | 
|  1257  |  1279  | 
|  1258   // check changing parameters changes signature. |  1280   // check changing parameters changes signature. | 
|  1259   SetParameter(texture_, GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR); |  1281   SetParameter(texture_ref_, GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR); | 
|  1260   signature2.clear(); |  1282   signature2.clear(); | 
|  1261   manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); |  1283   manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2); | 
|  1262   EXPECT_FALSE(InSet(&string_set, signature2)); |  1284   EXPECT_FALSE(InSet(&string_set, signature2)); | 
|  1263  |  1285  | 
|  1264   SetParameter( |  1286   SetParameter(texture_ref_, GL_TEXTURE_MIN_FILTER, | 
|  1265       texture_, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR, GL_NO_ERROR); |  1287                GL_NEAREST_MIPMAP_LINEAR, GL_NO_ERROR); | 
|  1266   SetParameter(texture_, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR); |  1288   SetParameter(texture_ref_, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR); | 
|  1267   signature2.clear(); |  1289   signature2.clear(); | 
|  1268   manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); |  1290   manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2); | 
|  1269   EXPECT_FALSE(InSet(&string_set, signature2)); |  1291   EXPECT_FALSE(InSet(&string_set, signature2)); | 
|  1270  |  1292  | 
|  1271   SetParameter(texture_, GL_TEXTURE_MAG_FILTER, GL_LINEAR, GL_NO_ERROR); |  1293   SetParameter(texture_ref_, GL_TEXTURE_MAG_FILTER, GL_LINEAR, GL_NO_ERROR); | 
|  1272   SetParameter(texture_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR); |  1294   SetParameter(texture_ref_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR); | 
|  1273   signature2.clear(); |  1295   signature2.clear(); | 
|  1274   manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); |  1296   manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2); | 
|  1275   EXPECT_FALSE(InSet(&string_set, signature2)); |  1297   EXPECT_FALSE(InSet(&string_set, signature2)); | 
|  1276  |  1298  | 
|  1277   SetParameter(texture_, GL_TEXTURE_WRAP_S, GL_REPEAT, GL_NO_ERROR); |  1299   SetParameter(texture_ref_, GL_TEXTURE_WRAP_S, GL_REPEAT, GL_NO_ERROR); | 
|  1278   SetParameter(texture_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR); |  1300   SetParameter(texture_ref_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR); | 
|  1279   signature2.clear(); |  1301   signature2.clear(); | 
|  1280   manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); |  1302   manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2); | 
|  1281   EXPECT_FALSE(InSet(&string_set, signature2)); |  1303   EXPECT_FALSE(InSet(&string_set, signature2)); | 
|  1282  |  1304  | 
|  1283   // Check putting it back genenerates the same signature |  1305   // Check putting it back genenerates the same signature | 
|  1284   SetParameter(texture_, GL_TEXTURE_WRAP_T, GL_REPEAT, GL_NO_ERROR); |  1306   SetParameter(texture_ref_, GL_TEXTURE_WRAP_T, GL_REPEAT, GL_NO_ERROR); | 
|  1285   signature2.clear(); |  1307   signature2.clear(); | 
|  1286   manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); |  1308   manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2); | 
|  1287   EXPECT_EQ(signature1, signature2); |  1309   EXPECT_EQ(signature1, signature2); | 
|  1288  |  1310  | 
|  1289   // Check the set was acutally getting different signatures. |  1311   // Check the set was acutally getting different signatures. | 
|  1290   EXPECT_EQ(11u, string_set.size()); |  1312   EXPECT_EQ(11u, string_set.size()); | 
|  1291 } |  1313 } | 
|  1292  |  1314  | 
|  1293 class SaveRestoreTextureTest : public TextureTest { |  1315 class SaveRestoreTextureTest : public TextureTest { | 
|  1294  public: |  1316  public: | 
|  1295   virtual void SetUp() { |  1317   virtual void SetUp() { | 
|  1296     TextureTest::SetUpBase(NULL, "GL_OES_EGL_image_external"); |  1318     TextureTest::SetUpBase(NULL, "GL_OES_EGL_image_external"); | 
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1357     GLenum target; |  1379     GLenum target; | 
|  1358     GLenum format; |  1380     GLenum format; | 
|  1359     GLsizei width; |  1381     GLsizei width; | 
|  1360     GLsizei height; |  1382     GLsizei height; | 
|  1361     GLsizei depth; |  1383     GLsizei depth; | 
|  1362     GLint border; |  1384     GLint border; | 
|  1363     GLenum type; |  1385     GLenum type; | 
|  1364     bool cleared; |  1386     bool cleared; | 
|  1365   }; |  1387   }; | 
|  1366  |  1388  | 
|  1367   void SetLevelInfo(Texture* texture, GLint level, const LevelInfo& info) { |  1389   void SetLevelInfo(TextureRef* texture_ref, | 
|  1368     manager_->SetLevelInfo(texture, |  1390                     GLint level, | 
 |  1391                     const LevelInfo& info) { | 
 |  1392     manager_->SetLevelInfo(texture_ref, | 
|  1369                            info.target, |  1393                            info.target, | 
|  1370                            level, |  1394                            level, | 
|  1371                            info.format, |  1395                            info.format, | 
|  1372                            info.width, |  1396                            info.width, | 
|  1373                            info.height, |  1397                            info.height, | 
|  1374                            info.depth, |  1398                            info.depth, | 
|  1375                            info.border, |  1399                            info.border, | 
|  1376                            info.format, |  1400                            info.format, | 
|  1377                            info.type, |  1401                            info.type, | 
|  1378                            info.cleared); |  1402                            info.cleared); | 
|  1379   } |  1403   } | 
|  1380  |  1404  | 
|  1381   static LevelInfo GetLevelInfo(const Texture* texture, |  1405   static LevelInfo GetLevelInfo(const TextureRef* texture_ref, | 
|  1382                                 GLint target, |  1406                                 GLint target, | 
|  1383                                 GLint level) { |  1407                                 GLint level) { | 
 |  1408     const Texture* texture = texture_ref->texture(); | 
|  1384     LevelInfo info; |  1409     LevelInfo info; | 
|  1385     info.target = target; |  1410     info.target = target; | 
|  1386     EXPECT_TRUE(texture->GetLevelSize(target, level, &info.width, |  1411     EXPECT_TRUE(texture->GetLevelSize(target, level, &info.width, | 
|  1387                                       &info.height)); |  1412                                       &info.height)); | 
|  1388     EXPECT_TRUE(texture->GetLevelType(target, level, &info.type, |  1413     EXPECT_TRUE(texture->GetLevelType(target, level, &info.type, | 
|  1389                                       &info.format)); |  1414                                       &info.format)); | 
|  1390     info.cleared = texture->IsLevelCleared(target, level); |  1415     info.cleared = texture->IsLevelCleared(target, level); | 
|  1391     return info; |  1416     return info; | 
|  1392   } |  1417   } | 
|  1393  |  1418  | 
|  1394   TextureDefinition* Save(Texture* texture) { |  1419   TextureDefinition* Save(TextureRef* texture_ref) { | 
|  1395     EXPECT_CALL(*gl_, GenTextures(_, _)) |  1420     EXPECT_CALL(*gl_, GenTextures(_, _)) | 
|  1396         .WillOnce(SetArgumentPointee<1>(kEmptyTextureServiceId)); |  1421         .WillOnce(SetArgumentPointee<1>(kEmptyTextureServiceId)); | 
|  1397     TextureDefinition* definition = manager_->Save(texture); |  1422     TextureDefinition* definition = manager_->Save(texture_ref); | 
|  1398     EXPECT_TRUE(definition != NULL); |  1423     EXPECT_TRUE(definition != NULL); | 
|  1399     return definition; |  1424     return definition; | 
|  1400   } |  1425   } | 
|  1401  |  1426  | 
|  1402   void Restore(Texture* texture, TextureDefinition* definition) { |  1427   void Restore(TextureRef* texture_ref, TextureDefinition* definition) { | 
|  1403     EXPECT_CALL(*gl_, DeleteTextures(1, Pointee(texture->service_id()))) |  1428     EXPECT_CALL(*gl_, DeleteTextures(1, Pointee(texture_ref->service_id()))) | 
|  1404         .Times(1).RetiresOnSaturation(); |  1429         .Times(1).RetiresOnSaturation(); | 
|  1405     EXPECT_CALL(*gl_, |  1430     EXPECT_CALL(*gl_, | 
|  1406                 BindTexture(definition->target(), definition->service_id())) |  1431                 BindTexture(definition->target(), definition->service_id())) | 
|  1407         .Times(1).RetiresOnSaturation(); |  1432         .Times(1).RetiresOnSaturation(); | 
|  1408     EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(AtLeast(1)); |  1433     EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(AtLeast(1)); | 
|  1409  |  1434  | 
|  1410     EXPECT_TRUE( |  1435     EXPECT_TRUE(manager_->Restore("TextureTest", decoder_.get(), | 
|  1411         manager_->Restore("TextureTest", decoder_.get(), texture, definition)); |  1436                                   texture_ref, definition)); | 
|  1412   } |  1437   } | 
|  1413  |  1438  | 
|  1414   scoped_refptr<Texture> texture2_; |  1439   scoped_refptr<TextureRef> texture2_; | 
|  1415  |  1440  | 
|  1416  private: |  1441  private: | 
|  1417   static const GLuint kEmptyTextureServiceId; |  1442   static const GLuint kEmptyTextureServiceId; | 
|  1418   static const GLuint kClient2Id; |  1443   static const GLuint kClient2Id; | 
|  1419   static const GLuint kService2Id; |  1444   static const GLuint kService2Id; | 
|  1420 }; |  1445 }; | 
|  1421  |  1446  | 
|  1422 const GLuint SaveRestoreTextureTest::kClient2Id = 2; |  1447 const GLuint SaveRestoreTextureTest::kClient2Id = 2; | 
|  1423 const GLuint SaveRestoreTextureTest::kService2Id = 12; |  1448 const GLuint SaveRestoreTextureTest::kService2Id = 12; | 
|  1424 const GLuint SaveRestoreTextureTest::kEmptyTextureServiceId = 13; |  1449 const GLuint SaveRestoreTextureTest::kEmptyTextureServiceId = 13; | 
|  1425  |  1450  | 
|  1426 TEST_F(SaveRestoreTextureTest, SaveRestore2D) { |  1451 TEST_F(SaveRestoreTextureTest, SaveRestore2D) { | 
|  1427   manager_->SetTarget(texture_, GL_TEXTURE_2D); |  1452   manager_->SetTarget(texture_ref_, GL_TEXTURE_2D); | 
|  1428   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture_->target()); |  1453   Texture* texture = texture_ref_->texture(); | 
 |  1454   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); | 
|  1429   LevelInfo level0( |  1455   LevelInfo level0( | 
|  1430       GL_TEXTURE_2D, GL_RGBA, 4, 4, 1, 0, GL_UNSIGNED_BYTE, true); |  1456       GL_TEXTURE_2D, GL_RGBA, 4, 4, 1, 0, GL_UNSIGNED_BYTE, true); | 
|  1431   SetLevelInfo(texture_, 0, level0); |  1457   SetLevelInfo(texture_ref_, 0, level0); | 
|  1432   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_)); |  1458   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_)); | 
|  1433   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); |  1459   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 
|  1434   LevelInfo level1 = GetLevelInfo(texture_.get(), GL_TEXTURE_2D, 1); |  1460   LevelInfo level1 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 1); | 
|  1435   LevelInfo level2 = GetLevelInfo(texture_.get(), GL_TEXTURE_2D, 2); |  1461   LevelInfo level2 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 2); | 
|  1436   scoped_ptr<TextureDefinition> definition(Save(texture_)); |  1462   scoped_ptr<TextureDefinition> definition(Save(texture_ref_)); | 
|  1437   const TextureDefinition::LevelInfos& infos = definition->level_infos(); |  1463   const TextureDefinition::LevelInfos& infos = definition->level_infos(); | 
|  1438   EXPECT_EQ(1U, infos.size()); |  1464   EXPECT_EQ(1U, infos.size()); | 
|  1439   EXPECT_EQ(3U, infos[0].size()); |  1465   EXPECT_EQ(3U, infos[0].size()); | 
|  1440  |  1466  | 
|  1441   // Make this texture bigger with more levels, and make sure they get |  1467   // Make this texture bigger with more levels, and make sure they get | 
|  1442   // clobbered correctly during Restore(). |  1468   // clobbered correctly during Restore(). | 
|  1443   manager_->SetTarget(texture2_, GL_TEXTURE_2D); |  1469   manager_->SetTarget(texture2_, GL_TEXTURE_2D); | 
|  1444   SetLevelInfo( |  1470   SetLevelInfo( | 
|  1445       texture2_, |  1471       texture2_, | 
|  1446       0, |  1472       0, | 
|  1447       LevelInfo(GL_TEXTURE_2D, GL_RGBA, 16, 16, 1, 0, GL_UNSIGNED_BYTE, false)); |  1473       LevelInfo(GL_TEXTURE_2D, GL_RGBA, 16, 16, 1, 0, GL_UNSIGNED_BYTE, false)); | 
|  1448   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture2_)); |  1474   EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture2_)); | 
|  1449   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture2_)); |  1475   texture = texture2_->texture(); | 
|  1450   EXPECT_EQ(1024U + 256U + 64U + 16U + 4U, texture2_->estimated_size()); |  1476   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 
 |  1477   EXPECT_EQ(1024U + 256U + 64U + 16U + 4U, texture->estimated_size()); | 
|  1451   Restore(texture2_, definition.release()); |  1478   Restore(texture2_, definition.release()); | 
|  1452   EXPECT_EQ(level0, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 0)); |  1479   EXPECT_EQ(level0, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 0)); | 
|  1453   EXPECT_EQ(level1, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 1)); |  1480   EXPECT_EQ(level1, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 1)); | 
|  1454   EXPECT_EQ(level2, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 2)); |  1481   EXPECT_EQ(level2, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 2)); | 
|  1455   EXPECT_EQ(64U + 16U + 4U, texture2_->estimated_size()); |  1482   EXPECT_EQ(64U + 16U + 4U, texture->estimated_size()); | 
|  1456   GLint w, h; |  1483   GLint w, h; | 
|  1457   EXPECT_TRUE(texture2_->GetLevelSize(GL_TEXTURE_2D, 3, &w, &h)); |  1484   EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 3, &w, &h)); | 
|  1458   EXPECT_EQ(0, w); |  1485   EXPECT_EQ(0, w); | 
|  1459   EXPECT_EQ(0, h); |  1486   EXPECT_EQ(0, h); | 
|  1460 } |  1487 } | 
|  1461  |  1488  | 
|  1462 TEST_F(SaveRestoreTextureTest, SaveRestoreClearRectangle) { |  1489 TEST_F(SaveRestoreTextureTest, SaveRestoreClearRectangle) { | 
|  1463   manager_->SetTarget(texture_, GL_TEXTURE_RECTANGLE_ARB); |  1490   manager_->SetTarget(texture_ref_, GL_TEXTURE_RECTANGLE_ARB); | 
|  1464   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), texture_->target()); |  1491   Texture* texture = texture_ref_->texture(); | 
 |  1492   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), texture->target()); | 
|  1465   LevelInfo level0( |  1493   LevelInfo level0( | 
|  1466       GL_TEXTURE_RECTANGLE_ARB, GL_RGBA, 1, 1, 1, 0, GL_UNSIGNED_BYTE, false); |  1494       GL_TEXTURE_RECTANGLE_ARB, GL_RGBA, 1, 1, 1, 0, GL_UNSIGNED_BYTE, false); | 
|  1467   SetLevelInfo(texture_, 0, level0); |  1495   SetLevelInfo(texture_ref_, 0, level0); | 
|  1468   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); |  1496   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 
|  1469   scoped_ptr<TextureDefinition> definition(Save(texture_)); |  1497   scoped_ptr<TextureDefinition> definition(Save(texture_ref_)); | 
|  1470   const TextureDefinition::LevelInfos& infos = definition->level_infos(); |  1498   const TextureDefinition::LevelInfos& infos = definition->level_infos(); | 
|  1471   EXPECT_EQ(1U, infos.size()); |  1499   EXPECT_EQ(1U, infos.size()); | 
|  1472   EXPECT_EQ(1U, infos[0].size()); |  1500   EXPECT_EQ(1U, infos[0].size()); | 
|  1473   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), infos[0][0].target); |  1501   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), infos[0][0].target); | 
|  1474   manager_->SetTarget(texture2_, GL_TEXTURE_RECTANGLE_ARB); |  1502   manager_->SetTarget(texture2_, GL_TEXTURE_RECTANGLE_ARB); | 
|  1475   Restore(texture2_, definition.release()); |  1503   Restore(texture2_, definition.release()); | 
|  1476  |  1504  | 
|  1477   // See if we can clear the previously uncleared level now. |  1505   // See if we can clear the previously uncleared level now. | 
|  1478   EXPECT_EQ(level0, GetLevelInfo(texture2_.get(), GL_TEXTURE_RECTANGLE_ARB, 0)); |  1506   EXPECT_EQ(level0, GetLevelInfo(texture2_.get(), GL_TEXTURE_RECTANGLE_ARB, 0)); | 
|  1479   EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _)) |  1507   EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _)) | 
|  1480       .WillRepeatedly(Return(true)); |  1508       .WillRepeatedly(Return(true)); | 
|  1481   EXPECT_TRUE(manager_->ClearTextureLevel( |  1509   EXPECT_TRUE(manager_->ClearTextureLevel( | 
|  1482       decoder_.get(), texture2_, GL_TEXTURE_RECTANGLE_ARB, 0)); |  1510       decoder_.get(), texture2_, GL_TEXTURE_RECTANGLE_ARB, 0)); | 
|  1483 } |  1511 } | 
|  1484  |  1512  | 
|  1485 TEST_F(SaveRestoreTextureTest, SaveRestoreStreamTexture) { |  1513 TEST_F(SaveRestoreTextureTest, SaveRestoreStreamTexture) { | 
|  1486   manager_->SetTarget(texture_, GL_TEXTURE_EXTERNAL_OES); |  1514   manager_->SetTarget(texture_ref_, GL_TEXTURE_EXTERNAL_OES); | 
|  1487   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture_->target()); |  1515   Texture* texture = texture_ref_->texture(); | 
|  1488   texture_->SetStreamTexture(true); |  1516   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target()); | 
|  1489   GLuint service_id = texture_->service_id(); |  1517   texture->SetStreamTexture(true); | 
|  1490   scoped_ptr<TextureDefinition> definition(Save(texture_)); |  1518   GLuint service_id = texture->service_id(); | 
|  1491   EXPECT_FALSE(texture_->IsStreamTexture()); |  1519   scoped_ptr<TextureDefinition> definition(Save(texture_ref_)); | 
 |  1520   EXPECT_FALSE(texture->IsStreamTexture()); | 
|  1492   manager_->SetTarget(texture2_, GL_TEXTURE_EXTERNAL_OES); |  1521   manager_->SetTarget(texture2_, GL_TEXTURE_EXTERNAL_OES); | 
|  1493   Restore(texture2_, definition.release()); |  1522   Restore(texture2_, definition.release()); | 
|  1494   EXPECT_TRUE(texture2_->IsStreamTexture()); |  1523   EXPECT_TRUE(texture2_->texture()->IsStreamTexture()); | 
|  1495   EXPECT_TRUE(texture2_->IsImmutable()); |  1524   EXPECT_TRUE(texture2_->texture()->IsImmutable()); | 
|  1496   EXPECT_EQ(service_id, texture2_->service_id()); |  1525   EXPECT_EQ(service_id, texture2_->service_id()); | 
|  1497 } |  1526 } | 
|  1498  |  1527  | 
|  1499 TEST_F(SaveRestoreTextureTest, SaveRestoreCube) { |  1528 TEST_F(SaveRestoreTextureTest, SaveRestoreCube) { | 
|  1500   manager_->SetTarget(texture_, GL_TEXTURE_CUBE_MAP); |  1529   manager_->SetTarget(texture_ref_, GL_TEXTURE_CUBE_MAP); | 
|  1501   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture_->target()); |  1530   Texture* texture = texture_ref_->texture(); | 
 |  1531   EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target()); | 
|  1502   LevelInfo face0(GL_TEXTURE_CUBE_MAP_POSITIVE_X, |  1532   LevelInfo face0(GL_TEXTURE_CUBE_MAP_POSITIVE_X, | 
|  1503                   GL_RGBA, |  1533                   GL_RGBA, | 
|  1504                   1, |  1534                   1, | 
|  1505                   1, |  1535                   1, | 
|  1506                   1, |  1536                   1, | 
|  1507                   0, |  1537                   0, | 
|  1508                   GL_UNSIGNED_BYTE, |  1538                   GL_UNSIGNED_BYTE, | 
|  1509                   true); |  1539                   true); | 
|  1510   LevelInfo face5(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, |  1540   LevelInfo face5(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, | 
|  1511                   GL_RGBA, |  1541                   GL_RGBA, | 
|  1512                   3, |  1542                   3, | 
|  1513                   3, |  1543                   3, | 
|  1514                   1, |  1544                   1, | 
|  1515                   0, |  1545                   0, | 
|  1516                   GL_UNSIGNED_BYTE, |  1546                   GL_UNSIGNED_BYTE, | 
|  1517                   true); |  1547                   true); | 
|  1518   SetLevelInfo(texture_, 0, face0); |  1548   SetLevelInfo(texture_ref_, 0, face0); | 
|  1519   SetLevelInfo(texture_, 0, face5); |  1549   SetLevelInfo(texture_ref_, 0, face5); | 
|  1520   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); |  1550   EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); | 
|  1521   scoped_ptr<TextureDefinition> definition(Save(texture_)); |  1551   scoped_ptr<TextureDefinition> definition(Save(texture_ref_)); | 
|  1522   const TextureDefinition::LevelInfos& infos = definition->level_infos(); |  1552   const TextureDefinition::LevelInfos& infos = definition->level_infos(); | 
|  1523   EXPECT_EQ(6U, infos.size()); |  1553   EXPECT_EQ(6U, infos.size()); | 
|  1524   EXPECT_EQ(1U, infos[0].size()); |  1554   EXPECT_EQ(1U, infos[0].size()); | 
|  1525   manager_->SetTarget(texture2_, GL_TEXTURE_CUBE_MAP); |  1555   manager_->SetTarget(texture2_, GL_TEXTURE_CUBE_MAP); | 
|  1526   Restore(texture2_, definition.release()); |  1556   Restore(texture2_, definition.release()); | 
|  1527   EXPECT_EQ(face0, |  1557   EXPECT_EQ(face0, | 
|  1528             GetLevelInfo(texture2_.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0)); |  1558             GetLevelInfo(texture2_.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0)); | 
|  1529   EXPECT_EQ(face5, |  1559   EXPECT_EQ(face5, | 
|  1530             GetLevelInfo(texture2_.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0)); |  1560             GetLevelInfo(texture2_.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0)); | 
|  1531 } |  1561 } | 
|  1532  |  1562  | 
|  1533 }  // namespace gles2 |  1563 }  // namespace gles2 | 
|  1534 }  // namespace gpu |  1564 }  // namespace gpu | 
|  1535  |  1565  | 
|  1536  |  1566  | 
| OLD | NEW |