Chromium Code Reviews| 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 const GLuint program, | |
|
greggman
2012/07/10 21:43:30
style: for unused parameters the format is
return
dmurph
2012/07/11 23:32:52
Done.
| |
| 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( | |
|
greggman
2012/07/10 21:43:30
see above
dmurph
2012/07/11 23:32:52
Done.
| |
| 23 const 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, | |
|
greggman
2012/07/10 21:43:30
style: indent
dmurph
2012/07/11 23:32:52
Done.
| |
| 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, ProgramCacheCompilationStatus) { | |
| 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, ProgramCacheProgramLinkStatus) { | |
| 96 const std::string shader1 = "abcd1234"; | |
| 97 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | |
| 98 { | |
| 99 std::string shader_a = shader1; | |
| 100 std::string shader_b = shader2; | |
| 101 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 102 cache_->GetLinkedProgramStatus(shader_a, shader_b, NULL)); | |
| 103 cache_->SaySuccessfullyCached(shader_a, shader_b, NULL); | |
| 104 | |
| 105 shader_a.clear(); | |
| 106 shader_b.clear(); | |
| 107 } | |
| 108 // make sure it was copied | |
| 109 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, | |
| 110 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); | |
| 111 } | |
| 112 | |
| 113 TEST_F(ProgramCacheTest, ProgramCacheEviction) { | |
| 114 const std::string shader1 = "abcd1234"; | |
| 115 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | |
| 116 cache_->ShaderCompilationSucceeded(shader1); | |
| 117 cache_->ShaderCompilationSucceeded(shader2); | |
| 118 cache_->SaySuccessfullyCached(shader1, shader2, NULL); | |
| 119 char a_sha[ProgramCache::kHashLength]; | |
| 120 char b_sha[ProgramCache::kHashLength]; | |
| 121 cache_->ComputeShaderHash(shader1, a_sha); | |
| 122 cache_->ComputeShaderHash(shader2, b_sha); | |
| 123 | |
| 124 char sha[ProgramCache::kHashLength]; | |
| 125 cache_->ComputeProgramHash(a_sha, | |
| 126 b_sha, | |
|
greggman
2012/07/10 21:43:30
style: indent
dmurph
2012/07/11 23:32:52
Done.
| |
| 127 NULL, | |
| 128 sha); | |
| 129 cache_->Evict(std::string(sha, ProgramCache::kHashLength), | |
| 130 std::string(a_sha, ProgramCache::kHashLength), | |
|
greggman
2012/07/10 21:43:30
style: indent
dmurph
2012/07/11 23:32:52
Done.
| |
| 131 std::string(b_sha, ProgramCache::kHashLength)); | |
| 132 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 133 cache_->GetShaderCompilationStatus(shader1)); | |
| 134 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 135 cache_->GetShaderCompilationStatus(shader2)); | |
| 136 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 137 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); | |
| 138 } | |
| 139 | |
| 140 TEST_F(ProgramCacheTest, ProgramCacheEvictionWithReusedShader) { | |
| 141 const std::string shader1 = "abcd1234"; | |
| 142 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | |
| 143 const std::string shader3 = "asbjbbjj239a"; | |
| 144 cache_->ShaderCompilationSucceeded(shader1); | |
| 145 cache_->ShaderCompilationSucceeded(shader2); | |
| 146 cache_->SaySuccessfullyCached(shader1, shader2, NULL); | |
| 147 cache_->ShaderCompilationSucceeded(shader3); | |
| 148 cache_->SaySuccessfullyCached(shader1, shader3, NULL); | |
| 149 | |
| 150 char a_sha[ProgramCache::kHashLength]; | |
| 151 char b_sha[ProgramCache::kHashLength]; | |
| 152 char c_sha[ProgramCache::kHashLength]; | |
| 153 cache_->ComputeShaderHash(shader1, a_sha); | |
| 154 cache_->ComputeShaderHash(shader2, b_sha); | |
| 155 cache_->ComputeShaderHash(shader3, c_sha); | |
| 156 | |
| 157 char sha[ProgramCache::kHashLength]; | |
| 158 cache_->ComputeProgramHash(a_sha, | |
| 159 b_sha, | |
| 160 NULL, | |
| 161 sha); | |
| 162 cache_->Evict(std::string(sha, ProgramCache::kHashLength), | |
| 163 std::string(a_sha, ProgramCache::kHashLength), | |
| 164 std::string(b_sha, ProgramCache::kHashLength)); | |
| 165 EXPECT_EQ(ProgramCache::COMPILATION_SUCCEEDED, | |
| 166 cache_->GetShaderCompilationStatus(shader1)); | |
| 167 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 168 cache_->GetShaderCompilationStatus(shader2)); | |
| 169 EXPECT_EQ(ProgramCache::COMPILATION_SUCCEEDED, | |
| 170 cache_->GetShaderCompilationStatus(shader3)); | |
| 171 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 172 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); | |
| 173 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, | |
| 174 cache_->GetLinkedProgramStatus(shader1, shader3, NULL)); | |
| 175 | |
| 176 | |
| 177 cache_->ComputeProgramHash(a_sha, | |
| 178 c_sha, | |
| 179 NULL, | |
| 180 sha); | |
| 181 cache_->Evict(std::string(sha, ProgramCache::kHashLength), | |
| 182 std::string(a_sha, ProgramCache::kHashLength), | |
| 183 std::string(c_sha, ProgramCache::kHashLength)); | |
| 184 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 185 cache_->GetShaderCompilationStatus(shader1)); | |
| 186 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 187 cache_->GetShaderCompilationStatus(shader2)); | |
| 188 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 189 cache_->GetShaderCompilationStatus(shader3)); | |
| 190 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 191 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); | |
| 192 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 193 cache_->GetLinkedProgramStatus(shader1, shader3, NULL)); | |
| 194 } | |
| 195 | |
| 196 TEST_F(ProgramCacheTest, ProgramCacheClear) { | |
| 197 const std::string shader1 = "abcd1234"; | |
| 198 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | |
| 199 const std::string shader3 = "asbjbbjj239a"; | |
| 200 cache_->ShaderCompilationSucceeded(shader1); | |
| 201 cache_->ShaderCompilationSucceeded(shader2); | |
| 202 cache_->SaySuccessfullyCached(shader1, shader2, NULL); | |
| 203 cache_->ShaderCompilationSucceeded(shader3); | |
| 204 cache_->SaySuccessfullyCached(shader1, shader3, NULL); | |
| 205 cache_->Clear(); | |
| 206 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 207 cache_->GetShaderCompilationStatus(shader1)); | |
| 208 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 209 cache_->GetShaderCompilationStatus(shader2)); | |
| 210 EXPECT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 211 cache_->GetShaderCompilationStatus(shader3)); | |
| 212 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 213 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); | |
| 214 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 215 cache_->GetLinkedProgramStatus(shader1, shader3, NULL)); | |
| 216 } | |
| 217 | |
| 218 } // namespace gles2 | |
| 219 } // namespace gpu | |
| OLD | NEW |