OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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 "config.h" | 5 #include "config.h" |
6 | 6 |
7 #include "CCTextureUpdateController.h" | 7 #include "CCTextureUpdateController.h" |
8 | 8 |
9 #include "CCSchedulerTestCommon.h" | 9 #include "CCSchedulerTestCommon.h" |
10 #include "CCSingleThreadProxy.h" // For DebugScopedSetImplThread | 10 #include "CCSingleThreadProxy.h" // For DebugScopedSetImplThread |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 { | 237 { |
238 m_test->onUpload(); | 238 m_test->onUpload(); |
239 } | 239 } |
240 | 240 |
241 | 241 |
242 // ZERO UPLOADS TESTS | 242 // ZERO UPLOADS TESTS |
243 TEST_F(CCTextureUpdateControllerTest, ZeroUploads) | 243 TEST_F(CCTextureUpdateControllerTest, ZeroUploads) |
244 { | 244 { |
245 appendFullUploadsToUpdateQueue(0); | 245 appendFullUploadsToUpdateQueue(0); |
246 appendPartialUploadsToUpdateQueue(0); | 246 appendPartialUploadsToUpdateQueue(0); |
247 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get(), m_totalUploadCountExpected); | 247 DebugScopedSetImplThread implThread; |
| 248 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get()); |
248 | 249 |
249 EXPECT_EQ(0, m_numBeginUploads); | |
250 EXPECT_EQ(0, m_numEndUploads); | |
251 EXPECT_EQ(0, m_numPreviousFlushes); | 250 EXPECT_EQ(0, m_numPreviousFlushes); |
252 EXPECT_EQ(0, m_numPreviousUploads); | 251 EXPECT_EQ(0, m_numPreviousUploads); |
253 } | 252 } |
254 | 253 |
255 | 254 |
256 // ONE UPLOAD TESTS | 255 // ONE UPLOAD TESTS |
257 TEST_F(CCTextureUpdateControllerTest, OneFullUpload) | 256 TEST_F(CCTextureUpdateControllerTest, OneFullUpload) |
258 { | 257 { |
259 appendFullUploadsToUpdateQueue(1); | 258 appendFullUploadsToUpdateQueue(1); |
260 appendPartialUploadsToUpdateQueue(0); | 259 appendPartialUploadsToUpdateQueue(0); |
261 DebugScopedSetImplThread implThread; | 260 DebugScopedSetImplThread implThread; |
262 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get(), m_totalUploadCountExpected); | 261 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get()); |
263 | 262 |
264 EXPECT_EQ(1, m_numBeginUploads); | |
265 EXPECT_EQ(1, m_numEndUploads); | |
266 EXPECT_EQ(1, m_numPreviousFlushes); | 263 EXPECT_EQ(1, m_numPreviousFlushes); |
267 EXPECT_EQ(1, m_numPreviousUploads); | 264 EXPECT_EQ(1, m_numPreviousUploads); |
268 } | 265 } |
269 | 266 |
270 TEST_F(CCTextureUpdateControllerTest, OnePartialUpload) | 267 TEST_F(CCTextureUpdateControllerTest, OnePartialUpload) |
271 { | 268 { |
272 appendFullUploadsToUpdateQueue(0); | 269 appendFullUploadsToUpdateQueue(0); |
273 appendPartialUploadsToUpdateQueue(1); | 270 appendPartialUploadsToUpdateQueue(1); |
274 DebugScopedSetImplThread implThread; | 271 DebugScopedSetImplThread implThread; |
275 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get(), m_totalUploadCountExpected); | 272 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get()); |
276 | 273 |
277 EXPECT_EQ(1, m_numBeginUploads); | |
278 EXPECT_EQ(1, m_numEndUploads); | |
279 EXPECT_EQ(1, m_numPreviousFlushes); | 274 EXPECT_EQ(1, m_numPreviousFlushes); |
280 EXPECT_EQ(1, m_numPreviousUploads); | 275 EXPECT_EQ(1, m_numPreviousUploads); |
281 } | 276 } |
282 | 277 |
283 TEST_F(CCTextureUpdateControllerTest, OneFullOnePartialUpload) | 278 TEST_F(CCTextureUpdateControllerTest, OneFullOnePartialUpload) |
284 { | 279 { |
285 appendFullUploadsToUpdateQueue(1); | 280 appendFullUploadsToUpdateQueue(1); |
286 appendPartialUploadsToUpdateQueue(1); | 281 appendPartialUploadsToUpdateQueue(1); |
287 DebugScopedSetImplThread implThread; | 282 DebugScopedSetImplThread implThread; |
288 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get(), m_totalUploadCountExpected); | 283 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get()); |
289 | 284 |
290 // We expect the full uploads to be followed by a flush | 285 EXPECT_EQ(1, m_numPreviousFlushes); |
291 // before the partial uploads begin. | |
292 EXPECT_EQ(1, m_numBeginUploads); | |
293 EXPECT_EQ(1, m_numEndUploads); | |
294 EXPECT_EQ(2, m_numPreviousFlushes); | |
295 EXPECT_EQ(2, m_numPreviousUploads); | 286 EXPECT_EQ(2, m_numPreviousUploads); |
296 } | 287 } |
297 | 288 |
298 | 289 |
299 // NO REMAINDER TESTS | |
300 // This class of tests upload a number of textures that is a multiple of the flu
sh period. | 290 // This class of tests upload a number of textures that is a multiple of the flu
sh period. |
301 const int fullUploadFlushMultipler = 7; | 291 const int fullUploadFlushMultipler = 7; |
302 const int fullNoRemainderCount = fullUploadFlushMultipler * kFlushPeriodFull; | 292 const int fullCount = fullUploadFlushMultipler * kFlushPeriodFull; |
303 | 293 |
304 const int partialUploadFlushMultipler = 11; | 294 const int partialUploadFlushMultipler = 11; |
305 const int partialNoRemainderCount = partialUploadFlushMultipler * kFlushPeriodPa
rtial; | 295 const int partialCount = partialUploadFlushMultipler * kFlushPeriodPartial; |
306 | 296 |
307 TEST_F(CCTextureUpdateControllerTest, ManyFullUploadsNoRemainder) | 297 TEST_F(CCTextureUpdateControllerTest, ManyFullUploads) |
308 { | 298 { |
309 appendFullUploadsToUpdateQueue(fullNoRemainderCount); | 299 appendFullUploadsToUpdateQueue(fullCount); |
310 appendPartialUploadsToUpdateQueue(0); | 300 appendPartialUploadsToUpdateQueue(0); |
311 DebugScopedSetImplThread implThread; | 301 DebugScopedSetImplThread implThread; |
312 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get(), m_totalUploadCountExpected); | 302 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get()); |
313 | 303 |
314 EXPECT_EQ(1, m_numBeginUploads); | |
315 EXPECT_EQ(1, m_numEndUploads); | |
316 EXPECT_EQ(fullUploadFlushMultipler, m_numPreviousFlushes); | 304 EXPECT_EQ(fullUploadFlushMultipler, m_numPreviousFlushes); |
317 EXPECT_EQ(fullNoRemainderCount, m_numPreviousUploads); | 305 EXPECT_EQ(fullCount, m_numPreviousUploads); |
318 } | 306 } |
319 | 307 |
320 TEST_F(CCTextureUpdateControllerTest, ManyPartialUploadsNoRemainder) | 308 TEST_F(CCTextureUpdateControllerTest, ManyPartialUploads) |
321 { | 309 { |
322 appendFullUploadsToUpdateQueue(0); | 310 appendFullUploadsToUpdateQueue(0); |
323 appendPartialUploadsToUpdateQueue(partialNoRemainderCount); | 311 appendPartialUploadsToUpdateQueue(partialCount); |
324 DebugScopedSetImplThread implThread; | 312 DebugScopedSetImplThread implThread; |
325 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get(), m_totalUploadCountExpected); | 313 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get()); |
326 | 314 |
327 EXPECT_EQ(1, m_numBeginUploads); | |
328 EXPECT_EQ(1, m_numEndUploads); | |
329 EXPECT_EQ(partialUploadFlushMultipler, m_numPreviousFlushes); | 315 EXPECT_EQ(partialUploadFlushMultipler, m_numPreviousFlushes); |
330 EXPECT_EQ(partialNoRemainderCount, m_numPreviousUploads); | 316 EXPECT_EQ(partialCount, m_numPreviousUploads); |
331 } | 317 } |
332 | 318 |
333 TEST_F(CCTextureUpdateControllerTest, ManyFullManyPartialUploadsNoRemainder) | 319 TEST_F(CCTextureUpdateControllerTest, ManyFullManyPartialUploads) |
334 { | 320 { |
335 appendFullUploadsToUpdateQueue(fullNoRemainderCount); | 321 appendFullUploadsToUpdateQueue(fullCount); |
336 appendPartialUploadsToUpdateQueue(partialNoRemainderCount); | 322 appendPartialUploadsToUpdateQueue(partialCount); |
337 DebugScopedSetImplThread implThread; | 323 DebugScopedSetImplThread implThread; |
338 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get(), m_totalUploadCountExpected); | 324 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get()); |
339 | 325 |
340 EXPECT_EQ(1, m_numBeginUploads); | |
341 EXPECT_EQ(1, m_numEndUploads); | |
342 EXPECT_EQ(fullUploadFlushMultipler + partialUploadFlushMultipler, m_numPrevi
ousFlushes); | 326 EXPECT_EQ(fullUploadFlushMultipler + partialUploadFlushMultipler, m_numPrevi
ousFlushes); |
343 EXPECT_EQ(fullNoRemainderCount + partialNoRemainderCount, m_numPreviousUploa
ds); | 327 EXPECT_EQ(fullCount + partialCount, m_numPreviousUploads); |
344 } | |
345 | |
346 | |
347 // MIN/MAX REMAINDER TESTS | |
348 // This class of tests mix and match uploading 1 more and 1 less texture | |
349 // than a multiple of the flush period. | |
350 | |
351 const int fullMinRemainderCount = fullNoRemainderCount + 1; | |
352 const int fullMaxRemainderCount = fullNoRemainderCount - 1; | |
353 const int partialMinRemainderCount = partialNoRemainderCount + 1; | |
354 const int partialMaxRemainderCount = partialNoRemainderCount - 1; | |
355 | |
356 TEST_F(CCTextureUpdateControllerTest, ManyFullAndPartialMinRemainder) | |
357 { | |
358 appendFullUploadsToUpdateQueue(fullMinRemainderCount); | |
359 appendPartialUploadsToUpdateQueue(partialMinRemainderCount); | |
360 DebugScopedSetImplThread implThread; | |
361 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get(), m_totalUploadCountExpected); | |
362 | |
363 EXPECT_EQ(1, m_numBeginUploads); | |
364 EXPECT_EQ(1, m_numEndUploads); | |
365 EXPECT_EQ(fullUploadFlushMultipler + partialUploadFlushMultipler + 2, m_numP
reviousFlushes); | |
366 EXPECT_EQ(fullMinRemainderCount + partialMinRemainderCount, m_numPreviousUpl
oads); | |
367 } | |
368 | |
369 TEST_F(CCTextureUpdateControllerTest, ManyFullAndPartialUploadsMaxRemainder) | |
370 { | |
371 appendFullUploadsToUpdateQueue(fullMaxRemainderCount); | |
372 appendPartialUploadsToUpdateQueue(partialMaxRemainderCount); | |
373 DebugScopedSetImplThread implThread; | |
374 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get(), m_totalUploadCountExpected); | |
375 | |
376 EXPECT_EQ(1, m_numBeginUploads); | |
377 EXPECT_EQ(1, m_numEndUploads); | |
378 EXPECT_EQ(fullUploadFlushMultipler + partialUploadFlushMultipler, m_numPrevi
ousFlushes); | |
379 EXPECT_EQ(fullMaxRemainderCount + partialMaxRemainderCount, m_numPreviousUpl
oads); | |
380 } | |
381 | |
382 TEST_F(CCTextureUpdateControllerTest, ManyFullMinRemainderManyPartialMaxRemainde
r) | |
383 { | |
384 appendFullUploadsToUpdateQueue(fullMinRemainderCount); | |
385 appendPartialUploadsToUpdateQueue(partialMaxRemainderCount); | |
386 DebugScopedSetImplThread implThread; | |
387 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get(), m_totalUploadCountExpected); | |
388 | |
389 EXPECT_EQ(1, m_numBeginUploads); | |
390 EXPECT_EQ(1, m_numEndUploads); | |
391 EXPECT_EQ((fullUploadFlushMultipler+1) + partialUploadFlushMultipler, m_numP
reviousFlushes); | |
392 EXPECT_EQ(fullMinRemainderCount + partialMaxRemainderCount, m_numPreviousUpl
oads); | |
393 } | |
394 | |
395 TEST_F(CCTextureUpdateControllerTest, ManyFullMaxRemainderManyPartialMinRemainde
r) | |
396 { | |
397 appendFullUploadsToUpdateQueue(fullMaxRemainderCount); | |
398 appendPartialUploadsToUpdateQueue(partialMinRemainderCount); | |
399 DebugScopedSetImplThread implThread; | |
400 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get(), m_totalUploadCountExpected); | |
401 | |
402 EXPECT_EQ(1, m_numBeginUploads); | |
403 EXPECT_EQ(1, m_numEndUploads); | |
404 EXPECT_EQ(fullUploadFlushMultipler + (partialUploadFlushMultipler+1), m_numP
reviousFlushes); | |
405 EXPECT_EQ(fullMaxRemainderCount + partialMinRemainderCount, m_numPreviousUpl
oads); | |
406 } | |
407 | |
408 | |
409 // MULTIPLE UPDATE TESTS | |
410 // These tests attempt to upload too many textures at once, requiring | |
411 // multiple calls to update(). | |
412 | |
413 int expectedFlushes(int uploads, int flushPeriod) | |
414 { | |
415 return (uploads + flushPeriod - 1) / flushPeriod; | |
416 } | |
417 | |
418 TEST_F(CCTextureUpdateControllerTest, TripleUpdateFinalUpdateFullAndPartial) | |
419 { | |
420 const int kMaxUploadsPerUpdate = 40; | |
421 const int kFullUploads = 100; | |
422 const int kPartialUploads = 20; | |
423 | |
424 int expectedPreviousFlushes = 0; | |
425 int expectedPreviousUploads = 0; | |
426 | |
427 setMaxUploadCountPerUpdate(kMaxUploadsPerUpdate); | |
428 appendFullUploadsToUpdateQueue(kFullUploads); | |
429 appendPartialUploadsToUpdateQueue(kPartialUploads); | |
430 | |
431 // First update (40 full) | |
432 DebugScopedSetImplThread implThread; | |
433 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get(), kMaxUploadsPerUpdate); | |
434 | |
435 EXPECT_EQ(1, m_numBeginUploads); | |
436 EXPECT_EQ(1, m_numEndUploads); | |
437 | |
438 expectedPreviousFlushes = expectedFlushes(kMaxUploadsPerUpdate, kFlushPeriod
Full); | |
439 EXPECT_EQ(expectedPreviousFlushes, m_numPreviousFlushes); | |
440 | |
441 expectedPreviousUploads = kMaxUploadsPerUpdate; | |
442 EXPECT_EQ(expectedPreviousUploads, m_numPreviousUploads); | |
443 | |
444 // Second update (40 full) | |
445 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get(), kMaxUploadsPerUpdate); | |
446 | |
447 EXPECT_EQ(2, m_numBeginUploads); | |
448 EXPECT_EQ(2, m_numEndUploads); | |
449 | |
450 expectedPreviousFlushes = expectedFlushes(kMaxUploadsPerUpdate, kFlushPeriod
Full); | |
451 EXPECT_EQ(expectedPreviousFlushes, m_numPreviousFlushes); | |
452 | |
453 expectedPreviousUploads = kMaxUploadsPerUpdate; | |
454 EXPECT_EQ(expectedPreviousUploads, m_numPreviousUploads); | |
455 | |
456 // Third update (20 full, 20 partial) | |
457 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get(), kMaxUploadsPerUpdate); | |
458 | |
459 EXPECT_EQ(3, m_numBeginUploads); | |
460 EXPECT_EQ(3, m_numEndUploads); | |
461 | |
462 expectedPreviousFlushes = expectedFlushes(kFullUploads-kMaxUploadsPerUpdate*
2, kFlushPeriodFull) + | |
463 expectedFlushes(kPartialUploads, kFlushPeriodParti
al); | |
464 EXPECT_EQ(expectedPreviousFlushes, m_numPreviousFlushes); | |
465 | |
466 expectedPreviousUploads = (kFullUploads-kMaxUploadsPerUpdate*2)+kPartialUplo
ads; | |
467 EXPECT_EQ(expectedPreviousUploads, m_numPreviousUploads); | |
468 | |
469 // Final sanity checks | |
470 EXPECT_EQ(kFullUploads + kPartialUploads, m_numTotalUploads); | |
471 } | |
472 | |
473 TEST_F(CCTextureUpdateControllerTest, TripleUpdateFinalUpdateAllPartial) | |
474 { | |
475 const int kMaxUploadsPerUpdate = 40; | |
476 const int kFullUploads = 70; | |
477 const int kPartialUploads = 30; | |
478 | |
479 int expectedPreviousFlushes = 0; | |
480 int expectedPreviousUploads = 0; | |
481 | |
482 setMaxUploadCountPerUpdate(kMaxUploadsPerUpdate); | |
483 appendFullUploadsToUpdateQueue(kFullUploads); | |
484 appendPartialUploadsToUpdateQueue(kPartialUploads); | |
485 | |
486 // First update (40 full) | |
487 DebugScopedSetImplThread implThread; | |
488 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get(), kMaxUploadsPerUpdate); | |
489 | |
490 EXPECT_EQ(1, m_numBeginUploads); | |
491 EXPECT_EQ(1, m_numEndUploads); | |
492 | |
493 expectedPreviousFlushes = expectedFlushes(kMaxUploadsPerUpdate, kFlushPeriod
Full); | |
494 EXPECT_EQ(expectedPreviousFlushes, m_numPreviousFlushes); | |
495 | |
496 expectedPreviousUploads = kMaxUploadsPerUpdate; | |
497 EXPECT_EQ(expectedPreviousUploads, m_numPreviousUploads); | |
498 | |
499 // Second update (30 full, optionally 10 partial) | |
500 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get(), kMaxUploadsPerUpdate); | |
501 | |
502 EXPECT_EQ(2, m_numBeginUploads); | |
503 EXPECT_EQ(2, m_numEndUploads); | |
504 EXPECT_LE(m_numPreviousUploads, kMaxUploadsPerUpdate); | |
505 // Be lenient on the exact number of flushes here, as the number of flushes | |
506 // will depend on whether some partial uploads were performed. | |
507 // onFlush(), onUpload(), and onEndUpload() will do basic flush checks for u
s anyway. | |
508 | |
509 // Third update (30 partial OR 20 partial if 10 partial uploaded in second u
pdate) | |
510 CCTextureUpdateController::updateTextures(m_resourceProvider.get(), &m_copie
r, &m_uploader, m_queue.get(), kMaxUploadsPerUpdate); | |
511 | |
512 EXPECT_EQ(3, m_numBeginUploads); | |
513 EXPECT_EQ(3, m_numEndUploads); | |
514 EXPECT_LE(m_numPreviousUploads, kMaxUploadsPerUpdate); | |
515 // Be lenient on the exact number of flushes here as well. | |
516 | |
517 // Final sanity checks | |
518 EXPECT_EQ(kFullUploads + kPartialUploads, m_numTotalUploads); | |
519 } | 328 } |
520 | 329 |
521 class FakeCCTextureUpdateControllerClient : public cc::CCTextureUpdateController
Client { | 330 class FakeCCTextureUpdateControllerClient : public cc::CCTextureUpdateController
Client { |
522 public: | 331 public: |
523 FakeCCTextureUpdateControllerClient() { reset(); } | 332 FakeCCTextureUpdateControllerClient() { reset(); } |
524 void reset() { m_readyToFinalizeCalled = false; } | 333 void reset() { m_readyToFinalizeCalled = false; } |
525 bool readyToFinalizeCalled() const { return m_readyToFinalizeCalled; } | 334 bool readyToFinalizeCalled() const { return m_readyToFinalizeCalled; } |
526 | 335 |
527 virtual void readyToFinalizeTextureUpdates() OVERRIDE { m_readyToFinalizeCal
led = true; } | 336 virtual void readyToFinalizeTextureUpdates() OVERRIDE { m_readyToFinalizeCal
led = true; } |
528 | 337 |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
676 } | 485 } |
677 | 486 |
678 EXPECT_FALSE(thread.hasPendingTask()); | 487 EXPECT_FALSE(thread.hasPendingTask()); |
679 EXPECT_TRUE(client.readyToFinalizeCalled()); | 488 EXPECT_TRUE(client.readyToFinalizeCalled()); |
680 EXPECT_EQ(2, m_numBeginUploads); | 489 EXPECT_EQ(2, m_numBeginUploads); |
681 EXPECT_EQ(2, m_numEndUploads); | 490 EXPECT_EQ(2, m_numEndUploads); |
682 EXPECT_EQ(2, m_numTotalUploads); | 491 EXPECT_EQ(2, m_numTotalUploads); |
683 } | 492 } |
684 | 493 |
685 } // namespace | 494 } // namespace |
OLD | NEW |