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

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

Issue 10534173: GPU Program Caching (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: more tests 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
« no previous file with comments | « gpu/command_buffer/service/memory_program_cache.cc ('k') | gpu/command_buffer/service/mocks.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/memory_program_cache.h"
6
7 #include "gpu/command_buffer/common/gl_mock.h"
8 #include "gpu/command_buffer/common/gles2_cmd_format.h"
9 #include "gpu/command_buffer/service/gl_utils.h"
10 #include "gpu/command_buffer/service/shader_translator.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 #include "ui/gl/gl_bindings.h"
13
14 using ::testing::_;
15 using ::testing::ElementsAreArray;
16 using ::testing::Invoke;
17 using ::testing::SetArgPointee;
18 using ::testing::SetArrayArgument;
19
20 namespace gpu {
21 namespace gles2 {
22
23 class ProgramBinaryEmulator {
24 public:
25 ProgramBinaryEmulator(GLsizei length,
26 GLenum format,
27 const char* binary)
28 : length_(length),
29 format_(format),
30 binary_(binary) { }
31
32 void GetProgramBinary(GLuint program,
33 GLsizei buffer_size,
34 GLsizei* length,
35 GLenum* format,
36 GLvoid* binary) {
37 *length = length_;
38 *format = format_;
39 memcpy(binary, binary_, length_);
40 }
41
42 void ProgramBinary(GLuint program,
43 GLenum format,
44 const GLvoid* binary,
45 GLsizei length) OVERRIDE {
46 // format and length are verified by matcher
47 const char* char_binary = static_cast<const char*>(binary);
48 for (int i = 0; i < length; i++) {
greggman 2012/07/12 00:48:29 EXPECT_EQ(0, memcmp(binary_, binary, length)); ?
greggman 2012/07/16 21:57:25 ping?
dmurph 2012/07/17 18:17:13 Done.
49 char expected = binary_[i];
50 EXPECT_EQ(expected, char_binary[i]);
51 }
52 }
53
54 GLsizei length() const { return length_; }
55 GLenum format() const { return format_; }
56 const char* binary() const { return binary_; }
57
58 private:
59 GLsizei length_;
60 GLenum format_;
61 const char* binary_;
62 };
63
64 class MemoryProgramCacheTest : public testing::Test {
65 public:
66 static const size_t kCacheSizeBytes = 1024;
67 static const GLuint kVertexShaderClientId = 90;
68 static const GLuint kVertexShaderServiceId = 100;
69 static const GLuint kFragmentShaderClientId = 91;
70 static const GLuint kFragmentShaderServiceId = 100;
71
72 MemoryProgramCacheTest()
73 : cache_(new MemoryProgramCache(kCacheSizeBytes)),
74 vertex_shader_(NULL),
75 fragment_shader_(NULL) { }
76 ~MemoryProgramCacheTest() {
77 shader_manager_.Destroy(false);
78 }
79
80 protected:
81 virtual void SetUp() {
82 gl_.reset(new ::testing::StrictMock<gfx::MockGLInterface>());
83 ::gfx::GLInterface::SetGLInterface(gl_.get());
84
85 vertex_shader_ = shader_manager_.CreateShaderInfo(kVertexShaderClientId,
86 kVertexShaderServiceId,
87 GL_VERTEX_SHADER);
88 fragment_shader_ = shader_manager_.CreateShaderInfo(
89 kFragmentShaderClientId,
90 kFragmentShaderServiceId,
91 GL_FRAGMENT_SHADER);
92 ASSERT_TRUE(vertex_shader_ != NULL);
93 ASSERT_TRUE(fragment_shader_ != NULL);
94 typedef ShaderTranslatorInterface::VariableInfo VariableInfo;
95 typedef ShaderTranslator::VariableMap VariableMap;
96 VariableMap vertex_attrib_map;
97 VariableMap vertex_uniform_map;
98 VariableMap fragment_attrib_map;
99 VariableMap fragment_uniform_map;
100
101 vertex_attrib_map["a"] = VariableInfo(1, 34, "a");
102 vertex_uniform_map["a"] = VariableInfo(0, 10, "a");
103 vertex_uniform_map["b"] = VariableInfo(2, 3114, "b");
104 fragment_attrib_map["jjjbb"] = VariableInfo(463, 1114, "jjjbb");
105 fragment_uniform_map["k"] = VariableInfo(10, 34413, "k");
106
107 vertex_shader_->SetAttribMap(vertex_attrib_map);
108 vertex_shader_->SetUniformMap(vertex_uniform_map);
109 fragment_shader_->SetAttribMap(vertex_attrib_map);
110 fragment_shader_->SetUniformMap(vertex_uniform_map);
111
112 vertex_shader_->UpdateSource("bbbalsldkdkdkd");
113 fragment_shader_->UpdateSource("bbbal sldkdkdkas 134 ad");
114
115 vertex_shader_->SetStatus(true, NULL, NULL);
116 fragment_shader_->SetStatus(true, NULL, NULL);
117 }
118
119 virtual void TearDown() {
120 ::gfx::GLInterface::SetGLInterface(NULL);
121 gl_.reset();
122 }
123
124 void SetExpectationsForSaveLinkedProgram(
125 const GLint program_id,
126 ProgramBinaryEmulator* emulator) const {
127 EXPECT_CALL(*gl_.get(),
128 GetProgramiv(program_id, GL_PROGRAM_BINARY_LENGTH_OES, _))
129 .WillOnce(SetArgPointee<2>(emulator->length()));
130 EXPECT_CALL(*gl_.get(),
131 GetProgramBinary(program_id, emulator->length(), _, _, _))
132 .WillOnce(Invoke(emulator, &ProgramBinaryEmulator::GetProgramBinary));
133 }
134
135 void SetExpectationsForLoadLinkedProgram(
136 const GLint program_id,
137 ProgramBinaryEmulator* emulator) const {
138 EXPECT_CALL(*gl_.get(),
139 ProgramBinary(program_id,
140 emulator->format(),
141 _,
142 emulator->length()))
143 .WillOnce(Invoke(emulator, &ProgramBinaryEmulator::ProgramBinary));
144 }
145
146 // Use StrictMock to make 100% sure we know how GL will be called.
147 scoped_ptr< ::testing::StrictMock<gfx::MockGLInterface> > gl_;
148 scoped_ptr<MemoryProgramCache> cache_;
149 ShaderManager shader_manager_;
150 ShaderManager::ShaderInfo* vertex_shader_;
151 ShaderManager::ShaderInfo* fragment_shader_;
152 };
153
154 TEST_F(MemoryProgramCacheTest, CacheSave) {
155 const GLenum kFormat = 1;
156 const int kProgramId = 10;
157 const int kBinaryLength = 20;
158 char testBinary[kBinaryLength];
159 for (int i = 0; i < kBinaryLength; ++i) {
160 testBinary[i] = i;
161 }
162 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, testBinary);
163
164 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator);
165 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL);
166
167 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus(
168 *vertex_shader_->source(),
169 *fragment_shader_->source(),
170 NULL));
171 }
172
173 TEST_F(MemoryProgramCacheTest, CacheLoadMatchesSave) {
174 typedef ShaderTranslator::VariableMap VariableMap;
175 const GLenum kFormat = 1;
176 const int kProgramId = 10;
177 const int kBinaryLength = 20;
178 char testBinary[kBinaryLength];
179 for (int i = 0; i < kBinaryLength; ++i) {
180 testBinary[i] = i;
181 }
182 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, testBinary);
183
184 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator);
185 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL);
186
187 VariableMap vertex_attrib_map = vertex_shader_->attrib_map();
188 VariableMap vertex_uniform_map = vertex_shader_->uniform_map();
189 VariableMap fragment_attrib_map = fragment_shader_->attrib_map();
190 VariableMap fragment_uniform_map = fragment_shader_->uniform_map();
191
192 vertex_shader_->SetAttribMap(VariableMap());
193 vertex_shader_->SetUniformMap(VariableMap());
194 fragment_shader_->SetAttribMap(VariableMap());
195 fragment_shader_->SetUniformMap(VariableMap());
196
197 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator);
198
199 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram(
200 kProgramId,
201 vertex_shader_,
202 fragment_shader_,
203 NULL));
204 EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map());
205 }
206
207 TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentSource) {
208 typedef ShaderTranslator::VariableMap VariableMap;
209 const GLenum kFormat = 1;
210 const int kProgramId = 10;
211 const int kBinaryLength = 20;
212 char testBinary[kBinaryLength];
213 for (int i = 0; i < kBinaryLength; ++i) {
214 testBinary[i] = i;
215 }
216 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, testBinary);
217
218 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator);
219 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL);
220
221 const std::string vertex_orig_source = *vertex_shader_->source();
222 vertex_shader_->UpdateSource("different!");
223 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram(
224 kProgramId,
225 vertex_shader_,
226 fragment_shader_,
227 NULL));
228
229 vertex_shader_->UpdateSource(vertex_orig_source.c_str());
230 fragment_shader_->UpdateSource("different!");
231 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram(
232 kProgramId,
233 vertex_shader_,
234 fragment_shader_,
235 NULL));
236 }
237
238 TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentMap) {
239 typedef ShaderTranslator::VariableMap VariableMap;
240 const GLenum kFormat = 1;
241 const int kProgramId = 10;
242 const int kBinaryLength = 20;
243 char testBinary[kBinaryLength];
244 for (int i = 0; i < kBinaryLength; ++i) {
245 testBinary[i] = i;
246 }
247 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, testBinary);
248
249 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator);
250 ProgramCache::LocationMap binding_map;
251 binding_map["test"] = 512;
252 cache_->SaveLinkedProgram(kProgramId,
253 vertex_shader_,
254 fragment_shader_,
255 &binding_map);
256
257 binding_map["different!"] = 59;
258 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram(
259 kProgramId,
260 vertex_shader_,
261 fragment_shader_,
262 &binding_map));
263 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram(
264 kProgramId,
265 vertex_shader_,
266 fragment_shader_,
267 NULL));
268 }
269
270 TEST_F(MemoryProgramCacheTest, MemoryProgramCacheEviction) {
271 typedef ShaderTranslator::VariableMap VariableMap;
272 const GLenum kFormat = 1;
273 const int kProgramId = 10;
274 const int kBinaryLength = 20;
275 char testBinary[kBinaryLength];
276 for (int i = 0; i < kBinaryLength; ++i) {
277 testBinary[i] = i;
278 }
279 ProgramBinaryEmulator emulator1(kBinaryLength, kFormat, testBinary);
280
281
282 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1);
283 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL);
284
285 const int kEvictingProgramId = 11;
286 const GLuint kEvictingBinaryLength = kCacheSizeBytes - kBinaryLength + 1;
287
288 // save old source and modify for new program
289 const std::string old_source(*fragment_shader_->source());
290 fragment_shader_->UpdateSource("al sdfkjdk");
291
292 scoped_array<char> bigTestBinary =
293 scoped_array<char>(new char[kEvictingBinaryLength]);
294 for (size_t i = 0; i < kEvictingBinaryLength; ++i) {
295 bigTestBinary[i] = i % 250;
296 }
297 ProgramBinaryEmulator emulator2(kEvictingBinaryLength,
298 kFormat,
299 bigTestBinary.get());
300
301 SetExpectationsForSaveLinkedProgram(kEvictingProgramId, &emulator2);
302 cache_->SaveLinkedProgram(kEvictingProgramId,
303 vertex_shader_,
304 fragment_shader_,
305 NULL);
306
307 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus(
308 *vertex_shader_->source(),
309 *fragment_shader_->source(),
310 NULL));
311 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, cache_->GetLinkedProgramStatus(
312 old_source,
313 *fragment_shader_->source(),
314 NULL));
315 }
316
317 } // namespace gles2
318 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/memory_program_cache.cc ('k') | gpu/command_buffer/service/mocks.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698