| 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/framebuffer_manager.h" |
| 11 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" | 11 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" |
| 12 #include "gpu/command_buffer/service/gpu_service_test.h" |
| 12 #include "gpu/command_buffer/service/mailbox_manager.h" | 13 #include "gpu/command_buffer/service/mailbox_manager.h" |
| 13 #include "gpu/command_buffer/service/memory_tracking.h" | 14 #include "gpu/command_buffer/service/memory_tracking.h" |
| 14 #include "gpu/command_buffer/service/mocks.h" | 15 #include "gpu/command_buffer/service/mocks.h" |
| 15 #include "gpu/command_buffer/service/test_helper.h" | 16 #include "gpu/command_buffer/service/test_helper.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
| 17 #include "ui/gl/gl_mock.h" | 18 #include "ui/gl/gl_mock.h" |
| 18 | 19 |
| 19 using ::testing::AtLeast; | 20 using ::testing::AtLeast; |
| 20 using ::testing::Pointee; | 21 using ::testing::Pointee; |
| 21 using ::testing::Return; | 22 using ::testing::Return; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 32 return texture->npot(); | 33 return texture->npot(); |
| 33 } | 34 } |
| 34 static bool IsTextureComplete(const Texture* texture) { | 35 static bool IsTextureComplete(const Texture* texture) { |
| 35 return texture->texture_complete(); | 36 return texture->texture_complete(); |
| 36 } | 37 } |
| 37 static bool IsCubeComplete(const Texture* texture) { | 38 static bool IsCubeComplete(const Texture* texture) { |
| 38 return texture->cube_complete(); | 39 return texture->cube_complete(); |
| 39 } | 40 } |
| 40 }; | 41 }; |
| 41 | 42 |
| 42 class TextureManagerTest : public testing::Test { | 43 class TextureManagerTest : public GpuServiceTest { |
| 43 public: | 44 public: |
| 44 static const GLint kMaxTextureSize = 16; | 45 static const GLint kMaxTextureSize = 16; |
| 45 static const GLint kMaxCubeMapTextureSize = 8; | 46 static const GLint kMaxCubeMapTextureSize = 8; |
| 46 static const GLint kMaxExternalTextureSize = 16; | 47 static const GLint kMaxExternalTextureSize = 16; |
| 47 static const GLint kMax2dLevels = 5; | 48 static const GLint kMax2dLevels = 5; |
| 48 static const GLint kMaxCubeMapLevels = 4; | 49 static const GLint kMaxCubeMapLevels = 4; |
| 49 static const GLint kMaxExternalLevels = 1; | 50 static const GLint kMaxExternalLevels = 1; |
| 50 static const bool kUseDefaultTextures = false; | 51 static const bool kUseDefaultTextures = false; |
| 51 | 52 |
| 52 TextureManagerTest() : feature_info_(new FeatureInfo()) {} | 53 TextureManagerTest() : feature_info_(new FeatureInfo()) {} |
| 53 | 54 |
| 54 virtual ~TextureManagerTest() { | 55 virtual ~TextureManagerTest() { |
| 55 } | 56 } |
| 56 | 57 |
| 57 protected: | 58 protected: |
| 58 virtual void SetUp() { | 59 virtual void SetUp() { |
| 59 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); | 60 GpuServiceTest::SetUp(); |
| 60 ::gfx::MockGLInterface::SetGLInterface(gl_.get()); | |
| 61 | |
| 62 manager_.reset(new TextureManager(NULL, | 61 manager_.reset(new TextureManager(NULL, |
| 63 feature_info_.get(), | 62 feature_info_.get(), |
| 64 kMaxTextureSize, | 63 kMaxTextureSize, |
| 65 kMaxCubeMapTextureSize, | 64 kMaxCubeMapTextureSize, |
| 66 kUseDefaultTextures)); | 65 kUseDefaultTextures)); |
| 67 TestHelper::SetupTextureManagerInitExpectations( | 66 TestHelper::SetupTextureManagerInitExpectations( |
| 68 gl_.get(), "", kUseDefaultTextures); | 67 gl_.get(), "", kUseDefaultTextures); |
| 69 manager_->Initialize(); | 68 manager_->Initialize(); |
| 70 error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>()); | 69 error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>()); |
| 71 } | 70 } |
| 72 | 71 |
| 73 virtual void TearDown() { | 72 virtual void TearDown() { |
| 74 manager_->Destroy(false); | 73 manager_->Destroy(false); |
| 75 manager_.reset(); | 74 manager_.reset(); |
| 76 ::gfx::MockGLInterface::SetGLInterface(NULL); | 75 GpuServiceTest::TearDown(); |
| 77 gl_.reset(); | |
| 78 } | 76 } |
| 79 | 77 |
| 80 void SetParameter( | 78 void SetParameter( |
| 81 TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) { | 79 TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) { |
| 82 TestHelper::SetTexParameteriWithExpectations( | 80 TestHelper::SetTexParameteriWithExpectations( |
| 83 gl_.get(), error_state_.get(), manager_.get(), | 81 gl_.get(), error_state_.get(), manager_.get(), |
| 84 texture_ref, pname, value, error); | 82 texture_ref, pname, value, error); |
| 85 } | 83 } |
| 86 | 84 |
| 87 // Use StrictMock to make 100% sure we know how GL will be called. | |
| 88 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; | |
| 89 scoped_refptr<FeatureInfo> feature_info_; | 85 scoped_refptr<FeatureInfo> feature_info_; |
| 90 scoped_ptr<TextureManager> manager_; | 86 scoped_ptr<TextureManager> manager_; |
| 91 scoped_ptr<MockErrorState> error_state_; | 87 scoped_ptr<MockErrorState> error_state_; |
| 92 }; | 88 }; |
| 93 | 89 |
| 94 // GCC requires these declarations, but MSVC requires they not be present | 90 // GCC requires these declarations, but MSVC requires they not be present |
| 95 #ifndef COMPILER_MSVC | 91 #ifndef COMPILER_MSVC |
| 96 const GLint TextureManagerTest::kMaxTextureSize; | 92 const GLint TextureManagerTest::kMaxTextureSize; |
| 97 const GLint TextureManagerTest::kMaxCubeMapTextureSize; | 93 const GLint TextureManagerTest::kMaxCubeMapTextureSize; |
| 98 const GLint TextureManagerTest::kMaxExternalTextureSize; | 94 const GLint TextureManagerTest::kMaxExternalTextureSize; |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 0, 5, 2, 1)); | 374 EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 0, 5, 2, 1)); |
| 379 // Check NPOT height on level 0 | 375 // Check NPOT height on level 0 |
| 380 EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 0, 2, 5, 1)); | 376 EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 0, 2, 5, 1)); |
| 381 // Check NPOT width on level 1 | 377 // Check NPOT width on level 1 |
| 382 EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 1, 5, 2, 1)); | 378 EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 1, 5, 2, 1)); |
| 383 // Check NPOT height on level 1 | 379 // Check NPOT height on level 1 |
| 384 EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 1, 2, 5, 1)); | 380 EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 1, 2, 5, 1)); |
| 385 manager.Destroy(false); | 381 manager.Destroy(false); |
| 386 } | 382 } |
| 387 | 383 |
| 388 class TextureTestBase : public testing::Test { | 384 class TextureTestBase : public GpuServiceTest { |
| 389 public: | 385 public: |
| 390 static const GLint kMaxTextureSize = 16; | 386 static const GLint kMaxTextureSize = 16; |
| 391 static const GLint kMaxCubeMapTextureSize = 8; | 387 static const GLint kMaxCubeMapTextureSize = 8; |
| 392 static const GLint kMax2dLevels = 5; | 388 static const GLint kMax2dLevels = 5; |
| 393 static const GLint kMaxCubeMapLevels = 4; | 389 static const GLint kMaxCubeMapLevels = 4; |
| 394 static const GLuint kClient1Id = 1; | 390 static const GLuint kClient1Id = 1; |
| 395 static const GLuint kService1Id = 11; | 391 static const GLuint kService1Id = 11; |
| 396 static const bool kUseDefaultTextures = false; | 392 static const bool kUseDefaultTextures = false; |
| 397 | 393 |
| 398 TextureTestBase() | 394 TextureTestBase() |
| 399 : feature_info_(new FeatureInfo()) { | 395 : feature_info_(new FeatureInfo()) { |
| 400 } | 396 } |
| 401 virtual ~TextureTestBase() { | 397 virtual ~TextureTestBase() { |
| 402 texture_ref_ = NULL; | 398 texture_ref_ = NULL; |
| 403 } | 399 } |
| 404 | 400 |
| 405 protected: | 401 protected: |
| 406 void SetUpBase(MemoryTracker* memory_tracker, std::string extensions) { | 402 void SetUpBase(MemoryTracker* memory_tracker, std::string extensions) { |
| 407 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); | 403 GpuServiceTest::SetUp(); |
| 408 ::gfx::MockGLInterface::SetGLInterface(gl_.get()); | |
| 409 | |
| 410 if (!extensions.empty()) { | 404 if (!extensions.empty()) { |
| 411 TestHelper::SetupFeatureInfoInitExpectations(gl_.get(), | 405 TestHelper::SetupFeatureInfoInitExpectations(gl_.get(), |
| 412 extensions.c_str()); | 406 extensions.c_str()); |
| 413 feature_info_->Initialize(); | 407 feature_info_->Initialize(); |
| 414 } | 408 } |
| 415 | 409 |
| 416 manager_.reset(new TextureManager(memory_tracker, | 410 manager_.reset(new TextureManager(memory_tracker, |
| 417 feature_info_.get(), | 411 feature_info_.get(), |
| 418 kMaxTextureSize, | 412 kMaxTextureSize, |
| 419 kMaxCubeMapTextureSize, | 413 kMaxCubeMapTextureSize, |
| (...skipping 13 matching lines...) Expand all Loading... |
| 433 // Check that it gets deleted when the last reference is released. | 427 // Check that it gets deleted when the last reference is released. |
| 434 EXPECT_CALL(*gl_, | 428 EXPECT_CALL(*gl_, |
| 435 DeleteTextures(1, ::testing::Pointee(texture_ref_->service_id()))) | 429 DeleteTextures(1, ::testing::Pointee(texture_ref_->service_id()))) |
| 436 .Times(1) | 430 .Times(1) |
| 437 .RetiresOnSaturation(); | 431 .RetiresOnSaturation(); |
| 438 } | 432 } |
| 439 texture_ref_ = NULL; | 433 texture_ref_ = NULL; |
| 440 } | 434 } |
| 441 manager_->Destroy(false); | 435 manager_->Destroy(false); |
| 442 manager_.reset(); | 436 manager_.reset(); |
| 443 ::gfx::MockGLInterface::SetGLInterface(NULL); | 437 GpuServiceTest::TearDown(); |
| 444 gl_.reset(); | |
| 445 } | 438 } |
| 446 | 439 |
| 447 void SetParameter( | 440 void SetParameter( |
| 448 TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) { | 441 TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) { |
| 449 TestHelper::SetTexParameteriWithExpectations( | 442 TestHelper::SetTexParameteriWithExpectations( |
| 450 gl_.get(), error_state_.get(), manager_.get(), | 443 gl_.get(), error_state_.get(), manager_.get(), |
| 451 texture_ref, pname, value, error); | 444 texture_ref, pname, value, error); |
| 452 } | 445 } |
| 453 | 446 |
| 454 scoped_ptr<MockGLES2Decoder> decoder_; | 447 scoped_ptr<MockGLES2Decoder> decoder_; |
| 455 scoped_ptr<MockErrorState> error_state_; | 448 scoped_ptr<MockErrorState> error_state_; |
| 456 // Use StrictMock to make 100% sure we know how GL will be called. | |
| 457 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; | |
| 458 scoped_refptr<FeatureInfo> feature_info_; | 449 scoped_refptr<FeatureInfo> feature_info_; |
| 459 scoped_ptr<TextureManager> manager_; | 450 scoped_ptr<TextureManager> manager_; |
| 460 scoped_refptr<TextureRef> texture_ref_; | 451 scoped_refptr<TextureRef> texture_ref_; |
| 461 }; | 452 }; |
| 462 | 453 |
| 463 class TextureTest : public TextureTestBase { | 454 class TextureTest : public TextureTestBase { |
| 464 protected: | 455 protected: |
| 465 virtual void SetUp() { | 456 virtual void SetUp() { |
| 466 SetUpBase(NULL, std::string()); | 457 SetUpBase(NULL, std::string()); |
| 467 } | 458 } |
| (...skipping 1726 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2194 return current_size_[pool]; | 2185 return current_size_[pool]; |
| 2195 } | 2186 } |
| 2196 | 2187 |
| 2197 private: | 2188 private: |
| 2198 virtual ~CountingMemoryTracker() {} | 2189 virtual ~CountingMemoryTracker() {} |
| 2199 | 2190 |
| 2200 size_t current_size_[2]; | 2191 size_t current_size_[2]; |
| 2201 DISALLOW_COPY_AND_ASSIGN(CountingMemoryTracker); | 2192 DISALLOW_COPY_AND_ASSIGN(CountingMemoryTracker); |
| 2202 }; | 2193 }; |
| 2203 | 2194 |
| 2204 class SharedTextureTest : public testing::Test { | 2195 class SharedTextureTest : public GpuServiceTest { |
| 2205 public: | 2196 public: |
| 2206 static const bool kUseDefaultTextures = false; | 2197 static const bool kUseDefaultTextures = false; |
| 2207 | 2198 |
| 2208 SharedTextureTest() : feature_info_(new FeatureInfo()) {} | 2199 SharedTextureTest() : feature_info_(new FeatureInfo()) {} |
| 2209 | 2200 |
| 2210 virtual ~SharedTextureTest() { | 2201 virtual ~SharedTextureTest() { |
| 2211 } | 2202 } |
| 2212 | 2203 |
| 2213 virtual void SetUp() { | 2204 virtual void SetUp() { |
| 2214 gl_.reset(new ::gfx::MockGLInterface()); | 2205 GpuServiceTest::SetUp(); |
| 2215 ::gfx::MockGLInterface::SetGLInterface(gl_.get()); | |
| 2216 | |
| 2217 memory_tracker1_ = new CountingMemoryTracker; | 2206 memory_tracker1_ = new CountingMemoryTracker; |
| 2218 texture_manager1_.reset( | 2207 texture_manager1_.reset( |
| 2219 new TextureManager(memory_tracker1_.get(), | 2208 new TextureManager(memory_tracker1_.get(), |
| 2220 feature_info_.get(), | 2209 feature_info_.get(), |
| 2221 TextureManagerTest::kMaxTextureSize, | 2210 TextureManagerTest::kMaxTextureSize, |
| 2222 TextureManagerTest::kMaxCubeMapTextureSize, | 2211 TextureManagerTest::kMaxCubeMapTextureSize, |
| 2223 kUseDefaultTextures)); | 2212 kUseDefaultTextures)); |
| 2224 memory_tracker2_ = new CountingMemoryTracker; | 2213 memory_tracker2_ = new CountingMemoryTracker; |
| 2225 texture_manager2_.reset( | 2214 texture_manager2_.reset( |
| 2226 new TextureManager(memory_tracker2_.get(), | 2215 new TextureManager(memory_tracker2_.get(), |
| 2227 feature_info_.get(), | 2216 feature_info_.get(), |
| 2228 TextureManagerTest::kMaxTextureSize, | 2217 TextureManagerTest::kMaxTextureSize, |
| 2229 TextureManagerTest::kMaxCubeMapTextureSize, | 2218 TextureManagerTest::kMaxCubeMapTextureSize, |
| 2230 kUseDefaultTextures)); | 2219 kUseDefaultTextures)); |
| 2231 TestHelper::SetupTextureManagerInitExpectations( | 2220 TestHelper::SetupTextureManagerInitExpectations( |
| 2232 gl_.get(), "", kUseDefaultTextures); | 2221 gl_.get(), "", kUseDefaultTextures); |
| 2233 texture_manager1_->Initialize(); | 2222 texture_manager1_->Initialize(); |
| 2234 TestHelper::SetupTextureManagerInitExpectations( | 2223 TestHelper::SetupTextureManagerInitExpectations( |
| 2235 gl_.get(), "", kUseDefaultTextures); | 2224 gl_.get(), "", kUseDefaultTextures); |
| 2236 texture_manager2_->Initialize(); | 2225 texture_manager2_->Initialize(); |
| 2237 } | 2226 } |
| 2238 | 2227 |
| 2239 virtual void TearDown() { | 2228 virtual void TearDown() { |
| 2240 texture_manager2_->Destroy(false); | 2229 texture_manager2_->Destroy(false); |
| 2241 texture_manager2_.reset(); | 2230 texture_manager2_.reset(); |
| 2242 texture_manager1_->Destroy(false); | 2231 texture_manager1_->Destroy(false); |
| 2243 texture_manager1_.reset(); | 2232 texture_manager1_.reset(); |
| 2244 ::gfx::MockGLInterface::SetGLInterface(NULL); | 2233 GpuServiceTest::TearDown(); |
| 2245 gl_.reset(); | |
| 2246 } | 2234 } |
| 2247 | 2235 |
| 2248 protected: | 2236 protected: |
| 2249 scoped_ptr< ::gfx::MockGLInterface > gl_; | |
| 2250 scoped_refptr<FeatureInfo> feature_info_; | 2237 scoped_refptr<FeatureInfo> feature_info_; |
| 2251 scoped_refptr<CountingMemoryTracker> memory_tracker1_; | 2238 scoped_refptr<CountingMemoryTracker> memory_tracker1_; |
| 2252 scoped_ptr<TextureManager> texture_manager1_; | 2239 scoped_ptr<TextureManager> texture_manager1_; |
| 2253 scoped_refptr<CountingMemoryTracker> memory_tracker2_; | 2240 scoped_refptr<CountingMemoryTracker> memory_tracker2_; |
| 2254 scoped_ptr<TextureManager> texture_manager2_; | 2241 scoped_ptr<TextureManager> texture_manager2_; |
| 2255 }; | 2242 }; |
| 2256 | 2243 |
| 2257 TEST_F(SharedTextureTest, DeleteTextures) { | 2244 TEST_F(SharedTextureTest, DeleteTextures) { |
| 2258 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10); | 2245 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10); |
| 2259 scoped_refptr<TextureRef> ref2 = | 2246 scoped_refptr<TextureRef> ref2 = |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2519 | 2506 |
| 2520 EXPECT_CALL(*gl_, DeleteTextures(1, _)) | 2507 EXPECT_CALL(*gl_, DeleteTextures(1, _)) |
| 2521 .Times(1) | 2508 .Times(1) |
| 2522 .RetiresOnSaturation(); | 2509 .RetiresOnSaturation(); |
| 2523 texture_manager1_->RemoveTexture(10); | 2510 texture_manager1_->RemoveTexture(10); |
| 2524 texture_manager2_->RemoveTexture(20); | 2511 texture_manager2_->RemoveTexture(20); |
| 2525 } | 2512 } |
| 2526 | 2513 |
| 2527 } // namespace gles2 | 2514 } // namespace gles2 |
| 2528 } // namespace gpu | 2515 } // namespace gpu |
| OLD | NEW |