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

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

Issue 10534173: GPU Program Caching (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: memory limit + lru Created 8 years, 6 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 {
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698