diff options
author | Brian Osman <brianosman@google.com> | 2017-01-25 14:13:00 +0000 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-01-25 14:54:35 +0000 |
commit | b92234a3210bce532f103d71002f4e04d336a182 (patch) | |
tree | 2d0e7a4cf5d912af913a5dbcce7f6bb14f94a256 | |
parent | e330eb2c0e6bab83add6986119864b546bf0b0a7 (diff) |
Revert "Remove SkImage::MakeTextureFromPixmap"
This reverts commit 8ccbbb455c6ef194920c47e846b95b50f5017138.
Reason for revert: Chrome perf regression
BUG=chrome:684483
Original change's description:
> Remove SkImage::MakeTextureFromPixmap
>
> Another step towards reducing the number of texture upload paths.
>
> BUG=skia:
>
> Change-Id: Ica185e7334f52dc9ebf87e21fe6f60589ef87bb3
> Reviewed-on: https://skia-review.googlesource.com/7346
> Commit-Queue: Brian Osman <brianosman@google.com>
> Reviewed-by: Brian Salomon <bsalomon@google.com>
>
TBR=bsalomon@google.com,robertphillips@google.com,brianosman@google.com,cblume@google.com
# Not skipping CQ checks because original CL landed > 1 day ago.
BUG=skia:
Change-Id: I8bf6970b764018f3ebcac8123e4d6a8ad05317ff
Reviewed-on: https://skia-review.googlesource.com/7484
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
-rw-r--r-- | include/core/SkImage.h | 2 | ||||
-rw-r--r-- | src/image/SkImage.cpp | 4 | ||||
-rw-r--r-- | src/image/SkImage_Gpu.cpp | 35 | ||||
-rw-r--r-- | tests/ImageTest.cpp | 49 |
4 files changed, 83 insertions, 7 deletions
diff --git a/include/core/SkImage.h b/include/core/SkImage.h index 92b8f80633..076da331a2 100644 --- a/include/core/SkImage.h +++ b/include/core/SkImage.h @@ -175,6 +175,8 @@ public: const SkMatrix*, const SkPaint*, BitDepth, sk_sp<SkColorSpace>); + static sk_sp<SkImage> MakeTextureFromPixmap(GrContext*, const SkPixmap&, SkBudgeted budgeted); + /////////////////////////////////////////////////////////////////////////////////////////////// int width() const { return fWidth; } diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp index 8efe91a706..5eb69372bf 100644 --- a/src/image/SkImage.cpp +++ b/src/image/SkImage.cpp @@ -329,6 +329,10 @@ bool SkImage::isAlphaOnly() const { #if !SK_SUPPORT_GPU +sk_sp<SkImage> SkImage::MakeTextureFromPixmap(GrContext*, const SkPixmap&, SkBudgeted budgeted) { + return nullptr; +} + sk_sp<SkImage> MakeTextureFromMipMap(GrContext*, const SkImageInfo&, const GrMipLevel* texels, int mipLevelCount, SkBudgeted, SkDestinationSurfaceColorMode) { return nullptr; diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp index a1ecf5bdad..ec1968f510 100644 --- a/src/image/SkImage_Gpu.cpp +++ b/src/image/SkImage_Gpu.cpp @@ -371,6 +371,20 @@ sk_sp<SkImage> SkImage::makeNonTextureImage() const { return MakeRasterData(info, data, rowBytes); } +sk_sp<SkImage> SkImage::MakeTextureFromPixmap(GrContext* ctx, const SkPixmap& pixmap, + SkBudgeted budgeted) { + if (!ctx) { + return nullptr; + } + sk_sp<GrTexture> texture(GrUploadPixmapToTexture(ctx, pixmap, budgeted)); + if (!texture) { + return nullptr; + } + return sk_make_sp<SkImage_Gpu>(texture->width(), texture->height(), kNeedNewImageUniqueID, + pixmap.alphaType(), std::move(texture), + sk_ref_sp(pixmap.info().colorSpace()), budgeted); +} + /////////////////////////////////////////////////////////////////////////////////////////////////// namespace { @@ -666,14 +680,21 @@ sk_sp<SkImage> SkImage::MakeFromDeferredTextureImageData(GrContext* context, con } SkImageInfo info = SkImageInfo::Make(dti->fWidth, dti->fHeight, dti->fColorType, dti->fAlphaType, colorSpace); - SkAutoSTArray<16, GrMipLevel> texels(mipLevelCount); - for (int i = 0; i < mipLevelCount; i++) { - texels[i].fPixels = dti->fMipMapLevelData[i].fPixelData; - texels[i].fRowBytes = dti->fMipMapLevelData[i].fRowBytes; - } + if (mipLevelCount == 1) { + SkPixmap pixmap; + pixmap.reset(info, dti->fMipMapLevelData[0].fPixelData, dti->fMipMapLevelData[0].fRowBytes); + return SkImage::MakeTextureFromPixmap(context, pixmap, budgeted); + } else { + std::unique_ptr<GrMipLevel[]> texels(new GrMipLevel[mipLevelCount]); + for (int i = 0; i < mipLevelCount; i++) { + texels[i].fPixels = dti->fMipMapLevelData[i].fPixelData; + texels[i].fRowBytes = dti->fMipMapLevelData[i].fRowBytes; + } - return SkImage::MakeTextureFromMipMap(context, info, texels.get(), mipLevelCount, - SkBudgeted::kYes, dti->fColorMode); + return SkImage::MakeTextureFromMipMap(context, info, texels.get(), + mipLevelCount, SkBudgeted::kYes, + dti->fColorMode); + } } /////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/tests/ImageTest.cpp b/tests/ImageTest.cpp index b16b8eae06..4f9d944d25 100644 --- a/tests/ImageTest.cpp +++ b/tests/ImageTest.cpp @@ -92,6 +92,13 @@ static sk_sp<SkImage> create_data_image() { return SkImage::MakeRasterData(info, std::move(data), info.minRowBytes()); } #if SK_SUPPORT_GPU // not gpu-specific but currently only used in GPU tests +static sk_sp<SkImage> create_image_565() { + const SkImageInfo info = SkImageInfo::Make(20, 20, kRGB_565_SkColorType, kOpaque_SkAlphaType); + auto surface(SkSurface::MakeRaster(info)); + draw_image_test_pattern(surface->getCanvas()); + return surface->makeImageSnapshot(); +} + static sk_sp<SkImage> create_image_large(int maxTextureSize) { const SkImageInfo info = SkImageInfo::MakeN32(maxTextureSize + 1, 32, kOpaque_SkAlphaType); auto surface(SkSurface::MakeRaster(info)); @@ -101,6 +108,23 @@ static sk_sp<SkImage> create_image_large(int maxTextureSize) { surface->getCanvas()->drawRect(SkRect::MakeXYWH(4000, 2, 28000, 30), paint); return surface->makeImageSnapshot(); } +static sk_sp<SkImage> create_image_ct() { + SkPMColor colors[] = { + SkPreMultiplyARGB(0xFF, 0xFF, 0xFF, 0x00), + SkPreMultiplyARGB(0x80, 0x00, 0xA0, 0xFF), + SkPreMultiplyARGB(0xFF, 0xBB, 0x00, 0xBB) + }; + sk_sp<SkColorTable> colorTable(new SkColorTable(colors, SK_ARRAY_COUNT(colors))); + uint8_t data[] = { + 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, + 0, 1, 2, 1, 0, + 0, 1, 1, 1, 0, + 0, 0, 0, 0, 0 + }; + SkImageInfo info = SkImageInfo::Make(5, 5, kIndex_8_SkColorType, kPremul_SkAlphaType); + return SkImage::MakeRasterCopy(SkPixmap(info, data, 5, colorTable.get())); +} static sk_sp<SkImage> create_picture_image() { SkPictureRecorder recorder; SkCanvas* canvas = recorder.beginRecording(10, 10); @@ -776,6 +800,31 @@ static void check_images_same(skiatest::Reporter* reporter, const SkImage* a, co } } +DEF_GPUTEST_FOR_RENDERING_CONTEXTS(NewTextureFromPixmap, reporter, ctxInfo) { + for (auto create : {&create_image, + &create_image_565, + &create_image_ct}) { + sk_sp<SkImage> image((*create)()); + if (!image) { + ERRORF(reporter, "Could not create image"); + return; + } + + SkPixmap pixmap; + if (!image->peekPixels(&pixmap)) { + ERRORF(reporter, "peek failed"); + } else { + sk_sp<SkImage> texImage(SkImage::MakeTextureFromPixmap(ctxInfo.grContext(), pixmap, + SkBudgeted::kNo)); + if (!texImage) { + ERRORF(reporter, "NewTextureFromPixmap failed."); + } else { + check_images_same(reporter, image.get(), texImage.get()); + } + } + } +} + DEF_GPUTEST_FOR_RENDERING_CONTEXTS(DeferredTextureImage, reporter, ctxInfo) { GrContext* context = ctxInfo.grContext(); sk_gpu_test::TestContext* testContext = ctxInfo.testContext(); |