OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 // Include here to ensure SK_SUPPORT_GPU is set correctly before it is examined. | 8 // Include here to ensure SK_SUPPORT_GPU is set correctly before it is examined. |
9 #include "SkTypes.h" | 9 #include "SkTypes.h" |
10 | 10 |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 | 218 |
219 REPORTER_ASSERT(reporter, borrowedIsAlive); | 219 REPORTER_ASSERT(reporter, borrowedIsAlive); |
220 REPORTER_ASSERT(reporter, !adoptedIsAlive); | 220 REPORTER_ASSERT(reporter, !adoptedIsAlive); |
221 | 221 |
222 gpu->deleteTestingOnlyBackendTexture(texIDs[0]); | 222 gpu->deleteTestingOnlyBackendTexture(texIDs[0]); |
223 | 223 |
224 context->resetContext(); | 224 context->resetContext(); |
225 } | 225 } |
226 | 226 |
227 class TestResource : public GrGpuResource { | 227 class TestResource : public GrGpuResource { |
228 static const size_t kDefaultSize = 100; | |
229 enum ScratchConstructor { kScratchConstructor }; | 228 enum ScratchConstructor { kScratchConstructor }; |
230 public: | 229 public: |
| 230 static const size_t kDefaultSize = 100; |
231 | 231 |
232 /** Property that distinctly categorizes the resource. | 232 /** Property that distinctly categorizes the resource. |
233 * For example, textures have width, height, ... */ | 233 * For example, textures have width, height, ... */ |
234 enum SimulatedProperty { kA_SimulatedProperty, kB_SimulatedProperty }; | 234 enum SimulatedProperty { kA_SimulatedProperty, kB_SimulatedProperty }; |
235 | 235 |
236 TestResource(GrGpu* gpu, size_t size, GrGpuResource::LifeCycle lifeCycle) | 236 TestResource(GrGpu* gpu, size_t size, GrGpuResource::LifeCycle lifeCycle) |
237 : INHERITED(gpu, lifeCycle) | 237 : INHERITED(gpu, lifeCycle) |
238 , fToDelete(NULL) | 238 , fToDelete(NULL) |
239 , fSize(size) | 239 , fSize(size) |
240 , fProperty(kA_SimulatedProperty) { | 240 , fProperty(kA_SimulatedProperty) { |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
553 TestResource::CreateScratch(context->getGpu(), TestResource::kA_Simulate
dProperty, false); | 553 TestResource::CreateScratch(context->getGpu(), TestResource::kA_Simulate
dProperty, false); |
554 GrScratchKey key; | 554 GrScratchKey key; |
555 TestResource::ComputeScratchKey(TestResource::kA_SimulatedProperty, &key); | 555 TestResource::ComputeScratchKey(TestResource::kA_SimulatedProperty, &key); |
556 | 556 |
557 size_t size = resource->gpuMemorySize(); | 557 size_t size = resource->gpuMemorySize(); |
558 for (int i = 0; i < 2; ++i) { | 558 for (int i = 0; i < 2; ++i) { |
559 // Since this resource is unbudgeted, it should not be reachable as scra
tch. | 559 // Since this resource is unbudgeted, it should not be reachable as scra
tch. |
560 REPORTER_ASSERT(reporter, resource->resourcePriv().getScratchKey() == ke
y); | 560 REPORTER_ASSERT(reporter, resource->resourcePriv().getScratchKey() == ke
y); |
561 REPORTER_ASSERT(reporter, !resource->cacheAccess().isScratch()); | 561 REPORTER_ASSERT(reporter, !resource->cacheAccess().isScratch()); |
562 REPORTER_ASSERT(reporter, !resource->resourcePriv().isBudgeted()); | 562 REPORTER_ASSERT(reporter, !resource->resourcePriv().isBudgeted()); |
563 REPORTER_ASSERT(reporter, NULL == cache->findAndRefScratchResource(key))
; | 563 REPORTER_ASSERT(reporter, NULL == cache->findAndRefScratchResource(key,
TestResource::kDefaultSize, 0)); |
564 REPORTER_ASSERT(reporter, 1 == cache->getResourceCount()); | 564 REPORTER_ASSERT(reporter, 1 == cache->getResourceCount()); |
565 REPORTER_ASSERT(reporter, size == cache->getResourceBytes()); | 565 REPORTER_ASSERT(reporter, size == cache->getResourceBytes()); |
566 REPORTER_ASSERT(reporter, 0 == cache->getBudgetedResourceCount()); | 566 REPORTER_ASSERT(reporter, 0 == cache->getBudgetedResourceCount()); |
567 REPORTER_ASSERT(reporter, 0 == cache->getBudgetedResourceBytes()); | 567 REPORTER_ASSERT(reporter, 0 == cache->getBudgetedResourceBytes()); |
568 | 568 |
569 // Once it is unrefed, it should become available as scratch. | 569 // Once it is unrefed, it should become available as scratch. |
570 resource->unref(); | 570 resource->unref(); |
571 REPORTER_ASSERT(reporter, 1 == cache->getResourceCount()); | 571 REPORTER_ASSERT(reporter, 1 == cache->getResourceCount()); |
572 REPORTER_ASSERT(reporter, size == cache->getResourceBytes()); | 572 REPORTER_ASSERT(reporter, size == cache->getResourceBytes()); |
573 REPORTER_ASSERT(reporter, 1 == cache->getBudgetedResourceCount()); | 573 REPORTER_ASSERT(reporter, 1 == cache->getBudgetedResourceCount()); |
574 REPORTER_ASSERT(reporter, size == cache->getBudgetedResourceBytes()); | 574 REPORTER_ASSERT(reporter, size == cache->getBudgetedResourceBytes()); |
575 resource = static_cast<TestResource*>(cache->findAndRefScratchResource(k
ey)); | 575 resource = static_cast<TestResource*>(cache->findAndRefScratchResource(k
ey, TestResource::kDefaultSize, 0)); |
576 REPORTER_ASSERT(reporter, resource); | 576 REPORTER_ASSERT(reporter, resource); |
577 REPORTER_ASSERT(reporter, resource->resourcePriv().getScratchKey() == ke
y); | 577 REPORTER_ASSERT(reporter, resource->resourcePriv().getScratchKey() == ke
y); |
578 REPORTER_ASSERT(reporter, resource->cacheAccess().isScratch()); | 578 REPORTER_ASSERT(reporter, resource->cacheAccess().isScratch()); |
579 REPORTER_ASSERT(reporter, resource->resourcePriv().isBudgeted()); | 579 REPORTER_ASSERT(reporter, resource->resourcePriv().isBudgeted()); |
580 | 580 |
581 if (0 == i) { | 581 if (0 == i) { |
582 // If made unbudgeted, it should return to original state: ref'ed an
d unbudgeted. Try | 582 // If made unbudgeted, it should return to original state: ref'ed an
d unbudgeted. Try |
583 // the above tests again. | 583 // the above tests again. |
584 resource->resourcePriv().makeUnbudgeted(); | 584 resource->resourcePriv().makeUnbudgeted(); |
585 } else { | 585 } else { |
(...skipping 25 matching lines...) Expand all Loading... |
611 // Create two resources that have the same scratch key. | 611 // Create two resources that have the same scratch key. |
612 TestResource* a = TestResource::CreateScratch(context->getGpu(), | 612 TestResource* a = TestResource::CreateScratch(context->getGpu(), |
613 TestResource::kB_SimulatedProp
erty); | 613 TestResource::kB_SimulatedProp
erty); |
614 TestResource* b = TestResource::CreateScratch(context->getGpu(), | 614 TestResource* b = TestResource::CreateScratch(context->getGpu(), |
615 TestResource::kB_SimulatedProp
erty); | 615 TestResource::kB_SimulatedProp
erty); |
616 a->setSize(11); | 616 a->setSize(11); |
617 b->setSize(12); | 617 b->setSize(12); |
618 GrScratchKey scratchKey1; | 618 GrScratchKey scratchKey1; |
619 TestResource::ComputeScratchKey(TestResource::kA_SimulatedProperty, &scratch
Key1); | 619 TestResource::ComputeScratchKey(TestResource::kA_SimulatedProperty, &scratch
Key1); |
620 // Check for negative case consistency. (leaks upon test failure.) | 620 // Check for negative case consistency. (leaks upon test failure.) |
621 REPORTER_ASSERT(reporter, NULL == cache->findAndRefScratchResource(scratchKe
y1)); | 621 REPORTER_ASSERT(reporter, NULL == cache->findAndRefScratchResource(scratchKe
y1, TestResource::kDefaultSize, 0)); |
622 | 622 |
623 GrScratchKey scratchKey; | 623 GrScratchKey scratchKey; |
624 TestResource::ComputeScratchKey(TestResource::kB_SimulatedProperty, &scratch
Key); | 624 TestResource::ComputeScratchKey(TestResource::kB_SimulatedProperty, &scratch
Key); |
625 | 625 |
626 // Scratch resources are registered with GrResourceCache just by existing. T
here are 2. | 626 // Scratch resources are registered with GrResourceCache just by existing. T
here are 2. |
627 REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive()); | 627 REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive()); |
628 SkDEBUGCODE(REPORTER_ASSERT(reporter, 2 == cache->countScratchEntriesForKey(
scratchKey));) | 628 SkDEBUGCODE(REPORTER_ASSERT(reporter, 2 == cache->countScratchEntriesForKey(
scratchKey));) |
629 REPORTER_ASSERT(reporter, 2 == cache->getResourceCount()); | 629 REPORTER_ASSERT(reporter, 2 == cache->getResourceCount()); |
630 REPORTER_ASSERT(reporter, a->gpuMemorySize() + b->gpuMemorySize() == | 630 REPORTER_ASSERT(reporter, a->gpuMemorySize() + b->gpuMemorySize() == |
631 cache->getResourceBytes()); | 631 cache->getResourceBytes()); |
(...skipping 26 matching lines...) Expand all Loading... |
658 TestResource::kB_SimulatedProp
erty); | 658 TestResource::kB_SimulatedProp
erty); |
659 TestResource* b = TestResource::CreateScratch(context->getGpu(), | 659 TestResource* b = TestResource::CreateScratch(context->getGpu(), |
660 TestResource::kB_SimulatedProp
erty); | 660 TestResource::kB_SimulatedProp
erty); |
661 a->unref(); | 661 a->unref(); |
662 b->unref(); | 662 b->unref(); |
663 | 663 |
664 GrScratchKey scratchKey; | 664 GrScratchKey scratchKey; |
665 // Ensure that scratch key lookup is correct for negative case. | 665 // Ensure that scratch key lookup is correct for negative case. |
666 TestResource::ComputeScratchKey(TestResource::kA_SimulatedProperty, &scratch
Key); | 666 TestResource::ComputeScratchKey(TestResource::kA_SimulatedProperty, &scratch
Key); |
667 // (following leaks upon test failure). | 667 // (following leaks upon test failure). |
668 REPORTER_ASSERT(reporter, cache->findAndRefScratchResource(scratchKey) == NU
LL); | 668 REPORTER_ASSERT(reporter, cache->findAndRefScratchResource(scratchKey, TestR
esource::kDefaultSize, 0) == NULL); |
669 | 669 |
670 // Scratch resources are registered with GrResourceCache just by existing. T
here are 2. | 670 // Scratch resources are registered with GrResourceCache just by existing. T
here are 2. |
671 TestResource::ComputeScratchKey(TestResource::kB_SimulatedProperty, &scratch
Key); | 671 TestResource::ComputeScratchKey(TestResource::kB_SimulatedProperty, &scratch
Key); |
672 REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive()); | 672 REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive()); |
673 SkDEBUGCODE(REPORTER_ASSERT(reporter, 2 == cache->countScratchEntriesForKey(
scratchKey));) | 673 SkDEBUGCODE(REPORTER_ASSERT(reporter, 2 == cache->countScratchEntriesForKey(
scratchKey));) |
674 REPORTER_ASSERT(reporter, 2 == cache->getResourceCount()); | 674 REPORTER_ASSERT(reporter, 2 == cache->getResourceCount()); |
675 | 675 |
676 // Find the first resource and remove its scratch key | 676 // Find the first resource and remove its scratch key |
677 GrGpuResource* find; | 677 GrGpuResource* find; |
678 find = cache->findAndRefScratchResource(scratchKey); | 678 find = cache->findAndRefScratchResource(scratchKey, TestResource::kDefaultSi
ze, 0); |
679 find->resourcePriv().removeScratchKey(); | 679 find->resourcePriv().removeScratchKey(); |
680 // It's still alive, but not cached by scratch key anymore | 680 // It's still alive, but not cached by scratch key anymore |
681 REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive()); | 681 REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive()); |
682 SkDEBUGCODE(REPORTER_ASSERT(reporter, 1 == cache->countScratchEntriesForKey(
scratchKey));) | 682 SkDEBUGCODE(REPORTER_ASSERT(reporter, 1 == cache->countScratchEntriesForKey(
scratchKey));) |
683 REPORTER_ASSERT(reporter, 2 == cache->getResourceCount()); | 683 REPORTER_ASSERT(reporter, 2 == cache->getResourceCount()); |
684 | 684 |
685 // The cache should immediately delete it when it's unrefed since it isn't a
ccessible. | 685 // The cache should immediately delete it when it's unrefed since it isn't a
ccessible. |
686 find->unref(); | 686 find->unref(); |
687 REPORTER_ASSERT(reporter, 1 == TestResource::NumAlive()); | 687 REPORTER_ASSERT(reporter, 1 == TestResource::NumAlive()); |
688 SkDEBUGCODE(REPORTER_ASSERT(reporter, 1 == cache->countScratchEntriesForKey(
scratchKey));) | 688 SkDEBUGCODE(REPORTER_ASSERT(reporter, 1 == cache->countScratchEntriesForKey(
scratchKey));) |
689 REPORTER_ASSERT(reporter, 1 == cache->getResourceCount()); | 689 REPORTER_ASSERT(reporter, 1 == cache->getResourceCount()); |
690 | 690 |
691 // Repeat for the second resource. | 691 // Repeat for the second resource. |
692 find = cache->findAndRefScratchResource(scratchKey); | 692 find = cache->findAndRefScratchResource(scratchKey, TestResource::kDefaultSi
ze, 0); |
693 find->resourcePriv().removeScratchKey(); | 693 find->resourcePriv().removeScratchKey(); |
694 REPORTER_ASSERT(reporter, 1 == TestResource::NumAlive()); | 694 REPORTER_ASSERT(reporter, 1 == TestResource::NumAlive()); |
695 SkDEBUGCODE(REPORTER_ASSERT(reporter, 0 == cache->countScratchEntriesForKey(
scratchKey));) | 695 SkDEBUGCODE(REPORTER_ASSERT(reporter, 0 == cache->countScratchEntriesForKey(
scratchKey));) |
696 REPORTER_ASSERT(reporter, 1 == cache->getResourceCount()); | 696 REPORTER_ASSERT(reporter, 1 == cache->getResourceCount()); |
697 | 697 |
698 // Should be able to call this multiple times with no problem. | 698 // Should be able to call this multiple times with no problem. |
699 find->resourcePriv().removeScratchKey(); | 699 find->resourcePriv().removeScratchKey(); |
700 REPORTER_ASSERT(reporter, 1 == TestResource::NumAlive()); | 700 REPORTER_ASSERT(reporter, 1 == TestResource::NumAlive()); |
701 SkDEBUGCODE(REPORTER_ASSERT(reporter, 0 == cache->countScratchEntriesForKey(
scratchKey));) | 701 SkDEBUGCODE(REPORTER_ASSERT(reporter, 0 == cache->countScratchEntriesForKey(
scratchKey));) |
702 REPORTER_ASSERT(reporter, 1 == cache->getResourceCount()); | 702 REPORTER_ASSERT(reporter, 1 == cache->getResourceCount()); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
738 scratchKey = scratchKey2; | 738 scratchKey = scratchKey2; |
739 REPORTER_ASSERT(reporter, scratchKey.size() == TestResource::ExpectedScratch
KeySize()); | 739 REPORTER_ASSERT(reporter, scratchKey.size() == TestResource::ExpectedScratch
KeySize()); |
740 REPORTER_ASSERT(reporter, scratchKey1 != scratchKey); | 740 REPORTER_ASSERT(reporter, scratchKey1 != scratchKey); |
741 REPORTER_ASSERT(reporter, scratchKey != scratchKey1); | 741 REPORTER_ASSERT(reporter, scratchKey != scratchKey1); |
742 REPORTER_ASSERT(reporter, scratchKey2 == scratchKey); | 742 REPORTER_ASSERT(reporter, scratchKey2 == scratchKey); |
743 REPORTER_ASSERT(reporter, scratchKey == scratchKey2); | 743 REPORTER_ASSERT(reporter, scratchKey == scratchKey2); |
744 | 744 |
745 // Ensure that scratch key lookup is correct for negative case. | 745 // Ensure that scratch key lookup is correct for negative case. |
746 TestResource::ComputeScratchKey(TestResource::kA_SimulatedProperty, &scratch
Key); | 746 TestResource::ComputeScratchKey(TestResource::kA_SimulatedProperty, &scratch
Key); |
747 // (following leaks upon test failure). | 747 // (following leaks upon test failure). |
748 REPORTER_ASSERT(reporter, cache->findAndRefScratchResource(scratchKey) == NU
LL); | 748 REPORTER_ASSERT(reporter, cache->findAndRefScratchResource(scratchKey, TestR
esource::kDefaultSize, 0) == NULL); |
749 | 749 |
750 // Find the first resource with a scratch key and a copy of a scratch key. | 750 // Find the first resource with a scratch key and a copy of a scratch key. |
751 TestResource::ComputeScratchKey(TestResource::kB_SimulatedProperty, &scratch
Key); | 751 TestResource::ComputeScratchKey(TestResource::kB_SimulatedProperty, &scratch
Key); |
752 GrGpuResource* find = cache->findAndRefScratchResource(scratchKey); | 752 GrGpuResource* find = cache->findAndRefScratchResource(scratchKey, TestResou
rce::kDefaultSize, 0); |
753 REPORTER_ASSERT(reporter, find != NULL); | 753 REPORTER_ASSERT(reporter, find != NULL); |
754 find->unref(); | 754 find->unref(); |
755 | 755 |
756 scratchKey2 = scratchKey; | 756 scratchKey2 = scratchKey; |
757 find = cache->findAndRefScratchResource(scratchKey2); | 757 find = cache->findAndRefScratchResource(scratchKey2, TestResource::kDefaultS
ize, 0); |
758 REPORTER_ASSERT(reporter, find != NULL); | 758 REPORTER_ASSERT(reporter, find != NULL); |
759 REPORTER_ASSERT(reporter, find == a || find == b); | 759 REPORTER_ASSERT(reporter, find == a || find == b); |
760 | 760 |
761 GrGpuResource* find2 = cache->findAndRefScratchResource(scratchKey2); | 761 GrGpuResource* find2 = cache->findAndRefScratchResource(scratchKey2, TestRes
ource::kDefaultSize, 0); |
762 REPORTER_ASSERT(reporter, find2 != NULL); | 762 REPORTER_ASSERT(reporter, find2 != NULL); |
763 REPORTER_ASSERT(reporter, find2 == a || find2 == b); | 763 REPORTER_ASSERT(reporter, find2 == a || find2 == b); |
764 REPORTER_ASSERT(reporter, find2 != find); | 764 REPORTER_ASSERT(reporter, find2 != find); |
765 find2->unref(); | 765 find2->unref(); |
766 find->unref(); | 766 find->unref(); |
767 } | 767 } |
768 | 768 |
769 static void test_duplicate_unique_key(skiatest::Reporter* reporter) { | 769 static void test_duplicate_unique_key(skiatest::Reporter* reporter) { |
770 Mock mock(5, 30000); | 770 Mock mock(5, 30000); |
771 GrContext* context = mock.context(); | 771 GrContext* context = mock.context(); |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
909 REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive()); | 909 REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive()); |
910 REPORTER_ASSERT(reporter, !cache->hasUniqueKey(key3)); | 910 REPORTER_ASSERT(reporter, !cache->hasUniqueKey(key3)); |
911 | 911 |
912 // make b purgeable. It should be immediately deleted since it has no key. | 912 // make b purgeable. It should be immediately deleted since it has no key. |
913 b->unref(); | 913 b->unref(); |
914 REPORTER_ASSERT(reporter, 1 == TestResource::NumAlive()); | 914 REPORTER_ASSERT(reporter, 1 == TestResource::NumAlive()); |
915 | 915 |
916 // Make sure we actually get to c via it's scratch key, before we say goodby
e. | 916 // Make sure we actually get to c via it's scratch key, before we say goodby
e. |
917 GrScratchKey scratchKey; | 917 GrScratchKey scratchKey; |
918 TestResource::ComputeScratchKey(TestResource::kA_SimulatedProperty, &scratch
Key); | 918 TestResource::ComputeScratchKey(TestResource::kA_SimulatedProperty, &scratch
Key); |
919 GrGpuResource* scratch = cache->findAndRefScratchResource(scratchKey); | 919 GrGpuResource* scratch = cache->findAndRefScratchResource(scratchKey, TestRe
source::kDefaultSize, 0); |
920 REPORTER_ASSERT(reporter, scratch == c); | 920 REPORTER_ASSERT(reporter, scratch == c); |
921 SkSafeUnref(scratch); | 921 SkSafeUnref(scratch); |
922 | 922 |
923 // Get rid of c. | 923 // Get rid of c. |
924 cache->purgeAllUnlocked(); | 924 cache->purgeAllUnlocked(); |
925 scratch = cache->findAndRefScratchResource(scratchKey); | 925 scratch = cache->findAndRefScratchResource(scratchKey, TestResource::kDefaul
tSize, 0); |
926 REPORTER_ASSERT(reporter, 0 == TestResource::NumAlive()); | 926 REPORTER_ASSERT(reporter, 0 == TestResource::NumAlive()); |
927 REPORTER_ASSERT(reporter, 0 == cache->getResourceCount()); | 927 REPORTER_ASSERT(reporter, 0 == cache->getResourceCount()); |
928 REPORTER_ASSERT(reporter, 0 == cache->getResourceBytes()); | 928 REPORTER_ASSERT(reporter, 0 == cache->getResourceBytes()); |
929 REPORTER_ASSERT(reporter, !scratch); | 929 REPORTER_ASSERT(reporter, !scratch); |
930 SkSafeUnref(scratch); | 930 SkSafeUnref(scratch); |
931 } | 931 } |
932 | 932 |
933 static void test_cache_chained_purge(skiatest::Reporter* reporter) { | 933 static void test_cache_chained_purge(skiatest::Reporter* reporter) { |
934 Mock mock(3, 30000); | 934 Mock mock(3, 30000); |
935 GrContext* context = mock.context(); | 935 GrContext* context = mock.context(); |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1289 test_purge_invalidated(reporter); | 1289 test_purge_invalidated(reporter); |
1290 test_cache_chained_purge(reporter); | 1290 test_cache_chained_purge(reporter); |
1291 test_resource_size_changed(reporter); | 1291 test_resource_size_changed(reporter); |
1292 test_timestamp_wrap(reporter); | 1292 test_timestamp_wrap(reporter); |
1293 test_flush(reporter); | 1293 test_flush(reporter); |
1294 test_large_resource_count(reporter); | 1294 test_large_resource_count(reporter); |
1295 test_custom_data(reporter); | 1295 test_custom_data(reporter); |
1296 } | 1296 } |
1297 | 1297 |
1298 #endif | 1298 #endif |
OLD | NEW |