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 "SkCanvas.h" | 8 #include "SkCanvas.h" |
9 #include "SkData.h" | 9 #include "SkData.h" |
10 #include "SkDevice.h" | 10 #include "SkDevice.h" |
(...skipping 603 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
614 SkAutoTUnref<SkImage> image(surface->newImageSnapshot()); | 614 SkAutoTUnref<SkImage> image(surface->newImageSnapshot()); |
615 REPORTER_ASSERT(reporter, image); | 615 REPORTER_ASSERT(reporter, image); |
616 if (image) { | 616 if (image) { |
617 REPORTER_ASSERT(reporter, image->isOpaque() == SkToBool(opaq
ue)); | 617 REPORTER_ASSERT(reporter, image->isOpaque() == SkToBool(opaq
ue)); |
618 } | 618 } |
619 } | 619 } |
620 } | 620 } |
621 } | 621 } |
622 } | 622 } |
623 | 623 |
| 624 static void test_backend_cow(skiatest::Reporter* reporter, SkSurface* surface, |
| 625 SkSurface::BackendHandleAccess mode, |
| 626 GrBackendObject (*func)(SkSurface*, SkSurface::Back
endHandleAccess)) { |
| 627 GrBackendObject obj1 = func(surface, mode); |
| 628 SkAutoTUnref<SkImage> snap1(surface->newImageSnapshot()); |
| 629 |
| 630 GrBackendObject obj2 = func(surface, mode); |
| 631 SkAutoTUnref<SkImage> snap2(surface->newImageSnapshot()); |
| 632 |
| 633 // If the access mode triggers CoW, then the backend objects should reflect
it. |
| 634 REPORTER_ASSERT(reporter, (obj1 == obj2) == (snap1 == snap2)); |
| 635 } |
| 636 |
624 static void TestSurfaceCopyOnWrite(skiatest::Reporter* reporter, SurfaceType sur
faceType, | 637 static void TestSurfaceCopyOnWrite(skiatest::Reporter* reporter, SurfaceType sur
faceType, |
625 GrContext* context) { | 638 GrContext* context) { |
626 // Verify that the right canvas commands trigger a copy on write | 639 // Verify that the right canvas commands trigger a copy on write |
627 SkSurface* surface = create_surface(surfaceType, context); | 640 SkSurface* surface = create_surface(surfaceType, context); |
628 SkAutoTUnref<SkSurface> aur_surface(surface); | 641 SkAutoTUnref<SkSurface> aur_surface(surface); |
629 SkCanvas* canvas = surface->getCanvas(); | 642 SkCanvas* canvas = surface->getCanvas(); |
630 | 643 |
631 const SkRect testRect = | 644 const SkRect testRect = |
632 SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0), | 645 SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0), |
633 SkIntToScalar(4), SkIntToScalar(5)); | 646 SkIntToScalar(4), SkIntToScalar(5)); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
692 EXPECT_COPY_ON_WRITE(drawPath(testPath, testPaint)) | 705 EXPECT_COPY_ON_WRITE(drawPath(testPath, testPaint)) |
693 EXPECT_COPY_ON_WRITE(drawBitmap(testBitmap, 0, 0)) | 706 EXPECT_COPY_ON_WRITE(drawBitmap(testBitmap, 0, 0)) |
694 EXPECT_COPY_ON_WRITE(drawBitmapRect(testBitmap, testRect)) | 707 EXPECT_COPY_ON_WRITE(drawBitmapRect(testBitmap, testRect)) |
695 EXPECT_COPY_ON_WRITE(drawBitmapNine(testBitmap, testIRect, testRect, NULL)) | 708 EXPECT_COPY_ON_WRITE(drawBitmapNine(testBitmap, testIRect, testRect, NULL)) |
696 EXPECT_COPY_ON_WRITE(drawSprite(testBitmap, 0, 0, NULL)) | 709 EXPECT_COPY_ON_WRITE(drawSprite(testBitmap, 0, 0, NULL)) |
697 EXPECT_COPY_ON_WRITE(drawText(testText.c_str(), testText.size(), 0, 1, testP
aint)) | 710 EXPECT_COPY_ON_WRITE(drawText(testText.c_str(), testText.size(), 0, 1, testP
aint)) |
698 EXPECT_COPY_ON_WRITE(drawPosText(testText.c_str(), testText.size(), testPoin
ts2, \ | 711 EXPECT_COPY_ON_WRITE(drawPosText(testText.c_str(), testText.size(), testPoin
ts2, \ |
699 testPaint)) | 712 testPaint)) |
700 EXPECT_COPY_ON_WRITE(drawTextOnPath(testText.c_str(), testText.size(), testP
ath, NULL, \ | 713 EXPECT_COPY_ON_WRITE(drawTextOnPath(testText.c_str(), testText.size(), testP
ath, NULL, \ |
701 testPaint)) | 714 testPaint)) |
| 715 |
| 716 const SkSurface::BackendHandleAccess accessModes[] = { |
| 717 SkSurface::kFlushRead_BackendHandleAccess, |
| 718 SkSurface::kFlushWrite_BackendHandleAccess, |
| 719 SkSurface::kDiscardWrite_BackendHandleAccess, |
| 720 }; |
| 721 |
| 722 for (auto access : accessModes) { |
| 723 test_backend_cow(reporter, surface, access, |
| 724 [](SkSurface* s, SkSurface::BackendHandleAccess a) ->
GrBackendObject { |
| 725 return s->getTextureHandle(a); |
| 726 }); |
| 727 |
| 728 test_backend_cow(reporter, surface, access, |
| 729 [](SkSurface* s, SkSurface::BackendHandleAccess a) ->
GrBackendObject { |
| 730 GrBackendObject result; |
| 731 if (!s->getRenderTargetHandle(&result, a)) { |
| 732 return 0; |
| 733 } |
| 734 return result; |
| 735 }); |
| 736 } |
702 } | 737 } |
703 | 738 |
704 static void TestSurfaceWritableAfterSnapshotRelease(skiatest::Reporter* reporter
, | 739 static void TestSurfaceWritableAfterSnapshotRelease(skiatest::Reporter* reporter
, |
705 SurfaceType surfaceType, | 740 SurfaceType surfaceType, |
706 GrContext* context) { | 741 GrContext* context) { |
707 // This test succeeds by not triggering an assertion. | 742 // This test succeeds by not triggering an assertion. |
708 // The test verifies that the surface remains writable (usable) after | 743 // The test verifies that the surface remains writable (usable) after |
709 // acquiring and releasing a snapshot without triggering a copy on write. | 744 // acquiring and releasing a snapshot without triggering a copy on write. |
710 SkAutoTUnref<SkSurface> surface(create_surface(surfaceType, context)); | 745 SkAutoTUnref<SkSurface> surface(create_surface(surfaceType, context)); |
711 SkCanvas* canvas = surface->getCanvas(); | 746 SkCanvas* canvas = surface->getCanvas(); |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
986 test_image_color(reporter, refImg, expected1); | 1021 test_image_color(reporter, refImg, expected1); |
987 #endif | 1022 #endif |
988 test_image_color(reporter, cpyImg, expected0); | 1023 test_image_color(reporter, cpyImg, expected0); |
989 | 1024 |
990 // Now exercise the release proc | 1025 // Now exercise the release proc |
991 REPORTER_ASSERT(reporter, !releaseCtx.fIsReleased); | 1026 REPORTER_ASSERT(reporter, !releaseCtx.fIsReleased); |
992 refImg.reset(NULL); // force a release of the image | 1027 refImg.reset(NULL); // force a release of the image |
993 REPORTER_ASSERT(reporter, releaseCtx.fIsReleased); | 1028 REPORTER_ASSERT(reporter, releaseCtx.fIsReleased); |
994 } | 1029 } |
995 #endif | 1030 #endif |
OLD | NEW |