diff options
Diffstat (limited to 'gpu/command_buffer/service/program_cache_unittest.cc')
-rw-r--r-- | gpu/command_buffer/service/program_cache_unittest.cc | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/gpu/command_buffer/service/program_cache_unittest.cc b/gpu/command_buffer/service/program_cache_unittest.cc new file mode 100644 index 0000000..eee7dab --- /dev/null +++ b/gpu/command_buffer/service/program_cache_unittest.cc @@ -0,0 +1,249 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/command_buffer/service/program_cache.h" + +#include "base/memory/scoped_ptr.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace gpu { +namespace gles2 { + +class NoBackendProgramCache : public ProgramCache { + public: + virtual ProgramLoadResult LoadLinkedProgram( + GLuint /* program */, + ShaderManager::ShaderInfo* /* shader_a */, + ShaderManager::ShaderInfo* /* shader_b */, + const LocationMap* /* bind_attrib_location_map */) const OVERRIDE { + return PROGRAM_LOAD_SUCCESS; + } + virtual void SaveLinkedProgram( + GLuint /* program */, + const ShaderManager::ShaderInfo* /* shader_a */, + const ShaderManager::ShaderInfo* /* shader_b */, + const LocationMap* /* bind_attrib_location_map */) OVERRIDE { } + + virtual void ClearBackend() OVERRIDE {} + + void SaySuccessfullyCached(const std::string& shader1, + const std::string& shader2, + std::map<std::string, GLint>* attrib_map) { + char a_sha[kHashLength]; + char b_sha[kHashLength]; + ComputeShaderHash(shader1, a_sha); + ComputeShaderHash(shader2, b_sha); + + char sha[kHashLength]; + ComputeProgramHash(a_sha, + b_sha, + attrib_map, + sha); + const std::string shaString(sha, kHashLength); + + LinkedProgramCacheSuccess(shaString, + std::string(a_sha, kHashLength), + std::string(b_sha, kHashLength)); + } + + void ComputeShaderHash(const std::string& shader, + char* result) const { + ProgramCache::ComputeShaderHash(shader, result); + } + + void ComputeProgramHash(const char* hashed_shader_0, + const char* hashed_shader_1, + const LocationMap* bind_attrib_location_map, + char* result) const { + ProgramCache::ComputeProgramHash(hashed_shader_0, + hashed_shader_1, + bind_attrib_location_map, + result); + } + + void Evict(const std::string& program_hash, + const std::string& shader_0_hash, + const std::string& shader_1_hash) { + ProgramCache::Evict(program_hash, shader_0_hash, shader_1_hash); + } +}; + +class ProgramCacheTest : public testing::Test { + public: + ProgramCacheTest() : + cache_(new NoBackendProgramCache()) { } + + protected: + scoped_ptr<NoBackendProgramCache> cache_; +}; + +TEST_F(ProgramCacheTest, CompilationStatusSave) { + const std::string shader1 = "abcd1234"; + { + std::string shader = shader1; + EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, + cache_->GetShaderCompilationStatus(shader)); + cache_->ShaderCompilationSucceeded(shader); + shader.clear(); + } + // make sure it was copied + EXPECT_EQ(ProgramCache::COMPILATION_SUCCEEDED, + cache_->GetShaderCompilationStatus(shader1)); +} + +TEST_F(ProgramCacheTest, CompilationUnknownOnSourceChange) { + std::string shader1 = "abcd1234"; + cache_->ShaderCompilationSucceeded(shader1); + + shader1 = "different!"; + EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, + cache_->GetShaderCompilationStatus(shader1)); +} + +TEST_F(ProgramCacheTest, LinkStatusSave) { + const std::string shader1 = "abcd1234"; + const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; + { + std::string shader_a = shader1; + std::string shader_b = shader2; + EXPECT_EQ(ProgramCache::LINK_UNKNOWN, + cache_->GetLinkedProgramStatus(shader_a, shader_b, NULL)); + cache_->SaySuccessfullyCached(shader_a, shader_b, NULL); + + shader_a.clear(); + shader_b.clear(); + } + // make sure it was copied + EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, + cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); +} + +TEST_F(ProgramCacheTest, LinkUnknownOnFragmentSourceChange) { + const std::string shader1 = "abcd1234"; + std::string shader2 = "abcda sda b1~#4 bbbbb1234"; + cache_->SaySuccessfullyCached(shader1, shader2, NULL); + + shader2 = "different!"; + EXPECT_EQ(ProgramCache::LINK_UNKNOWN, + cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); +} + +TEST_F(ProgramCacheTest, LinkUnknownOnVertexSourceChange) { + std::string shader1 = "abcd1234"; + const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; + cache_->SaySuccessfullyCached(shader1, shader2, NULL); + + shader1 = "different!"; + EXPECT_EQ(ProgramCache::LINK_UNKNOWN, + cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); +} + +TEST_F(ProgramCacheTest, StatusEviction) { + const std::string shader1 = "abcd1234"; + const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; + cache_->ShaderCompilationSucceeded(shader1); + cache_->ShaderCompilationSucceeded(shader2); + cache_->SaySuccessfullyCached(shader1, shader2, NULL); + char a_sha[ProgramCache::kHashLength]; + char b_sha[ProgramCache::kHashLength]; + cache_->ComputeShaderHash(shader1, a_sha); + cache_->ComputeShaderHash(shader2, b_sha); + + char sha[ProgramCache::kHashLength]; + cache_->ComputeProgramHash(a_sha, + b_sha, + NULL, + sha); + cache_->Evict(std::string(sha, ProgramCache::kHashLength), + std::string(a_sha, ProgramCache::kHashLength), + std::string(b_sha, ProgramCache::kHashLength)); + EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, + cache_->GetShaderCompilationStatus(shader1)); + EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, + cache_->GetShaderCompilationStatus(shader2)); + EXPECT_EQ(ProgramCache::LINK_UNKNOWN, + cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); +} + +TEST_F(ProgramCacheTest, EvictionWithReusedShader) { + const std::string shader1 = "abcd1234"; + const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; + const std::string shader3 = "asbjbbjj239a"; + cache_->ShaderCompilationSucceeded(shader1); + cache_->ShaderCompilationSucceeded(shader2); + cache_->SaySuccessfullyCached(shader1, shader2, NULL); + cache_->ShaderCompilationSucceeded(shader1); + cache_->ShaderCompilationSucceeded(shader3); + cache_->SaySuccessfullyCached(shader1, shader3, NULL); + + char a_sha[ProgramCache::kHashLength]; + char b_sha[ProgramCache::kHashLength]; + char c_sha[ProgramCache::kHashLength]; + cache_->ComputeShaderHash(shader1, a_sha); + cache_->ComputeShaderHash(shader2, b_sha); + cache_->ComputeShaderHash(shader3, c_sha); + + char sha[ProgramCache::kHashLength]; + cache_->ComputeProgramHash(a_sha, + b_sha, + NULL, + sha); + cache_->Evict(std::string(sha, ProgramCache::kHashLength), + std::string(a_sha, ProgramCache::kHashLength), + std::string(b_sha, ProgramCache::kHashLength)); + EXPECT_EQ(ProgramCache::COMPILATION_SUCCEEDED, + cache_->GetShaderCompilationStatus(shader1)); + EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, + cache_->GetShaderCompilationStatus(shader2)); + EXPECT_EQ(ProgramCache::COMPILATION_SUCCEEDED, + cache_->GetShaderCompilationStatus(shader3)); + EXPECT_EQ(ProgramCache::LINK_UNKNOWN, + cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); + EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, + cache_->GetLinkedProgramStatus(shader1, shader3, NULL)); + + + cache_->ComputeProgramHash(a_sha, + c_sha, + NULL, + sha); + cache_->Evict(std::string(sha, ProgramCache::kHashLength), + std::string(a_sha, ProgramCache::kHashLength), + std::string(c_sha, ProgramCache::kHashLength)); + EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, + cache_->GetShaderCompilationStatus(shader1)); + EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, + cache_->GetShaderCompilationStatus(shader2)); + EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, + cache_->GetShaderCompilationStatus(shader3)); + EXPECT_EQ(ProgramCache::LINK_UNKNOWN, + cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); + EXPECT_EQ(ProgramCache::LINK_UNKNOWN, + cache_->GetLinkedProgramStatus(shader1, shader3, NULL)); +} + +TEST_F(ProgramCacheTest, StatusClear) { + const std::string shader1 = "abcd1234"; + const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; + const std::string shader3 = "asbjbbjj239a"; + cache_->ShaderCompilationSucceeded(shader1); + cache_->ShaderCompilationSucceeded(shader2); + cache_->SaySuccessfullyCached(shader1, shader2, NULL); + cache_->ShaderCompilationSucceeded(shader3); + cache_->SaySuccessfullyCached(shader1, shader3, NULL); + cache_->Clear(); + EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, + cache_->GetShaderCompilationStatus(shader1)); + EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, + cache_->GetShaderCompilationStatus(shader2)); + EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, + cache_->GetShaderCompilationStatus(shader3)); + EXPECT_EQ(ProgramCache::LINK_UNKNOWN, + cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); + EXPECT_EQ(ProgramCache::LINK_UNKNOWN, + cache_->GetLinkedProgramStatus(shader1, shader3, NULL)); +} + +} // namespace gles2 +} // namespace gpu |