Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(183)

Side by Side Diff: gpu/command_buffer/service/program_cache_unittest.cc

Issue 10797055: gpu in-memory program cache implementation with a memory limit + lru eviction. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: nit fixes Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/program_cache_lru_helper_unittest.cc ('k') | gpu/command_buffer/service/program_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698