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 { | |
| 11 typedef std::map<std::string, GLint> LocationMap; | |
|
greggman
2012/06/26 23:00:27
sorry to harp on this but just to make it clear. I
dmurph
2012/07/04 00:01:29
Done.
| |
| 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), | |
|
greggman
2012/06/26 23:00:27
style: indenting
dmurph
2012/07/04 00:01:29
Done.
| |
| 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 LocationMap* 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, | |
|
greggman
2012/06/26 23:00:27
style: functions are UpperCase
| |
| 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 const uint32 hash_length() const { | |
|
greggman
2012/06/26 23:00:27
Is there a reason have this vs just using ProgramC
dmurph
2012/07/04 00:01:29
it was because I has kHashLength as a protected fi
| |
| 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 scoped_ptr<NoBackendProgramCache> cache_; | |
| 85 }; | |
| 86 | |
| 87 TEST_F(ProgramCacheTest, ProgramCacheCompilationStatus) { | |
| 88 const std::string shader1 = "abcd1234"; | |
| 89 { | |
|
greggman
2012/06/26 23:00:27
what's this extra code block for?
dmurph
2012/07/04 00:01:29
So the strings given will be destructed, to make s
| |
| 90 std::string shader = shader1; | |
| 91 ASSERT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 92 cache_->GetShaderCompilationStatus(shader)); | |
| 93 cache_->ShaderCompilationSucceeded(shader); | |
| 94 shader.clear(); | |
|
greggman
2012/06/26 23:00:27
why are you clearing this string?
dmurph
2012/07/04 00:01:29
same. I can get rid of these checks if they seem
| |
| 95 } | |
| 96 // make sure it was copied | |
| 97 ASSERT_EQ(ProgramCache::COMPILATION_SUCCEEDED, | |
| 98 cache_->GetShaderCompilationStatus(shader1)); | |
| 99 } | |
| 100 | |
| 101 TEST_F(ProgramCacheTest, ProgramCacheProgramLinkStatus) { | |
| 102 const std::string shader1 = "abcd1234"; | |
| 103 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | |
| 104 { | |
|
greggman
2012/06/26 23:00:27
same as above. What's the extra code block for and
| |
| 105 std::string shaderA = shader1; | |
|
greggman
2012/06/26 23:00:27
style: variables are under_score
| |
| 106 std::string shaderB = shader2; | |
| 107 ASSERT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 108 cache_->GetLinkedProgramStatus(shaderA, shaderB, NULL)); | |
| 109 cache_->SaySuccessfullyCached(shaderA, shaderB, NULL); | |
| 110 | |
| 111 shaderA.clear(); | |
| 112 shaderB.clear(); | |
| 113 } | |
| 114 // make sure it was copied | |
| 115 ASSERT_EQ(ProgramCache::LINK_SUCCEEDED, | |
| 116 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); | |
| 117 } | |
| 118 | |
| 119 TEST_F(ProgramCacheTest, ProgramCacheEviction) { | |
| 120 const std::string shader1 = "abcd1234"; | |
| 121 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | |
| 122 cache_->ShaderCompilationSucceeded(shader1); | |
| 123 cache_->ShaderCompilationSucceeded(shader2); | |
| 124 cache_->SaySuccessfullyCached(shader1, shader2, NULL); | |
| 125 const uint32 kHashLength = cache_->hash_length(); | |
| 126 char a_sha[kHashLength]; | |
|
greggman
2012/06/26 23:00:27
dynamically sized c arrays are not standard c. Thi
dmurph
2012/07/04 00:01:29
Done.
| |
| 127 char b_sha[kHashLength]; | |
| 128 cache_->ComputeShaderHash(shader1, a_sha); | |
| 129 cache_->ComputeShaderHash(shader2, b_sha); | |
| 130 | |
| 131 char sha[kHashLength]; | |
| 132 cache_->ComputeProgramHash(a_sha, | |
| 133 b_sha, | |
|
greggman
2012/06/26 23:00:27
style: indenting
dmurph
2012/07/04 00:01:29
Done.
| |
| 134 NULL, | |
| 135 sha); | |
| 136 cache_->evict(std::string(sha, kHashLength), | |
| 137 std::string(a_sha, kHashLength), | |
|
greggman
2012/06/26 23:00:27
style: indenting
dmurph
2012/07/04 00:01:29
Done.
| |
| 138 std::string(b_sha, kHashLength)); | |
| 139 ASSERT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 140 cache_->GetShaderCompilationStatus(shader1)); | |
| 141 ASSERT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 142 cache_->GetShaderCompilationStatus(shader2)); | |
| 143 ASSERT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 144 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); | |
| 145 } | |
| 146 | |
| 147 TEST_F(ProgramCacheTest, ProgramCacheEvictionWithReusedShader) { | |
| 148 const std::string shader1 = "abcd1234"; | |
| 149 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; | |
| 150 const std::string shader3 = "asbjbbjj239a"; | |
| 151 cache_->ShaderCompilationSucceeded(shader1); | |
| 152 cache_->ShaderCompilationSucceeded(shader2); | |
| 153 cache_->SaySuccessfullyCached(shader1, shader2, NULL); | |
| 154 cache_->ShaderCompilationSucceeded(shader3); | |
| 155 cache_->SaySuccessfullyCached(shader1, shader3, NULL); | |
| 156 | |
| 157 const uint32 kHashLength = cache_->hash_length(); | |
| 158 char a_sha[kHashLength]; | |
| 159 char b_sha[kHashLength]; | |
| 160 char c_sha[kHashLength]; | |
| 161 cache_->ComputeShaderHash(shader1, a_sha); | |
| 162 cache_->ComputeShaderHash(shader2, b_sha); | |
| 163 cache_->ComputeShaderHash(shader3, c_sha); | |
| 164 | |
| 165 char sha[kHashLength]; | |
| 166 cache_->ComputeProgramHash(a_sha, | |
| 167 b_sha, | |
| 168 NULL, | |
| 169 sha); | |
| 170 cache_->evict(std::string(sha, kHashLength), | |
| 171 std::string(a_sha, kHashLength), | |
| 172 std::string(b_sha, kHashLength)); | |
| 173 ASSERT_EQ(ProgramCache::COMPILATION_SUCCEEDED, | |
| 174 cache_->GetShaderCompilationStatus(shader1)); | |
| 175 ASSERT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 176 cache_->GetShaderCompilationStatus(shader2)); | |
| 177 ASSERT_EQ(ProgramCache::COMPILATION_SUCCEEDED, | |
| 178 cache_->GetShaderCompilationStatus(shader3)); | |
| 179 ASSERT_EQ(ProgramCache::LINK_UNKNOWN, | |
| 180 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); | |
| 181 | |
| 182 cache_->ComputeProgramHash(a_sha, | |
| 183 c_sha, | |
| 184 NULL, | |
| 185 sha); | |
| 186 cache_->evict(std::string(sha, kHashLength), | |
| 187 std::string(a_sha, kHashLength), | |
| 188 std::string(c_sha, kHashLength)); | |
| 189 ASSERT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 190 cache_->GetShaderCompilationStatus(shader1)); | |
| 191 ASSERT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 192 cache_->GetShaderCompilationStatus(shader2)); | |
| 193 ASSERT_EQ(ProgramCache::COMPILATION_UNKNOWN, | |
| 194 cache_->GetShaderCompilationStatus(shader3)); | |
| 195 } | |
| 196 | |
| 197 } // namespace gles2 | |
| 198 } // namespace gpu | |
| OLD | NEW |