OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 <functional> | 8 #include <functional> |
9 #include <initializer_list> | 9 #include <initializer_list> |
10 #include <vector> | 10 #include <vector> |
(...skipping 727 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
738 #endif | 738 #endif |
739 | 739 |
740 #if SK_SUPPORT_GPU | 740 #if SK_SUPPORT_GPU |
741 struct TextureReleaseChecker { | 741 struct TextureReleaseChecker { |
742 TextureReleaseChecker() : fReleaseCount(0) {} | 742 TextureReleaseChecker() : fReleaseCount(0) {} |
743 int fReleaseCount; | 743 int fReleaseCount; |
744 static void Release(void* self) { | 744 static void Release(void* self) { |
745 static_cast<TextureReleaseChecker*>(self)->fReleaseCount++; | 745 static_cast<TextureReleaseChecker*>(self)->fReleaseCount++; |
746 } | 746 } |
747 }; | 747 }; |
748 static void check_image_color(skiatest::Reporter* reporter, SkImage* image, SkPM Color expected) { | 748 DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(SkImage_NewFromTextureRelease, reporter, c txInfo) { |
749 const SkImageInfo info = SkImageInfo::MakeN32Premul(1, 1); | |
750 SkPMColor pixel; | |
751 REPORTER_ASSERT(reporter, image->readPixels(info, &pixel, sizeof(pixel), 0, 0)); | |
752 REPORTER_ASSERT(reporter, pixel == expected); | |
753 } | |
754 DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(SkImage_NewFromTexture, reporter, ctxInfo) { | |
755 GrTextureProvider* provider = ctxInfo.grContext()->textureProvider(); | 749 GrTextureProvider* provider = ctxInfo.grContext()->textureProvider(); |
756 const int w = 10; | 750 const int w = 10; |
757 const int h = 10; | 751 const int h = 10; |
758 SkPMColor storage[w * h]; | |
759 const SkPMColor expected0 = SkPreMultiplyColor(SK_ColorRED); | |
760 sk_memset32(storage, expected0, w * h); | |
761 GrSurfaceDesc desc; | 752 GrSurfaceDesc desc; |
762 desc.fFlags = kRenderTarget_GrSurfaceFlag; // needs to be a rendertarget fo r readpixels(); | 753 desc.fFlags = kRenderTarget_GrSurfaceFlag; |
763 desc.fOrigin = kDefault_GrSurfaceOrigin; | 754 desc.fOrigin = kDefault_GrSurfaceOrigin; |
764 desc.fWidth = w; | 755 desc.fWidth = w; |
765 desc.fHeight = h; | 756 desc.fHeight = h; |
766 desc.fConfig = kSkia8888_GrPixelConfig; | 757 desc.fConfig = kSkia8888_GrPixelConfig; |
767 desc.fSampleCnt = 0; | 758 desc.fSampleCnt = 0; |
768 SkAutoTUnref<GrTexture> tex(provider->createTexture(desc, SkBudgeted::kNo, s torage, w * 4)); | 759 SkAutoTUnref<GrTexture> tex(provider->createTexture(desc, SkBudgeted::kNo)); |
769 if (!tex) { | 760 if (!tex) { |
770 REPORTER_ASSERT(reporter, false); | 761 REPORTER_ASSERT(reporter, false); |
771 return; | 762 return; |
772 } | 763 } |
773 | 764 |
774 GrBackendTextureDesc backendDesc; | 765 GrBackendTextureDesc backendDesc; |
775 backendDesc.fConfig = kSkia8888_GrPixelConfig; | 766 backendDesc.fConfig = kSkia8888_GrPixelConfig; |
776 backendDesc.fFlags = kRenderTarget_GrBackendTextureFlag; | 767 backendDesc.fFlags = kRenderTarget_GrBackendTextureFlag; |
777 backendDesc.fWidth = w; | 768 backendDesc.fWidth = w; |
778 backendDesc.fHeight = h; | 769 backendDesc.fHeight = h; |
779 backendDesc.fSampleCnt = 0; | 770 backendDesc.fSampleCnt = 0; |
780 backendDesc.fTextureHandle = tex->getTextureHandle(); | 771 backendDesc.fTextureHandle = tex->getTextureHandle(); |
bsalomon
2016/07/21 20:57:44
Can we get rid of 'tex' and use
backendDesc.fText
| |
781 TextureReleaseChecker releaseChecker; | 772 TextureReleaseChecker releaseChecker; |
782 sk_sp<SkImage> refImg( | 773 sk_sp<SkImage> refImg( |
783 SkImage::MakeFromTexture(ctxInfo.grContext(), backendDesc, kPremul_SkAlp haType, | 774 SkImage::MakeFromTexture(ctxInfo.grContext(), backendDesc, kPremul_SkAlp haType, |
784 TextureReleaseChecker::Release, &releaseChecker )); | 775 TextureReleaseChecker::Release, &releaseChecker )); |
785 | 776 |
786 check_image_color(reporter, refImg.get(), expected0); | |
787 | |
788 // Now lets jam new colors into our "external" texture, and see if the image s notice | |
789 const SkPMColor expected1 = SkPreMultiplyColor(SK_ColorBLUE); | |
790 sk_memset32(storage, expected1, w * h); | |
791 tex->writePixels(0, 0, w, h, kSkia8888_GrPixelConfig, storage, GrContext::kF lushWrites_PixelOp); | |
792 | |
793 // The cpy'd one should still see the old color | |
794 #if 0 | |
795 // There is no guarantee that refImg sees the new color. We are free to have made a copy. Our | |
796 // write pixels call violated the contract with refImg and refImg is now und efined. | |
797 check_image_color(reporter, refImg, expected1); | |
798 #endif | |
799 | |
800 // Now exercise the release proc | 777 // Now exercise the release proc |
801 REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount); | 778 REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount); |
802 refImg.reset(nullptr); // force a release of the image | 779 refImg.reset(nullptr); // force a release of the image |
803 REPORTER_ASSERT(reporter, 1 == releaseChecker.fReleaseCount); | 780 REPORTER_ASSERT(reporter, 1 == releaseChecker.fReleaseCount); |
804 } | 781 } |
805 | 782 |
806 static void check_images_same(skiatest::Reporter* reporter, const SkImage* a, co nst SkImage* b) { | 783 static void check_images_same(skiatest::Reporter* reporter, const SkImage* a, co nst SkImage* b) { |
807 if (a->width() != b->width() || a->height() != b->height()) { | 784 if (a->width() != b->width() || a->height() != b->height()) { |
808 ERRORF(reporter, "Images must have the same size"); | 785 ERRORF(reporter, "Images must have the same size"); |
809 return; | 786 return; |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
959 otherContextInfo.grContext(), buffer, budgeted)); | 936 otherContextInfo.grContext(), buffer, budgeted)); |
960 REPORTER_ASSERT(reporter, !newImage2); | 937 REPORTER_ASSERT(reporter, !newImage2); |
961 testContext->makeCurrent(); | 938 testContext->makeCurrent(); |
962 } | 939 } |
963 } | 940 } |
964 sk_free(buffer); | 941 sk_free(buffer); |
965 } | 942 } |
966 } | 943 } |
967 } | 944 } |
968 #endif | 945 #endif |
OLD | NEW |