aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Mike Klein <mtklein@chromium.org>2016-12-09 16:25:44 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2016-12-09 22:05:24 +0000
commitb0b17d1e5375a65b8956a8990d63e0d02357fdaf (patch)
tree65c9b3487dd577006e4c5608b5f6d13579298f00 /src/core
parent21aa35f0aac9a091d01ad50dcdc44271dc2a13ed (diff)
bicubic, attempt gazillion
- explicitly separate bilinear_ stages in x and y too BUG=skia: CQ_INCLUDE_TRYBOTS=skia.primary:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD Change-Id: Ib7b4f9d26ea6abe9171068e92424479d811ee606 Reviewed-on: https://skia-review.googlesource.com/5636 Reviewed-by: Brian Osman <brianosman@google.com> Commit-Queue: Mike Klein <mtklein@chromium.org>
Diffstat (limited to 'src/core')
-rw-r--r--src/core/SkBitmapController.cpp23
-rw-r--r--src/core/SkBitmapController.h5
-rw-r--r--src/core/SkBitmapProcState.cpp2
-rw-r--r--src/core/SkRasterPipeline.h4
4 files changed, 27 insertions, 7 deletions
diff --git a/src/core/SkBitmapController.cpp b/src/core/SkBitmapController.cpp
index 75c500d80e..6a44a36645 100644
--- a/src/core/SkBitmapController.cpp
+++ b/src/core/SkBitmapController.cpp
@@ -40,11 +40,15 @@ SkBitmapController::State* SkBitmapController::requestBitmap(const SkBitmapProvi
class SkDefaultBitmapControllerState : public SkBitmapController::State {
public:
- SkDefaultBitmapControllerState(const SkBitmapProvider&, const SkMatrix& inv, SkFilterQuality);
+ SkDefaultBitmapControllerState(const SkBitmapProvider&,
+ const SkMatrix& inv,
+ SkFilterQuality,
+ bool canShadeHQ);
private:
SkBitmap fResultBitmap;
sk_sp<const SkMipMap> fCurrMip;
+ bool fCanShadeHQ;
bool processExternalRequest(const SkBitmapProvider&);
bool processHQRequest(const SkBitmapProvider&);
@@ -128,6 +132,14 @@ bool SkDefaultBitmapControllerState::processHQRequest(const SkBitmapProvider& pr
return false; // only use HQ when upsampling
}
+ // If the shader can natively handle HQ filtering, let it do it.
+ if (fCanShadeHQ) {
+ fQuality = kHigh_SkFilterQuality;
+ SkAssertResult(provider.asBitmap(&fResultBitmap));
+ fResultBitmap.lockPixels();
+ return true;
+ }
+
const int dstW = SkScalarRoundToScalar(provider.width() / invScaleX);
const int dstH = SkScalarRoundToScalar(provider.height() / invScaleY);
const SkBitmapCacheDesc desc = provider.makeCacheDesc(dstW, dstH);
@@ -222,9 +234,11 @@ bool SkDefaultBitmapControllerState::processMediumRequest(const SkBitmapProvider
SkDefaultBitmapControllerState::SkDefaultBitmapControllerState(const SkBitmapProvider& provider,
const SkMatrix& inv,
- SkFilterQuality qual) {
+ SkFilterQuality qual,
+ bool canShadeHQ) {
fInvMatrix = inv;
fQuality = qual;
+ fCanShadeHQ = canShadeHQ;
bool processed = this->processExternalRequest(provider);
@@ -239,7 +253,7 @@ SkDefaultBitmapControllerState::SkDefaultBitmapControllerState(const SkBitmapPro
fResultBitmap.lockPixels();
// lock may fail to give us pixels
}
- SkASSERT(fQuality <= kLow_SkFilterQuality);
+ SkASSERT(fCanShadeHQ || fQuality <= kLow_SkFilterQuality);
// fResultBitmap.getPixels() may be null, but our caller knows to check fPixmap.addr()
// and will destroy us if it is nullptr.
@@ -251,5 +265,6 @@ SkBitmapController::State* SkDefaultBitmapController::onRequestBitmap(const SkBi
const SkMatrix& inverse,
SkFilterQuality quality,
void* storage, size_t size) {
- return SkInPlaceNewCheck<SkDefaultBitmapControllerState>(storage, size, bm, inverse, quality);
+ return SkInPlaceNewCheck<SkDefaultBitmapControllerState>(storage, size,
+ bm, inverse, quality, fCanShadeHQ);
}
diff --git a/src/core/SkBitmapController.h b/src/core/SkBitmapController.h
index 9eff2d28ff..72fc721c53 100644
--- a/src/core/SkBitmapController.h
+++ b/src/core/SkBitmapController.h
@@ -57,11 +57,14 @@ protected:
class SkDefaultBitmapController : public SkBitmapController {
public:
- SkDefaultBitmapController() {}
+ enum class CanShadeHQ { kNo, kYes };
+ SkDefaultBitmapController(CanShadeHQ canShadeHQ)
+ : fCanShadeHQ(canShadeHQ == CanShadeHQ::kYes) {}
protected:
State* onRequestBitmap(const SkBitmapProvider&, const SkMatrix& inverse, SkFilterQuality,
void* storage, size_t storageSize) override;
+ bool fCanShadeHQ;
};
#endif
diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp
index 3c4f414c23..684555e052 100644
--- a/src/core/SkBitmapProcState.cpp
+++ b/src/core/SkBitmapProcState.cpp
@@ -109,7 +109,7 @@ bool SkBitmapProcInfo::init(const SkMatrix& inv, const SkPaint& paint) {
allow_ignore_fractional_translate = false;
}
- SkDefaultBitmapController controller;
+ SkDefaultBitmapController controller(SkDefaultBitmapController::CanShadeHQ::kNo);
fBMState = controller.requestBitmap(fProvider, inv, paint.getFilterQuality(),
fBMStateStorage.get(), fBMStateStorage.size());
// Note : we allow the controller to return an empty (zero-dimension) result. Should we?
diff --git a/src/core/SkRasterPipeline.h b/src/core/SkRasterPipeline.h
index 3ecf80f79b..b3f513d69e 100644
--- a/src/core/SkRasterPipeline.h
+++ b/src/core/SkRasterPipeline.h
@@ -86,7 +86,9 @@
M(clamp_y) M(mirror_y) M(repeat_y) \
M(gather_a8) M(gather_g8) M(gather_i8) \
M(gather_565) M(gather_4444) M(gather_8888) M(gather_f16) \
- M(bilinear_nn) M(bilinear_pn) M(bilinear_np) M(bilinear_pp) \
+ M(bilinear_nx) M(bilinear_px) M(bilinear_ny) M(bilinear_py) \
+ M(bicubic_n3x) M(bicubic_n1x) M(bicubic_p1x) M(bicubic_p3x) \
+ M(bicubic_n3y) M(bicubic_n1y) M(bicubic_p1y) M(bicubic_p3y) \
M(save_xy) M(accumulate)
class SkRasterPipeline {