skia2/tests/ImageTest.cpp

1539 lines
62 KiB
C++
Raw Normal View History

/*
* Copyright 2015 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include <functional>
#include <initializer_list>
#include <vector>
#include "include/core/SkBitmap.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkData.h"
#include "include/core/SkImageEncoder.h"
#include "include/core/SkImageGenerator.h"
#include "include/core/SkPicture.h"
#include "include/core/SkPictureRecorder.h"
#include "include/core/SkRRect.h"
#include "include/core/SkSerialProcs.h"
#include "include/core/SkStream.h"
#include "include/core/SkSurface.h"
Reland "Add flush() to SkImage." This reverts commit 693bc2bae5cf41ec51408b8c252b2a61a980659e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Add flush() to SkImage." > > This reverts commit d0503a72ac4293562a8e88be33633ec0cf55c3d4. > > Reason for revert: <INSERT REASONING HERE> > > Original change's description: > > Add flush() to SkImage. > > > > This allows a client to ensure all uses of a texture-backed image have > > been flushed. > > > > Does nothing if the image isn't texture-backed. > > > > The implementation adds support for triggering a flush if any of a set > > of proxies are used rather than just a single proxy. > > > > Change-Id: I358882d9737e63c6e69b924c0767f49b8f8f36ec > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212405 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: Ie376bf4225307f45b8fb3eb4a63bf84702365797 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212884 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: Idcba378ce2e3af0af9d0eef35737670055539ec5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212960 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
2019-05-09 14:30:12 +00:00
#include "include/gpu/GrContextThreadSafeProxy.h"
#include "include/gpu/GrDirectContext.h"
#include "src/core/SkAutoPixmapStorage.h"
#include "src/core/SkColorSpacePriv.h"
#include "src/core/SkImagePriv.h"
#include "src/core/SkUtils.h"
#include "src/gpu/GrDirectContextPriv.h"
Reland "Add flush() to SkImage." This reverts commit 693bc2bae5cf41ec51408b8c252b2a61a980659e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Add flush() to SkImage." > > This reverts commit d0503a72ac4293562a8e88be33633ec0cf55c3d4. > > Reason for revert: <INSERT REASONING HERE> > > Original change's description: > > Add flush() to SkImage. > > > > This allows a client to ensure all uses of a texture-backed image have > > been flushed. > > > > Does nothing if the image isn't texture-backed. > > > > The implementation adds support for triggering a flush if any of a set > > of proxies are used rather than just a single proxy. > > > > Change-Id: I358882d9737e63c6e69b924c0767f49b8f8f36ec > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212405 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: Ie376bf4225307f45b8fb3eb4a63bf84702365797 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212884 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: Idcba378ce2e3af0af9d0eef35737670055539ec5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212960 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
2019-05-09 14:30:12 +00:00
#include "src/gpu/GrGpu.h"
#include "src/gpu/GrImageContextPriv.h"
#include "src/gpu/GrRecordingContextPriv.h"
Reland "Add flush() to SkImage." This reverts commit 693bc2bae5cf41ec51408b8c252b2a61a980659e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Add flush() to SkImage." > > This reverts commit d0503a72ac4293562a8e88be33633ec0cf55c3d4. > > Reason for revert: <INSERT REASONING HERE> > > Original change's description: > > Add flush() to SkImage. > > > > This allows a client to ensure all uses of a texture-backed image have > > been flushed. > > > > Does nothing if the image isn't texture-backed. > > > > The implementation adds support for triggering a flush if any of a set > > of proxies are used rather than just a single proxy. > > > > Change-Id: I358882d9737e63c6e69b924c0767f49b8f8f36ec > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212405 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: Ie376bf4225307f45b8fb3eb4a63bf84702365797 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212884 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: Idcba378ce2e3af0af9d0eef35737670055539ec5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212960 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
2019-05-09 14:30:12 +00:00
#include "src/gpu/GrResourceCache.h"
Reland "Move GrGpuResource GrSurface and GrTexture into src." This reverts commit f6ed96d1c23b79130ca7344c984b07ef9d94fb7b. Reason for revert: google3 change landed Original change's description: > Revert "Move GrGpuResource GrSurface and GrTexture into src." > > This reverts commit e5a06ce678aad7640411f99f70f220f82ad49908. > > Reason for revert: Need to make change in google3 first > > Original change's description: > > Move GrGpuResource GrSurface and GrTexture into src. > > > > Must land https://chromium-review.googlesource.com/c/chromium/src/+/2087980 > > before this can land. > > > > Bug: skia:7966 > > Change-Id: I60bbb1765bfbb2c96b2bc0c9826b6b9d57eb2a03 > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/275077 > > Commit-Queue: Greg Daniel <egdaniel@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: Id39e0a351e49a87209de88a6ad9fadb0219db72c > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: skia:7966 > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/275216 > Reviewed-by: Greg Daniel <egdaniel@google.com> > Commit-Queue: Greg Daniel <egdaniel@google.com> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: I746ce739cb084cefc46f9dab24ef773e7c3cc621 No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: skia:7966 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/275436 Reviewed-by: Greg Daniel <egdaniel@google.com> Commit-Queue: Greg Daniel <egdaniel@google.com>
2020-03-05 19:14:18 +00:00
#include "src/gpu/GrTexture.h"
Reland "Add flush() to SkImage." This reverts commit 693bc2bae5cf41ec51408b8c252b2a61a980659e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Add flush() to SkImage." > > This reverts commit d0503a72ac4293562a8e88be33633ec0cf55c3d4. > > Reason for revert: <INSERT REASONING HERE> > > Original change's description: > > Add flush() to SkImage. > > > > This allows a client to ensure all uses of a texture-backed image have > > been flushed. > > > > Does nothing if the image isn't texture-backed. > > > > The implementation adds support for triggering a flush if any of a set > > of proxies are used rather than just a single proxy. > > > > Change-Id: I358882d9737e63c6e69b924c0767f49b8f8f36ec > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212405 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: Ie376bf4225307f45b8fb3eb4a63bf84702365797 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212884 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: Idcba378ce2e3af0af9d0eef35737670055539ec5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212960 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
2019-05-09 14:30:12 +00:00
#include "src/gpu/SkGr.h"
#include "src/image/SkImage_Base.h"
Reland "Add flush() to SkImage." This reverts commit 693bc2bae5cf41ec51408b8c252b2a61a980659e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Add flush() to SkImage." > > This reverts commit d0503a72ac4293562a8e88be33633ec0cf55c3d4. > > Reason for revert: <INSERT REASONING HERE> > > Original change's description: > > Add flush() to SkImage. > > > > This allows a client to ensure all uses of a texture-backed image have > > been flushed. > > > > Does nothing if the image isn't texture-backed. > > > > The implementation adds support for triggering a flush if any of a set > > of proxies are used rather than just a single proxy. > > > > Change-Id: I358882d9737e63c6e69b924c0767f49b8f8f36ec > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212405 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: Ie376bf4225307f45b8fb3eb4a63bf84702365797 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212884 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: Idcba378ce2e3af0af9d0eef35737670055539ec5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212960 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
2019-05-09 14:30:12 +00:00
#include "src/image/SkImage_GpuYUVA.h"
#include "tests/Test.h"
#include "tools/Resources.h"
#include "tools/ToolUtils.h"
#include "tools/gpu/ManagedBackendTexture.h"
using namespace sk_gpu_test;
Revert "Revert "Disallow readPixels() conversions from untagged srcs to tagged dsts"" This reverts commit 8461506c8b025522eb89cd754c63fb5dbf0cb7f1. Reason for revert: Fixed some Chrome code, let's try this again. Original change's description: > Revert "Disallow readPixels() conversions from untagged srcs to tagged dsts" > > This reverts commit ccfd1083a7b9d546735ddd1037f3240635cce72d. > > Reason for revert: Roll is failing. > > Original change's description: > > Disallow readPixels() conversions from untagged srcs to tagged dsts > > > > This might break the roll into Chrome. But let's see how. > > > > BUG=skia:6021 > > > > Change-Id: I2698b5d6fe72d01bed0dc64703b592a03d441a80 > > Reviewed-on: https://skia-review.googlesource.com/7127 > > Reviewed-by: Mike Reed <reed@google.com> > > Commit-Queue: Matt Sarett <msarett@google.com> > > > > TBR=msarett@google.com,brianosman@google.com,reed@google.com > NOPRESUBMIT=true > NOTREECHECKS=true > NOTRY=true > BUG=skia:6021 > > Change-Id: I4b62178fd7c23f43cf69ca69fc14526ecd503956 > Reviewed-on: https://skia-review.googlesource.com/7205 > Commit-Queue: Matt Sarett <msarett@google.com> > Reviewed-by: Matt Sarett <msarett@google.com> > TBR=msarett@google.com,brianosman@google.com,reed@google.com # Not skipping CQ checks because original CL landed > 1 day ago. BUG=skia:6021 Change-Id: I3f3f33fe6b84fbd5c537b60ed5c8b9201d529a6a Reviewed-on: https://skia-review.googlesource.com/8156 Commit-Queue: Matt Sarett <msarett@google.com> Reviewed-by: Matt Sarett <msarett@google.com>
2017-02-07 21:52:07 +00:00
SkImageInfo read_pixels_info(SkImage* image) {
if (image->colorSpace()) {
Revert "Revert "Disallow readPixels() conversions from untagged srcs to tagged dsts"" This reverts commit 8461506c8b025522eb89cd754c63fb5dbf0cb7f1. Reason for revert: Fixed some Chrome code, let's try this again. Original change's description: > Revert "Disallow readPixels() conversions from untagged srcs to tagged dsts" > > This reverts commit ccfd1083a7b9d546735ddd1037f3240635cce72d. > > Reason for revert: Roll is failing. > > Original change's description: > > Disallow readPixels() conversions from untagged srcs to tagged dsts > > > > This might break the roll into Chrome. But let's see how. > > > > BUG=skia:6021 > > > > Change-Id: I2698b5d6fe72d01bed0dc64703b592a03d441a80 > > Reviewed-on: https://skia-review.googlesource.com/7127 > > Reviewed-by: Mike Reed <reed@google.com> > > Commit-Queue: Matt Sarett <msarett@google.com> > > > > TBR=msarett@google.com,brianosman@google.com,reed@google.com > NOPRESUBMIT=true > NOTREECHECKS=true > NOTRY=true > BUG=skia:6021 > > Change-Id: I4b62178fd7c23f43cf69ca69fc14526ecd503956 > Reviewed-on: https://skia-review.googlesource.com/7205 > Commit-Queue: Matt Sarett <msarett@google.com> > Reviewed-by: Matt Sarett <msarett@google.com> > TBR=msarett@google.com,brianosman@google.com,reed@google.com # Not skipping CQ checks because original CL landed > 1 day ago. BUG=skia:6021 Change-Id: I3f3f33fe6b84fbd5c537b60ed5c8b9201d529a6a Reviewed-on: https://skia-review.googlesource.com/8156 Commit-Queue: Matt Sarett <msarett@google.com> Reviewed-by: Matt Sarett <msarett@google.com>
2017-02-07 21:52:07 +00:00
return SkImageInfo::MakeS32(image->width(), image->height(), image->alphaType());
}
return SkImageInfo::MakeN32(image->width(), image->height(), image->alphaType());
}
// image `b` is assumed to be raster
static void assert_equal(skiatest::Reporter* reporter, GrDirectContext* dContextA, SkImage* a,
const SkIRect* subsetA, SkImage* b) {
const int widthA = subsetA ? subsetA->width() : a->width();
const int heightA = subsetA ? subsetA->height() : a->height();
REPORTER_ASSERT(reporter, widthA == b->width());
REPORTER_ASSERT(reporter, heightA == b->height());
// see https://bug.skia.org/3965
//REPORTER_ASSERT(reporter, a->isOpaque() == b->isOpaque());
SkAutoPixmapStorage pmapA, pmapB;
Revert "Revert "Disallow readPixels() conversions from untagged srcs to tagged dsts"" This reverts commit 8461506c8b025522eb89cd754c63fb5dbf0cb7f1. Reason for revert: Fixed some Chrome code, let's try this again. Original change's description: > Revert "Disallow readPixels() conversions from untagged srcs to tagged dsts" > > This reverts commit ccfd1083a7b9d546735ddd1037f3240635cce72d. > > Reason for revert: Roll is failing. > > Original change's description: > > Disallow readPixels() conversions from untagged srcs to tagged dsts > > > > This might break the roll into Chrome. But let's see how. > > > > BUG=skia:6021 > > > > Change-Id: I2698b5d6fe72d01bed0dc64703b592a03d441a80 > > Reviewed-on: https://skia-review.googlesource.com/7127 > > Reviewed-by: Mike Reed <reed@google.com> > > Commit-Queue: Matt Sarett <msarett@google.com> > > > > TBR=msarett@google.com,brianosman@google.com,reed@google.com > NOPRESUBMIT=true > NOTREECHECKS=true > NOTRY=true > BUG=skia:6021 > > Change-Id: I4b62178fd7c23f43cf69ca69fc14526ecd503956 > Reviewed-on: https://skia-review.googlesource.com/7205 > Commit-Queue: Matt Sarett <msarett@google.com> > Reviewed-by: Matt Sarett <msarett@google.com> > TBR=msarett@google.com,brianosman@google.com,reed@google.com # Not skipping CQ checks because original CL landed > 1 day ago. BUG=skia:6021 Change-Id: I3f3f33fe6b84fbd5c537b60ed5c8b9201d529a6a Reviewed-on: https://skia-review.googlesource.com/8156 Commit-Queue: Matt Sarett <msarett@google.com> Reviewed-by: Matt Sarett <msarett@google.com>
2017-02-07 21:52:07 +00:00
pmapA.alloc(read_pixels_info(a));
pmapB.alloc(read_pixels_info(b));
const int srcX = subsetA ? subsetA->x() : 0;
const int srcY = subsetA ? subsetA->y() : 0;
REPORTER_ASSERT(reporter, a->readPixels(dContextA, pmapA, srcX, srcY));
REPORTER_ASSERT(reporter, b->readPixels(nullptr, pmapB, 0, 0));
Revert "Revert "Disallow readPixels() conversions from untagged srcs to tagged dsts"" This reverts commit 8461506c8b025522eb89cd754c63fb5dbf0cb7f1. Reason for revert: Fixed some Chrome code, let's try this again. Original change's description: > Revert "Disallow readPixels() conversions from untagged srcs to tagged dsts" > > This reverts commit ccfd1083a7b9d546735ddd1037f3240635cce72d. > > Reason for revert: Roll is failing. > > Original change's description: > > Disallow readPixels() conversions from untagged srcs to tagged dsts > > > > This might break the roll into Chrome. But let's see how. > > > > BUG=skia:6021 > > > > Change-Id: I2698b5d6fe72d01bed0dc64703b592a03d441a80 > > Reviewed-on: https://skia-review.googlesource.com/7127 > > Reviewed-by: Mike Reed <reed@google.com> > > Commit-Queue: Matt Sarett <msarett@google.com> > > > > TBR=msarett@google.com,brianosman@google.com,reed@google.com > NOPRESUBMIT=true > NOTREECHECKS=true > NOTRY=true > BUG=skia:6021 > > Change-Id: I4b62178fd7c23f43cf69ca69fc14526ecd503956 > Reviewed-on: https://skia-review.googlesource.com/7205 > Commit-Queue: Matt Sarett <msarett@google.com> > Reviewed-by: Matt Sarett <msarett@google.com> > TBR=msarett@google.com,brianosman@google.com,reed@google.com # Not skipping CQ checks because original CL landed > 1 day ago. BUG=skia:6021 Change-Id: I3f3f33fe6b84fbd5c537b60ed5c8b9201d529a6a Reviewed-on: https://skia-review.googlesource.com/8156 Commit-Queue: Matt Sarett <msarett@google.com> Reviewed-by: Matt Sarett <msarett@google.com>
2017-02-07 21:52:07 +00:00
const size_t widthBytes = widthA * 4;
for (int y = 0; y < heightA; ++y) {
REPORTER_ASSERT(reporter, !memcmp(pmapA.addr32(0, y), pmapB.addr32(0, y), widthBytes));
}
}
static void draw_image_test_pattern(SkCanvas* canvas) {
canvas->clear(SK_ColorWHITE);
SkPaint paint;
paint.setColor(SK_ColorBLACK);
canvas->drawRect(SkRect::MakeXYWH(5, 5, 10, 10), paint);
}
static sk_sp<SkImage> create_image() {
const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);
auto surface(SkSurface::MakeRaster(info));
draw_image_test_pattern(surface->getCanvas());
return surface->makeImageSnapshot();
}
static sk_sp<SkData> create_image_data(SkImageInfo* info) {
*info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);
const size_t rowBytes = info->minRowBytes();
sk_sp<SkData> data(SkData::MakeUninitialized(rowBytes * info->height()));
{
SkBitmap bm;
bm.installPixels(*info, data->writable_data(), rowBytes);
SkCanvas canvas(bm);
draw_image_test_pattern(&canvas);
}
return data;
}
static sk_sp<SkImage> create_data_image() {
SkImageInfo info;
sk_sp<SkData> data(create_image_data(&info));
return SkImage::MakeRasterData(info, std::move(data), info.minRowBytes());
}
static sk_sp<SkImage> create_image_large(int maxTextureSize) {
const SkImageInfo info = SkImageInfo::MakeN32(maxTextureSize + 1, 32, kOpaque_SkAlphaType);
auto surface(SkSurface::MakeRaster(info));
surface->getCanvas()->clear(SK_ColorWHITE);
SkPaint paint;
paint.setColor(SK_ColorBLACK);
surface->getCanvas()->drawRect(SkRect::MakeXYWH(4000, 2, 28000, 30), paint);
return surface->makeImageSnapshot();
}
static sk_sp<SkImage> create_picture_image() {
SkPictureRecorder recorder;
SkCanvas* canvas = recorder.beginRecording(10, 10);
canvas->clear(SK_ColorCYAN);
return SkImage::MakeFromPicture(recorder.finishRecordingAsPicture(), SkISize::Make(10, 10),
nullptr, nullptr, SkImage::BitDepth::kU8,
SkColorSpace::MakeSRGB());
};
// Want to ensure that our Release is called when the owning image is destroyed
struct RasterDataHolder {
RasterDataHolder() : fReleaseCount(0) {}
sk_sp<SkData> fData;
int fReleaseCount;
static void Release(const void* pixels, void* context) {
RasterDataHolder* self = static_cast<RasterDataHolder*>(context);
self->fReleaseCount++;
self->fData.reset();
}
};
static sk_sp<SkImage> create_rasterproc_image(RasterDataHolder* dataHolder) {
SkASSERT(dataHolder);
SkImageInfo info;
dataHolder->fData = create_image_data(&info);
return SkImage::MakeFromRaster(SkPixmap(info, dataHolder->fData->data(), info.minRowBytes()),
RasterDataHolder::Release, dataHolder);
}
static sk_sp<SkImage> create_codec_image() {
SkImageInfo info;
sk_sp<SkData> data(create_image_data(&info));
SkBitmap bitmap;
bitmap.installPixels(info, data->writable_data(), info.minRowBytes());
auto src = SkEncodeBitmap(bitmap, SkEncodedImageFormat::kPNG, 100);
return SkImage::MakeFromEncoded(std::move(src));
}
static sk_sp<SkImage> create_gpu_image(GrRecordingContext* rContext,
bool withMips = false,
SkBudgeted budgeted = SkBudgeted::kYes) {
const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);
auto surface = SkSurface::MakeRenderTarget(rContext, budgeted, info, 0,
kBottomLeft_GrSurfaceOrigin, nullptr, withMips);
draw_image_test_pattern(surface->getCanvas());
return surface->makeImageSnapshot();
}
static void test_encode(skiatest::Reporter* reporter, GrDirectContext* dContext, SkImage* image) {
const SkIRect ir = SkIRect::MakeXYWH(5, 5, 10, 10);
sk_sp<SkData> origEncoded = image->encodeToData();
REPORTER_ASSERT(reporter, origEncoded);
REPORTER_ASSERT(reporter, origEncoded->size() > 0);
sk_sp<SkImage> decoded(SkImage::MakeFromEncoded(origEncoded));
Make SkPngCodec decode progressively. This is a step towards using SkCodec in Chromium, where progressive decoding is necessary. Switch from using png_read_row (which expects all the data to be available) to png_process_data, which uses callbacks when rows are available. Create a new API for SkCodec, which supports progressive decoding and scanline decoding. Future changes will switch the other clients off of startScanlineDecode and get/skip-Scanlines to the new API. Remove SkCodec::kNone_ScanlineOrder, which was only used for interlaced PNG images. In the new API, interlaced PNG fits kTopDown. Also remove updateCurrScanline(), which was only used by the old implementation for interlaced PNG. DMSrcSink: - In CodecSrc::kScanline_Mode, use the new method for scanline decoding for the supported formats (just PNG and PNG-in-ICO for now). fuzz.cpp: - Remove reference to kNone_ScanlineOrder SkCodec: - Add new APIs: - startIncrementalDecode - incrementalDecode - Remove kNone_SkScanlineOrder and updateCurrScanline() - Set fDstInfo and fOptions in getPixels(). This may not be necessary for all implementations, but it simplifies things for SkPngCodec. SkPngCodec: - Implement new APIs - Switch from sk_read_fn/png_read_row etc to png_process_data - Expand AutoCleanPng's role to decode the header and create the SkPngCodec - Make the interlaced PNG decoder report how many lines were initialized during an incomplete decode SkIcoCodec: - Implement the new APIs; supported for PNG in ICO SkSampledCodec: - Call the new method for decoding scanlines, and fall back to the old method if the new version is unimplemented - Remove references to kNone_SkScanlineOrder tests/CodecPartial: - Add a test which decodes part of an image, then finishes the decode, and compares it to the straightforward method tests/CodecTest: - Add a test which decodes all scanlines using the new method - Repurpose the Codec_stripes test to decode using the new method in sections rather than all at once - In the method check(), add a parameter for whether the image supports the new method of scanline decoding, and be explicit about whether an image supports incomplete - Test incomplete PNG decodes. We should have been doing it anyway for non-interlaced (except for an image that is too small - one row), but the new method supports interlaced incomplete as well - Make test_invalid_parameters test the new method - Add a test to ensure that it's safe to fall back to scanline decoding without rewinding BUG=skia:4211 The new version was generally faster than the old version (but not significantly so). Some raw performance differences can be found at https://docs.google.com/a/google.com/spreadsheets/d/1Gis3aRCEa72qBNDRMgGDg3jD-pMgO-FXldlNF9ejo4o/ Design doc can be found at https://docs.google.com/a/google.com/document/d/11Mn8-ePDKwVEMCjs3nWwSjxcSpJ_Cu8DF57KNtUmgLM/ GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1997703003 Review-Url: https://codereview.chromium.org/1997703003
2016-09-16 15:20:38 +00:00
if (!decoded) {
ERRORF(reporter, "failed to decode image!");
return;
}
REPORTER_ASSERT(reporter, decoded);
assert_equal(reporter, dContext, image, nullptr, decoded.get());
// Now see if we can instantiate an image from a subset of the surface/origEncoded
decoded = SkImage::MakeFromEncoded(origEncoded)->makeSubset(ir);
REPORTER_ASSERT(reporter, decoded);
assert_equal(reporter, dContext, image, &ir, decoded.get());
}
DEF_TEST(ImageEncode, reporter) {
test_encode(reporter, nullptr, create_image().get());
}
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageEncode_Gpu, reporter, ctxInfo) {
auto dContext = ctxInfo.directContext();
test_encode(reporter, dContext, create_gpu_image(dContext).get());
}
DEF_TEST(Image_MakeFromRasterBitmap, reporter) {
const struct {
SkCopyPixelsMode fCPM;
bool fExpectSameAsMutable;
bool fExpectSameAsImmutable;
} recs[] = {
{ kIfMutable_SkCopyPixelsMode, false, true },
{ kAlways_SkCopyPixelsMode, false, false },
{ kNever_SkCopyPixelsMode, true, true },
};
for (auto rec : recs) {
SkPixmap pm;
SkBitmap bm;
bm.allocN32Pixels(100, 100);
auto img = SkMakeImageFromRasterBitmap(bm, rec.fCPM);
REPORTER_ASSERT(reporter, img->peekPixels(&pm));
const bool sameMutable = pm.addr32(0, 0) == bm.getAddr32(0, 0);
REPORTER_ASSERT(reporter, rec.fExpectSameAsMutable == sameMutable);
REPORTER_ASSERT(reporter, (bm.getGenerationID() == img->uniqueID()) == sameMutable);
bm.notifyPixelsChanged(); // force a new generation ID
bm.setImmutable();
img = SkMakeImageFromRasterBitmap(bm, rec.fCPM);
REPORTER_ASSERT(reporter, img->peekPixels(&pm));
const bool sameImmutable = pm.addr32(0, 0) == bm.getAddr32(0, 0);
REPORTER_ASSERT(reporter, rec.fExpectSameAsImmutable == sameImmutable);
REPORTER_ASSERT(reporter, (bm.getGenerationID() == img->uniqueID()) == sameImmutable);
}
}
// Test that image encoding failures do not break picture serialization/deserialization.
DEF_TEST(Image_Serialize_Encoding_Failure, reporter) {
auto surface(SkSurface::MakeRasterN32Premul(100, 100));
surface->getCanvas()->clear(SK_ColorGREEN);
sk_sp<SkImage> image(surface->makeImageSnapshot());
REPORTER_ASSERT(reporter, image);
SkPictureRecorder recorder;
SkCanvas* canvas = recorder.beginRecording(100, 100);
canvas->drawImage(image, 0, 0);
sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
REPORTER_ASSERT(reporter, picture);
REPORTER_ASSERT(reporter, picture->approximateOpCount() > 0);
bool was_called = false;
SkSerialProcs procs;
procs.fImageProc = [](SkImage*, void* called) {
*(bool*)called = true;
return SkData::MakeEmpty();
};
procs.fImageCtx = &was_called;
REPORTER_ASSERT(reporter, !was_called);
auto data = picture->serialize(&procs);
REPORTER_ASSERT(reporter, was_called);
REPORTER_ASSERT(reporter, data && data->size() > 0);
auto deserialized = SkPicture::MakeFromData(data->data(), data->size());
REPORTER_ASSERT(reporter, deserialized);
REPORTER_ASSERT(reporter, deserialized->approximateOpCount() > 0);
}
// Test that a draw that only partially covers the drawing surface isn't
// interpreted as covering the entire drawing surface (i.e., exercise one of the
// conditions of SkCanvas::wouldOverwriteEntireSurface()).
DEF_TEST(Image_RetainSnapshot, reporter) {
const SkPMColor red = SkPackARGB32(0xFF, 0xFF, 0, 0);
const SkPMColor green = SkPackARGB32(0xFF, 0, 0xFF, 0);
SkImageInfo info = SkImageInfo::MakeN32Premul(2, 2);
auto surface(SkSurface::MakeRaster(info));
surface->getCanvas()->clear(0xFF00FF00);
SkPMColor pixels[4];
memset(pixels, 0xFF, sizeof(pixels)); // init with values we don't expect
const SkImageInfo dstInfo = SkImageInfo::MakeN32Premul(2, 2);
const size_t dstRowBytes = 2 * sizeof(SkPMColor);
sk_sp<SkImage> image1(surface->makeImageSnapshot());
REPORTER_ASSERT(reporter, image1->readPixels(nullptr, dstInfo, pixels, dstRowBytes, 0, 0));
for (size_t i = 0; i < SK_ARRAY_COUNT(pixels); ++i) {
REPORTER_ASSERT(reporter, pixels[i] == green);
}
SkPaint paint;
paint.setBlendMode(SkBlendMode::kSrc);
paint.setColor(SK_ColorRED);
surface->getCanvas()->drawRect(SkRect::MakeXYWH(1, 1, 1, 1), paint);
sk_sp<SkImage> image2(surface->makeImageSnapshot());
REPORTER_ASSERT(reporter, image2->readPixels(nullptr, dstInfo, pixels, dstRowBytes, 0, 0));
REPORTER_ASSERT(reporter, pixels[0] == green);
REPORTER_ASSERT(reporter, pixels[1] == green);
REPORTER_ASSERT(reporter, pixels[2] == green);
REPORTER_ASSERT(reporter, pixels[3] == red);
}
/////////////////////////////////////////////////////////////////////////////////////////////////
static void make_bitmap_mutable(SkBitmap* bm) {
bm->allocN32Pixels(10, 10);
}
static void make_bitmap_immutable(SkBitmap* bm) {
bm->allocN32Pixels(10, 10);
bm->setImmutable();
}
DEF_TEST(image_newfrombitmap, reporter) {
const struct {
void (*fMakeProc)(SkBitmap*);
bool fExpectPeekSuccess;
bool fExpectSharedID;
bool fExpectLazy;
} rec[] = {
{ make_bitmap_mutable, true, false, false },
{ make_bitmap_immutable, true, true, false },
};
for (size_t i = 0; i < SK_ARRAY_COUNT(rec); ++i) {
SkBitmap bm;
rec[i].fMakeProc(&bm);
sk_sp<SkImage> image(SkImage::MakeFromBitmap(bm));
SkPixmap pmap;
const bool sharedID = (image->uniqueID() == bm.getGenerationID());
REPORTER_ASSERT(reporter, sharedID == rec[i].fExpectSharedID);
const bool peekSuccess = image->peekPixels(&pmap);
REPORTER_ASSERT(reporter, peekSuccess == rec[i].fExpectPeekSuccess);
const bool lazy = image->isLazyGenerated();
REPORTER_ASSERT(reporter, lazy == rec[i].fExpectLazy);
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
#include "src/core/SkBitmapCache.h"
/*
* This tests the caching (and preemptive purge) of the raster equivalent of a gpu-image.
* We cache it for performance when drawing into a raster surface.
*
* A cleaner test would know if each drawImage call triggered a read-back from the gpu,
* but we don't have that facility (at the moment) so we use a little internal knowledge
* of *how* the raster version is cached, and look for that.
*/
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(SkImage_Gpu2Cpu, reporter, ctxInfo) {
SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);
sk_sp<SkImage> image(create_gpu_image(ctxInfo.directContext()));
const auto desc = SkBitmapCacheDesc::Make(image.get());
auto surface(SkSurface::MakeRaster(info));
// now we can test drawing a gpu-backed image into a cpu-backed surface
{
SkBitmap cachedBitmap;
REPORTER_ASSERT(reporter, !SkBitmapCache::Find(desc, &cachedBitmap));
}
surface->getCanvas()->drawImage(image, 0, 0);
{
SkBitmap cachedBitmap;
if (SkBitmapCache::Find(desc, &cachedBitmap)) {
REPORTER_ASSERT(reporter, cachedBitmap.isImmutable());
REPORTER_ASSERT(reporter, cachedBitmap.getPixels());
} else {
// unexpected, but not really a bug, since the cache is global and this test may be
// run w/ other threads competing for its budget.
SkDebugf("SkImage_Gpu2Cpu : cachedBitmap was already purged\n");
}
}
image.reset(nullptr);
{
SkBitmap cachedBitmap;
REPORTER_ASSERT(reporter, !SkBitmapCache::Find(desc, &cachedBitmap));
}
}
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(SkImage_makeTextureImage, reporter, contextInfo) {
auto dContext = contextInfo.directContext();
sk_gpu_test::TestContext* testContext = contextInfo.testContext();
GrContextFactory otherFactory;
ContextInfo otherContextInfo = otherFactory.getContextInfo(contextInfo.type());
testContext->makeCurrent();
std::function<sk_sp<SkImage>()> imageFactories[] = {
create_image, create_codec_image, create_data_image,
// Create an image from a picture.
create_picture_image,
// Create a texture image.
[dContext] { return create_gpu_image(dContext, true, SkBudgeted::kYes); },
[dContext] { return create_gpu_image(dContext, false, SkBudgeted::kNo); },
// Create a texture image in a another context.
[otherContextInfo] {
auto restore = otherContextInfo.testContext()->makeCurrentAndAutoRestore();
auto otherContextImage = create_gpu_image(otherContextInfo.directContext());
otherContextInfo.directContext()->flushAndSubmit();
return otherContextImage;
}};
for (auto mipMapped : {GrMipmapped::kNo, GrMipmapped::kYes}) {
for (const auto& factory : imageFactories) {
sk_sp<SkImage> image(factory());
if (!image) {
ERRORF(reporter, "Error creating image.");
continue;
}
GrTextureProxy* origProxy = nullptr;
if (auto sp = as_IB(image)->peekProxy()) {
origProxy = sp->asTextureProxy();
SkASSERT(origProxy);
}
for (auto budgeted : {SkBudgeted::kNo, SkBudgeted::kYes}) {
auto texImage = image->makeTextureImage(dContext, mipMapped, budgeted);
if (!texImage) {
auto imageContext = as_IB(image)->context();
// We expect to fail if image comes from a different context
if (!image->isTextureBacked() || imageContext->priv().matches(dContext)) {
ERRORF(reporter, "makeTextureImage failed.");
}
continue;
}
if (!texImage->isTextureBacked()) {
ERRORF(reporter, "makeTextureImage returned non-texture image.");
continue;
}
GrTextureProxy* copyProxy = as_IB(texImage)->peekProxy()->asTextureProxy();
SkASSERT(copyProxy);
bool shouldBeMipped =
mipMapped == GrMipmapped::kYes && dContext->priv().caps()->mipmapSupport();
if (shouldBeMipped && copyProxy->mipmapped() == GrMipmapped::kNo) {
ERRORF(reporter, "makeTextureImage returned non-mipmapped texture.");
continue;
}
bool origIsMipped = origProxy && origProxy->mipmapped() == GrMipmapped::kYes;
if (image->isTextureBacked() && (!shouldBeMipped || origIsMipped)) {
if (origProxy->underlyingUniqueID() != copyProxy->underlyingUniqueID()) {
ERRORF(reporter, "makeTextureImage made unnecessary texture copy.");
}
} else {
auto* texProxy = as_IB(texImage)->peekProxy()->asTextureProxy();
REPORTER_ASSERT(reporter, !texProxy->getUniqueKey().isValid());
REPORTER_ASSERT(reporter, texProxy->isBudgeted() == budgeted);
}
if (image->width() != texImage->width() || image->height() != texImage->height()) {
ERRORF(reporter, "makeTextureImage changed the image size.");
}
if (image->alphaType() != texImage->alphaType()) {
ERRORF(reporter, "makeTextureImage changed image alpha type.");
}
}
}
}
dContext->flushAndSubmit();
}
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(SkImage_makeNonTextureImage, reporter, contextInfo) {
auto dContext = contextInfo.directContext();
std::function<sk_sp<SkImage>()> imageFactories[] = {
create_image,
create_codec_image,
create_data_image,
create_picture_image,
[dContext] { return create_gpu_image(dContext); },
};
for (const auto& factory : imageFactories) {
sk_sp<SkImage> image = factory();
if (!image->isTextureBacked()) {
REPORTER_ASSERT(reporter, image->makeNonTextureImage().get() == image.get());
if (!(image = image->makeTextureImage(dContext))) {
continue;
}
}
auto rasterImage = image->makeNonTextureImage();
if (!rasterImage) {
ERRORF(reporter, "makeNonTextureImage failed for texture-backed image.");
}
REPORTER_ASSERT(reporter, !rasterImage->isTextureBacked());
assert_equal(reporter, dContext, image.get(), nullptr, rasterImage.get());
}
}
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(GrContext_colorTypeSupportedAsImage, reporter, ctxInfo) {
Reland "Migrate SkImage::MakeFromTexture to GrRecordingContext" This reverts commit 74b83a4ea9e31dbdc1996a1ed2d1844d5cdbe9b7. Reason for revert: Flutter is updated Original change's description: > Revert "Migrate SkImage::MakeFromTexture to GrRecordingContext" > > This reverts commit daa9e7455d4f0f54dc07f405becba5d0c5964847. > > Reason for revert: Broke Build-Debian9-Clang-arm-Release-Flutter_Android_Docker > > Original change's description: > > Migrate SkImage::MakeFromTexture to GrRecordingContext > > > > Android migration landed in Android CL 12234077 > > Chrome migration is landing in Chrome CL 2335812 > > > > Note: makeFromCompressedTexture is not used by Chrome. > > > > Bug: skia:104662 > > Change-Id: Ibbe6d412cf22e87188926383d10b21f780208e48 > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/305102 > > Commit-Queue: Adlai Holler <adlai@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > Reviewed-by: Brian Salomon <bsalomon@google.com> > > Auto-Submit: Adlai Holler <adlai@google.com> > > TBR=bsalomon@google.com,robertphillips@google.com,adlai@google.com > > Change-Id: I570945521c6cd78dfeea81e492b7e2b31dd0e6f5 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: skia:104662 > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/308505 > Reviewed-by: Adlai Holler <adlai@google.com> > Commit-Queue: Adlai Holler <adlai@google.com> TBR=bsalomon@google.com,robertphillips@google.com,adlai@google.com # Not skipping CQ checks because original CL landed > 1 day ago. Bug: skia:104662 Change-Id: Ie1d7fd9e597e6e6e5bd91bec086e83a8c1f45a37 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/309321 Reviewed-by: Adlai Holler <adlai@google.com> Commit-Queue: Adlai Holler <adlai@google.com> Auto-Submit: Adlai Holler <adlai@google.com>
2020-08-11 15:48:49 +00:00
auto dContext = ctxInfo.directContext();
static constexpr int kSize = 10;
for (int ct = 0; ct < kLastEnum_SkColorType; ++ct) {
SkColorType colorType = static_cast<SkColorType>(ct);
Reland "Migrate SkImage::MakeFromTexture to GrRecordingContext" This reverts commit 74b83a4ea9e31dbdc1996a1ed2d1844d5cdbe9b7. Reason for revert: Flutter is updated Original change's description: > Revert "Migrate SkImage::MakeFromTexture to GrRecordingContext" > > This reverts commit daa9e7455d4f0f54dc07f405becba5d0c5964847. > > Reason for revert: Broke Build-Debian9-Clang-arm-Release-Flutter_Android_Docker > > Original change's description: > > Migrate SkImage::MakeFromTexture to GrRecordingContext > > > > Android migration landed in Android CL 12234077 > > Chrome migration is landing in Chrome CL 2335812 > > > > Note: makeFromCompressedTexture is not used by Chrome. > > > > Bug: skia:104662 > > Change-Id: Ibbe6d412cf22e87188926383d10b21f780208e48 > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/305102 > > Commit-Queue: Adlai Holler <adlai@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > Reviewed-by: Brian Salomon <bsalomon@google.com> > > Auto-Submit: Adlai Holler <adlai@google.com> > > TBR=bsalomon@google.com,robertphillips@google.com,adlai@google.com > > Change-Id: I570945521c6cd78dfeea81e492b7e2b31dd0e6f5 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: skia:104662 > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/308505 > Reviewed-by: Adlai Holler <adlai@google.com> > Commit-Queue: Adlai Holler <adlai@google.com> TBR=bsalomon@google.com,robertphillips@google.com,adlai@google.com # Not skipping CQ checks because original CL landed > 1 day ago. Bug: skia:104662 Change-Id: Ie1d7fd9e597e6e6e5bd91bec086e83a8c1f45a37 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/309321 Reviewed-by: Adlai Holler <adlai@google.com> Commit-Queue: Adlai Holler <adlai@google.com> Auto-Submit: Adlai Holler <adlai@google.com>
2020-08-11 15:48:49 +00:00
bool can = dContext->colorTypeSupportedAsImage(colorType);
auto mbet = sk_gpu_test::ManagedBackendTexture::MakeWithoutData(
dContext, kSize, kSize, colorType, GrMipmapped::kNo, GrRenderable::kNo);
sk_sp<SkImage> img;
if (mbet) {
img = SkImage::MakeFromTexture(dContext, mbet->texture(), kTopLeft_GrSurfaceOrigin,
colorType, kOpaque_SkAlphaType, nullptr);
}
REPORTER_ASSERT(reporter, can == SkToBool(img),
"colorTypeSupportedAsImage:%d, actual:%d, ct:%d", can, SkToBool(img),
colorType);
}
}
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(UnpremulTextureImage, reporter, ctxInfo) {
SkBitmap bmp;
bmp.allocPixels(
SkImageInfo::Make(256, 256, kRGBA_8888_SkColorType, kUnpremul_SkAlphaType, nullptr));
for (int y = 0; y < 256; ++y) {
for (int x = 0; x < 256; ++x) {
*bmp.getAddr32(x, y) =
SkColorSetARGB((U8CPU)y, 255 - (U8CPU)y, (U8CPU)x, 255 - (U8CPU)x);
}
}
auto dContext = ctxInfo.directContext();
auto texImage = SkImage::MakeFromBitmap(bmp)->makeTextureImage(dContext);
if (!texImage || texImage->alphaType() != kUnpremul_SkAlphaType) {
ERRORF(reporter, "Failed to make unpremul texture image.");
return;
}
SkBitmap unpremul;
unpremul.allocPixels(SkImageInfo::Make(256, 256, kRGBA_8888_SkColorType,
kUnpremul_SkAlphaType, nullptr));
if (!texImage->readPixels(dContext, unpremul.info(), unpremul.getPixels(), unpremul.rowBytes(),
0, 0)) {
ERRORF(reporter, "Unpremul readback failed.");
return;
}
for (int y = 0; y < 256; ++y) {
for (int x = 0; x < 256; ++x) {
if (*bmp.getAddr32(x, y) != *unpremul.getAddr32(x, y)) {
ERRORF(reporter, "unpremul(0x%08x)->unpremul(0x%08x) at %d, %d.",
*bmp.getAddr32(x, y), *unpremul.getAddr32(x, y), x, y);
return;
}
}
}
SkBitmap premul;
premul.allocPixels(
SkImageInfo::Make(256, 256, kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr));
if (!texImage->readPixels(dContext, premul.info(), premul.getPixels(), premul.rowBytes(),
0, 0)) {
ERRORF(reporter, "Unpremul readback failed.");
return;
}
for (int y = 0; y < 256; ++y) {
for (int x = 0; x < 256; ++x) {
uint32_t origColor = *bmp.getAddr32(x, y);
int32_t origA = (origColor >> 24) & 0xff;
float a = origA / 255.f;
int32_t origB = sk_float_round2int(((origColor >> 16) & 0xff) * a);
int32_t origG = sk_float_round2int(((origColor >> 8) & 0xff) * a);
int32_t origR = sk_float_round2int(((origColor >> 0) & 0xff) * a);
uint32_t read = *premul.getAddr32(x, y);
int32_t readA = (read >> 24) & 0xff;
int32_t readB = (read >> 16) & 0xff;
int32_t readG = (read >> 8) & 0xff;
int32_t readR = (read >> 0) & 0xff;
// We expect that alpha=1 and alpha=0 should come out exact. Otherwise allow a little
// bit of tolerance for GPU vs CPU premul math.
int32_t tol = (origA == 0 || origA == 255) ? 0 : 1;
if (origA != readA || SkTAbs(readB - origB) > tol || SkTAbs(readG - origG) > tol ||
SkTAbs(readR - origR) > tol) {
ERRORF(reporter, "unpremul(0x%08x)->premul(0x%08x) expected(0x%08x) at %d, %d.",
*bmp.getAddr32(x, y), *premul.getAddr32(x, y), origColor, x, y);
return;
}
}
}
}
DEF_GPUTEST(AbandonedContextImage, reporter, options) {
using Factory = sk_gpu_test::GrContextFactory;
for (int ct = 0; ct < Factory::kContextTypeCnt; ++ct) {
auto type = static_cast<Factory::ContextType>(ct);
std::unique_ptr<Factory> factory(new Factory);
if (!factory->get(type)) {
continue;
}
sk_sp<SkImage> img;
auto gsurf = SkSurface::MakeRenderTarget(
factory->get(type), SkBudgeted::kYes,
SkImageInfo::Make(100, 100, kRGBA_8888_SkColorType, kPremul_SkAlphaType), 1,
nullptr);
if (!gsurf) {
continue;
}
img = gsurf->makeImageSnapshot();
gsurf.reset();
auto rsurf = SkSurface::MakeRaster(SkImageInfo::MakeN32Premul(100, 100));
REPORTER_ASSERT(reporter, img->isValid(factory->get(type)));
REPORTER_ASSERT(reporter, img->isValid(rsurf->getCanvas()->recordingContext()));
factory->get(type)->abandonContext();
REPORTER_ASSERT(reporter, !img->isValid(factory->get(type)));
REPORTER_ASSERT(reporter, !img->isValid(rsurf->getCanvas()->recordingContext()));
// This shouldn't crash.
rsurf->getCanvas()->drawImage(img, 0, 0);
// Give up all other refs on the context.
factory.reset(nullptr);
REPORTER_ASSERT(reporter, !img->isValid(rsurf->getCanvas()->recordingContext()));
// This shouldn't crash.
rsurf->getCanvas()->drawImage(img, 0, 0);
}
}
class EmptyGenerator : public SkImageGenerator {
public:
EmptyGenerator() : SkImageGenerator(SkImageInfo::MakeN32Premul(0, 0)) {}
};
DEF_TEST(ImageEmpty, reporter) {
const SkImageInfo info = SkImageInfo::Make(0, 0, kN32_SkColorType, kPremul_SkAlphaType);
SkPixmap pmap(info, nullptr, 0);
REPORTER_ASSERT(reporter, nullptr == SkImage::MakeRasterCopy(pmap));
REPORTER_ASSERT(reporter, nullptr == SkImage::MakeRasterData(info, nullptr, 0));
REPORTER_ASSERT(reporter, nullptr == SkImage::MakeFromRaster(pmap, nullptr, nullptr));
REPORTER_ASSERT(reporter, nullptr == SkImage::MakeFromGenerator(
std::make_unique<EmptyGenerator>()));
}
DEF_TEST(ImageDataRef, reporter) {
SkImageInfo info = SkImageInfo::MakeN32Premul(1, 1);
size_t rowBytes = info.minRowBytes();
size_t size = info.computeByteSize(rowBytes);
sk_sp<SkData> data = SkData::MakeUninitialized(size);
REPORTER_ASSERT(reporter, data->unique());
sk_sp<SkImage> image = SkImage::MakeRasterData(info, data, rowBytes);
REPORTER_ASSERT(reporter, !data->unique());
image.reset();
REPORTER_ASSERT(reporter, data->unique());
}
static bool has_pixels(const SkPMColor pixels[], int count, SkPMColor expected) {
for (int i = 0; i < count; ++i) {
if (pixels[i] != expected) {
return false;
}
}
return true;
}
static void image_test_read_pixels(GrDirectContext* dContext, skiatest::Reporter* reporter,
SkImage* image) {
Make SkPngCodec decode progressively. This is a step towards using SkCodec in Chromium, where progressive decoding is necessary. Switch from using png_read_row (which expects all the data to be available) to png_process_data, which uses callbacks when rows are available. Create a new API for SkCodec, which supports progressive decoding and scanline decoding. Future changes will switch the other clients off of startScanlineDecode and get/skip-Scanlines to the new API. Remove SkCodec::kNone_ScanlineOrder, which was only used for interlaced PNG images. In the new API, interlaced PNG fits kTopDown. Also remove updateCurrScanline(), which was only used by the old implementation for interlaced PNG. DMSrcSink: - In CodecSrc::kScanline_Mode, use the new method for scanline decoding for the supported formats (just PNG and PNG-in-ICO for now). fuzz.cpp: - Remove reference to kNone_ScanlineOrder SkCodec: - Add new APIs: - startIncrementalDecode - incrementalDecode - Remove kNone_SkScanlineOrder and updateCurrScanline() - Set fDstInfo and fOptions in getPixels(). This may not be necessary for all implementations, but it simplifies things for SkPngCodec. SkPngCodec: - Implement new APIs - Switch from sk_read_fn/png_read_row etc to png_process_data - Expand AutoCleanPng's role to decode the header and create the SkPngCodec - Make the interlaced PNG decoder report how many lines were initialized during an incomplete decode SkIcoCodec: - Implement the new APIs; supported for PNG in ICO SkSampledCodec: - Call the new method for decoding scanlines, and fall back to the old method if the new version is unimplemented - Remove references to kNone_SkScanlineOrder tests/CodecPartial: - Add a test which decodes part of an image, then finishes the decode, and compares it to the straightforward method tests/CodecTest: - Add a test which decodes all scanlines using the new method - Repurpose the Codec_stripes test to decode using the new method in sections rather than all at once - In the method check(), add a parameter for whether the image supports the new method of scanline decoding, and be explicit about whether an image supports incomplete - Test incomplete PNG decodes. We should have been doing it anyway for non-interlaced (except for an image that is too small - one row), but the new method supports interlaced incomplete as well - Make test_invalid_parameters test the new method - Add a test to ensure that it's safe to fall back to scanline decoding without rewinding BUG=skia:4211 The new version was generally faster than the old version (but not significantly so). Some raw performance differences can be found at https://docs.google.com/a/google.com/spreadsheets/d/1Gis3aRCEa72qBNDRMgGDg3jD-pMgO-FXldlNF9ejo4o/ Design doc can be found at https://docs.google.com/a/google.com/document/d/11Mn8-ePDKwVEMCjs3nWwSjxcSpJ_Cu8DF57KNtUmgLM/ GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1997703003 Review-Url: https://codereview.chromium.org/1997703003
2016-09-16 15:20:38 +00:00
if (!image) {
ERRORF(reporter, "Failed to create image!");
return;
}
const SkPMColor expected = SkPreMultiplyColor(SK_ColorWHITE);
const SkPMColor notExpected = ~expected;
const int w = 2, h = 2;
const size_t rowBytes = w * sizeof(SkPMColor);
SkPMColor pixels[w*h];
SkImageInfo info;
info = SkImageInfo::MakeUnknown(w, h);
REPORTER_ASSERT(reporter, !image->readPixels(dContext, info, pixels, rowBytes, 0, 0));
// out-of-bounds should fail
info = SkImageInfo::MakeN32Premul(w, h);
REPORTER_ASSERT(reporter, !image->readPixels(dContext, info, pixels, rowBytes, -w, 0));
REPORTER_ASSERT(reporter, !image->readPixels(dContext, info, pixels, rowBytes, 0, -h));
REPORTER_ASSERT(reporter, !image->readPixels(dContext, info, pixels, rowBytes,
image->width(), 0));
REPORTER_ASSERT(reporter, !image->readPixels(dContext, info, pixels, rowBytes,
0, image->height()));
// top-left should succeed
sk_memset32(pixels, notExpected, w*h);
REPORTER_ASSERT(reporter, image->readPixels(dContext, info, pixels, rowBytes, 0, 0));
REPORTER_ASSERT(reporter, has_pixels(pixels, w*h, expected));
// bottom-right should succeed
sk_memset32(pixels, notExpected, w*h);
REPORTER_ASSERT(reporter, image->readPixels(dContext, info, pixels, rowBytes,
image->width() - w, image->height() - h));
REPORTER_ASSERT(reporter, has_pixels(pixels, w*h, expected));
// partial top-left should succeed
sk_memset32(pixels, notExpected, w*h);
REPORTER_ASSERT(reporter, image->readPixels(dContext, info, pixels, rowBytes, -1, -1));
REPORTER_ASSERT(reporter, pixels[3] == expected);
REPORTER_ASSERT(reporter, has_pixels(pixels, w*h - 1, notExpected));
// partial bottom-right should succeed
sk_memset32(pixels, notExpected, w*h);
REPORTER_ASSERT(reporter, image->readPixels(dContext, info, pixels, rowBytes,
image->width() - 1, image->height() - 1));
REPORTER_ASSERT(reporter, pixels[0] == expected);
REPORTER_ASSERT(reporter, has_pixels(&pixels[1], w*h - 1, notExpected));
}
DEF_TEST(ImageReadPixels, reporter) {
sk_sp<SkImage> image(create_image());
image_test_read_pixels(nullptr, reporter, image.get());
image = create_data_image();
image_test_read_pixels(nullptr, reporter, image.get());
RasterDataHolder dataHolder;
image = create_rasterproc_image(&dataHolder);
image_test_read_pixels(nullptr, reporter, image.get());
image.reset();
REPORTER_ASSERT(reporter, 1 == dataHolder.fReleaseCount);
image = create_codec_image();
image_test_read_pixels(nullptr, reporter, image.get());
}
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageReadPixels_Gpu, reporter, ctxInfo) {
auto dContext = ctxInfo.directContext();
image_test_read_pixels(dContext, reporter, create_gpu_image(dContext).get());
}
static void check_legacy_bitmap(skiatest::Reporter* reporter, GrDirectContext* dContext,
const SkImage* image, const SkBitmap& bitmap) {
REPORTER_ASSERT(reporter, image->width() == bitmap.width());
REPORTER_ASSERT(reporter, image->height() == bitmap.height());
REPORTER_ASSERT(reporter, image->alphaType() == bitmap.alphaType());
REPORTER_ASSERT(reporter, bitmap.isImmutable());
REPORTER_ASSERT(reporter, bitmap.getPixels());
const SkImageInfo info = SkImageInfo::MakeN32(1, 1, bitmap.alphaType());
SkPMColor imageColor;
REPORTER_ASSERT(reporter, image->readPixels(dContext, info, &imageColor, sizeof(SkPMColor),
0, 0));
REPORTER_ASSERT(reporter, imageColor == *bitmap.getAddr32(0, 0));
}
static void test_legacy_bitmap(skiatest::Reporter* reporter, GrDirectContext* dContext,
const SkImage* image) {
Make SkPngCodec decode progressively. This is a step towards using SkCodec in Chromium, where progressive decoding is necessary. Switch from using png_read_row (which expects all the data to be available) to png_process_data, which uses callbacks when rows are available. Create a new API for SkCodec, which supports progressive decoding and scanline decoding. Future changes will switch the other clients off of startScanlineDecode and get/skip-Scanlines to the new API. Remove SkCodec::kNone_ScanlineOrder, which was only used for interlaced PNG images. In the new API, interlaced PNG fits kTopDown. Also remove updateCurrScanline(), which was only used by the old implementation for interlaced PNG. DMSrcSink: - In CodecSrc::kScanline_Mode, use the new method for scanline decoding for the supported formats (just PNG and PNG-in-ICO for now). fuzz.cpp: - Remove reference to kNone_ScanlineOrder SkCodec: - Add new APIs: - startIncrementalDecode - incrementalDecode - Remove kNone_SkScanlineOrder and updateCurrScanline() - Set fDstInfo and fOptions in getPixels(). This may not be necessary for all implementations, but it simplifies things for SkPngCodec. SkPngCodec: - Implement new APIs - Switch from sk_read_fn/png_read_row etc to png_process_data - Expand AutoCleanPng's role to decode the header and create the SkPngCodec - Make the interlaced PNG decoder report how many lines were initialized during an incomplete decode SkIcoCodec: - Implement the new APIs; supported for PNG in ICO SkSampledCodec: - Call the new method for decoding scanlines, and fall back to the old method if the new version is unimplemented - Remove references to kNone_SkScanlineOrder tests/CodecPartial: - Add a test which decodes part of an image, then finishes the decode, and compares it to the straightforward method tests/CodecTest: - Add a test which decodes all scanlines using the new method - Repurpose the Codec_stripes test to decode using the new method in sections rather than all at once - In the method check(), add a parameter for whether the image supports the new method of scanline decoding, and be explicit about whether an image supports incomplete - Test incomplete PNG decodes. We should have been doing it anyway for non-interlaced (except for an image that is too small - one row), but the new method supports interlaced incomplete as well - Make test_invalid_parameters test the new method - Add a test to ensure that it's safe to fall back to scanline decoding without rewinding BUG=skia:4211 The new version was generally faster than the old version (but not significantly so). Some raw performance differences can be found at https://docs.google.com/a/google.com/spreadsheets/d/1Gis3aRCEa72qBNDRMgGDg3jD-pMgO-FXldlNF9ejo4o/ Design doc can be found at https://docs.google.com/a/google.com/document/d/11Mn8-ePDKwVEMCjs3nWwSjxcSpJ_Cu8DF57KNtUmgLM/ GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1997703003 Review-Url: https://codereview.chromium.org/1997703003
2016-09-16 15:20:38 +00:00
if (!image) {
ERRORF(reporter, "Failed to create image.");
return;
}
SkBitmap bitmap;
REPORTER_ASSERT(reporter, image->asLegacyBitmap(&bitmap));
check_legacy_bitmap(reporter, dContext, image, bitmap);
// Test subsetting to exercise the rowBytes logic.
SkBitmap tmp;
REPORTER_ASSERT(reporter, bitmap.extractSubset(&tmp, SkIRect::MakeWH(image->width() / 2,
image->height() / 2)));
sk_sp<SkImage> subsetImage(SkImage::MakeFromBitmap(tmp));
REPORTER_ASSERT(reporter, subsetImage.get());
SkBitmap subsetBitmap;
REPORTER_ASSERT(reporter, subsetImage->asLegacyBitmap(&subsetBitmap));
check_legacy_bitmap(reporter, nullptr, subsetImage.get(), subsetBitmap);
}
DEF_TEST(ImageLegacyBitmap, reporter) {
sk_sp<SkImage> image(create_image());
test_legacy_bitmap(reporter, nullptr, image.get());
image = create_data_image();
test_legacy_bitmap(reporter, nullptr, image.get());
RasterDataHolder dataHolder;
image = create_rasterproc_image(&dataHolder);
test_legacy_bitmap(reporter, nullptr, image.get());
image.reset();
REPORTER_ASSERT(reporter, 1 == dataHolder.fReleaseCount);
image = create_codec_image();
test_legacy_bitmap(reporter, nullptr, image.get());
}
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageLegacyBitmap_Gpu, reporter, ctxInfo) {
auto dContext = ctxInfo.directContext();
sk_sp<SkImage> image(create_gpu_image(dContext));
test_legacy_bitmap(reporter, dContext, image.get());
}
static void test_peek(skiatest::Reporter* reporter, SkImage* image, bool expectPeekSuccess) {
Make SkPngCodec decode progressively. This is a step towards using SkCodec in Chromium, where progressive decoding is necessary. Switch from using png_read_row (which expects all the data to be available) to png_process_data, which uses callbacks when rows are available. Create a new API for SkCodec, which supports progressive decoding and scanline decoding. Future changes will switch the other clients off of startScanlineDecode and get/skip-Scanlines to the new API. Remove SkCodec::kNone_ScanlineOrder, which was only used for interlaced PNG images. In the new API, interlaced PNG fits kTopDown. Also remove updateCurrScanline(), which was only used by the old implementation for interlaced PNG. DMSrcSink: - In CodecSrc::kScanline_Mode, use the new method for scanline decoding for the supported formats (just PNG and PNG-in-ICO for now). fuzz.cpp: - Remove reference to kNone_ScanlineOrder SkCodec: - Add new APIs: - startIncrementalDecode - incrementalDecode - Remove kNone_SkScanlineOrder and updateCurrScanline() - Set fDstInfo and fOptions in getPixels(). This may not be necessary for all implementations, but it simplifies things for SkPngCodec. SkPngCodec: - Implement new APIs - Switch from sk_read_fn/png_read_row etc to png_process_data - Expand AutoCleanPng's role to decode the header and create the SkPngCodec - Make the interlaced PNG decoder report how many lines were initialized during an incomplete decode SkIcoCodec: - Implement the new APIs; supported for PNG in ICO SkSampledCodec: - Call the new method for decoding scanlines, and fall back to the old method if the new version is unimplemented - Remove references to kNone_SkScanlineOrder tests/CodecPartial: - Add a test which decodes part of an image, then finishes the decode, and compares it to the straightforward method tests/CodecTest: - Add a test which decodes all scanlines using the new method - Repurpose the Codec_stripes test to decode using the new method in sections rather than all at once - In the method check(), add a parameter for whether the image supports the new method of scanline decoding, and be explicit about whether an image supports incomplete - Test incomplete PNG decodes. We should have been doing it anyway for non-interlaced (except for an image that is too small - one row), but the new method supports interlaced incomplete as well - Make test_invalid_parameters test the new method - Add a test to ensure that it's safe to fall back to scanline decoding without rewinding BUG=skia:4211 The new version was generally faster than the old version (but not significantly so). Some raw performance differences can be found at https://docs.google.com/a/google.com/spreadsheets/d/1Gis3aRCEa72qBNDRMgGDg3jD-pMgO-FXldlNF9ejo4o/ Design doc can be found at https://docs.google.com/a/google.com/document/d/11Mn8-ePDKwVEMCjs3nWwSjxcSpJ_Cu8DF57KNtUmgLM/ GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1997703003 Review-Url: https://codereview.chromium.org/1997703003
2016-09-16 15:20:38 +00:00
if (!image) {
ERRORF(reporter, "Failed to create image!");
return;
}
SkPixmap pm;
bool success = image->peekPixels(&pm);
REPORTER_ASSERT(reporter, expectPeekSuccess == success);
if (success) {
const SkImageInfo& info = pm.info();
REPORTER_ASSERT(reporter, 20 == info.width());
REPORTER_ASSERT(reporter, 20 == info.height());
REPORTER_ASSERT(reporter, kN32_SkColorType == info.colorType());
REPORTER_ASSERT(reporter, kPremul_SkAlphaType == info.alphaType() ||
kOpaque_SkAlphaType == info.alphaType());
REPORTER_ASSERT(reporter, info.minRowBytes() <= pm.rowBytes());
REPORTER_ASSERT(reporter, SkPreMultiplyColor(SK_ColorWHITE) == *pm.addr32(0, 0));
}
}
DEF_TEST(ImagePeek, reporter) {
sk_sp<SkImage> image(create_image());
test_peek(reporter, image.get(), true);
image = create_data_image();
test_peek(reporter, image.get(), true);
RasterDataHolder dataHolder;
image = create_rasterproc_image(&dataHolder);
test_peek(reporter, image.get(), true);
image.reset();
REPORTER_ASSERT(reporter, 1 == dataHolder.fReleaseCount);
image = create_codec_image();
test_peek(reporter, image.get(), false);
}
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImagePeek_Gpu, reporter, ctxInfo) {
sk_sp<SkImage> image(create_gpu_image(ctxInfo.directContext()));
test_peek(reporter, image.get(), false);
}
struct TextureReleaseChecker {
TextureReleaseChecker() : fReleaseCount(0) {}
int fReleaseCount;
static void Release(void* self) {
static_cast<TextureReleaseChecker*>(self)->fReleaseCount++;
}
};
DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(SkImage_NewFromTextureRelease, reporter, ctxInfo) {
const int kWidth = 10;
const int kHeight = 10;
Revert "Revert "Plumb GrBackendTexture throughout skia."" This reverts commit 7fa5c31c2c9af834bee66d5fcf476e250076c8d6. Reason for revert: Relanding this change now that other fixes have landed. Original change's description: > Revert "Plumb GrBackendTexture throughout skia." > > This reverts commit 7da62b9059f3c1d31624a0e4da96ee5f908f9c12. > > Reason for revert: fix android roll > > Original change's description: > > Plumb GrBackendTexture throughout skia. > > > > Bug: skia: > > Change-Id: I1bae6768ee7229818a83ba608035a1f7867e6875 > > Reviewed-on: https://skia-review.googlesource.com/13645 > > Commit-Queue: Greg Daniel <egdaniel@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com,brianosman@google.com,reviews@skia.org,stani@google.com > NOPRESUBMIT=true > NOTREECHECKS=true > NOTRY=true > > Change-Id: I5cb8763cc837c83ebc6d10366fe2dd3efe35fb89 > Reviewed-on: https://skia-review.googlesource.com/13773 > Reviewed-by: Stan Iliev <stani@google.com> > Commit-Queue: Stan Iliev <stani@google.com> > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com,reviews@skia.org,brianosman@google.com,stani@google.com # Not skipping CQ checks because original CL landed > 1 day ago. Change-Id: I92bc074e4fe37fa5c83186afadc472c03802e8f2 Reviewed-on: https://skia-review.googlesource.com/13975 Reviewed-by: Greg Daniel <egdaniel@google.com> Commit-Queue: Greg Daniel <egdaniel@google.com>
2017-04-20 16:41:55 +00:00
Reland "Migrate SkImage::MakeFromTexture to GrRecordingContext" This reverts commit 74b83a4ea9e31dbdc1996a1ed2d1844d5cdbe9b7. Reason for revert: Flutter is updated Original change's description: > Revert "Migrate SkImage::MakeFromTexture to GrRecordingContext" > > This reverts commit daa9e7455d4f0f54dc07f405becba5d0c5964847. > > Reason for revert: Broke Build-Debian9-Clang-arm-Release-Flutter_Android_Docker > > Original change's description: > > Migrate SkImage::MakeFromTexture to GrRecordingContext > > > > Android migration landed in Android CL 12234077 > > Chrome migration is landing in Chrome CL 2335812 > > > > Note: makeFromCompressedTexture is not used by Chrome. > > > > Bug: skia:104662 > > Change-Id: Ibbe6d412cf22e87188926383d10b21f780208e48 > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/305102 > > Commit-Queue: Adlai Holler <adlai@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > Reviewed-by: Brian Salomon <bsalomon@google.com> > > Auto-Submit: Adlai Holler <adlai@google.com> > > TBR=bsalomon@google.com,robertphillips@google.com,adlai@google.com > > Change-Id: I570945521c6cd78dfeea81e492b7e2b31dd0e6f5 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: skia:104662 > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/308505 > Reviewed-by: Adlai Holler <adlai@google.com> > Commit-Queue: Adlai Holler <adlai@google.com> TBR=bsalomon@google.com,robertphillips@google.com,adlai@google.com # Not skipping CQ checks because original CL landed > 1 day ago. Bug: skia:104662 Change-Id: Ie1d7fd9e597e6e6e5bd91bec086e83a8c1f45a37 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/309321 Reviewed-by: Adlai Holler <adlai@google.com> Commit-Queue: Adlai Holler <adlai@google.com> Auto-Submit: Adlai Holler <adlai@google.com>
2020-08-11 15:48:49 +00:00
auto dContext = ctxInfo.directContext();
Revert "Revert "Plumb GrBackendTexture throughout skia."" This reverts commit 7fa5c31c2c9af834bee66d5fcf476e250076c8d6. Reason for revert: Relanding this change now that other fixes have landed. Original change's description: > Revert "Plumb GrBackendTexture throughout skia." > > This reverts commit 7da62b9059f3c1d31624a0e4da96ee5f908f9c12. > > Reason for revert: fix android roll > > Original change's description: > > Plumb GrBackendTexture throughout skia. > > > > Bug: skia: > > Change-Id: I1bae6768ee7229818a83ba608035a1f7867e6875 > > Reviewed-on: https://skia-review.googlesource.com/13645 > > Commit-Queue: Greg Daniel <egdaniel@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com,brianosman@google.com,reviews@skia.org,stani@google.com > NOPRESUBMIT=true > NOTREECHECKS=true > NOTRY=true > > Change-Id: I5cb8763cc837c83ebc6d10366fe2dd3efe35fb89 > Reviewed-on: https://skia-review.googlesource.com/13773 > Reviewed-by: Stan Iliev <stani@google.com> > Commit-Queue: Stan Iliev <stani@google.com> > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com,reviews@skia.org,brianosman@google.com,stani@google.com # Not skipping CQ checks because original CL landed > 1 day ago. Change-Id: I92bc074e4fe37fa5c83186afadc472c03802e8f2 Reviewed-on: https://skia-review.googlesource.com/13975 Reviewed-by: Greg Daniel <egdaniel@google.com> Commit-Queue: Greg Daniel <egdaniel@google.com>
2017-04-20 16:41:55 +00:00
auto mbet = sk_gpu_test::ManagedBackendTexture::MakeWithoutData(dContext,
kWidth,
kHeight,
kRGBA_8888_SkColorType,
GrMipmapped::kNo,
GrRenderable::kNo,
GrProtected::kNo);
if (!mbet) {
ERRORF(reporter, "couldn't create backend texture\n");
return;
}
TextureReleaseChecker releaseChecker;
Revert "Revert "Plumb GrBackendTexture throughout skia."" This reverts commit 7fa5c31c2c9af834bee66d5fcf476e250076c8d6. Reason for revert: Relanding this change now that other fixes have landed. Original change's description: > Revert "Plumb GrBackendTexture throughout skia." > > This reverts commit 7da62b9059f3c1d31624a0e4da96ee5f908f9c12. > > Reason for revert: fix android roll > > Original change's description: > > Plumb GrBackendTexture throughout skia. > > > > Bug: skia: > > Change-Id: I1bae6768ee7229818a83ba608035a1f7867e6875 > > Reviewed-on: https://skia-review.googlesource.com/13645 > > Commit-Queue: Greg Daniel <egdaniel@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com,brianosman@google.com,reviews@skia.org,stani@google.com > NOPRESUBMIT=true > NOTREECHECKS=true > NOTRY=true > > Change-Id: I5cb8763cc837c83ebc6d10366fe2dd3efe35fb89 > Reviewed-on: https://skia-review.googlesource.com/13773 > Reviewed-by: Stan Iliev <stani@google.com> > Commit-Queue: Stan Iliev <stani@google.com> > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com,reviews@skia.org,brianosman@google.com,stani@google.com # Not skipping CQ checks because original CL landed > 1 day ago. Change-Id: I92bc074e4fe37fa5c83186afadc472c03802e8f2 Reviewed-on: https://skia-review.googlesource.com/13975 Reviewed-by: Greg Daniel <egdaniel@google.com> Commit-Queue: Greg Daniel <egdaniel@google.com>
2017-04-20 16:41:55 +00:00
GrSurfaceOrigin texOrigin = kBottomLeft_GrSurfaceOrigin;
sk_sp<SkImage> refImg = SkImage::MakeFromTexture(
dContext,
mbet->texture(),
texOrigin,
kRGBA_8888_SkColorType,
kPremul_SkAlphaType,
/*color space*/nullptr,
sk_gpu_test::ManagedBackendTexture::ReleaseProc,
mbet->releaseContext(TextureReleaseChecker::Release, &releaseChecker));
GrSurfaceOrigin readBackOrigin;
GrBackendTexture readBackBackendTex = refImg->getBackendTexture(false, &readBackOrigin);
if (!GrBackendTexture::TestingOnly_Equals(readBackBackendTex, mbet->texture())) {
ERRORF(reporter, "backend mismatch\n");
}
REPORTER_ASSERT(reporter,
GrBackendTexture::TestingOnly_Equals(readBackBackendTex, mbet->texture()));
Revert "Revert "Plumb GrBackendTexture throughout skia."" This reverts commit 7fa5c31c2c9af834bee66d5fcf476e250076c8d6. Reason for revert: Relanding this change now that other fixes have landed. Original change's description: > Revert "Plumb GrBackendTexture throughout skia." > > This reverts commit 7da62b9059f3c1d31624a0e4da96ee5f908f9c12. > > Reason for revert: fix android roll > > Original change's description: > > Plumb GrBackendTexture throughout skia. > > > > Bug: skia: > > Change-Id: I1bae6768ee7229818a83ba608035a1f7867e6875 > > Reviewed-on: https://skia-review.googlesource.com/13645 > > Commit-Queue: Greg Daniel <egdaniel@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com,brianosman@google.com,reviews@skia.org,stani@google.com > NOPRESUBMIT=true > NOTREECHECKS=true > NOTRY=true > > Change-Id: I5cb8763cc837c83ebc6d10366fe2dd3efe35fb89 > Reviewed-on: https://skia-review.googlesource.com/13773 > Reviewed-by: Stan Iliev <stani@google.com> > Commit-Queue: Stan Iliev <stani@google.com> > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com,reviews@skia.org,brianosman@google.com,stani@google.com # Not skipping CQ checks because original CL landed > 1 day ago. Change-Id: I92bc074e4fe37fa5c83186afadc472c03802e8f2 Reviewed-on: https://skia-review.googlesource.com/13975 Reviewed-by: Greg Daniel <egdaniel@google.com> Commit-Queue: Greg Daniel <egdaniel@google.com>
2017-04-20 16:41:55 +00:00
if (readBackOrigin != texOrigin) {
ERRORF(reporter, "origin mismatch %d %d\n", readBackOrigin, texOrigin);
}
Revert "Revert "Plumb GrBackendTexture throughout skia."" This reverts commit 7fa5c31c2c9af834bee66d5fcf476e250076c8d6. Reason for revert: Relanding this change now that other fixes have landed. Original change's description: > Revert "Plumb GrBackendTexture throughout skia." > > This reverts commit 7da62b9059f3c1d31624a0e4da96ee5f908f9c12. > > Reason for revert: fix android roll > > Original change's description: > > Plumb GrBackendTexture throughout skia. > > > > Bug: skia: > > Change-Id: I1bae6768ee7229818a83ba608035a1f7867e6875 > > Reviewed-on: https://skia-review.googlesource.com/13645 > > Commit-Queue: Greg Daniel <egdaniel@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com,brianosman@google.com,reviews@skia.org,stani@google.com > NOPRESUBMIT=true > NOTREECHECKS=true > NOTRY=true > > Change-Id: I5cb8763cc837c83ebc6d10366fe2dd3efe35fb89 > Reviewed-on: https://skia-review.googlesource.com/13773 > Reviewed-by: Stan Iliev <stani@google.com> > Commit-Queue: Stan Iliev <stani@google.com> > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com,reviews@skia.org,brianosman@google.com,stani@google.com # Not skipping CQ checks because original CL landed > 1 day ago. Change-Id: I92bc074e4fe37fa5c83186afadc472c03802e8f2 Reviewed-on: https://skia-review.googlesource.com/13975 Reviewed-by: Greg Daniel <egdaniel@google.com> Commit-Queue: Greg Daniel <egdaniel@google.com>
2017-04-20 16:41:55 +00:00
REPORTER_ASSERT(reporter, readBackOrigin == texOrigin);
// Now exercise the release proc
REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount);
refImg.reset(nullptr); // force a release of the image
REPORTER_ASSERT(reporter, 1 == releaseChecker.fReleaseCount);
}
static void test_cross_context_image(skiatest::Reporter* reporter, const GrContextOptions& options,
const char* testName,
std::function<sk_sp<SkImage>(GrDirectContext*)> imageMaker) {
for (int i = 0; i < GrContextFactory::kContextTypeCnt; ++i) {
GrContextFactory testFactory(options);
GrContextFactory::ContextType ctxType = static_cast<GrContextFactory::ContextType>(i);
ContextInfo ctxInfo = testFactory.getContextInfo(ctxType);
auto dContext = ctxInfo.directContext();
if (!dContext) {
continue;
}
// If we don't have proper support for this feature, the factory will fallback to returning
// codec-backed images. Those will "work", but some of our checks will fail because we
// expect the cross-context images not to work on multiple contexts at once.
if (!dContext->priv().caps()->crossContextTextureSupport()) {
continue;
}
// We test three lifetime patterns for a single context:
// 1) Create image, free image
// 2) Create image, draw, flush, free image
// 3) Create image, draw, free image, flush
// ... and then repeat the last two patterns with drawing on a second* context:
// 4) Create image, draw*, flush*, free image
// 5) Create image, draw*, free iamge, flush*
// Case #1: Create image, free image
{
sk_sp<SkImage> refImg(imageMaker(dContext));
refImg.reset(nullptr); // force a release of the image
}
SkImageInfo info = SkImageInfo::MakeN32Premul(128, 128);
sk_sp<SkSurface> surface = SkSurface::MakeRenderTarget(dContext, SkBudgeted::kNo, info);
if (!surface) {
ERRORF(reporter, "SkSurface::MakeRenderTarget failed for %s.", testName);
continue;
}
SkCanvas* canvas = surface->getCanvas();
// Case #2: Create image, draw, flush, free image
{
sk_sp<SkImage> refImg(imageMaker(dContext));
canvas->drawImage(refImg, 0, 0);
surface->flushAndSubmit();
refImg.reset(nullptr); // force a release of the image
}
// Case #3: Create image, draw, free image, flush
{
sk_sp<SkImage> refImg(imageMaker(dContext));
canvas->drawImage(refImg, 0, 0);
refImg.reset(nullptr); // force a release of the image
surface->flushAndSubmit();
}
// Configure second context
sk_gpu_test::TestContext* testContext = ctxInfo.testContext();
ContextInfo otherContextInfo = testFactory.getSharedContextInfo(dContext);
auto otherCtx = otherContextInfo.directContext();
sk_gpu_test::TestContext* otherTestContext = otherContextInfo.testContext();
// Creating a context in a share group may fail
if (!otherCtx) {
continue;
}
surface = SkSurface::MakeRenderTarget(otherCtx, SkBudgeted::kNo, info);
canvas = surface->getCanvas();
// Case #4: Create image, draw*, flush*, free image
{
testContext->makeCurrent();
sk_sp<SkImage> refImg(imageMaker(dContext));
otherTestContext->makeCurrent();
canvas->drawImage(refImg, 0, 0);
surface->flushAndSubmit();
testContext->makeCurrent();
refImg.reset(nullptr); // force a release of the image
}
// Case #5: Create image, draw*, free image, flush*
{
testContext->makeCurrent();
sk_sp<SkImage> refImg(imageMaker(dContext));
otherTestContext->makeCurrent();
canvas->drawImage(refImg, 0, 0);
testContext->makeCurrent();
refImg.reset(nullptr); // force a release of the image
otherTestContext->makeCurrent();
surface->flushAndSubmit();
// This is specifically here for vulkan to guarantee the command buffer will finish
// which is when we call the ReleaseProc.
otherCtx->priv().getGpu()->testingOnly_flushGpuAndSync();
}
// Case #6: Verify that only one context can be using the image at a time
{
// Suppress warnings about trying to use a texture in two contexts.
GrRecordingContextPriv::AutoSuppressWarningMessages aswm(otherCtx);
testContext->makeCurrent();
sk_sp<SkImage> refImg(imageMaker(dContext));
// Any context should be able to borrow the texture at this point
GrSurfaceProxyView view = as_IB(refImg)->refView(dContext, GrMipmapped::kNo);
REPORTER_ASSERT(reporter, view);
// But once it's borrowed, no other context should be able to borrow
otherTestContext->makeCurrent();
GrSurfaceProxyView otherView = as_IB(refImg)->refView(otherCtx, GrMipmapped::kNo);
REPORTER_ASSERT(reporter, !otherView);
// Original context (that's already borrowing) should be okay
testContext->makeCurrent();
GrSurfaceProxyView viewSecondRef = as_IB(refImg)->refView(dContext, GrMipmapped::kNo);
REPORTER_ASSERT(reporter, viewSecondRef);
// Release first ref from the original context
view.reset();
// We released one proxy but not the other from the current borrowing context. Make sure
// a new context is still not able to borrow the texture.
otherTestContext->makeCurrent();
otherView = as_IB(refImg)->refView(otherCtx, GrMipmapped::kNo);
REPORTER_ASSERT(reporter, !otherView);
// Release second ref from the original context
testContext->makeCurrent();
viewSecondRef.reset();
// Now we should be able to borrow the texture from the other context
otherTestContext->makeCurrent();
otherView = as_IB(refImg)->refView(otherCtx, GrMipmapped::kNo);
REPORTER_ASSERT(reporter, otherView);
// Release everything
otherView.reset();
refImg.reset(nullptr);
}
}
}
DEF_GPUTEST(SkImage_MakeCrossContextFromPixmapRelease, reporter, options) {
SkBitmap bitmap;
SkPixmap pixmap;
if (!GetResourceAsBitmap("images/mandrill_128.png", &bitmap) || !bitmap.peekPixels(&pixmap)) {
ERRORF(reporter, "missing resource");
return;
}
test_cross_context_image(reporter, options, "SkImage_MakeCrossContextFromPixmapRelease",
[&pixmap](GrDirectContext* dContext) {
return SkImage::MakeCrossContextFromPixmap(dContext, pixmap, false);
});
}
DEF_GPUTEST(SkImage_CrossContextGrayAlphaConfigs, reporter, options) {
for (SkColorType ct : { kGray_8_SkColorType, kAlpha_8_SkColorType }) {
SkAutoPixmapStorage pixmap;
pixmap.alloc(SkImageInfo::Make(4, 4, ct, kPremul_SkAlphaType));
for (int i = 0; i < GrContextFactory::kContextTypeCnt; ++i) {
GrContextFactory testFactory(options);
GrContextFactory::ContextType ctxType = static_cast<GrContextFactory::ContextType>(i);
ContextInfo ctxInfo = testFactory.getContextInfo(ctxType);
Reland "Migrate MakeCrossContextFromPixmap to GrDirectContext" This reverts commit ae04cc9099b367c81a11a6e77162410e7941056a. Reason for revert: Flutter g3 roll complete Original change's description: > Revert "Migrate MakeCrossContextFromPixmap to GrDirectContext" > > This reverts commit 066f7d6b1ada68217fba365d30f6dd766ca0139b. > > Reason for revert: Cant land until flutter PR 20235 reaches g3 > > Original change's description: > > Migrate MakeCrossContextFromPixmap to GrDirectContext > > > > This function isn't used by Chrome so we migrate directly. > > Flutter migration is at https://github.com/flutter/engine/pull/20235 > > > > Bug: skia:104662 > > Change-Id: I9d875acdbd162f50a6d86b3a4cae3f400e4dd38f > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/305180 > > Commit-Queue: Adlai Holler <adlai@google.com> > > Reviewed-by: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=bsalomon@google.com,robertphillips@google.com,adlai@google.com > > Change-Id: I100a87075ffdf5c0cda78c95f1cfe3310f97630e > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: skia:104662 > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/308501 > Reviewed-by: Adlai Holler <adlai@google.com> > Commit-Queue: Adlai Holler <adlai@google.com> TBR=bsalomon@google.com,robertphillips@google.com,adlai@google.com # Not skipping CQ checks because original CL landed > 1 day ago. Bug: skia:104662 Change-Id: I32e36aa1c70902296e7f28d0f8b52d4e55b264a4 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/309320 Reviewed-by: Adlai Holler <adlai@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Adlai Holler <adlai@google.com>
2020-08-11 15:47:47 +00:00
auto dContext = ctxInfo.directContext();
if (!dContext || !dContext->priv().caps()->crossContextTextureSupport()) {
continue;
}
Reland "Migrate MakeCrossContextFromPixmap to GrDirectContext" This reverts commit ae04cc9099b367c81a11a6e77162410e7941056a. Reason for revert: Flutter g3 roll complete Original change's description: > Revert "Migrate MakeCrossContextFromPixmap to GrDirectContext" > > This reverts commit 066f7d6b1ada68217fba365d30f6dd766ca0139b. > > Reason for revert: Cant land until flutter PR 20235 reaches g3 > > Original change's description: > > Migrate MakeCrossContextFromPixmap to GrDirectContext > > > > This function isn't used by Chrome so we migrate directly. > > Flutter migration is at https://github.com/flutter/engine/pull/20235 > > > > Bug: skia:104662 > > Change-Id: I9d875acdbd162f50a6d86b3a4cae3f400e4dd38f > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/305180 > > Commit-Queue: Adlai Holler <adlai@google.com> > > Reviewed-by: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=bsalomon@google.com,robertphillips@google.com,adlai@google.com > > Change-Id: I100a87075ffdf5c0cda78c95f1cfe3310f97630e > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: skia:104662 > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/308501 > Reviewed-by: Adlai Holler <adlai@google.com> > Commit-Queue: Adlai Holler <adlai@google.com> TBR=bsalomon@google.com,robertphillips@google.com,adlai@google.com # Not skipping CQ checks because original CL landed > 1 day ago. Bug: skia:104662 Change-Id: I32e36aa1c70902296e7f28d0f8b52d4e55b264a4 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/309320 Reviewed-by: Adlai Holler <adlai@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Adlai Holler <adlai@google.com>
2020-08-11 15:47:47 +00:00
sk_sp<SkImage> image = SkImage::MakeCrossContextFromPixmap(dContext, pixmap, false);
REPORTER_ASSERT(reporter, image);
Reland "Migrate MakeCrossContextFromPixmap to GrDirectContext" This reverts commit ae04cc9099b367c81a11a6e77162410e7941056a. Reason for revert: Flutter g3 roll complete Original change's description: > Revert "Migrate MakeCrossContextFromPixmap to GrDirectContext" > > This reverts commit 066f7d6b1ada68217fba365d30f6dd766ca0139b. > > Reason for revert: Cant land until flutter PR 20235 reaches g3 > > Original change's description: > > Migrate MakeCrossContextFromPixmap to GrDirectContext > > > > This function isn't used by Chrome so we migrate directly. > > Flutter migration is at https://github.com/flutter/engine/pull/20235 > > > > Bug: skia:104662 > > Change-Id: I9d875acdbd162f50a6d86b3a4cae3f400e4dd38f > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/305180 > > Commit-Queue: Adlai Holler <adlai@google.com> > > Reviewed-by: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=bsalomon@google.com,robertphillips@google.com,adlai@google.com > > Change-Id: I100a87075ffdf5c0cda78c95f1cfe3310f97630e > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: skia:104662 > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/308501 > Reviewed-by: Adlai Holler <adlai@google.com> > Commit-Queue: Adlai Holler <adlai@google.com> TBR=bsalomon@google.com,robertphillips@google.com,adlai@google.com # Not skipping CQ checks because original CL landed > 1 day ago. Bug: skia:104662 Change-Id: I32e36aa1c70902296e7f28d0f8b52d4e55b264a4 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/309320 Reviewed-by: Adlai Holler <adlai@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Adlai Holler <adlai@google.com>
2020-08-11 15:47:47 +00:00
GrSurfaceProxyView view = as_IB(image)->refView(dContext, GrMipmapped::kNo);
REPORTER_ASSERT(reporter, view);
bool expectAlpha = kAlpha_8_SkColorType == ct;
GrColorType grCT = SkColorTypeToGrColorType(image->colorType());
REPORTER_ASSERT(reporter, expectAlpha == GrColorTypeIsAlphaOnly(grCT));
}
}
}
DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(makeBackendTexture, reporter, ctxInfo) {
auto context = ctxInfo.directContext();
sk_gpu_test::TestContext* testContext = ctxInfo.testContext();
sk_sp<GrContextThreadSafeProxy> proxy = context->threadSafeProxy();
GrContextFactory otherFactory;
ContextInfo otherContextInfo = otherFactory.getContextInfo(ctxInfo.type());
testContext->makeCurrent();
REPORTER_ASSERT(reporter, proxy);
auto createLarge = [context] {
return create_image_large(context->priv().caps()->maxTextureSize());
};
struct TestCase {
std::function<sk_sp<SkImage>()> fImageFactory;
bool fExpectation;
bool fCanTakeDirectly;
};
TestCase testCases[] = {
{ create_image, true, false },
{ create_codec_image, true, false },
{ create_data_image, true, false },
{ create_picture_image, true, false },
{ [context] { return create_gpu_image(context); }, true, true },
// Create a texture image in a another context.
{ [otherContextInfo] {
auto restore = otherContextInfo.testContext()->makeCurrentAndAutoRestore();
sk_sp<SkImage> otherContextImage = create_gpu_image(otherContextInfo.directContext());
otherContextInfo.directContext()->flushAndSubmit();
return otherContextImage;
}, false, false },
// Create an image that is too large to be texture backed.
{ createLarge, false, false }
};
for (const TestCase& testCase : testCases) {
sk_sp<SkImage> image(testCase.fImageFactory());
if (!image) {
ERRORF(reporter, "Failed to create image!");
continue;
}
GrBackendTexture origBackend = image->getBackendTexture(true);
if (testCase.fCanTakeDirectly) {
SkASSERT(origBackend.isValid());
}
GrBackendTexture newBackend;
SkImage::BackendTextureReleaseProc proc;
bool result = SkImage::MakeBackendTextureFromSkImage(context, std::move(image),
&newBackend, &proc);
if (result != testCase.fExpectation) {
static const char *const kFS[] = { "fail", "succeed" };
ERRORF(reporter, "This image was expected to %s but did not.",
kFS[testCase.fExpectation]);
}
if (result) {
SkASSERT(newBackend.isValid());
}
bool tookDirectly = result && GrBackendTexture::TestingOnly_Equals(origBackend, newBackend);
if (testCase.fCanTakeDirectly != tookDirectly) {
static const char *const kExpectedState[] = { "not expected", "expected" };
ERRORF(reporter, "This backend texture was %s to be taken directly.",
kExpectedState[testCase.fCanTakeDirectly]);
}
context->flushAndSubmit();
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
static sk_sp<SkImage> create_picture_image(sk_sp<SkColorSpace> space) {
SkPictureRecorder recorder;
SkCanvas* canvas = recorder.beginRecording(10, 10);
canvas->clear(SK_ColorCYAN);
return SkImage::MakeFromPicture(recorder.finishRecordingAsPicture(), SkISize::Make(10, 10),
nullptr, nullptr, SkImage::BitDepth::kU8, std::move(space));
};
DEF_TEST(Image_ColorSpace, r) {
sk_sp<SkColorSpace> srgb = SkColorSpace::MakeSRGB();
sk_sp<SkImage> image = GetResourceAsImage("images/mandrill_512_q075.jpg");
REPORTER_ASSERT(r, srgb.get() == image->colorSpace());
image = GetResourceAsImage("images/webp-color-profile-lossy.webp");
skcms_TransferFunction fn;
bool success = image->colorSpace()->isNumericalTransferFn(&fn);
REPORTER_ASSERT(r, success);
REPORTER_ASSERT(r, color_space_almost_equal(1.8f, fn.g));
sk_sp<SkColorSpace> rec2020 = SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB,
SkNamedGamut::kRec2020);
image = create_picture_image(rec2020);
REPORTER_ASSERT(r, SkColorSpace::Equals(rec2020.get(), image->colorSpace()));
SkBitmap bitmap;
SkImageInfo info = SkImageInfo::MakeN32(10, 10, kPremul_SkAlphaType, rec2020);
bitmap.allocPixels(info);
image = SkImage::MakeFromBitmap(bitmap);
REPORTER_ASSERT(r, SkColorSpace::Equals(rec2020.get(), image->colorSpace()));
sk_sp<SkSurface> surface = SkSurface::MakeRaster(
SkImageInfo::MakeN32Premul(SkISize::Make(10, 10)));
image = surface->makeImageSnapshot();
REPORTER_ASSERT(r, nullptr == image->colorSpace());
surface = SkSurface::MakeRaster(info);
image = surface->makeImageSnapshot();
REPORTER_ASSERT(r, SkColorSpace::Equals(rec2020.get(), image->colorSpace()));
}
DEF_TEST(Image_makeColorSpace, r) {
sk_sp<SkColorSpace> p3 = SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kDisplayP3);
skcms_TransferFunction fn;
fn.a = 1.f; fn.b = 0.f; fn.c = 0.f; fn.d = 0.f; fn.e = 0.f; fn.f = 0.f; fn.g = 1.8f;
sk_sp<SkColorSpace> adobeGamut = SkColorSpace::MakeRGB(fn, SkNamedGamut::kAdobeRGB);
SkBitmap srgbBitmap;
srgbBitmap.allocPixels(SkImageInfo::MakeS32(1, 1, kOpaque_SkAlphaType));
*srgbBitmap.getAddr32(0, 0) = SkSwizzle_RGBA_to_PMColor(0xFF604020);
srgbBitmap.setImmutable();
sk_sp<SkImage> srgbImage = SkImage::MakeFromBitmap(srgbBitmap);
Reland "Add a direct context arg to makeColorTypeAndColorSpace" This reverts commit 779813a2394073f2f00029a7ef89e886d592eba1. Reason for revert: Avoid null dereference in DDL test case Original change's description: > Revert "Add a direct context arg to makeColorTypeAndColorSpace" > > This reverts commit a56da9ee923c5f09ed9b97a83e250400b3c78deb. > > Reason for revert: UBSAN complains in Vulkan OOPRDDL mode > > Original change's description: > > Add a direct context arg to makeColorTypeAndColorSpace > > > > This is part of a larger effort to de-power SkImage and force users to > > specify the GPU context for all new images. > > > > Staging flag landed in Chrome CL 2296632. > > > > Bug: skia:10466 > > Change-Id: I6b7bbec10369f7d8ee884dd1bcc234d332c30a6c > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/302290 > > Commit-Queue: Adlai Holler <adlai@google.com> > > Reviewed-by: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=bsalomon@google.com,robertphillips@google.com,adlai@google.com > > Change-Id: Ide36bed6966d3d92ad6b8d05f897d22d287b40b1 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: skia:10466 > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/302824 > Reviewed-by: Adlai Holler <adlai@google.com> > Commit-Queue: Adlai Holler <adlai@google.com> Bug: skia:10466 Change-Id: I59de0bd2b33989b1af08e8af2f8a52542b6b5db0 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/302829 Commit-Queue: Adlai Holler <adlai@google.com> Reviewed-by: Robert Phillips <robertphillips@google.com>
2020-07-15 14:37:50 +00:00
sk_sp<SkImage> p3Image = srgbImage->makeColorSpace(p3, nullptr);
SkBitmap p3Bitmap;
bool success = p3Image->asLegacyBitmap(&p3Bitmap);
auto almost_equal = [](int a, int b) { return SkTAbs(a - b) <= 2; };
REPORTER_ASSERT(r, success);
REPORTER_ASSERT(r, almost_equal(0x28, SkGetPackedR32(*p3Bitmap.getAddr32(0, 0))));
REPORTER_ASSERT(r, almost_equal(0x40, SkGetPackedG32(*p3Bitmap.getAddr32(0, 0))));
REPORTER_ASSERT(r, almost_equal(0x5E, SkGetPackedB32(*p3Bitmap.getAddr32(0, 0))));
Reland "Add a direct context arg to makeColorTypeAndColorSpace" This reverts commit 779813a2394073f2f00029a7ef89e886d592eba1. Reason for revert: Avoid null dereference in DDL test case Original change's description: > Revert "Add a direct context arg to makeColorTypeAndColorSpace" > > This reverts commit a56da9ee923c5f09ed9b97a83e250400b3c78deb. > > Reason for revert: UBSAN complains in Vulkan OOPRDDL mode > > Original change's description: > > Add a direct context arg to makeColorTypeAndColorSpace > > > > This is part of a larger effort to de-power SkImage and force users to > > specify the GPU context for all new images. > > > > Staging flag landed in Chrome CL 2296632. > > > > Bug: skia:10466 > > Change-Id: I6b7bbec10369f7d8ee884dd1bcc234d332c30a6c > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/302290 > > Commit-Queue: Adlai Holler <adlai@google.com> > > Reviewed-by: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=bsalomon@google.com,robertphillips@google.com,adlai@google.com > > Change-Id: Ide36bed6966d3d92ad6b8d05f897d22d287b40b1 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: skia:10466 > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/302824 > Reviewed-by: Adlai Holler <adlai@google.com> > Commit-Queue: Adlai Holler <adlai@google.com> Bug: skia:10466 Change-Id: I59de0bd2b33989b1af08e8af2f8a52542b6b5db0 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/302829 Commit-Queue: Adlai Holler <adlai@google.com> Reviewed-by: Robert Phillips <robertphillips@google.com>
2020-07-15 14:37:50 +00:00
sk_sp<SkImage> adobeImage = srgbImage->makeColorSpace(adobeGamut, nullptr);
SkBitmap adobeBitmap;
success = adobeImage->asLegacyBitmap(&adobeBitmap);
REPORTER_ASSERT(r, success);
REPORTER_ASSERT(r, almost_equal(0x21, SkGetPackedR32(*adobeBitmap.getAddr32(0, 0))));
REPORTER_ASSERT(r, almost_equal(0x31, SkGetPackedG32(*adobeBitmap.getAddr32(0, 0))));
REPORTER_ASSERT(r, almost_equal(0x4C, SkGetPackedB32(*adobeBitmap.getAddr32(0, 0))));
srgbImage = GetResourceAsImage("images/1x1.png");
Reland "Add a direct context arg to makeColorTypeAndColorSpace" This reverts commit 779813a2394073f2f00029a7ef89e886d592eba1. Reason for revert: Avoid null dereference in DDL test case Original change's description: > Revert "Add a direct context arg to makeColorTypeAndColorSpace" > > This reverts commit a56da9ee923c5f09ed9b97a83e250400b3c78deb. > > Reason for revert: UBSAN complains in Vulkan OOPRDDL mode > > Original change's description: > > Add a direct context arg to makeColorTypeAndColorSpace > > > > This is part of a larger effort to de-power SkImage and force users to > > specify the GPU context for all new images. > > > > Staging flag landed in Chrome CL 2296632. > > > > Bug: skia:10466 > > Change-Id: I6b7bbec10369f7d8ee884dd1bcc234d332c30a6c > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/302290 > > Commit-Queue: Adlai Holler <adlai@google.com> > > Reviewed-by: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=bsalomon@google.com,robertphillips@google.com,adlai@google.com > > Change-Id: Ide36bed6966d3d92ad6b8d05f897d22d287b40b1 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: skia:10466 > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/302824 > Reviewed-by: Adlai Holler <adlai@google.com> > Commit-Queue: Adlai Holler <adlai@google.com> Bug: skia:10466 Change-Id: I59de0bd2b33989b1af08e8af2f8a52542b6b5db0 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/302829 Commit-Queue: Adlai Holler <adlai@google.com> Reviewed-by: Robert Phillips <robertphillips@google.com>
2020-07-15 14:37:50 +00:00
p3Image = srgbImage->makeColorSpace(p3, nullptr);
success = p3Image->asLegacyBitmap(&p3Bitmap);
REPORTER_ASSERT(r, success);
REPORTER_ASSERT(r, almost_equal(0x8B, SkGetPackedR32(*p3Bitmap.getAddr32(0, 0))));
REPORTER_ASSERT(r, almost_equal(0x82, SkGetPackedG32(*p3Bitmap.getAddr32(0, 0))));
REPORTER_ASSERT(r, almost_equal(0x77, SkGetPackedB32(*p3Bitmap.getAddr32(0, 0))));
}
///////////////////////////////////////////////////////////////////////////////////////////////////
static void make_all_premul(SkBitmap* bm) {
bm->allocPixels(SkImageInfo::MakeN32(256, 256, kPremul_SkAlphaType));
for (int a = 0; a < 256; ++a) {
for (int r = 0; r < 256; ++r) {
// make all valid premul combinations
int c = std::min(a, r);
*bm->getAddr32(a, r) = SkPackARGB32(a, c, c, c);
}
}
}
static bool equal(const SkBitmap& a, const SkBitmap& b) {
SkASSERT(a.width() == b.width());
SkASSERT(a.height() == b.height());
for (int y = 0; y < a.height(); ++y) {
for (int x = 0; x < a.width(); ++x) {
SkPMColor pa = *a.getAddr32(x, y);
SkPMColor pb = *b.getAddr32(x, y);
if (pa != pb) {
return false;
}
}
}
return true;
}
DEF_TEST(image_roundtrip_encode, reporter) {
SkBitmap bm0;
make_all_premul(&bm0);
auto img0 = SkImage::MakeFromBitmap(bm0);
sk_sp<SkData> data = img0->encodeToData(SkEncodedImageFormat::kPNG, 100);
auto img1 = SkImage::MakeFromEncoded(data);
SkBitmap bm1;
bm1.allocPixels(SkImageInfo::MakeN32(256, 256, kPremul_SkAlphaType));
img1->readPixels(nullptr, bm1.info(), bm1.getPixels(), bm1.rowBytes(), 0, 0);
REPORTER_ASSERT(reporter, equal(bm0, bm1));
}
DEF_TEST(image_roundtrip_premul, reporter) {
SkBitmap bm0;
make_all_premul(&bm0);
SkBitmap bm1;
bm1.allocPixels(SkImageInfo::MakeN32(256, 256, kUnpremul_SkAlphaType));
bm0.readPixels(bm1.info(), bm1.getPixels(), bm1.rowBytes(), 0, 0);
SkBitmap bm2;
bm2.allocPixels(SkImageInfo::MakeN32(256, 256, kPremul_SkAlphaType));
bm1.readPixels(bm2.info(), bm2.getPixels(), bm2.rowBytes(), 0, 0);
REPORTER_ASSERT(reporter, equal(bm0, bm2));
}
///////////////////////////////////////////////////////////////////////////////////////////////////
static void check_scaled_pixels(skiatest::Reporter* reporter, SkPixmap* pmap, uint32_t expected) {
// Verify that all pixels contain the original test color
for (auto y = 0; y < pmap->height(); ++y) {
for (auto x = 0; x < pmap->width(); ++x) {
uint32_t pixel = *pmap->addr32(x, y);
if (pixel != expected) {
ERRORF(reporter, "Expected scaled pixels to be the same. At %d,%d 0x%08x != 0x%08x",
x, y, pixel, expected);
return;
}
}
}
}
static void test_scale_pixels(skiatest::Reporter* reporter, const SkImage* image,
uint32_t expected) {
SkImageInfo info = SkImageInfo::MakeN32Premul(image->width() * 2, image->height() * 2);
// Make sure to test kDisallow first, so we don't just get a cache hit in that case
for (auto chint : { SkImage::kDisallow_CachingHint, SkImage::kAllow_CachingHint }) {
SkAutoPixmapStorage scaled;
scaled.alloc(info);
if (!image->scalePixels(scaled, SkSamplingOptions(SkFilterMode::kLinear,
SkMipmapMode::kNone), chint)) {
ERRORF(reporter, "Failed to scale image");
continue;
}
check_scaled_pixels(reporter, &scaled, expected);
}
}
DEF_TEST(ImageScalePixels, reporter) {
const SkPMColor pmRed = SkPackARGB32(0xFF, 0xFF, 0, 0);
const SkColor red = SK_ColorRED;
// Test raster image
SkImageInfo info = SkImageInfo::MakeN32Premul(1, 1);
sk_sp<SkSurface> surface = SkSurface::MakeRaster(info);
surface->getCanvas()->clear(red);
sk_sp<SkImage> rasterImage = surface->makeImageSnapshot();
test_scale_pixels(reporter, rasterImage.get(), pmRed);
// Test encoded image
sk_sp<SkData> data = rasterImage->encodeToData();
sk_sp<SkImage> codecImage = SkImage::MakeFromEncoded(data);
test_scale_pixels(reporter, codecImage.get(), pmRed);
}
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageScalePixels_Gpu, reporter, ctxInfo) {
const SkPMColor pmRed = SkPackARGB32(0xFF, 0xFF, 0, 0);
const SkColor red = SK_ColorRED;
SkImageInfo info = SkImageInfo::MakeN32Premul(16, 16);
sk_sp<SkSurface> surface = SkSurface::MakeRenderTarget(ctxInfo.directContext(),
SkBudgeted::kNo, info);
surface->getCanvas()->clear(red);
sk_sp<SkImage> gpuImage = surface->makeImageSnapshot();
test_scale_pixels(reporter, gpuImage.get(), pmRed);
}
static sk_sp<SkImage> any_image_will_do() {
return GetResourceAsImage("images/mandrill_32.png");
}
DEF_TEST(Image_nonfinite_dst, reporter) {
auto surf = SkSurface::MakeRasterN32Premul(10, 10);
auto img = any_image_will_do();
SkPaint paint;
for (SkScalar bad : { SK_ScalarInfinity, SK_ScalarNaN}) {
for (int bits = 1; bits <= 15; ++bits) {
SkRect dst = { 0, 0, 10, 10 };
if (bits & 1) dst.fLeft = bad;
if (bits & 2) dst.fTop = bad;
if (bits & 4) dst.fRight = bad;
if (bits & 8) dst.fBottom = bad;
surf->getCanvas()->drawImageRect(img, dst, &paint);
// we should draw nothing
ToolUtils::PixelIter iter(surf.get());
while (void* addr = iter.next()) {
REPORTER_ASSERT(reporter, *(SkPMColor*)addr == 0);
}
}
}
}
static sk_sp<SkImage> make_yuva_image(GrDirectContext* dContext) {
Reland "Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA."" This reverts commit 8fbca482e5d9bd46ef6d97c0c3283cb108988ce4. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA."" > > This reverts commit 622b6f5367e2d26dab276df8bd9df0451236808b. > > Reason for revert: ANGLE may not be fixed > > Original change's description: > > Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA." > > > > This reverts commit bc0c460349142140295593a3a32d507f7b45c622. > > > > Reason for revert: fixed isTextureBacked(), checked cc_unittests passes > > > > Original change's description: > > > Revert "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA." > > > > > > This reverts commit a15f355be83136e7827ccfbc9bb9e9ea77f48518. > > > > > > Reason for revert: ANGLE failing new test > > > > > > Original change's description: > > > > Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA. > > > > > > > > Also removed unused virtual function from SkImage_GpuBase and override > > > > on SkImage_GpuYUVA. > > > > > > > > Change-Id: Ib47b46b529b16976181cb9453976133d66e0f952 > > > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212734 > > > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > > > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > > > > > Change-Id: Ib2566ff8aa99d3698d6044167e70a1d75542f2e9 > > > No-Presubmit: true > > > No-Tree-Checks: true > > > No-Try: true > > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212986 > > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > Commit-Queue: Robert Phillips <robertphillips@google.com> > > > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > > > Change-Id: I3c9454da33a764504e768d02b59a5cd99766aff1 > > No-Presubmit: true > > No-Tree-Checks: true > > No-Try: true > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212988 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Brian Salomon <bsalomon@google.com> > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: I06632adc69844522c87cd72e8a6b0c2795974fe4 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212989 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: I15cad8a907dbf6faa892cf7ca15c0fa5da58f87f Reviewed-on: https://skia-review.googlesource.com/c/skia/+/213123 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Brian Salomon <bsalomon@google.com>
2019-05-10 13:22:49 +00:00
SkAutoPixmapStorage pm;
pm.alloc(SkImageInfo::Make(1, 1, kAlpha_8_SkColorType, kPremul_SkAlphaType));
SkYUVAInfo yuvaInfo({1, 1},
SkYUVAInfo::PlaneConfig::kY_U_V,
SkYUVAInfo::Subsampling::k444,
kJPEG_Full_SkYUVColorSpace);
const SkPixmap pmaps[] = {pm, pm, pm};
auto yuvaPixmaps = SkYUVAPixmaps::FromExternalPixmaps(yuvaInfo, pmaps);
return SkImage::MakeFromYUVAPixmaps(dContext, yuvaPixmaps);
Reland "Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA."" This reverts commit 8fbca482e5d9bd46ef6d97c0c3283cb108988ce4. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA."" > > This reverts commit 622b6f5367e2d26dab276df8bd9df0451236808b. > > Reason for revert: ANGLE may not be fixed > > Original change's description: > > Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA." > > > > This reverts commit bc0c460349142140295593a3a32d507f7b45c622. > > > > Reason for revert: fixed isTextureBacked(), checked cc_unittests passes > > > > Original change's description: > > > Revert "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA." > > > > > > This reverts commit a15f355be83136e7827ccfbc9bb9e9ea77f48518. > > > > > > Reason for revert: ANGLE failing new test > > > > > > Original change's description: > > > > Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA. > > > > > > > > Also removed unused virtual function from SkImage_GpuBase and override > > > > on SkImage_GpuYUVA. > > > > > > > > Change-Id: Ib47b46b529b16976181cb9453976133d66e0f952 > > > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212734 > > > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > > > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > > > > > Change-Id: Ib2566ff8aa99d3698d6044167e70a1d75542f2e9 > > > No-Presubmit: true > > > No-Tree-Checks: true > > > No-Try: true > > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212986 > > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > Commit-Queue: Robert Phillips <robertphillips@google.com> > > > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > > > Change-Id: I3c9454da33a764504e768d02b59a5cd99766aff1 > > No-Presubmit: true > > No-Tree-Checks: true > > No-Try: true > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212988 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Brian Salomon <bsalomon@google.com> > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: I06632adc69844522c87cd72e8a6b0c2795974fe4 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212989 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: I15cad8a907dbf6faa892cf7ca15c0fa5da58f87f Reviewed-on: https://skia-review.googlesource.com/c/skia/+/213123 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Brian Salomon <bsalomon@google.com>
2019-05-10 13:22:49 +00:00
}
Reland "Add flush() to SkImage." This reverts commit 693bc2bae5cf41ec51408b8c252b2a61a980659e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Add flush() to SkImage." > > This reverts commit d0503a72ac4293562a8e88be33633ec0cf55c3d4. > > Reason for revert: <INSERT REASONING HERE> > > Original change's description: > > Add flush() to SkImage. > > > > This allows a client to ensure all uses of a texture-backed image have > > been flushed. > > > > Does nothing if the image isn't texture-backed. > > > > The implementation adds support for triggering a flush if any of a set > > of proxies are used rather than just a single proxy. > > > > Change-Id: I358882d9737e63c6e69b924c0767f49b8f8f36ec > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212405 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: Ie376bf4225307f45b8fb3eb4a63bf84702365797 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212884 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: Idcba378ce2e3af0af9d0eef35737670055539ec5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212960 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
2019-05-09 14:30:12 +00:00
DEF_GPUTEST_FOR_ALL_CONTEXTS(ImageFlush, reporter, ctxInfo) {
auto dContext = ctxInfo.directContext();
Reland "Add flush() to SkImage." This reverts commit 693bc2bae5cf41ec51408b8c252b2a61a980659e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Add flush() to SkImage." > > This reverts commit d0503a72ac4293562a8e88be33633ec0cf55c3d4. > > Reason for revert: <INSERT REASONING HERE> > > Original change's description: > > Add flush() to SkImage. > > > > This allows a client to ensure all uses of a texture-backed image have > > been flushed. > > > > Does nothing if the image isn't texture-backed. > > > > The implementation adds support for triggering a flush if any of a set > > of proxies are used rather than just a single proxy. > > > > Change-Id: I358882d9737e63c6e69b924c0767f49b8f8f36ec > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212405 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: Ie376bf4225307f45b8fb3eb4a63bf84702365797 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212884 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: Idcba378ce2e3af0af9d0eef35737670055539ec5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212960 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
2019-05-09 14:30:12 +00:00
auto ii = SkImageInfo::Make(10, 10, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
auto s = SkSurface::MakeRenderTarget(dContext, SkBudgeted::kYes, ii, 1, nullptr);
Reland "Add flush() to SkImage." This reverts commit 693bc2bae5cf41ec51408b8c252b2a61a980659e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Add flush() to SkImage." > > This reverts commit d0503a72ac4293562a8e88be33633ec0cf55c3d4. > > Reason for revert: <INSERT REASONING HERE> > > Original change's description: > > Add flush() to SkImage. > > > > This allows a client to ensure all uses of a texture-backed image have > > been flushed. > > > > Does nothing if the image isn't texture-backed. > > > > The implementation adds support for triggering a flush if any of a set > > of proxies are used rather than just a single proxy. > > > > Change-Id: I358882d9737e63c6e69b924c0767f49b8f8f36ec > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212405 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: Ie376bf4225307f45b8fb3eb4a63bf84702365797 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212884 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: Idcba378ce2e3af0af9d0eef35737670055539ec5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212960 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
2019-05-09 14:30:12 +00:00
s->getCanvas()->clear(SK_ColorRED);
auto i0 = s->makeImageSnapshot();
s->getCanvas()->clear(SK_ColorBLUE);
auto i1 = s->makeImageSnapshot();
s->getCanvas()->clear(SK_ColorGREEN);
// Make a YUVA image.
auto i2 = make_yuva_image(dContext);
Reland "Add flush() to SkImage." This reverts commit 693bc2bae5cf41ec51408b8c252b2a61a980659e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Add flush() to SkImage." > > This reverts commit d0503a72ac4293562a8e88be33633ec0cf55c3d4. > > Reason for revert: <INSERT REASONING HERE> > > Original change's description: > > Add flush() to SkImage. > > > > This allows a client to ensure all uses of a texture-backed image have > > been flushed. > > > > Does nothing if the image isn't texture-backed. > > > > The implementation adds support for triggering a flush if any of a set > > of proxies are used rather than just a single proxy. > > > > Change-Id: I358882d9737e63c6e69b924c0767f49b8f8f36ec > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212405 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: Ie376bf4225307f45b8fb3eb4a63bf84702365797 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212884 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: Idcba378ce2e3af0af9d0eef35737670055539ec5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212960 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
2019-05-09 14:30:12 +00:00
// Flush all the setup work we did above and then make little lambda that reports the flush
// count delta since the last time it was called.
dContext->flushAndSubmit();
auto numSubmits =
[dContext,
submitCnt = dContext->priv().getGpu()->stats()->numSubmitToGpus()]() mutable {
int curr = dContext->priv().getGpu()->stats()->numSubmitToGpus();
int n = curr - submitCnt;
submitCnt = curr;
Reland "Add flush() to SkImage." This reverts commit 693bc2bae5cf41ec51408b8c252b2a61a980659e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Add flush() to SkImage." > > This reverts commit d0503a72ac4293562a8e88be33633ec0cf55c3d4. > > Reason for revert: <INSERT REASONING HERE> > > Original change's description: > > Add flush() to SkImage. > > > > This allows a client to ensure all uses of a texture-backed image have > > been flushed. > > > > Does nothing if the image isn't texture-backed. > > > > The implementation adds support for triggering a flush if any of a set > > of proxies are used rather than just a single proxy. > > > > Change-Id: I358882d9737e63c6e69b924c0767f49b8f8f36ec > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212405 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: Ie376bf4225307f45b8fb3eb4a63bf84702365797 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212884 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: Idcba378ce2e3af0af9d0eef35737670055539ec5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212960 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
2019-05-09 14:30:12 +00:00
return n;
};
// Images aren't used therefore flush is ignored, but submit is still called.
i0->flushAndSubmit(dContext);
i1->flushAndSubmit(dContext);
i2->flushAndSubmit(dContext);
REPORTER_ASSERT(reporter, numSubmits() == 3);
Reland "Add flush() to SkImage." This reverts commit 693bc2bae5cf41ec51408b8c252b2a61a980659e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Add flush() to SkImage." > > This reverts commit d0503a72ac4293562a8e88be33633ec0cf55c3d4. > > Reason for revert: <INSERT REASONING HERE> > > Original change's description: > > Add flush() to SkImage. > > > > This allows a client to ensure all uses of a texture-backed image have > > been flushed. > > > > Does nothing if the image isn't texture-backed. > > > > The implementation adds support for triggering a flush if any of a set > > of proxies are used rather than just a single proxy. > > > > Change-Id: I358882d9737e63c6e69b924c0767f49b8f8f36ec > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212405 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: Ie376bf4225307f45b8fb3eb4a63bf84702365797 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212884 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: Idcba378ce2e3af0af9d0eef35737670055539ec5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212960 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
2019-05-09 14:30:12 +00:00
// Syncing forces the flush to happen even if the images aren't used.
i0->flush(dContext);
dContext->submit(true);
REPORTER_ASSERT(reporter, numSubmits() == 1);
i1->flush(dContext);
dContext->submit(true);
REPORTER_ASSERT(reporter, numSubmits() == 1);
i2->flush(dContext);
dContext->submit(true);
REPORTER_ASSERT(reporter, numSubmits() == 1);
Reland "Add flush() to SkImage." This reverts commit 693bc2bae5cf41ec51408b8c252b2a61a980659e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Add flush() to SkImage." > > This reverts commit d0503a72ac4293562a8e88be33633ec0cf55c3d4. > > Reason for revert: <INSERT REASONING HERE> > > Original change's description: > > Add flush() to SkImage. > > > > This allows a client to ensure all uses of a texture-backed image have > > been flushed. > > > > Does nothing if the image isn't texture-backed. > > > > The implementation adds support for triggering a flush if any of a set > > of proxies are used rather than just a single proxy. > > > > Change-Id: I358882d9737e63c6e69b924c0767f49b8f8f36ec > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212405 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: Ie376bf4225307f45b8fb3eb4a63bf84702365797 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212884 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: Idcba378ce2e3af0af9d0eef35737670055539ec5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212960 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
2019-05-09 14:30:12 +00:00
// Use image 1
s->getCanvas()->drawImage(i1, 0, 0);
// Flushing image 0 should do nothing, but submit is still called.
i0->flushAndSubmit(dContext);
REPORTER_ASSERT(reporter, numSubmits() == 1);
Reland "Add flush() to SkImage." This reverts commit 693bc2bae5cf41ec51408b8c252b2a61a980659e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Add flush() to SkImage." > > This reverts commit d0503a72ac4293562a8e88be33633ec0cf55c3d4. > > Reason for revert: <INSERT REASONING HERE> > > Original change's description: > > Add flush() to SkImage. > > > > This allows a client to ensure all uses of a texture-backed image have > > been flushed. > > > > Does nothing if the image isn't texture-backed. > > > > The implementation adds support for triggering a flush if any of a set > > of proxies are used rather than just a single proxy. > > > > Change-Id: I358882d9737e63c6e69b924c0767f49b8f8f36ec > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212405 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: Ie376bf4225307f45b8fb3eb4a63bf84702365797 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212884 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: Idcba378ce2e3af0af9d0eef35737670055539ec5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212960 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
2019-05-09 14:30:12 +00:00
// Flushing image 1 should flush.
i1->flushAndSubmit(dContext);
REPORTER_ASSERT(reporter, numSubmits() == 1);
// Flushing image 2 should do nothing, but submit is still called.
i2->flushAndSubmit(dContext);
REPORTER_ASSERT(reporter, numSubmits() == 1);
Reland "Add flush() to SkImage." This reverts commit 693bc2bae5cf41ec51408b8c252b2a61a980659e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Add flush() to SkImage." > > This reverts commit d0503a72ac4293562a8e88be33633ec0cf55c3d4. > > Reason for revert: <INSERT REASONING HERE> > > Original change's description: > > Add flush() to SkImage. > > > > This allows a client to ensure all uses of a texture-backed image have > > been flushed. > > > > Does nothing if the image isn't texture-backed. > > > > The implementation adds support for triggering a flush if any of a set > > of proxies are used rather than just a single proxy. > > > > Change-Id: I358882d9737e63c6e69b924c0767f49b8f8f36ec > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212405 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: Ie376bf4225307f45b8fb3eb4a63bf84702365797 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212884 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: Idcba378ce2e3af0af9d0eef35737670055539ec5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212960 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
2019-05-09 14:30:12 +00:00
// Use image 2
s->getCanvas()->drawImage(i2, 0, 0);
// Flushing image 0 should do nothing, but submit is still called.
i0->flushAndSubmit(dContext);
REPORTER_ASSERT(reporter, numSubmits() == 1);
// Flushing image 1 do nothing, but submit is still called.
i1->flushAndSubmit(dContext);
REPORTER_ASSERT(reporter, numSubmits() == 1);
Reland "Add flush() to SkImage." This reverts commit 693bc2bae5cf41ec51408b8c252b2a61a980659e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Add flush() to SkImage." > > This reverts commit d0503a72ac4293562a8e88be33633ec0cf55c3d4. > > Reason for revert: <INSERT REASONING HERE> > > Original change's description: > > Add flush() to SkImage. > > > > This allows a client to ensure all uses of a texture-backed image have > > been flushed. > > > > Does nothing if the image isn't texture-backed. > > > > The implementation adds support for triggering a flush if any of a set > > of proxies are used rather than just a single proxy. > > > > Change-Id: I358882d9737e63c6e69b924c0767f49b8f8f36ec > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212405 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: Ie376bf4225307f45b8fb3eb4a63bf84702365797 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212884 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: Idcba378ce2e3af0af9d0eef35737670055539ec5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212960 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
2019-05-09 14:30:12 +00:00
// Flushing image 2 should flush.
i2->flushAndSubmit(dContext);
REPORTER_ASSERT(reporter, numSubmits() == 1);
Reland "Add flush() to SkImage." This reverts commit 693bc2bae5cf41ec51408b8c252b2a61a980659e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Add flush() to SkImage." > > This reverts commit d0503a72ac4293562a8e88be33633ec0cf55c3d4. > > Reason for revert: <INSERT REASONING HERE> > > Original change's description: > > Add flush() to SkImage. > > > > This allows a client to ensure all uses of a texture-backed image have > > been flushed. > > > > Does nothing if the image isn't texture-backed. > > > > The implementation adds support for triggering a flush if any of a set > > of proxies are used rather than just a single proxy. > > > > Change-Id: I358882d9737e63c6e69b924c0767f49b8f8f36ec > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212405 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: Ie376bf4225307f45b8fb3eb4a63bf84702365797 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212884 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: Idcba378ce2e3af0af9d0eef35737670055539ec5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212960 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
2019-05-09 14:30:12 +00:00
// Since we just did a simple image draw it should not have been flattened.
REPORTER_ASSERT(reporter,
!static_cast<SkImage_GpuYUVA*>(as_IB(i2.get()))->testingOnly_IsFlattened());
Reland "Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA."" This reverts commit 8fbca482e5d9bd46ef6d97c0c3283cb108988ce4. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA."" > > This reverts commit 622b6f5367e2d26dab276df8bd9df0451236808b. > > Reason for revert: ANGLE may not be fixed > > Original change's description: > > Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA." > > > > This reverts commit bc0c460349142140295593a3a32d507f7b45c622. > > > > Reason for revert: fixed isTextureBacked(), checked cc_unittests passes > > > > Original change's description: > > > Revert "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA." > > > > > > This reverts commit a15f355be83136e7827ccfbc9bb9e9ea77f48518. > > > > > > Reason for revert: ANGLE failing new test > > > > > > Original change's description: > > > > Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA. > > > > > > > > Also removed unused virtual function from SkImage_GpuBase and override > > > > on SkImage_GpuYUVA. > > > > > > > > Change-Id: Ib47b46b529b16976181cb9453976133d66e0f952 > > > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212734 > > > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > > > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > > > > > Change-Id: Ib2566ff8aa99d3698d6044167e70a1d75542f2e9 > > > No-Presubmit: true > > > No-Tree-Checks: true > > > No-Try: true > > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212986 > > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > Commit-Queue: Robert Phillips <robertphillips@google.com> > > > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > > > Change-Id: I3c9454da33a764504e768d02b59a5cd99766aff1 > > No-Presubmit: true > > No-Tree-Checks: true > > No-Try: true > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212988 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Brian Salomon <bsalomon@google.com> > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: I06632adc69844522c87cd72e8a6b0c2795974fe4 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212989 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: I15cad8a907dbf6faa892cf7ca15c0fa5da58f87f Reviewed-on: https://skia-review.googlesource.com/c/skia/+/213123 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Brian Salomon <bsalomon@google.com>
2019-05-10 13:22:49 +00:00
REPORTER_ASSERT(reporter, static_cast<SkImage_GpuYUVA*>(as_IB(i2.get()))->isTextureBacked());
// Flatten it and repeat.
as_IB(i2.get())->view(dContext);
Reland "Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA."" This reverts commit 8fbca482e5d9bd46ef6d97c0c3283cb108988ce4. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA."" > > This reverts commit 622b6f5367e2d26dab276df8bd9df0451236808b. > > Reason for revert: ANGLE may not be fixed > > Original change's description: > > Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA." > > > > This reverts commit bc0c460349142140295593a3a32d507f7b45c622. > > > > Reason for revert: fixed isTextureBacked(), checked cc_unittests passes > > > > Original change's description: > > > Revert "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA." > > > > > > This reverts commit a15f355be83136e7827ccfbc9bb9e9ea77f48518. > > > > > > Reason for revert: ANGLE failing new test > > > > > > Original change's description: > > > > Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA. > > > > > > > > Also removed unused virtual function from SkImage_GpuBase and override > > > > on SkImage_GpuYUVA. > > > > > > > > Change-Id: Ib47b46b529b16976181cb9453976133d66e0f952 > > > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212734 > > > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > > > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > > > > > Change-Id: Ib2566ff8aa99d3698d6044167e70a1d75542f2e9 > > > No-Presubmit: true > > > No-Tree-Checks: true > > > No-Try: true > > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212986 > > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > Commit-Queue: Robert Phillips <robertphillips@google.com> > > > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > > > Change-Id: I3c9454da33a764504e768d02b59a5cd99766aff1 > > No-Presubmit: true > > No-Tree-Checks: true > > No-Try: true > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212988 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Brian Salomon <bsalomon@google.com> > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: I06632adc69844522c87cd72e8a6b0c2795974fe4 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212989 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: I15cad8a907dbf6faa892cf7ca15c0fa5da58f87f Reviewed-on: https://skia-review.googlesource.com/c/skia/+/213123 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Brian Salomon <bsalomon@google.com>
2019-05-10 13:22:49 +00:00
REPORTER_ASSERT(reporter,
static_cast<SkImage_GpuYUVA*>(as_IB(i2.get()))->testingOnly_IsFlattened());
REPORTER_ASSERT(reporter, static_cast<SkImage_GpuYUVA*>(as_IB(i2.get()))->isTextureBacked());
s->getCanvas()->drawImage(i2, 0, 0);
// Flushing image 0 should do nothing, but submit is still called.
i0->flushAndSubmit(dContext);
REPORTER_ASSERT(reporter, numSubmits() == 1);
// Flushing image 1 do nothing, but submit is still called.
i1->flushAndSubmit(dContext);
REPORTER_ASSERT(reporter, numSubmits() == 1);
Reland "Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA."" This reverts commit 8fbca482e5d9bd46ef6d97c0c3283cb108988ce4. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA."" > > This reverts commit 622b6f5367e2d26dab276df8bd9df0451236808b. > > Reason for revert: ANGLE may not be fixed > > Original change's description: > > Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA." > > > > This reverts commit bc0c460349142140295593a3a32d507f7b45c622. > > > > Reason for revert: fixed isTextureBacked(), checked cc_unittests passes > > > > Original change's description: > > > Revert "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA." > > > > > > This reverts commit a15f355be83136e7827ccfbc9bb9e9ea77f48518. > > > > > > Reason for revert: ANGLE failing new test > > > > > > Original change's description: > > > > Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA. > > > > > > > > Also removed unused virtual function from SkImage_GpuBase and override > > > > on SkImage_GpuYUVA. > > > > > > > > Change-Id: Ib47b46b529b16976181cb9453976133d66e0f952 > > > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212734 > > > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > > > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > > > > > Change-Id: Ib2566ff8aa99d3698d6044167e70a1d75542f2e9 > > > No-Presubmit: true > > > No-Tree-Checks: true > > > No-Try: true > > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212986 > > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > Commit-Queue: Robert Phillips <robertphillips@google.com> > > > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > > > Change-Id: I3c9454da33a764504e768d02b59a5cd99766aff1 > > No-Presubmit: true > > No-Tree-Checks: true > > No-Try: true > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212988 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Brian Salomon <bsalomon@google.com> > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: I06632adc69844522c87cd72e8a6b0c2795974fe4 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212989 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: I15cad8a907dbf6faa892cf7ca15c0fa5da58f87f Reviewed-on: https://skia-review.googlesource.com/c/skia/+/213123 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Brian Salomon <bsalomon@google.com>
2019-05-10 13:22:49 +00:00
// Flushing image 2 should flush.
i2->flushAndSubmit(dContext);
REPORTER_ASSERT(reporter, numSubmits() == 1);
Reland "Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA."" This reverts commit 8fbca482e5d9bd46ef6d97c0c3283cb108988ce4. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA."" > > This reverts commit 622b6f5367e2d26dab276df8bd9df0451236808b. > > Reason for revert: ANGLE may not be fixed > > Original change's description: > > Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA." > > > > This reverts commit bc0c460349142140295593a3a32d507f7b45c622. > > > > Reason for revert: fixed isTextureBacked(), checked cc_unittests passes > > > > Original change's description: > > > Revert "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA." > > > > > > This reverts commit a15f355be83136e7827ccfbc9bb9e9ea77f48518. > > > > > > Reason for revert: ANGLE failing new test > > > > > > Original change's description: > > > > Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA. > > > > > > > > Also removed unused virtual function from SkImage_GpuBase and override > > > > on SkImage_GpuYUVA. > > > > > > > > Change-Id: Ib47b46b529b16976181cb9453976133d66e0f952 > > > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212734 > > > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > > > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > > > > > Change-Id: Ib2566ff8aa99d3698d6044167e70a1d75542f2e9 > > > No-Presubmit: true > > > No-Tree-Checks: true > > > No-Try: true > > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212986 > > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > Commit-Queue: Robert Phillips <robertphillips@google.com> > > > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > > > Change-Id: I3c9454da33a764504e768d02b59a5cd99766aff1 > > No-Presubmit: true > > No-Tree-Checks: true > > No-Try: true > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212988 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Brian Salomon <bsalomon@google.com> > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: I06632adc69844522c87cd72e8a6b0c2795974fe4 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212989 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: I15cad8a907dbf6faa892cf7ca15c0fa5da58f87f Reviewed-on: https://skia-review.googlesource.com/c/skia/+/213123 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Brian Salomon <bsalomon@google.com>
2019-05-10 13:22:49 +00:00
// Test case where flatten happens before the first flush.
i2 = make_yuva_image(dContext);
Reland "Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA."" This reverts commit 8fbca482e5d9bd46ef6d97c0c3283cb108988ce4. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA."" > > This reverts commit 622b6f5367e2d26dab276df8bd9df0451236808b. > > Reason for revert: ANGLE may not be fixed > > Original change's description: > > Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA." > > > > This reverts commit bc0c460349142140295593a3a32d507f7b45c622. > > > > Reason for revert: fixed isTextureBacked(), checked cc_unittests passes > > > > Original change's description: > > > Revert "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA." > > > > > > This reverts commit a15f355be83136e7827ccfbc9bb9e9ea77f48518. > > > > > > Reason for revert: ANGLE failing new test > > > > > > Original change's description: > > > > Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA. > > > > > > > > Also removed unused virtual function from SkImage_GpuBase and override > > > > on SkImage_GpuYUVA. > > > > > > > > Change-Id: Ib47b46b529b16976181cb9453976133d66e0f952 > > > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212734 > > > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > > > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > > > > > Change-Id: Ib2566ff8aa99d3698d6044167e70a1d75542f2e9 > > > No-Presubmit: true > > > No-Tree-Checks: true > > > No-Try: true > > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212986 > > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > Commit-Queue: Robert Phillips <robertphillips@google.com> > > > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > > > Change-Id: I3c9454da33a764504e768d02b59a5cd99766aff1 > > No-Presubmit: true > > No-Tree-Checks: true > > No-Try: true > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212988 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Brian Salomon <bsalomon@google.com> > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: I06632adc69844522c87cd72e8a6b0c2795974fe4 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212989 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: I15cad8a907dbf6faa892cf7ca15c0fa5da58f87f Reviewed-on: https://skia-review.googlesource.com/c/skia/+/213123 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Brian Salomon <bsalomon@google.com>
2019-05-10 13:22:49 +00:00
// On some systems where preferVRAMUseOverFlushes is false (ANGLE on Windows) the above may
// actually flush in order to make textures for the YUV planes. TODO: Remove this when we
// make the YUVA planes from backend textures rather than pixmaps that the context must upload.
// Calling numSubmits rebases the flush count from here.
numSubmits();
as_IB(i2.get())->view(dContext);
Reland "Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA."" This reverts commit 8fbca482e5d9bd46ef6d97c0c3283cb108988ce4. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA."" > > This reverts commit 622b6f5367e2d26dab276df8bd9df0451236808b. > > Reason for revert: ANGLE may not be fixed > > Original change's description: > > Reland "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA." > > > > This reverts commit bc0c460349142140295593a3a32d507f7b45c622. > > > > Reason for revert: fixed isTextureBacked(), checked cc_unittests passes > > > > Original change's description: > > > Revert "Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA." > > > > > > This reverts commit a15f355be83136e7827ccfbc9bb9e9ea77f48518. > > > > > > Reason for revert: ANGLE failing new test > > > > > > Original change's description: > > > > Release YUVA planes in SkImage_GpuYUVA after flattenning to RGBA. > > > > > > > > Also removed unused virtual function from SkImage_GpuBase and override > > > > on SkImage_GpuYUVA. > > > > > > > > Change-Id: Ib47b46b529b16976181cb9453976133d66e0f952 > > > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212734 > > > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > > > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > > > > > Change-Id: Ib2566ff8aa99d3698d6044167e70a1d75542f2e9 > > > No-Presubmit: true > > > No-Tree-Checks: true > > > No-Try: true > > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212986 > > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > > Commit-Queue: Robert Phillips <robertphillips@google.com> > > > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > > > Change-Id: I3c9454da33a764504e768d02b59a5cd99766aff1 > > No-Presubmit: true > > No-Tree-Checks: true > > No-Try: true > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212988 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Brian Salomon <bsalomon@google.com> > > TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: I06632adc69844522c87cd72e8a6b0c2795974fe4 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212989 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: I15cad8a907dbf6faa892cf7ca15c0fa5da58f87f Reviewed-on: https://skia-review.googlesource.com/c/skia/+/213123 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Brian Salomon <bsalomon@google.com>
2019-05-10 13:22:49 +00:00
REPORTER_ASSERT(reporter,
static_cast<SkImage_GpuYUVA*>(as_IB(i2.get()))->testingOnly_IsFlattened());
REPORTER_ASSERT(reporter, static_cast<SkImage_GpuYUVA*>(as_IB(i2.get()))->isTextureBacked());
s->getCanvas()->drawImage(i2, 0, 0);
// Flushing image 0 should do nothing, but submit is still called.
i0->flushAndSubmit(dContext);
REPORTER_ASSERT(reporter, numSubmits() == 1);
// Flushing image 1 do nothing, but submit is still called.
i1->flushAndSubmit(dContext);
REPORTER_ASSERT(reporter, numSubmits() == 1);
// Flushing image 2 should flush, but submit is still called.
i2->flushAndSubmit(dContext);
REPORTER_ASSERT(reporter, numSubmits() == 1);
Reland "Add flush() to SkImage." This reverts commit 693bc2bae5cf41ec51408b8c252b2a61a980659e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Add flush() to SkImage." > > This reverts commit d0503a72ac4293562a8e88be33633ec0cf55c3d4. > > Reason for revert: <INSERT REASONING HERE> > > Original change's description: > > Add flush() to SkImage. > > > > This allows a client to ensure all uses of a texture-backed image have > > been flushed. > > > > Does nothing if the image isn't texture-backed. > > > > The implementation adds support for triggering a flush if any of a set > > of proxies are used rather than just a single proxy. > > > > Change-Id: I358882d9737e63c6e69b924c0767f49b8f8f36ec > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212405 > > Commit-Queue: Brian Salomon <bsalomon@google.com> > > Reviewed-by: Robert Phillips <robertphillips@google.com> > > TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com > > Change-Id: Ie376bf4225307f45b8fb3eb4a63bf84702365797 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212884 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Brian Salomon <bsalomon@google.com> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com Change-Id: Idcba378ce2e3af0af9d0eef35737670055539ec5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/212960 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
2019-05-09 14:30:12 +00:00
}
#include "src/shaders/SkImageShader.h"
constexpr SkM44 gCentripetalCatmulRom
(0.0f/2, -1.0f/2, 2.0f/2, -1.0f/2,
2.0f/2, 0.0f/2, -5.0f/2, 3.0f/2,
0.0f/2, 1.0f/2, 4.0f/2, -3.0f/2,
0.0f/2, 0.0f/2, -1.0f/2, 1.0f/2);
constexpr SkM44 gMitchellNetravali
( 1.0f/18, -9.0f/18, 15.0f/18, -7.0f/18,
16.0f/18, 0.0f/18, -36.0f/18, 21.0f/18,
1.0f/18, 9.0f/18, 27.0f/18, -21.0f/18,
0.0f/18, 0.0f/18, -6.0f/18, 7.0f/18);
DEF_TEST(image_cubicresampler, reporter) {
auto diff = [reporter](const SkM44& a, const SkM44& b) {
const float tolerance = 0.000001f;
for (int r = 0; r < 4; ++r) {
for (int c = 0; c < 4; ++c) {
float d = std::abs(a.rc(r, c) - b.rc(r, c));
REPORTER_ASSERT(reporter, d <= tolerance);
}
}
};
diff(SkImageShader::CubicResamplerMatrix(1.0f/3, 1.0f/3), gMitchellNetravali);
diff(SkImageShader::CubicResamplerMatrix(0, 1.0f/2), gCentripetalCatmulRom);
}
DEF_TEST(image_subset_encode_skbug_7752, reporter) {
sk_sp<SkImage> image = GetResourceAsImage("images/mandrill_128.png");
const int W = image->width();
const int H = image->height();
auto check_roundtrip = [&](sk_sp<SkImage> img) {
auto img2 = SkImage::MakeFromEncoded(img->encodeToData());
REPORTER_ASSERT(reporter, ToolUtils::equal_pixels(img.get(), img2.get()));
};
check_roundtrip(image); // should trivially pass
check_roundtrip(image->makeSubset({0, 0, W/2, H/2}));
check_roundtrip(image->makeSubset({W/2, H/2, W, H}));
check_roundtrip(image->makeColorSpace(SkColorSpace::MakeSRGBLinear()));
}