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