OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "gpu/command_buffer/service/memory_program_cache.h" | 5 #include "gpu/command_buffer/service/memory_program_cache.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 8 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
9 #include "gpu/command_buffer/service/gl_utils.h" | 9 #include "gpu/command_buffer/service/gl_utils.h" |
10 #include "gpu/command_buffer/service/gpu_service_test.h" | 10 #include "gpu/command_buffer/service/gpu_service_test.h" |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 const GLenum kFormat = 1; | 183 const GLenum kFormat = 1; |
184 const int kProgramId = 10; | 184 const int kProgramId = 10; |
185 const int kBinaryLength = 20; | 185 const int kBinaryLength = 20; |
186 char test_binary[kBinaryLength]; | 186 char test_binary[kBinaryLength]; |
187 for (int i = 0; i < kBinaryLength; ++i) { | 187 for (int i = 0; i < kBinaryLength; ++i) { |
188 test_binary[i] = i; | 188 test_binary[i] = i; |
189 } | 189 } |
190 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 190 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
191 | 191 |
192 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 192 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
193 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, | 193 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
194 fragment_shader_, NULL, NULL, | 194 fragment_shader_, NULL, |
195 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 195 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
196 base::Unretained(this))); | 196 base::Unretained(this))); |
197 | 197 |
198 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( | 198 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( |
199 vertex_shader_->last_compiled_source(), | 199 vertex_shader_->last_compiled_signature(), |
200 NULL, | 200 fragment_shader_->last_compiled_signature(), |
201 fragment_shader_->last_compiled_source(), | |
202 NULL, | |
203 NULL)); | 201 NULL)); |
204 EXPECT_EQ(1, shader_cache_count()); | 202 EXPECT_EQ(1, shader_cache_count()); |
205 } | 203 } |
206 | 204 |
207 TEST_F(MemoryProgramCacheTest, LoadProgram) { | 205 TEST_F(MemoryProgramCacheTest, LoadProgram) { |
208 const GLenum kFormat = 1; | 206 const GLenum kFormat = 1; |
209 const int kProgramId = 10; | 207 const int kProgramId = 10; |
210 const int kBinaryLength = 20; | 208 const int kBinaryLength = 20; |
211 char test_binary[kBinaryLength]; | 209 char test_binary[kBinaryLength]; |
212 for (int i = 0; i < kBinaryLength; ++i) { | 210 for (int i = 0; i < kBinaryLength; ++i) { |
213 test_binary[i] = i; | 211 test_binary[i] = i; |
214 } | 212 } |
215 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 213 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
216 | 214 |
217 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 215 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
218 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, | 216 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
219 fragment_shader_, NULL, NULL, | 217 fragment_shader_, NULL, |
220 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 218 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
221 base::Unretained(this))); | 219 base::Unretained(this))); |
222 | 220 |
223 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( | 221 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( |
224 vertex_shader_->last_compiled_source(), | 222 vertex_shader_->last_compiled_signature(), |
225 NULL, | 223 fragment_shader_->last_compiled_signature(), |
226 fragment_shader_->last_compiled_source(), | |
227 NULL, | |
228 NULL)); | 224 NULL)); |
229 EXPECT_EQ(1, shader_cache_count()); | 225 EXPECT_EQ(1, shader_cache_count()); |
230 | 226 |
231 cache_->Clear(); | 227 cache_->Clear(); |
232 | 228 |
233 cache_->LoadProgram(shader_cache_shader()); | 229 cache_->LoadProgram(shader_cache_shader()); |
234 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( | 230 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( |
235 vertex_shader_->last_compiled_source(), | 231 vertex_shader_->last_compiled_signature(), |
236 NULL, | 232 fragment_shader_->last_compiled_signature(), |
237 fragment_shader_->last_compiled_source(), | |
238 NULL, | |
239 NULL)); | 233 NULL)); |
240 } | 234 } |
241 | 235 |
242 TEST_F(MemoryProgramCacheTest, CacheLoadMatchesSave) { | 236 TEST_F(MemoryProgramCacheTest, CacheLoadMatchesSave) { |
243 const GLenum kFormat = 1; | 237 const GLenum kFormat = 1; |
244 const int kProgramId = 10; | 238 const int kProgramId = 10; |
245 const int kBinaryLength = 20; | 239 const int kBinaryLength = 20; |
246 char test_binary[kBinaryLength]; | 240 char test_binary[kBinaryLength]; |
247 for (int i = 0; i < kBinaryLength; ++i) { | 241 for (int i = 0; i < kBinaryLength; ++i) { |
248 test_binary[i] = i; | 242 test_binary[i] = i; |
249 } | 243 } |
250 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 244 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
251 | 245 |
252 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 246 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
253 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, | 247 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
254 fragment_shader_, NULL, NULL, | 248 fragment_shader_, NULL, |
255 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 249 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
256 base::Unretained(this))); | 250 base::Unretained(this))); |
257 EXPECT_EQ(1, shader_cache_count()); | 251 EXPECT_EQ(1, shader_cache_count()); |
258 | 252 |
259 AttributeMap vertex_attrib_map = vertex_shader_->attrib_map(); | 253 AttributeMap vertex_attrib_map = vertex_shader_->attrib_map(); |
260 UniformMap vertex_uniform_map = vertex_shader_->uniform_map(); | 254 UniformMap vertex_uniform_map = vertex_shader_->uniform_map(); |
261 VaryingMap vertex_varying_map = vertex_shader_->varying_map(); | 255 VaryingMap vertex_varying_map = vertex_shader_->varying_map(); |
262 AttributeMap fragment_attrib_map = fragment_shader_->attrib_map(); | 256 AttributeMap fragment_attrib_map = fragment_shader_->attrib_map(); |
263 UniformMap fragment_uniform_map = fragment_shader_->uniform_map(); | 257 UniformMap fragment_uniform_map = fragment_shader_->uniform_map(); |
264 VaryingMap fragment_varying_map = fragment_shader_->varying_map(); | 258 VaryingMap fragment_varying_map = fragment_shader_->varying_map(); |
265 | 259 |
266 vertex_shader_->set_attrib_map(AttributeMap()); | 260 vertex_shader_->set_attrib_map(AttributeMap()); |
267 vertex_shader_->set_uniform_map(UniformMap()); | 261 vertex_shader_->set_uniform_map(UniformMap()); |
268 vertex_shader_->set_varying_map(VaryingMap()); | 262 vertex_shader_->set_varying_map(VaryingMap()); |
269 fragment_shader_->set_attrib_map(AttributeMap()); | 263 fragment_shader_->set_attrib_map(AttributeMap()); |
270 fragment_shader_->set_uniform_map(UniformMap()); | 264 fragment_shader_->set_uniform_map(UniformMap()); |
271 fragment_shader_->set_varying_map(VaryingMap()); | 265 fragment_shader_->set_varying_map(VaryingMap()); |
272 | 266 |
273 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); | 267 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); |
274 | 268 |
275 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( | 269 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( |
276 kProgramId, | 270 kProgramId, |
277 vertex_shader_, | 271 vertex_shader_, |
278 NULL, | |
279 fragment_shader_, | 272 fragment_shader_, |
280 NULL, | 273 NULL, |
281 NULL, | |
282 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 274 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
283 base::Unretained(this)))); | 275 base::Unretained(this)))); |
284 | 276 |
285 // apparently the hash_map implementation on android doesn't have the | 277 // apparently the hash_map implementation on android doesn't have the |
286 // equality operator | 278 // equality operator |
287 #if !defined(OS_ANDROID) | 279 #if !defined(OS_ANDROID) |
288 EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); | 280 EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); |
289 EXPECT_EQ(vertex_uniform_map, vertex_shader_->uniform_map()); | 281 EXPECT_EQ(vertex_uniform_map, vertex_shader_->uniform_map()); |
290 EXPECT_EQ(vertex_varying_map, vertex_shader_->varying_map()); | 282 EXPECT_EQ(vertex_varying_map, vertex_shader_->varying_map()); |
291 EXPECT_EQ(fragment_attrib_map, fragment_shader_->attrib_map()); | 283 EXPECT_EQ(fragment_attrib_map, fragment_shader_->attrib_map()); |
292 EXPECT_EQ(fragment_uniform_map, fragment_shader_->uniform_map()); | 284 EXPECT_EQ(fragment_uniform_map, fragment_shader_->uniform_map()); |
293 EXPECT_EQ(fragment_varying_map, fragment_shader_->varying_map()); | 285 EXPECT_EQ(fragment_varying_map, fragment_shader_->varying_map()); |
294 #endif | 286 #endif |
295 } | 287 } |
296 | 288 |
297 TEST_F(MemoryProgramCacheTest, LoadProgramMatchesSave) { | 289 TEST_F(MemoryProgramCacheTest, LoadProgramMatchesSave) { |
298 const GLenum kFormat = 1; | 290 const GLenum kFormat = 1; |
299 const int kProgramId = 10; | 291 const int kProgramId = 10; |
300 const int kBinaryLength = 20; | 292 const int kBinaryLength = 20; |
301 char test_binary[kBinaryLength]; | 293 char test_binary[kBinaryLength]; |
302 for (int i = 0; i < kBinaryLength; ++i) { | 294 for (int i = 0; i < kBinaryLength; ++i) { |
303 test_binary[i] = i; | 295 test_binary[i] = i; |
304 } | 296 } |
305 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 297 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
306 | 298 |
307 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 299 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
308 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, | 300 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
309 fragment_shader_, NULL, NULL, | 301 fragment_shader_, NULL, |
310 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 302 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
311 base::Unretained(this))); | 303 base::Unretained(this))); |
312 EXPECT_EQ(1, shader_cache_count()); | 304 EXPECT_EQ(1, shader_cache_count()); |
313 | 305 |
314 AttributeMap vertex_attrib_map = vertex_shader_->attrib_map(); | 306 AttributeMap vertex_attrib_map = vertex_shader_->attrib_map(); |
315 UniformMap vertex_uniform_map = vertex_shader_->uniform_map(); | 307 UniformMap vertex_uniform_map = vertex_shader_->uniform_map(); |
316 VaryingMap vertex_varying_map = vertex_shader_->varying_map(); | 308 VaryingMap vertex_varying_map = vertex_shader_->varying_map(); |
317 AttributeMap fragment_attrib_map = fragment_shader_->attrib_map(); | 309 AttributeMap fragment_attrib_map = fragment_shader_->attrib_map(); |
318 UniformMap fragment_uniform_map = fragment_shader_->uniform_map(); | 310 UniformMap fragment_uniform_map = fragment_shader_->uniform_map(); |
319 VaryingMap fragment_varying_map = fragment_shader_->varying_map(); | 311 VaryingMap fragment_varying_map = fragment_shader_->varying_map(); |
320 | 312 |
321 vertex_shader_->set_attrib_map(AttributeMap()); | 313 vertex_shader_->set_attrib_map(AttributeMap()); |
322 vertex_shader_->set_uniform_map(UniformMap()); | 314 vertex_shader_->set_uniform_map(UniformMap()); |
323 vertex_shader_->set_varying_map(VaryingMap()); | 315 vertex_shader_->set_varying_map(VaryingMap()); |
324 fragment_shader_->set_attrib_map(AttributeMap()); | 316 fragment_shader_->set_attrib_map(AttributeMap()); |
325 fragment_shader_->set_uniform_map(UniformMap()); | 317 fragment_shader_->set_uniform_map(UniformMap()); |
326 fragment_shader_->set_varying_map(VaryingMap()); | 318 fragment_shader_->set_varying_map(VaryingMap()); |
327 | 319 |
328 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); | 320 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); |
329 | 321 |
330 cache_->Clear(); | 322 cache_->Clear(); |
331 cache_->LoadProgram(shader_cache_shader()); | 323 cache_->LoadProgram(shader_cache_shader()); |
332 | 324 |
333 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( | 325 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( |
334 kProgramId, | 326 kProgramId, |
335 vertex_shader_, | 327 vertex_shader_, |
336 NULL, | |
337 fragment_shader_, | 328 fragment_shader_, |
338 NULL, | 329 NULL, |
339 NULL, | |
340 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 330 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
341 base::Unretained(this)))); | 331 base::Unretained(this)))); |
342 | 332 |
343 // apparently the hash_map implementation on android doesn't have the | 333 // apparently the hash_map implementation on android doesn't have the |
344 // equality operator | 334 // equality operator |
345 #if !defined(OS_ANDROID) | 335 #if !defined(OS_ANDROID) |
346 EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); | 336 EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); |
347 EXPECT_EQ(vertex_uniform_map, vertex_shader_->uniform_map()); | 337 EXPECT_EQ(vertex_uniform_map, vertex_shader_->uniform_map()); |
348 EXPECT_EQ(vertex_varying_map, vertex_shader_->varying_map()); | 338 EXPECT_EQ(vertex_varying_map, vertex_shader_->varying_map()); |
349 EXPECT_EQ(fragment_attrib_map, fragment_shader_->attrib_map()); | 339 EXPECT_EQ(fragment_attrib_map, fragment_shader_->attrib_map()); |
350 EXPECT_EQ(fragment_uniform_map, fragment_shader_->uniform_map()); | 340 EXPECT_EQ(fragment_uniform_map, fragment_shader_->uniform_map()); |
351 EXPECT_EQ(fragment_varying_map, fragment_shader_->varying_map()); | 341 EXPECT_EQ(fragment_varying_map, fragment_shader_->varying_map()); |
352 #endif | 342 #endif |
353 } | 343 } |
354 | 344 |
355 TEST_F(MemoryProgramCacheTest, LoadFailOnLinkFalse) { | 345 TEST_F(MemoryProgramCacheTest, LoadFailOnLinkFalse) { |
356 const GLenum kFormat = 1; | 346 const GLenum kFormat = 1; |
357 const int kProgramId = 10; | 347 const int kProgramId = 10; |
358 const int kBinaryLength = 20; | 348 const int kBinaryLength = 20; |
359 char test_binary[kBinaryLength]; | 349 char test_binary[kBinaryLength]; |
360 for (int i = 0; i < kBinaryLength; ++i) { | 350 for (int i = 0; i < kBinaryLength; ++i) { |
361 test_binary[i] = i; | 351 test_binary[i] = i; |
362 } | 352 } |
363 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 353 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
364 | 354 |
365 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 355 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
366 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, | 356 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
367 fragment_shader_, NULL, NULL, | 357 fragment_shader_, NULL, |
368 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 358 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
369 base::Unretained(this))); | 359 base::Unretained(this))); |
370 | 360 |
371 SetExpectationsForLoadLinkedProgramFailure(kProgramId, &emulator); | 361 SetExpectationsForLoadLinkedProgramFailure(kProgramId, &emulator); |
372 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( | 362 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( |
373 kProgramId, | 363 kProgramId, |
374 vertex_shader_, | 364 vertex_shader_, |
375 NULL, | |
376 fragment_shader_, | 365 fragment_shader_, |
377 NULL, | 366 NULL, |
378 NULL, | |
379 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 367 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
380 base::Unretained(this)))); | 368 base::Unretained(this)))); |
381 } | 369 } |
382 | 370 |
383 TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentSource) { | 371 TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentSource) { |
384 const GLenum kFormat = 1; | 372 const GLenum kFormat = 1; |
385 const int kProgramId = 10; | 373 const int kProgramId = 10; |
386 const int kBinaryLength = 20; | 374 const int kBinaryLength = 20; |
387 char test_binary[kBinaryLength]; | 375 char test_binary[kBinaryLength]; |
388 for (int i = 0; i < kBinaryLength; ++i) { | 376 for (int i = 0; i < kBinaryLength; ++i) { |
389 test_binary[i] = i; | 377 test_binary[i] = i; |
390 } | 378 } |
391 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 379 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
392 | 380 |
393 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 381 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
394 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, | 382 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
395 fragment_shader_, NULL, NULL, | 383 fragment_shader_, NULL, |
396 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 384 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
397 base::Unretained(this))); | 385 base::Unretained(this))); |
398 | 386 |
399 const std::string vertex_orig_source = vertex_shader_->last_compiled_source(); | 387 const std::string vertex_orig_source = vertex_shader_->last_compiled_source(); |
400 vertex_shader_->set_source("different!"); | 388 vertex_shader_->set_source("different!"); |
401 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); | 389 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); |
402 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( | 390 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( |
403 kProgramId, | 391 kProgramId, |
404 vertex_shader_, | 392 vertex_shader_, |
405 NULL, | |
406 fragment_shader_, | 393 fragment_shader_, |
407 NULL, | 394 NULL, |
408 NULL, | |
409 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 395 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
410 base::Unretained(this)))); | 396 base::Unretained(this)))); |
411 | 397 |
412 vertex_shader_->set_source(vertex_orig_source); | 398 vertex_shader_->set_source(vertex_orig_source); |
413 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); | 399 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); |
414 fragment_shader_->set_source("different!"); | 400 fragment_shader_->set_source("different!"); |
415 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); | 401 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); |
416 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( | 402 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( |
417 kProgramId, | 403 kProgramId, |
418 vertex_shader_, | 404 vertex_shader_, |
419 NULL, | |
420 fragment_shader_, | 405 fragment_shader_, |
421 NULL, | 406 NULL, |
422 NULL, | |
423 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 407 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
424 base::Unretained(this)))); | 408 base::Unretained(this)))); |
425 } | 409 } |
426 | 410 |
427 TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentMap) { | 411 TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentMap) { |
428 const GLenum kFormat = 1; | 412 const GLenum kFormat = 1; |
429 const int kProgramId = 10; | 413 const int kProgramId = 10; |
430 const int kBinaryLength = 20; | 414 const int kBinaryLength = 20; |
431 char test_binary[kBinaryLength]; | 415 char test_binary[kBinaryLength]; |
432 for (int i = 0; i < kBinaryLength; ++i) { | 416 for (int i = 0; i < kBinaryLength; ++i) { |
433 test_binary[i] = i; | 417 test_binary[i] = i; |
434 } | 418 } |
435 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 419 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
436 | 420 |
437 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 421 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
438 ProgramCache::LocationMap binding_map; | 422 ProgramCache::LocationMap binding_map; |
439 binding_map["test"] = 512; | 423 binding_map["test"] = 512; |
440 cache_->SaveLinkedProgram(kProgramId, | 424 cache_->SaveLinkedProgram(kProgramId, |
441 vertex_shader_, | 425 vertex_shader_, |
442 NULL, | |
443 fragment_shader_, | 426 fragment_shader_, |
444 NULL, | |
445 &binding_map, | 427 &binding_map, |
446 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 428 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
447 base::Unretained(this))); | 429 base::Unretained(this))); |
448 | 430 |
449 binding_map["different!"] = 59; | 431 binding_map["different!"] = 59; |
450 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( | 432 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( |
451 kProgramId, | 433 kProgramId, |
452 vertex_shader_, | 434 vertex_shader_, |
453 NULL, | |
454 fragment_shader_, | 435 fragment_shader_, |
455 NULL, | |
456 &binding_map, | 436 &binding_map, |
457 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 437 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
458 base::Unretained(this)))); | 438 base::Unretained(this)))); |
459 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( | 439 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( |
460 kProgramId, | 440 kProgramId, |
461 vertex_shader_, | 441 vertex_shader_, |
462 NULL, | |
463 fragment_shader_, | 442 fragment_shader_, |
464 NULL, | 443 NULL, |
465 NULL, | |
466 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 444 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
467 base::Unretained(this)))); | 445 base::Unretained(this)))); |
468 } | 446 } |
469 | 447 |
470 TEST_F(MemoryProgramCacheTest, MemoryProgramCacheEviction) { | 448 TEST_F(MemoryProgramCacheTest, MemoryProgramCacheEviction) { |
471 const GLenum kFormat = 1; | 449 const GLenum kFormat = 1; |
472 const int kProgramId = 10; | 450 const int kProgramId = 10; |
473 const int kBinaryLength = 20; | 451 const int kBinaryLength = 20; |
474 char test_binary[kBinaryLength]; | 452 char test_binary[kBinaryLength]; |
475 for (int i = 0; i < kBinaryLength; ++i) { | 453 for (int i = 0; i < kBinaryLength; ++i) { |
476 test_binary[i] = i; | 454 test_binary[i] = i; |
477 } | 455 } |
478 ProgramBinaryEmulator emulator1(kBinaryLength, kFormat, test_binary); | 456 ProgramBinaryEmulator emulator1(kBinaryLength, kFormat, test_binary); |
479 | 457 |
480 | 458 |
481 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1); | 459 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1); |
482 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, | 460 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
483 fragment_shader_, NULL, NULL, | 461 fragment_shader_, NULL, |
484 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 462 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
485 base::Unretained(this))); | 463 base::Unretained(this))); |
486 | 464 |
487 const int kEvictingProgramId = 11; | 465 const int kEvictingProgramId = 11; |
488 const GLuint kEvictingBinaryLength = kCacheSizeBytes - kBinaryLength + 1; | 466 const GLuint kEvictingBinaryLength = kCacheSizeBytes - kBinaryLength + 1; |
489 | 467 |
490 // save old source and modify for new program | 468 // save old source and modify for new program |
491 const std::string& old_source = fragment_shader_->last_compiled_source(); | 469 const std::string& old_sig = fragment_shader_->last_compiled_signature(); |
492 fragment_shader_->set_source("al sdfkjdk"); | 470 fragment_shader_->set_source("al sdfkjdk"); |
493 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); | 471 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); |
494 | 472 |
495 scoped_ptr<char[]> bigTestBinary = | 473 scoped_ptr<char[]> bigTestBinary = |
496 scoped_ptr<char[]>(new char[kEvictingBinaryLength]); | 474 scoped_ptr<char[]>(new char[kEvictingBinaryLength]); |
497 for (size_t i = 0; i < kEvictingBinaryLength; ++i) { | 475 for (size_t i = 0; i < kEvictingBinaryLength; ++i) { |
498 bigTestBinary[i] = i % 250; | 476 bigTestBinary[i] = i % 250; |
499 } | 477 } |
500 ProgramBinaryEmulator emulator2(kEvictingBinaryLength, | 478 ProgramBinaryEmulator emulator2(kEvictingBinaryLength, |
501 kFormat, | 479 kFormat, |
502 bigTestBinary.get()); | 480 bigTestBinary.get()); |
503 | 481 |
504 SetExpectationsForSaveLinkedProgram(kEvictingProgramId, &emulator2); | 482 SetExpectationsForSaveLinkedProgram(kEvictingProgramId, &emulator2); |
505 cache_->SaveLinkedProgram(kEvictingProgramId, | 483 cache_->SaveLinkedProgram(kEvictingProgramId, |
506 vertex_shader_, | 484 vertex_shader_, |
507 NULL, | |
508 fragment_shader_, | 485 fragment_shader_, |
509 NULL, | 486 NULL, |
510 NULL, | |
511 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 487 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
512 base::Unretained(this))); | 488 base::Unretained(this))); |
513 | 489 |
514 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( | 490 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( |
515 vertex_shader_->last_compiled_source(), | 491 vertex_shader_->last_compiled_signature(), |
516 NULL, | 492 fragment_shader_->last_compiled_signature(), |
517 fragment_shader_->last_compiled_source(), | |
518 NULL, | |
519 NULL)); | 493 NULL)); |
520 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, cache_->GetLinkedProgramStatus( | 494 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, cache_->GetLinkedProgramStatus( |
521 old_source, | 495 old_sig, |
522 NULL, | 496 fragment_shader_->last_compiled_signature(), |
523 fragment_shader_->last_compiled_source(), | |
524 NULL, | |
525 NULL)); | 497 NULL)); |
526 } | 498 } |
527 | 499 |
528 TEST_F(MemoryProgramCacheTest, SaveCorrectProgram) { | 500 TEST_F(MemoryProgramCacheTest, SaveCorrectProgram) { |
529 const GLenum kFormat = 1; | 501 const GLenum kFormat = 1; |
530 const int kProgramId = 10; | 502 const int kProgramId = 10; |
531 const int kBinaryLength = 20; | 503 const int kBinaryLength = 20; |
532 char test_binary[kBinaryLength]; | 504 char test_binary[kBinaryLength]; |
533 for (int i = 0; i < kBinaryLength; ++i) { | 505 for (int i = 0; i < kBinaryLength; ++i) { |
534 test_binary[i] = i; | 506 test_binary[i] = i; |
535 } | 507 } |
536 ProgramBinaryEmulator emulator1(kBinaryLength, kFormat, test_binary); | 508 ProgramBinaryEmulator emulator1(kBinaryLength, kFormat, test_binary); |
537 | 509 |
538 vertex_shader_->set_source("different!"); | 510 vertex_shader_->set_source("different!"); |
539 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1); | 511 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1); |
540 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, | 512 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
541 fragment_shader_, NULL, NULL, | 513 fragment_shader_, NULL, |
542 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 514 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
543 base::Unretained(this))); | 515 base::Unretained(this))); |
544 | 516 |
545 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( | 517 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( |
546 vertex_shader_->last_compiled_source(), | 518 vertex_shader_->last_compiled_signature(), |
547 NULL, | 519 fragment_shader_->last_compiled_signature(), |
548 fragment_shader_->last_compiled_source(), | |
549 NULL, | |
550 NULL)); | 520 NULL)); |
551 } | 521 } |
552 | 522 |
553 TEST_F(MemoryProgramCacheTest, LoadCorrectProgram) { | 523 TEST_F(MemoryProgramCacheTest, LoadCorrectProgram) { |
554 const GLenum kFormat = 1; | 524 const GLenum kFormat = 1; |
555 const int kProgramId = 10; | 525 const int kProgramId = 10; |
556 const int kBinaryLength = 20; | 526 const int kBinaryLength = 20; |
557 char test_binary[kBinaryLength]; | 527 char test_binary[kBinaryLength]; |
558 for (int i = 0; i < kBinaryLength; ++i) { | 528 for (int i = 0; i < kBinaryLength; ++i) { |
559 test_binary[i] = i; | 529 test_binary[i] = i; |
560 } | 530 } |
561 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 531 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
562 | 532 |
563 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 533 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
564 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, | 534 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
565 fragment_shader_, NULL, NULL, | 535 fragment_shader_, NULL, |
566 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 536 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
567 base::Unretained(this))); | 537 base::Unretained(this))); |
568 | 538 |
569 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( | 539 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( |
570 vertex_shader_->last_compiled_source(), | 540 vertex_shader_->last_compiled_signature(), |
571 NULL, | 541 fragment_shader_->last_compiled_signature(), |
572 fragment_shader_->last_compiled_source(), | |
573 NULL, | |
574 NULL)); | 542 NULL)); |
575 | 543 |
576 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); | 544 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); |
577 | 545 |
578 fragment_shader_->set_source("different!"); | 546 fragment_shader_->set_source("different!"); |
579 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( | 547 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( |
580 kProgramId, | 548 kProgramId, |
581 vertex_shader_, | 549 vertex_shader_, |
582 NULL, | |
583 fragment_shader_, | 550 fragment_shader_, |
584 NULL, | 551 NULL, |
585 NULL, | |
586 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 552 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
587 base::Unretained(this)))); | 553 base::Unretained(this)))); |
588 } | 554 } |
589 | 555 |
590 TEST_F(MemoryProgramCacheTest, OverwriteOnNewSave) { | 556 TEST_F(MemoryProgramCacheTest, OverwriteOnNewSave) { |
591 const GLenum kFormat = 1; | 557 const GLenum kFormat = 1; |
592 const int kProgramId = 10; | 558 const int kProgramId = 10; |
593 const int kBinaryLength = 20; | 559 const int kBinaryLength = 20; |
594 char test_binary[kBinaryLength]; | 560 char test_binary[kBinaryLength]; |
595 for (int i = 0; i < kBinaryLength; ++i) { | 561 for (int i = 0; i < kBinaryLength; ++i) { |
596 test_binary[i] = i; | 562 test_binary[i] = i; |
597 } | 563 } |
598 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); | 564 ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); |
599 | 565 |
600 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); | 566 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); |
601 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, | 567 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
602 fragment_shader_, NULL, NULL, | 568 fragment_shader_, NULL, |
603 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 569 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
604 base::Unretained(this))); | 570 base::Unretained(this))); |
605 | 571 |
606 | 572 |
607 char test_binary2[kBinaryLength]; | 573 char test_binary2[kBinaryLength]; |
608 for (int i = 0; i < kBinaryLength; ++i) { | 574 for (int i = 0; i < kBinaryLength; ++i) { |
609 test_binary2[i] = (i*2) % 250; | 575 test_binary2[i] = (i*2) % 250; |
610 } | 576 } |
611 ProgramBinaryEmulator emulator2(kBinaryLength, kFormat, test_binary2); | 577 ProgramBinaryEmulator emulator2(kBinaryLength, kFormat, test_binary2); |
612 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator2); | 578 SetExpectationsForSaveLinkedProgram(kProgramId, &emulator2); |
613 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, | 579 cache_->SaveLinkedProgram(kProgramId, vertex_shader_, |
614 fragment_shader_, NULL, NULL, | 580 fragment_shader_, NULL, |
615 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 581 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
616 base::Unretained(this))); | 582 base::Unretained(this))); |
617 | 583 |
618 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator2); | 584 SetExpectationsForLoadLinkedProgram(kProgramId, &emulator2); |
619 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( | 585 EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( |
620 kProgramId, | 586 kProgramId, |
621 vertex_shader_, | 587 vertex_shader_, |
622 NULL, | |
623 fragment_shader_, | 588 fragment_shader_, |
624 NULL, | 589 NULL, |
625 NULL, | |
626 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, | 590 base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, |
627 base::Unretained(this)))); | 591 base::Unretained(this)))); |
628 } | 592 } |
629 | 593 |
630 } // namespace gles2 | 594 } // namespace gles2 |
631 } // namespace gpu | 595 } // namespace gpu |
OLD | NEW |