| 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 gpu { | |
| 11 namespace gles2 { | |
| 12 | |
| 13 class NoBackendProgramCache : public ProgramCache { | |
| 14 public: | |
| 15 virtual ProgramLoadResult LoadLinkedProgram( | |
| 16 GLuint /* program */, | |
| 17 ShaderManager::ShaderInfo* /* shader_a */, | |
| 18 ShaderManager::ShaderInfo* /* shader_b */, | |
| 19 const LocationMap* /* bind_attrib_location_map */) const OVERRIDE { | |
| 20 return PROGRAM_LOAD_SUCCESS; | |
| 21 } | |
| 22 virtual void SaveLinkedProgram( | |
| 23 GLuint /* program */, | |
| 24 const ShaderManager::ShaderInfo* /* shader_a */, | |
| 25 const ShaderManager::ShaderInfo* /* shader_b */, | |
| 26 const LocationMap* /* bind_attrib_location_map */) OVERRIDE { } | |
| 27 | |
| 28 virtual void ClearBackend() OVERRIDE {} | |
| 29 | |
| 30 void SaySuccessfullyCached(const std::string& shader1, | |
| 31 const std::string& shader2, | |
| 32 std::map<std::string, GLint>* attrib_map) { | |
| 33 char a_sha[kHashLength]; | |
| 34 char b_sha[kHashLength]; | |
| 35 ComputeShaderHash(shader1, a_sha); | |
| 36 ComputeShaderHash(shader2, b_sha); | |
| 37 | |
| 38 char sha[kHashLength]; | |
| 39 ComputeProgramHash(a_sha, | |
| 40 b_sha, | |
| 41 attrib_map, | |
| 42 sha); | |
| 43 const std::string shaString(sha, kHashLength); | |
| 44 | |
| 45 LinkedProgramCacheSuccess(shaString, | |
| 46 std::string(a_sha, kHashLength), | |
| 47 std::string(b_sha, kHashLength)); | |
| 48 } | |
| 49 | |
| 50 void ComputeShaderHash(const std::string& shader, | |
| 51 char* result) const { | |
| 52 ProgramCache::ComputeShaderHash(shader, result); | |
| 53 } | |
| 54 | |
| 55 void ComputeProgramHash(const char* hashed_shader_0, | |
| 56 const char* hashed_shader_1, | |
| 57 const LocationMap* bind_attrib_location_map, | |
| 58 char* result) const { | |
| 59 ProgramCache::ComputeProgramHash(hashed_shader_0, | |
| 60 hashed_shader_1, | |
| 61 bind_attrib_location_map, | |
| 62 result); | |
| 63 } | |
| 64 | |
| 65 void Evict(const std::string& program_hash, | |
| 66 const std::string& shader_0_hash, | |
| 67 const std::string& shader_1_hash) { | |
| 68 ProgramCache::Evict(program_hash, shader_0_hash, shader_1_hash); | |
| 69 } | |
| 70 }; | |
| 71 | |
| 72 class ProgramCacheTest : public testing::Test { | |
| 73 public: | |
| 74 ProgramCacheTest() : | |
| 75 cache_(new NoBackendProgramCache()) { } | |
| 76 | |
| 77 protected: | |
| 78 scoped_ptr<NoBackendProgramCache> cache_; | |
| 79 }; | |
| 80 | |
| 81 TEST_F(ProgramCacheTest, CompilationStatusSave) { | |
| 82 const std::string shader1 = "abcd1234"; | |
| 83 { | |
| 84 std::string shader = shader1; | |
| 85 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 86 cache_->GetShaderCompilationStatus(shader)); | |
| 87 cache_->ShaderCompilationSucceeded(shader); | |
| 88 shader.clear(); | |
| 89 } | |
| 90 // make sure it was copied | |
| 91 EXPECT_EQ(ProgramCache::COMPILATION_SUCCEEDED, | |
| 92 cache_->GetShaderCompilationStatus(shader1)); | |
| 93 } | |
| 94 | |
| 95 TEST_F(ProgramCacheTest, CompilationUnknownOnSourceChange) { | |
| 96 std::string shader1 = "abcd1234"; | |
| 97 cache_->ShaderCompilationSucceeded(shader1); | |
| 98 | |
| 99 shader1 = "different!"; | |
| 100 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 101 cache_->GetShaderCompilationStatus(shader1)); | |
| 102 } | |
| 103 | |
| 104 TEST_F(ProgramCacheTest, LinkStatusSave) { | |
| 105 const std::string shader1 = "abcd1234"; | |
| 106 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | |
| 107 { | |
| 108 std::string shader_a = shader1; | |
| 109 std::string shader_b = shader2; | |
| 110 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 111 cache_->GetLinkedProgramStatus(shader_a, shader_b, NULL)); | |
| 112 cache_->SaySuccessfullyCached(shader_a, shader_b, NULL); | |
| 113 | |
| 114 shader_a.clear(); | |
| 115 shader_b.clear(); | |
| 116 } | |
| 117 // make sure it was copied | |
| 118 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, | |
| 119 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); | |
| 120 } | |
| 121 | |
| 122 TEST_F(ProgramCacheTest, LinkUnknownOnFragmentSourceChange) { | |
| 123 const std::string shader1 = "abcd1234"; | |
| 124 std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | |
| 125 cache_->SaySuccessfullyCached(shader1, shader2, NULL); | |
| 126 | |
| 127 shader2 = "different!"; | |
| 128 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 129 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); | |
| 130 } | |
| 131 | |
| 132 TEST_F(ProgramCacheTest, LinkUnknownOnVertexSourceChange) { | |
| 133 std::string shader1 = "abcd1234"; | |
| 134 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | |
| 135 cache_->SaySuccessfullyCached(shader1, shader2, NULL); | |
| 136 | |
| 137 shader1 = "different!"; | |
| 138 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 139 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); | |
| 140 } | |
| 141 | |
| 142 TEST_F(ProgramCacheTest, StatusEviction) { | |
| 143 const std::string shader1 = "abcd1234"; | |
| 144 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | |
| 145 cache_->ShaderCompilationSucceeded(shader1); | |
| 146 cache_->ShaderCompilationSucceeded(shader2); | |
| 147 cache_->SaySuccessfullyCached(shader1, shader2, NULL); | |
| 148 char a_sha[ProgramCache::kHashLength]; | |
| 149 char b_sha[ProgramCache::kHashLength]; | |
| 150 cache_->ComputeShaderHash(shader1, a_sha); | |
| 151 cache_->ComputeShaderHash(shader2, b_sha); | |
| 152 | |
| 153 char sha[ProgramCache::kHashLength]; | |
| 154 cache_->ComputeProgramHash(a_sha, | |
| 155 b_sha, | |
| 156 NULL, | |
| 157 sha); | |
| 158 cache_->Evict(std::string(sha, ProgramCache::kHashLength), | |
| 159 std::string(a_sha, ProgramCache::kHashLength), | |
| 160 std::string(b_sha, ProgramCache::kHashLength)); | |
| 161 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 162 cache_->GetShaderCompilationStatus(shader1)); | |
| 163 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 164 cache_->GetShaderCompilationStatus(shader2)); | |
| 165 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 166 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); | |
| 167 } | |
| 168 | |
| 169 TEST_F(ProgramCacheTest, EvictionWithReusedShader) { | |
| 170 const std::string shader1 = "abcd1234"; | |
| 171 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | |
| 172 const std::string shader3 = "asbjbbjj239a"; | |
| 173 cache_->ShaderCompilationSucceeded(shader1); | |
| 174 cache_->ShaderCompilationSucceeded(shader2); | |
| 175 cache_->SaySuccessfullyCached(shader1, shader2, NULL); | |
| 176 cache_->ShaderCompilationSucceeded(shader1); | |
| 177 cache_->ShaderCompilationSucceeded(shader3); | |
| 178 cache_->SaySuccessfullyCached(shader1, shader3, NULL); | |
| 179 | |
| 180 char a_sha[ProgramCache::kHashLength]; | |
| 181 char b_sha[ProgramCache::kHashLength]; | |
| 182 char c_sha[ProgramCache::kHashLength]; | |
| 183 cache_->ComputeShaderHash(shader1, a_sha); | |
| 184 cache_->ComputeShaderHash(shader2, b_sha); | |
| 185 cache_->ComputeShaderHash(shader3, c_sha); | |
| 186 | |
| 187 char sha[ProgramCache::kHashLength]; | |
| 188 cache_->ComputeProgramHash(a_sha, | |
| 189 b_sha, | |
| 190 NULL, | |
| 191 sha); | |
| 192 cache_->Evict(std::string(sha, ProgramCache::kHashLength), | |
| 193 std::string(a_sha, ProgramCache::kHashLength), | |
| 194 std::string(b_sha, ProgramCache::kHashLength)); | |
| 195 EXPECT_EQ(ProgramCache::COMPILATION_SUCCEEDED, | |
| 196 cache_->GetShaderCompilationStatus(shader1)); | |
| 197 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 198 cache_->GetShaderCompilationStatus(shader2)); | |
| 199 EXPECT_EQ(ProgramCache::COMPILATION_SUCCEEDED, | |
| 200 cache_->GetShaderCompilationStatus(shader3)); | |
| 201 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 202 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); | |
| 203 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, | |
| 204 cache_->GetLinkedProgramStatus(shader1, shader3, NULL)); | |
| 205 | |
| 206 | |
| 207 cache_->ComputeProgramHash(a_sha, | |
| 208 c_sha, | |
| 209 NULL, | |
| 210 sha); | |
| 211 cache_->Evict(std::string(sha, ProgramCache::kHashLength), | |
| 212 std::string(a_sha, ProgramCache::kHashLength), | |
| 213 std::string(c_sha, ProgramCache::kHashLength)); | |
| 214 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 215 cache_->GetShaderCompilationStatus(shader1)); | |
| 216 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 217 cache_->GetShaderCompilationStatus(shader2)); | |
| 218 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 219 cache_->GetShaderCompilationStatus(shader3)); | |
| 220 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 221 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); | |
| 222 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 223 cache_->GetLinkedProgramStatus(shader1, shader3, NULL)); | |
| 224 } | |
| 225 | |
| 226 TEST_F(ProgramCacheTest, StatusClear) { | |
| 227 const std::string shader1 = "abcd1234"; | |
| 228 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | |
| 229 const std::string shader3 = "asbjbbjj239a"; | |
| 230 cache_->ShaderCompilationSucceeded(shader1); | |
| 231 cache_->ShaderCompilationSucceeded(shader2); | |
| 232 cache_->SaySuccessfullyCached(shader1, shader2, NULL); | |
| 233 cache_->ShaderCompilationSucceeded(shader3); | |
| 234 cache_->SaySuccessfullyCached(shader1, shader3, NULL); | |
| 235 cache_->Clear(); | |
| 236 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 237 cache_->GetShaderCompilationStatus(shader1)); | |
| 238 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 239 cache_->GetShaderCompilationStatus(shader2)); | |
| 240 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 241 cache_->GetShaderCompilationStatus(shader3)); | |
| 242 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 243 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); | |
| 244 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 245 cache_->GetLinkedProgramStatus(shader1, shader3, NULL)); | |
| 246 } | |
| 247 | |
| 248 } // namespace gles2 | |
| 249 } // namespace gpu | |
| OLD | NEW |