| OLD | NEW |
| (Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "gpu/command_buffer/service/program_cache.h" |
| 6 |
| 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 |
| 10 namespace { |
| 11 typedef std::map<std::string, GLint> LocationMap; |
| 12 } // anonymous namespace |
| 13 |
| 14 namespace gpu { |
| 15 namespace gles2 { |
| 16 |
| 17 class NoBackendProgramCache : public ProgramCache { |
| 18 public: |
| 19 bool LoadLinkedProgram(const GLuint program, |
| 20 ShaderManager::ShaderInfo* shader_a, |
| 21 ShaderManager::ShaderInfo* shader_b, |
| 22 const LocationMap* bind_attrib_location_map) const { |
| 23 return true; |
| 24 } |
| 25 void SaveLinkedProgram(const GLuint program, |
| 26 const ShaderManager::ShaderInfo* shader_a, |
| 27 const ShaderManager::ShaderInfo* shader_b, |
| 28 const LocationMap* bind_attrib_location_map) { } |
| 29 |
| 30 void ClearBackend() {} |
| 31 |
| 32 void SaySuccessfullyCached(const std::string& shader1, |
| 33 const std::string& shader2, |
| 34 std::map<std::string, GLint>* attrib_map) { |
| 35 char a_sha[kHashLength]; |
| 36 char b_sha[kHashLength]; |
| 37 computeShaderHash(shader1, a_sha); |
| 38 computeShaderHash(shader2, b_sha); |
| 39 |
| 40 char sha[kHashLength]; |
| 41 computeProgramHash(a_sha, |
| 42 b_sha, |
| 43 attrib_map, |
| 44 sha); |
| 45 const std::string shaString(sha, kHashLength); |
| 46 |
| 47 LinkedProgramCacheSuccess(shaString, |
| 48 std::string(a_sha, kHashLength), |
| 49 std::string(b_sha, kHashLength)); |
| 50 } |
| 51 |
| 52 void computeShaderHash(const std::string& shader, |
| 53 char* result) const { |
| 54 ProgramCache::ComputeShaderHash(shader, result); |
| 55 } |
| 56 |
| 57 void computeProgramHash(const char* hashed_shader_0, |
| 58 const char* hashed_shader_1, |
| 59 const BindAttribMap* bind_attrib_location_map, |
| 60 char* result) const { |
| 61 ProgramCache::ComputeProgramHash(hashed_shader_0, |
| 62 hashed_shader_1, |
| 63 bind_attrib_location_map, |
| 64 result); |
| 65 } |
| 66 |
| 67 void evict(const std::string& program_hash, |
| 68 const std::string& shader_0_hash, |
| 69 const std::string& shader_1_hash) { |
| 70 ProgramCache::Evict(program_hash, shader_0_hash, shader_1_hash); |
| 71 } |
| 72 |
| 73 uint32 getHashLength() { |
| 74 return ProgramCache::kHashLength ; |
| 75 } |
| 76 }; |
| 77 |
| 78 class ProgramCacheTest : public testing::Test { |
| 79 public: |
| 80 ProgramCacheTest() : |
| 81 cache_(new NoBackendProgramCache()) { } |
| 82 |
| 83 protected: |
| 84 |
| 85 scoped_ptr<NoBackendProgramCache> cache_; |
| 86 }; |
| 87 |
| 88 TEST_F(ProgramCacheTest, ProgramCacheCompilationStatus) { |
| 89 const std::string shader1 = "abcd1234"; |
| 90 { |
| 91 std::string shader = shader1; |
| 92 ASSERT_EQ(ProgramCache::COMPILATION_UNKNOWN, |
| 93 cache_->GetShaderCompilationStatus(shader)); |
| 94 cache_->ShaderCompilationSucceeded(shader); |
| 95 shader.clear(); |
| 96 } |
| 97 // make sure it was copied |
| 98 ASSERT_EQ(ProgramCache::COMPILATION_SUCCEEDED, |
| 99 cache_->GetShaderCompilationStatus(shader1)); |
| 100 } |
| 101 |
| 102 TEST_F(ProgramCacheTest, ProgramCacheProgramLinkStatus) { |
| 103 const std::string shader1 = "abcd1234"; |
| 104 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; |
| 105 { |
| 106 std::string shaderA = shader1; |
| 107 std::string shaderB = shader2; |
| 108 ASSERT_EQ(ProgramCache::LINK_UNKNOWN, |
| 109 cache_->GetLinkedProgramStatus(shaderA, shaderB, NULL)); |
| 110 cache_->SaySuccessfullyCached(shaderA, shaderB, NULL); |
| 111 |
| 112 shaderA.clear(); |
| 113 shaderB.clear(); |
| 114 } |
| 115 // make sure it was copied |
| 116 ASSERT_EQ(ProgramCache::LINK_SUCCEEDED, |
| 117 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); |
| 118 } |
| 119 |
| 120 TEST_F(ProgramCacheTest, ProgramCacheEviction) { |
| 121 const std::string shader1 = "abcd1234"; |
| 122 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; |
| 123 cache_->ShaderCompilationSucceeded(shader1); |
| 124 cache_->ShaderCompilationSucceeded(shader2); |
| 125 cache_->SaySuccessfullyCached(shader1, shader2, NULL); |
| 126 const uint32 hashLength = cache_->getHashLength(); |
| 127 char a_sha[hashLength]; |
| 128 char b_sha[hashLength]; |
| 129 cache_->computeShaderHash(shader1, a_sha); |
| 130 cache_->computeShaderHash(shader2, b_sha); |
| 131 |
| 132 char sha[hashLength]; |
| 133 cache_->computeProgramHash(a_sha, |
| 134 b_sha, |
| 135 NULL, |
| 136 sha); |
| 137 cache_->evict(std::string(sha, hashLength), |
| 138 std::string(a_sha, hashLength), |
| 139 std::string(b_sha, hashLength)); |
| 140 ASSERT_EQ(ProgramCache::COMPILATION_UNKNOWN, |
| 141 cache_->GetShaderCompilationStatus(shader1)); |
| 142 ASSERT_EQ(ProgramCache::COMPILATION_UNKNOWN, |
| 143 cache_->GetShaderCompilationStatus(shader2)); |
| 144 ASSERT_EQ(ProgramCache::LINK_UNKNOWN, |
| 145 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); |
| 146 } |
| 147 |
| 148 TEST_F(ProgramCacheTest, ProgramCacheEvictionWithReusedShader) { |
| 149 const std::string shader1 = "abcd1234"; |
| 150 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; |
| 151 const std::string shader3 = "asbjbbjj239a"; |
| 152 cache_->ShaderCompilationSucceeded(shader1); |
| 153 cache_->ShaderCompilationSucceeded(shader2); |
| 154 cache_->SaySuccessfullyCached(shader1, shader2, NULL); |
| 155 cache_->ShaderCompilationSucceeded(shader3); |
| 156 cache_->SaySuccessfullyCached(shader1, shader3, NULL); |
| 157 |
| 158 const uint32 hashLength = cache_->getHashLength(); |
| 159 char a_sha[hashLength]; |
| 160 char b_sha[hashLength]; |
| 161 char c_sha[hashLength]; |
| 162 cache_->computeShaderHash(shader1, a_sha); |
| 163 cache_->computeShaderHash(shader2, b_sha); |
| 164 cache_->computeShaderHash(shader3, c_sha); |
| 165 |
| 166 char sha[hashLength]; |
| 167 cache_->computeProgramHash(a_sha, |
| 168 b_sha, |
| 169 NULL, |
| 170 sha); |
| 171 cache_->evict(std::string(sha, hashLength), |
| 172 std::string(a_sha, hashLength), |
| 173 std::string(b_sha, hashLength)); |
| 174 ASSERT_EQ(ProgramCache::COMPILATION_SUCCEEDED, |
| 175 cache_->GetShaderCompilationStatus(shader1)); |
| 176 ASSERT_EQ(ProgramCache::COMPILATION_UNKNOWN, |
| 177 cache_->GetShaderCompilationStatus(shader2)); |
| 178 ASSERT_EQ(ProgramCache::COMPILATION_SUCCEEDED, |
| 179 cache_->GetShaderCompilationStatus(shader3)); |
| 180 ASSERT_EQ(ProgramCache::LINK_UNKNOWN, |
| 181 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); |
| 182 |
| 183 cache_->computeProgramHash(a_sha, |
| 184 c_sha, |
| 185 NULL, |
| 186 sha); |
| 187 cache_->evict(std::string(sha, hashLength), |
| 188 std::string(a_sha, hashLength), |
| 189 std::string(c_sha, hashLength)); |
| 190 ASSERT_EQ(ProgramCache::COMPILATION_UNKNOWN, |
| 191 cache_->GetShaderCompilationStatus(shader1)); |
| 192 ASSERT_EQ(ProgramCache::COMPILATION_UNKNOWN, |
| 193 cache_->GetShaderCompilationStatus(shader2)); |
| 194 ASSERT_EQ(ProgramCache::COMPILATION_UNKNOWN, |
| 195 cache_->GetShaderCompilationStatus(shader3)); |
| 196 } |
| 197 |
| 198 } // namespace gles2 |
| 199 } // namespace gpu |
| OLD | NEW |