From b0b17d1e5375a65b8956a8990d63e0d02357fdaf Mon Sep 17 00:00:00 2001 From: Mike Klein Date: Fri, 9 Dec 2016 16:25:44 -0500 Subject: 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 Commit-Queue: Mike Klein --- src/core/SkBitmapController.cpp | 23 +++++++++++++++++++---- src/core/SkBitmapController.h | 5 ++++- src/core/SkBitmapProcState.cpp | 2 +- src/core/SkRasterPipeline.h | 4 +++- 4 files changed, 27 insertions(+), 7 deletions(-) (limited to 'src/core') 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 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(storage, size, bm, inverse, quality); + return SkInPlaceNewCheck(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 { -- cgit v1.2.3