diff options
author | dsinclair@chromium.org <dsinclair@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-13 00:01:37 +0000 |
---|---|---|
committer | dsinclair@chromium.org <dsinclair@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-13 00:01:37 +0000 |
commit | e3932abb978b39d8b28db6e9b7d15869d817dad2 (patch) | |
tree | e86df2495c23edf37fb72c2e6b306ef0f0458c70 /gpu/command_buffer/service/memory_program_cache_unittest.cc | |
parent | a11b00cf82c61489fe42878204375524fa2f952a (diff) | |
download | chromium_src-e3932abb978b39d8b28db6e9b7d15869d817dad2.zip chromium_src-e3932abb978b39d8b28db6e9b7d15869d817dad2.tar.gz chromium_src-e3932abb978b39d8b28db6e9b7d15869d817dad2.tar.bz2 |
Add per-profile disk caching of complied GPU shaders.
This CL adds a per-profile disk cache for any shaders that are
complied while using the profile. When the profile is first opened
the shaders will be loaded from disk and used to pre-populate the
GPU memory shader cache.
The disk cache takes the load time for From Dust from ~30 seconds
to ~18 seconds on my Linux machine for any loads after the first.
BUG=166763
Review URL: https://chromiumcodereview.appspot.com/12036056
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@187704 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu/command_buffer/service/memory_program_cache_unittest.cc')
-rw-r--r-- | gpu/command_buffer/service/memory_program_cache_unittest.cc | 137 |
1 files changed, 125 insertions, 12 deletions
diff --git a/gpu/command_buffer/service/memory_program_cache_unittest.cc b/gpu/command_buffer/service/memory_program_cache_unittest.cc index 3c64d3f..f20caeb 100644 --- a/gpu/command_buffer/service/memory_program_cache_unittest.cc +++ b/gpu/command_buffer/service/memory_program_cache_unittest.cc @@ -4,6 +4,7 @@ #include "gpu/command_buffer/service/memory_program_cache.h" +#include "base/bind.h" #include "gpu/command_buffer/common/gles2_cmd_format.h" #include "gpu/command_buffer/service/gl_utils.h" #include "gpu/command_buffer/service/shader_manager.h" @@ -75,11 +76,20 @@ class MemoryProgramCacheTest : public testing::Test { MemoryProgramCacheTest() : cache_(new MemoryProgramCache(kCacheSizeBytes)), vertex_shader_(NULL), - fragment_shader_(NULL) { } + fragment_shader_(NULL), + shader_cache_count_(0) { } virtual ~MemoryProgramCacheTest() { shader_manager_.Destroy(false); } + void ShaderCacheCb(const std::string& key, const std::string& shader) { + shader_cache_count_++; + shader_cache_shader_ = shader; + } + + int32 shader_cache_count() { return shader_cache_count_; } + const std::string& shader_cache_shader() { return shader_cache_shader_; } + protected: virtual void SetUp() { gl_.reset(new ::testing::StrictMock<gfx::MockGLInterface>()); @@ -171,6 +181,8 @@ class MemoryProgramCacheTest : public testing::Test { ShaderManager shader_manager_; Shader* vertex_shader_; Shader* fragment_shader_; + int32 shader_cache_count_; + std::string shader_cache_shader_; }; TEST_F(MemoryProgramCacheTest, CacheSave) { @@ -184,12 +196,45 @@ TEST_F(MemoryProgramCacheTest, CacheSave) { ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); - cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL); + cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, + base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, + base::Unretained(this))); EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( *vertex_shader_->deferred_compilation_source(), *fragment_shader_->deferred_compilation_source(), NULL)); + EXPECT_EQ(1, shader_cache_count()); +} + +TEST_F(MemoryProgramCacheTest, LoadProgram) { + const GLenum kFormat = 1; + const int kProgramId = 10; + const int kBinaryLength = 20; + char test_binary[kBinaryLength]; + for (int i = 0; i < kBinaryLength; ++i) { + test_binary[i] = i; + } + ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); + + SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); + cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, + base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, + base::Unretained(this))); + + EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( + *vertex_shader_->deferred_compilation_source(), + *fragment_shader_->deferred_compilation_source(), + NULL)); + EXPECT_EQ(1, shader_cache_count()); + + cache_->Clear(); + + cache_->LoadProgram(shader_cache_shader()); + EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( + *vertex_shader_->deferred_compilation_source(), + *fragment_shader_->deferred_compilation_source(), + NULL)); } TEST_F(MemoryProgramCacheTest, CacheLoadMatchesSave) { @@ -203,7 +248,54 @@ TEST_F(MemoryProgramCacheTest, CacheLoadMatchesSave) { ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); - cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL); + cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, + base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, + base::Unretained(this))); + EXPECT_EQ(1, shader_cache_count()); + + VariableMap vertex_attrib_map = vertex_shader_->attrib_map(); + VariableMap vertex_uniform_map = vertex_shader_->uniform_map(); + VariableMap fragment_attrib_map = fragment_shader_->attrib_map(); + VariableMap fragment_uniform_map = fragment_shader_->uniform_map(); + + vertex_shader_->set_attrib_map(VariableMap()); + vertex_shader_->set_uniform_map(VariableMap()); + fragment_shader_->set_attrib_map(VariableMap()); + fragment_shader_->set_uniform_map(VariableMap()); + + SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); + + EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( + kProgramId, + vertex_shader_, + fragment_shader_, + NULL)); + + // apparently the hash_map implementation on android doesn't have the + // equality operator +#if !defined(OS_ANDROID) + EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); + EXPECT_EQ(vertex_attrib_map, vertex_shader_->uniform_map()); + EXPECT_EQ(vertex_attrib_map, fragment_shader_->attrib_map()); + EXPECT_EQ(vertex_attrib_map, fragment_shader_->uniform_map()); +#endif +} + +TEST_F(MemoryProgramCacheTest, LoadProgramMatchesSave) { + const GLenum kFormat = 1; + const int kProgramId = 10; + const int kBinaryLength = 20; + char test_binary[kBinaryLength]; + for (int i = 0; i < kBinaryLength; ++i) { + test_binary[i] = i; + } + ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); + + SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); + cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, + base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, + base::Unretained(this))); + EXPECT_EQ(1, shader_cache_count()); VariableMap vertex_attrib_map = vertex_shader_->attrib_map(); VariableMap vertex_uniform_map = vertex_shader_->uniform_map(); @@ -217,6 +309,9 @@ TEST_F(MemoryProgramCacheTest, CacheLoadMatchesSave) { SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); + cache_->Clear(); + cache_->LoadProgram(shader_cache_shader()); + EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( kProgramId, vertex_shader_, @@ -244,7 +339,9 @@ TEST_F(MemoryProgramCacheTest, LoadFailOnLinkFalse) { ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); - cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL); + cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, + base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, + base::Unretained(this))); SetExpectationsForLoadLinkedProgramFailure(kProgramId, &emulator); EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( @@ -265,7 +362,9 @@ TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentSource) { ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); - cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL); + cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, + base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, + base::Unretained(this))); const std::string vertex_orig_source = *vertex_shader_->deferred_compilation_source(); @@ -304,7 +403,9 @@ TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentMap) { cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, - &binding_map); + &binding_map, + base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, + base::Unretained(this))); binding_map["different!"] = 59; EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( @@ -332,7 +433,9 @@ TEST_F(MemoryProgramCacheTest, MemoryProgramCacheEviction) { SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1); - cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL); + cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, + base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, + base::Unretained(this))); const int kEvictingProgramId = 11; const GLuint kEvictingBinaryLength = kCacheSizeBytes - kBinaryLength + 1; @@ -356,7 +459,9 @@ TEST_F(MemoryProgramCacheTest, MemoryProgramCacheEviction) { cache_->SaveLinkedProgram(kEvictingProgramId, vertex_shader_, fragment_shader_, - NULL); + NULL, + base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, + base::Unretained(this))); EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( *vertex_shader_->deferred_compilation_source(), @@ -380,7 +485,9 @@ TEST_F(MemoryProgramCacheTest, SaveCorrectProgram) { vertex_shader_->UpdateSource("different!"); SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1); - cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL); + cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, + base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, + base::Unretained(this))); EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( *vertex_shader_->deferred_compilation_source(), @@ -399,7 +506,9 @@ TEST_F(MemoryProgramCacheTest, LoadCorrectProgram) { ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); - cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL); + cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, + base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, + base::Unretained(this))); EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( *vertex_shader_->deferred_compilation_source(), @@ -427,7 +536,9 @@ TEST_F(MemoryProgramCacheTest, OverwriteOnNewSave) { ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); - cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL); + cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, + base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, + base::Unretained(this))); char test_binary2[kBinaryLength]; @@ -436,7 +547,9 @@ TEST_F(MemoryProgramCacheTest, OverwriteOnNewSave) { } ProgramBinaryEmulator emulator2(kBinaryLength, kFormat, test_binary2); SetExpectationsForSaveLinkedProgram(kProgramId, &emulator2); - cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL); + cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, + base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, + base::Unretained(this))); SetExpectationsForLoadLinkedProgram(kProgramId, &emulator2); EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( |