2016-02-19 16:19:40 +00:00
|
|
|
/*
|
|
|
|
* Copyright 2016 Google Inc.
|
|
|
|
*
|
|
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
|
|
* found in the LICENSE file.
|
|
|
|
*/
|
|
|
|
|
2019-04-23 17:05:21 +00:00
|
|
|
#include "tests/Test.h"
|
2016-02-19 16:19:40 +00:00
|
|
|
|
2019-04-23 17:05:21 +00:00
|
|
|
#include "include/core/SkBitmap.h"
|
|
|
|
#include "include/core/SkColorFilter.h"
|
|
|
|
#include "include/core/SkImage.h"
|
|
|
|
#include "include/core/SkImageFilter.h"
|
|
|
|
#include "include/core/SkMatrix.h"
|
2019-08-05 14:41:10 +00:00
|
|
|
#include "include/effects/SkImageFilters.h"
|
2019-04-23 17:05:21 +00:00
|
|
|
#include "src/core/SkImageFilterCache.h"
|
|
|
|
#include "src/core/SkSpecialImage.h"
|
2016-02-19 16:19:40 +00:00
|
|
|
|
2019-08-26 14:52:15 +00:00
|
|
|
SK_USE_FLUENT_IMAGE_FILTER_TYPES
|
|
|
|
|
2016-02-19 16:19:40 +00:00
|
|
|
static const int kSmallerSize = 10;
|
|
|
|
static const int kPad = 3;
|
|
|
|
static const int kFullSize = kSmallerSize + 2 * kPad;
|
|
|
|
|
|
|
|
static SkBitmap create_bm() {
|
2019-09-20 16:40:55 +00:00
|
|
|
SkImageInfo ii = SkImageInfo::Make(kFullSize, kFullSize, kRGBA_8888_SkColorType,
|
|
|
|
kPremul_SkAlphaType);
|
|
|
|
|
2016-02-19 16:19:40 +00:00
|
|
|
SkBitmap bm;
|
2019-09-20 16:40:55 +00:00
|
|
|
bm.allocPixels(ii);
|
2016-02-19 16:19:40 +00:00
|
|
|
bm.eraseColor(SK_ColorTRANSPARENT);
|
2020-01-28 22:02:49 +00:00
|
|
|
bm.setImmutable();
|
2016-02-19 16:19:40 +00:00
|
|
|
return bm;
|
|
|
|
}
|
|
|
|
|
2018-05-03 18:39:57 +00:00
|
|
|
static sk_sp<SkImageFilter> make_filter() {
|
2019-08-26 14:52:15 +00:00
|
|
|
sk_sp<SkColorFilter> filter(SkColorFilters::Blend(SK_ColorBLUE, SkBlendMode::kSrcIn));
|
2019-08-05 14:41:10 +00:00
|
|
|
return SkImageFilters::ColorFilter(std::move(filter), nullptr, nullptr);
|
2018-05-03 18:39:57 +00:00
|
|
|
}
|
|
|
|
|
2016-02-19 16:19:40 +00:00
|
|
|
// Ensure the cache can return a cached image
|
|
|
|
static void test_find_existing(skiatest::Reporter* reporter,
|
2016-03-17 21:31:39 +00:00
|
|
|
const sk_sp<SkSpecialImage>& image,
|
|
|
|
const sk_sp<SkSpecialImage>& subset) {
|
2016-02-19 16:19:40 +00:00
|
|
|
static const size_t kCacheSize = 1000000;
|
2016-11-04 15:49:42 +00:00
|
|
|
sk_sp<SkImageFilterCache> cache(SkImageFilterCache::Create(kCacheSize));
|
2016-02-19 16:19:40 +00:00
|
|
|
|
|
|
|
SkIRect clip = SkIRect::MakeWH(100, 100);
|
2016-04-27 18:31:23 +00:00
|
|
|
SkImageFilterCacheKey key1(0, SkMatrix::I(), clip, image->uniqueID(), image->subset());
|
|
|
|
SkImageFilterCacheKey key2(0, SkMatrix::I(), clip, subset->uniqueID(), subset->subset());
|
2016-02-19 16:19:40 +00:00
|
|
|
|
|
|
|
SkIPoint offset = SkIPoint::Make(3, 4);
|
2018-05-03 18:39:57 +00:00
|
|
|
auto filter = make_filter();
|
Define coord space tagged geometry for image filters v2.
This is an alternative approach to https://skia-review.googlesource.com/c/skia/+/234896
It inverts the templates and coordinate spaces, so that each coordinate space is
defined by a struct that accepts the SkIRect/etc. type as an argument. For parameter
space and device space, the only exposed functionality is holding on to the coordinates
and moving into and out of the layer space (using the Mapping type, which now encapsulates
the definition of parameter, layer, and device space for a given CTM).
The LayerSpace struct has specialized definitions for each of the 6 key geometric types,
exposes accessors/mutators and operations like join/intersect that work on appropriate
layer-space geometry.
FilterResult and Context have been updated to use these new types, although they no
longer take a Usage enum. If this strategy works, FilterResult will be updated to have
more utilities to operate and read from its image in layer-space so there won't be a need
to have the image space (and the usage enum to differentiate between different image
spaces).
To further reinforce the differences between getInputBounds() and getOutputBounds() (which
previously used Usage to do this), they now accept/return values in device and parameter
space. This is no different than what SkCanvas would have done before calling the old
functions, but now that work is owned by SkImageFilter (seems like a good thing), and
achieves the same reinforcement.
Change-Id: I8bebb9fadf6c8f2bd51fa863b2d6f2e4a33dd08b
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/244515
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
2019-10-02 17:38:29 +00:00
|
|
|
cache->set(key1, filter.get(),
|
|
|
|
skif::FilterResult<For::kOutput>(image, skif::LayerSpace<SkIPoint>(offset)));
|
2016-02-19 16:19:40 +00:00
|
|
|
|
2019-08-26 14:52:15 +00:00
|
|
|
skif::FilterResult<For::kOutput> foundImage;
|
|
|
|
REPORTER_ASSERT(reporter, cache->get(key1, &foundImage));
|
Define coord space tagged geometry for image filters v2.
This is an alternative approach to https://skia-review.googlesource.com/c/skia/+/234896
It inverts the templates and coordinate spaces, so that each coordinate space is
defined by a struct that accepts the SkIRect/etc. type as an argument. For parameter
space and device space, the only exposed functionality is holding on to the coordinates
and moving into and out of the layer space (using the Mapping type, which now encapsulates
the definition of parameter, layer, and device space for a given CTM).
The LayerSpace struct has specialized definitions for each of the 6 key geometric types,
exposes accessors/mutators and operations like join/intersect that work on appropriate
layer-space geometry.
FilterResult and Context have been updated to use these new types, although they no
longer take a Usage enum. If this strategy works, FilterResult will be updated to have
more utilities to operate and read from its image in layer-space so there won't be a need
to have the image space (and the usage enum to differentiate between different image
spaces).
To further reinforce the differences between getInputBounds() and getOutputBounds() (which
previously used Usage to do this), they now accept/return values in device and parameter
space. This is no different than what SkCanvas would have done before calling the old
functions, but now that work is owned by SkImageFilter (seems like a good thing), and
achieves the same reinforcement.
Change-Id: I8bebb9fadf6c8f2bd51fa863b2d6f2e4a33dd08b
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/244515
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
2019-10-02 17:38:29 +00:00
|
|
|
REPORTER_ASSERT(reporter, offset == SkIPoint(foundImage.layerOrigin()));
|
2016-02-19 16:19:40 +00:00
|
|
|
|
2019-08-26 14:52:15 +00:00
|
|
|
REPORTER_ASSERT(reporter, !cache->get(key2, &foundImage));
|
2016-02-19 16:19:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// If either id is different or the clip or the matrix are different the
|
|
|
|
// cached image won't be found. Even if it is caching the same bitmap.
|
|
|
|
static void test_dont_find_if_diff_key(skiatest::Reporter* reporter,
|
2016-03-17 21:31:39 +00:00
|
|
|
const sk_sp<SkSpecialImage>& image,
|
|
|
|
const sk_sp<SkSpecialImage>& subset) {
|
2016-02-19 16:19:40 +00:00
|
|
|
static const size_t kCacheSize = 1000000;
|
2016-11-04 15:49:42 +00:00
|
|
|
sk_sp<SkImageFilterCache> cache(SkImageFilterCache::Create(kCacheSize));
|
2016-02-19 16:19:40 +00:00
|
|
|
|
|
|
|
SkIRect clip1 = SkIRect::MakeWH(100, 100);
|
|
|
|
SkIRect clip2 = SkIRect::MakeWH(200, 200);
|
2016-04-27 18:31:23 +00:00
|
|
|
SkImageFilterCacheKey key0(0, SkMatrix::I(), clip1, image->uniqueID(), image->subset());
|
|
|
|
SkImageFilterCacheKey key1(1, SkMatrix::I(), clip1, image->uniqueID(), image->subset());
|
2020-05-21 16:11:27 +00:00
|
|
|
SkImageFilterCacheKey key2(0, SkMatrix::Translate(5, 5), clip1,
|
2016-02-19 16:19:40 +00:00
|
|
|
image->uniqueID(), image->subset());
|
2016-04-27 18:31:23 +00:00
|
|
|
SkImageFilterCacheKey key3(0, SkMatrix::I(), clip2, image->uniqueID(), image->subset());
|
|
|
|
SkImageFilterCacheKey key4(0, SkMatrix::I(), clip1, subset->uniqueID(), subset->subset());
|
2016-02-19 16:19:40 +00:00
|
|
|
|
|
|
|
SkIPoint offset = SkIPoint::Make(3, 4);
|
2018-05-03 18:39:57 +00:00
|
|
|
auto filter = make_filter();
|
Define coord space tagged geometry for image filters v2.
This is an alternative approach to https://skia-review.googlesource.com/c/skia/+/234896
It inverts the templates and coordinate spaces, so that each coordinate space is
defined by a struct that accepts the SkIRect/etc. type as an argument. For parameter
space and device space, the only exposed functionality is holding on to the coordinates
and moving into and out of the layer space (using the Mapping type, which now encapsulates
the definition of parameter, layer, and device space for a given CTM).
The LayerSpace struct has specialized definitions for each of the 6 key geometric types,
exposes accessors/mutators and operations like join/intersect that work on appropriate
layer-space geometry.
FilterResult and Context have been updated to use these new types, although they no
longer take a Usage enum. If this strategy works, FilterResult will be updated to have
more utilities to operate and read from its image in layer-space so there won't be a need
to have the image space (and the usage enum to differentiate between different image
spaces).
To further reinforce the differences between getInputBounds() and getOutputBounds() (which
previously used Usage to do this), they now accept/return values in device and parameter
space. This is no different than what SkCanvas would have done before calling the old
functions, but now that work is owned by SkImageFilter (seems like a good thing), and
achieves the same reinforcement.
Change-Id: I8bebb9fadf6c8f2bd51fa863b2d6f2e4a33dd08b
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/244515
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
2019-10-02 17:38:29 +00:00
|
|
|
cache->set(key0, filter.get(),
|
|
|
|
skif::FilterResult<For::kOutput>(image, skif::LayerSpace<SkIPoint>(offset)));
|
2016-02-19 16:19:40 +00:00
|
|
|
|
2019-08-26 14:52:15 +00:00
|
|
|
skif::FilterResult<For::kOutput> foundImage;
|
|
|
|
REPORTER_ASSERT(reporter, !cache->get(key1, &foundImage));
|
|
|
|
REPORTER_ASSERT(reporter, !cache->get(key2, &foundImage));
|
|
|
|
REPORTER_ASSERT(reporter, !cache->get(key3, &foundImage));
|
|
|
|
REPORTER_ASSERT(reporter, !cache->get(key4, &foundImage));
|
2016-02-19 16:19:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Test purging when the max cache size is exceeded
|
2016-03-17 21:31:39 +00:00
|
|
|
static void test_internal_purge(skiatest::Reporter* reporter, const sk_sp<SkSpecialImage>& image) {
|
2016-02-19 16:19:40 +00:00
|
|
|
SkASSERT(image->getSize());
|
2016-02-21 21:36:50 +00:00
|
|
|
const size_t kCacheSize = image->getSize() + 10;
|
2016-11-04 15:49:42 +00:00
|
|
|
sk_sp<SkImageFilterCache> cache(SkImageFilterCache::Create(kCacheSize));
|
2016-02-19 16:19:40 +00:00
|
|
|
|
|
|
|
SkIRect clip = SkIRect::MakeWH(100, 100);
|
2016-04-27 18:31:23 +00:00
|
|
|
SkImageFilterCacheKey key1(0, SkMatrix::I(), clip, image->uniqueID(), image->subset());
|
|
|
|
SkImageFilterCacheKey key2(1, SkMatrix::I(), clip, image->uniqueID(), image->subset());
|
2016-02-19 16:19:40 +00:00
|
|
|
|
|
|
|
SkIPoint offset = SkIPoint::Make(3, 4);
|
2018-05-03 18:39:57 +00:00
|
|
|
auto filter1 = make_filter();
|
Define coord space tagged geometry for image filters v2.
This is an alternative approach to https://skia-review.googlesource.com/c/skia/+/234896
It inverts the templates and coordinate spaces, so that each coordinate space is
defined by a struct that accepts the SkIRect/etc. type as an argument. For parameter
space and device space, the only exposed functionality is holding on to the coordinates
and moving into and out of the layer space (using the Mapping type, which now encapsulates
the definition of parameter, layer, and device space for a given CTM).
The LayerSpace struct has specialized definitions for each of the 6 key geometric types,
exposes accessors/mutators and operations like join/intersect that work on appropriate
layer-space geometry.
FilterResult and Context have been updated to use these new types, although they no
longer take a Usage enum. If this strategy works, FilterResult will be updated to have
more utilities to operate and read from its image in layer-space so there won't be a need
to have the image space (and the usage enum to differentiate between different image
spaces).
To further reinforce the differences between getInputBounds() and getOutputBounds() (which
previously used Usage to do this), they now accept/return values in device and parameter
space. This is no different than what SkCanvas would have done before calling the old
functions, but now that work is owned by SkImageFilter (seems like a good thing), and
achieves the same reinforcement.
Change-Id: I8bebb9fadf6c8f2bd51fa863b2d6f2e4a33dd08b
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/244515
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
2019-10-02 17:38:29 +00:00
|
|
|
cache->set(key1, filter1.get(),
|
|
|
|
skif::FilterResult<For::kOutput>(image, skif::LayerSpace<SkIPoint>(offset)));
|
2016-02-19 16:19:40 +00:00
|
|
|
|
2019-08-26 14:52:15 +00:00
|
|
|
skif::FilterResult<For::kOutput> foundImage;
|
|
|
|
REPORTER_ASSERT(reporter, cache->get(key1, &foundImage));
|
2016-02-19 16:19:40 +00:00
|
|
|
|
|
|
|
// This should knock the first one out of the cache
|
2018-05-03 18:39:57 +00:00
|
|
|
auto filter2 = make_filter();
|
Define coord space tagged geometry for image filters v2.
This is an alternative approach to https://skia-review.googlesource.com/c/skia/+/234896
It inverts the templates and coordinate spaces, so that each coordinate space is
defined by a struct that accepts the SkIRect/etc. type as an argument. For parameter
space and device space, the only exposed functionality is holding on to the coordinates
and moving into and out of the layer space (using the Mapping type, which now encapsulates
the definition of parameter, layer, and device space for a given CTM).
The LayerSpace struct has specialized definitions for each of the 6 key geometric types,
exposes accessors/mutators and operations like join/intersect that work on appropriate
layer-space geometry.
FilterResult and Context have been updated to use these new types, although they no
longer take a Usage enum. If this strategy works, FilterResult will be updated to have
more utilities to operate and read from its image in layer-space so there won't be a need
to have the image space (and the usage enum to differentiate between different image
spaces).
To further reinforce the differences between getInputBounds() and getOutputBounds() (which
previously used Usage to do this), they now accept/return values in device and parameter
space. This is no different than what SkCanvas would have done before calling the old
functions, but now that work is owned by SkImageFilter (seems like a good thing), and
achieves the same reinforcement.
Change-Id: I8bebb9fadf6c8f2bd51fa863b2d6f2e4a33dd08b
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/244515
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
2019-10-02 17:38:29 +00:00
|
|
|
cache->set(key2, filter2.get(),
|
|
|
|
skif::FilterResult<For::kOutput>(image, skif::LayerSpace<SkIPoint>(offset)));
|
2016-02-19 16:19:40 +00:00
|
|
|
|
2019-08-26 14:52:15 +00:00
|
|
|
REPORTER_ASSERT(reporter, cache->get(key2, &foundImage));
|
|
|
|
REPORTER_ASSERT(reporter, !cache->get(key1, &foundImage));
|
2016-02-19 16:19:40 +00:00
|
|
|
}
|
|
|
|
|
2017-06-29 15:19:42 +00:00
|
|
|
// Exercise the purgeByKey and purge methods
|
2016-02-19 16:19:40 +00:00
|
|
|
static void test_explicit_purging(skiatest::Reporter* reporter,
|
2016-03-17 21:31:39 +00:00
|
|
|
const sk_sp<SkSpecialImage>& image,
|
|
|
|
const sk_sp<SkSpecialImage>& subset) {
|
2016-02-19 16:19:40 +00:00
|
|
|
static const size_t kCacheSize = 1000000;
|
2016-11-04 15:49:42 +00:00
|
|
|
sk_sp<SkImageFilterCache> cache(SkImageFilterCache::Create(kCacheSize));
|
2016-02-19 16:19:40 +00:00
|
|
|
|
|
|
|
SkIRect clip = SkIRect::MakeWH(100, 100);
|
2016-04-27 18:31:23 +00:00
|
|
|
SkImageFilterCacheKey key1(0, SkMatrix::I(), clip, image->uniqueID(), image->subset());
|
|
|
|
SkImageFilterCacheKey key2(1, SkMatrix::I(), clip, subset->uniqueID(), image->subset());
|
2016-02-19 16:19:40 +00:00
|
|
|
|
|
|
|
SkIPoint offset = SkIPoint::Make(3, 4);
|
2018-05-03 18:39:57 +00:00
|
|
|
auto filter1 = make_filter();
|
|
|
|
auto filter2 = make_filter();
|
Define coord space tagged geometry for image filters v2.
This is an alternative approach to https://skia-review.googlesource.com/c/skia/+/234896
It inverts the templates and coordinate spaces, so that each coordinate space is
defined by a struct that accepts the SkIRect/etc. type as an argument. For parameter
space and device space, the only exposed functionality is holding on to the coordinates
and moving into and out of the layer space (using the Mapping type, which now encapsulates
the definition of parameter, layer, and device space for a given CTM).
The LayerSpace struct has specialized definitions for each of the 6 key geometric types,
exposes accessors/mutators and operations like join/intersect that work on appropriate
layer-space geometry.
FilterResult and Context have been updated to use these new types, although they no
longer take a Usage enum. If this strategy works, FilterResult will be updated to have
more utilities to operate and read from its image in layer-space so there won't be a need
to have the image space (and the usage enum to differentiate between different image
spaces).
To further reinforce the differences between getInputBounds() and getOutputBounds() (which
previously used Usage to do this), they now accept/return values in device and parameter
space. This is no different than what SkCanvas would have done before calling the old
functions, but now that work is owned by SkImageFilter (seems like a good thing), and
achieves the same reinforcement.
Change-Id: I8bebb9fadf6c8f2bd51fa863b2d6f2e4a33dd08b
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/244515
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
2019-10-02 17:38:29 +00:00
|
|
|
cache->set(key1, filter1.get(),
|
|
|
|
skif::FilterResult<For::kOutput>(image, skif::LayerSpace<SkIPoint>(offset)));
|
|
|
|
cache->set(key2, filter2.get(),
|
|
|
|
skif::FilterResult<For::kOutput>(image, skif::LayerSpace<SkIPoint>(offset)));
|
2016-04-18 21:49:57 +00:00
|
|
|
SkDEBUGCODE(REPORTER_ASSERT(reporter, 2 == cache->count());)
|
2016-02-19 16:19:40 +00:00
|
|
|
|
2019-08-26 14:52:15 +00:00
|
|
|
skif::FilterResult<For::kOutput> foundImage;
|
|
|
|
REPORTER_ASSERT(reporter, cache->get(key1, &foundImage));
|
|
|
|
REPORTER_ASSERT(reporter, cache->get(key2, &foundImage));
|
2016-02-19 16:19:40 +00:00
|
|
|
|
2018-05-03 18:39:57 +00:00
|
|
|
cache->purgeByImageFilter(filter1.get());
|
2016-04-18 21:49:57 +00:00
|
|
|
SkDEBUGCODE(REPORTER_ASSERT(reporter, 1 == cache->count());)
|
2016-02-19 16:19:40 +00:00
|
|
|
|
2019-08-26 14:52:15 +00:00
|
|
|
REPORTER_ASSERT(reporter, !cache->get(key1, &foundImage));
|
|
|
|
REPORTER_ASSERT(reporter, cache->get(key2, &foundImage));
|
2016-02-19 16:19:40 +00:00
|
|
|
|
|
|
|
cache->purge();
|
2016-04-18 21:49:57 +00:00
|
|
|
SkDEBUGCODE(REPORTER_ASSERT(reporter, 0 == cache->count());)
|
2016-02-19 16:19:40 +00:00
|
|
|
|
2019-08-26 14:52:15 +00:00
|
|
|
REPORTER_ASSERT(reporter, !cache->get(key1, &foundImage));
|
|
|
|
REPORTER_ASSERT(reporter, !cache->get(key2, &foundImage));
|
2016-02-19 16:19:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
DEF_TEST(ImageFilterCache_RasterBacked, reporter) {
|
|
|
|
SkBitmap srcBM = create_bm();
|
|
|
|
|
|
|
|
const SkIRect& full = SkIRect::MakeWH(kFullSize, kFullSize);
|
|
|
|
|
2016-04-20 18:48:36 +00:00
|
|
|
sk_sp<SkSpecialImage> fullImg(SkSpecialImage::MakeFromRaster(full, srcBM));
|
2016-02-19 16:19:40 +00:00
|
|
|
|
|
|
|
const SkIRect& subset = SkIRect::MakeXYWH(kPad, kPad, kSmallerSize, kSmallerSize);
|
|
|
|
|
2016-04-20 18:48:36 +00:00
|
|
|
sk_sp<SkSpecialImage> subsetImg(SkSpecialImage::MakeFromRaster(subset, srcBM));
|
2016-02-19 16:19:40 +00:00
|
|
|
|
|
|
|
test_find_existing(reporter, fullImg, subsetImg);
|
|
|
|
test_dont_find_if_diff_key(reporter, fullImg, subsetImg);
|
|
|
|
test_internal_purge(reporter, fullImg);
|
|
|
|
test_explicit_purging(reporter, fullImg, subsetImg);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-02-19 18:41:12 +00:00
|
|
|
// Shared test code for both the raster and gpu-backed image cases
|
2019-01-10 21:34:22 +00:00
|
|
|
static void test_image_backed(skiatest::Reporter* reporter,
|
|
|
|
GrContext* context,
|
|
|
|
const sk_sp<SkImage>& srcImage) {
|
2016-02-19 16:19:40 +00:00
|
|
|
const SkIRect& full = SkIRect::MakeWH(kFullSize, kFullSize);
|
|
|
|
|
2019-01-10 21:34:22 +00:00
|
|
|
sk_sp<SkSpecialImage> fullImg(SkSpecialImage::MakeFromImage(context, full, srcImage));
|
2016-02-19 16:19:40 +00:00
|
|
|
|
|
|
|
const SkIRect& subset = SkIRect::MakeXYWH(kPad, kPad, kSmallerSize, kSmallerSize);
|
|
|
|
|
2019-01-10 21:34:22 +00:00
|
|
|
sk_sp<SkSpecialImage> subsetImg(SkSpecialImage::MakeFromImage(context, subset, srcImage));
|
2016-02-19 16:19:40 +00:00
|
|
|
|
|
|
|
test_find_existing(reporter, fullImg, subsetImg);
|
|
|
|
test_dont_find_if_diff_key(reporter, fullImg, subsetImg);
|
|
|
|
test_internal_purge(reporter, fullImg);
|
|
|
|
test_explicit_purging(reporter, fullImg, subsetImg);
|
|
|
|
}
|
|
|
|
|
2016-02-19 18:41:12 +00:00
|
|
|
DEF_TEST(ImageFilterCache_ImageBackedRaster, reporter) {
|
|
|
|
SkBitmap srcBM = create_bm();
|
|
|
|
|
2016-03-17 17:51:11 +00:00
|
|
|
sk_sp<SkImage> srcImage(SkImage::MakeFromBitmap(srcBM));
|
2016-02-19 18:41:12 +00:00
|
|
|
|
2019-01-10 21:34:22 +00:00
|
|
|
test_image_backed(reporter, nullptr, srcImage);
|
2016-02-19 18:41:12 +00:00
|
|
|
}
|
|
|
|
|
2019-04-23 17:05:21 +00:00
|
|
|
#include "include/gpu/GrContext.h"
|
2020-01-28 22:02:49 +00:00
|
|
|
#include "src/gpu/GrBitmapTextureMaker.h"
|
2019-04-23 17:05:21 +00:00
|
|
|
#include "src/gpu/GrContextPriv.h"
|
|
|
|
#include "src/gpu/GrProxyProvider.h"
|
|
|
|
#include "src/gpu/GrResourceProvider.h"
|
|
|
|
#include "src/gpu/GrSurfaceProxyPriv.h"
|
2020-03-05 19:14:18 +00:00
|
|
|
#include "src/gpu/GrTexture.h"
|
2019-06-18 13:58:02 +00:00
|
|
|
#include "src/gpu/GrTextureProxy.h"
|
2016-02-19 16:19:40 +00:00
|
|
|
|
2020-01-28 22:03:46 +00:00
|
|
|
static GrSurfaceProxyView create_proxy_view(GrRecordingContext* context) {
|
2017-02-21 15:19:29 +00:00
|
|
|
SkBitmap srcBM = create_bm();
|
2020-03-18 14:06:13 +00:00
|
|
|
GrBitmapTextureMaker maker(context, srcBM, GrImageTexGenPolicy::kNew_Uncached_Budgeted);
|
2020-02-28 23:07:32 +00:00
|
|
|
return maker.view(GrMipMapped::kNo);
|
2017-02-21 15:19:29 +00:00
|
|
|
}
|
|
|
|
|
2017-04-05 18:56:21 +00:00
|
|
|
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageFilterCache_ImageBackedGPU, reporter, ctxInfo) {
|
2017-04-06 11:59:41 +00:00
|
|
|
GrContext* context = ctxInfo.grContext();
|
|
|
|
|
2020-01-28 22:03:46 +00:00
|
|
|
GrSurfaceProxyView srcView = create_proxy_view(context);
|
|
|
|
if (!srcView.proxy()) {
|
2017-04-06 11:59:41 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-01-28 22:03:46 +00:00
|
|
|
if (!srcView.proxy()->instantiate(context->priv().resourceProvider())) {
|
2016-02-19 18:41:12 +00:00
|
|
|
return;
|
|
|
|
}
|
2020-01-28 22:03:46 +00:00
|
|
|
GrTexture* tex = srcView.proxy()->peekTexture();
|
2016-02-19 18:41:12 +00:00
|
|
|
|
2017-12-13 20:00:45 +00:00
|
|
|
GrBackendTexture backendTex = tex->getBackendTexture();
|
|
|
|
|
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 = kTopLeft_GrSurfaceOrigin;
|
2017-04-06 11:59:41 +00:00
|
|
|
sk_sp<SkImage> srcImage(SkImage::MakeFromTexture(context,
|
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
|
|
|
backendTex,
|
|
|
|
texOrigin,
|
2017-12-18 19:48:15 +00:00
|
|
|
kRGBA_8888_SkColorType,
|
|
|
|
kPremul_SkAlphaType, nullptr,
|
|
|
|
nullptr, nullptr));
|
2016-02-19 18:41:12 +00:00
|
|
|
if (!srcImage) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-01-31 22:53:34 +00:00
|
|
|
GrSurfaceOrigin readBackOrigin;
|
2018-04-04 19:54:55 +00:00
|
|
|
GrBackendTexture readBackBackendTex = srcImage->getBackendTexture(false, &readBackOrigin);
|
|
|
|
if (!GrBackendTexture::TestingOnly_Equals(readBackBackendTex, backendTex)) {
|
|
|
|
ERRORF(reporter, "backend mismatch\n");
|
2017-01-31 22:53:34 +00:00
|
|
|
}
|
2018-04-04 19:54:55 +00:00
|
|
|
REPORTER_ASSERT(reporter, GrBackendTexture::TestingOnly_Equals(readBackBackendTex, backendTex));
|
|
|
|
|
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);
|
2017-01-31 22:53:34 +00:00
|
|
|
}
|
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);
|
2017-01-31 22:53:34 +00:00
|
|
|
|
2019-01-10 21:34:22 +00:00
|
|
|
test_image_backed(reporter, context, srcImage);
|
2016-02-19 18:41:12 +00:00
|
|
|
}
|
|
|
|
|
2016-04-12 16:59:58 +00:00
|
|
|
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageFilterCache_GPUBacked, reporter, ctxInfo) {
|
2017-02-21 15:19:29 +00:00
|
|
|
GrContext* context = ctxInfo.grContext();
|
2016-02-19 18:41:12 +00:00
|
|
|
|
2020-01-28 22:03:46 +00:00
|
|
|
GrSurfaceProxyView srcView = create_proxy_view(context);
|
|
|
|
if (!srcView.proxy()) {
|
2016-02-19 16:19:40 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const SkIRect& full = SkIRect::MakeWH(kFullSize, kFullSize);
|
|
|
|
|
2017-02-21 15:19:29 +00:00
|
|
|
sk_sp<SkSpecialImage> fullImg(SkSpecialImage::MakeDeferredFromGpu(
|
|
|
|
context, full,
|
2016-03-17 21:31:39 +00:00
|
|
|
kNeedNewImageUniqueID_SpecialImage,
|
2020-01-28 22:03:46 +00:00
|
|
|
srcView,
|
2019-09-20 16:40:55 +00:00
|
|
|
GrColorType::kRGBA_8888, nullptr));
|
2016-02-19 16:19:40 +00:00
|
|
|
|
|
|
|
const SkIRect& subset = SkIRect::MakeXYWH(kPad, kPad, kSmallerSize, kSmallerSize);
|
|
|
|
|
2017-02-21 15:19:29 +00:00
|
|
|
sk_sp<SkSpecialImage> subsetImg(SkSpecialImage::MakeDeferredFromGpu(
|
|
|
|
context, subset,
|
2016-02-19 16:19:40 +00:00
|
|
|
kNeedNewImageUniqueID_SpecialImage,
|
2020-01-28 22:03:46 +00:00
|
|
|
std::move(srcView),
|
2019-09-20 16:40:55 +00:00
|
|
|
GrColorType::kRGBA_8888, nullptr));
|
2016-02-19 16:19:40 +00:00
|
|
|
|
|
|
|
test_find_existing(reporter, fullImg, subsetImg);
|
|
|
|
test_dont_find_if_diff_key(reporter, fullImg, subsetImg);
|
|
|
|
test_internal_purge(reporter, fullImg);
|
|
|
|
test_explicit_purging(reporter, fullImg, subsetImg);
|
|
|
|
}
|