From 6f9f7ebb74f49a3b641421fd368d8101e81dd05e Mon Sep 17 00:00:00 2001 From: Robert Phillips Date: Sat, 18 Feb 2017 15:15:51 -0500 Subject: [PATCH] Expand use of GrMakeCachedBitmapProxy (take 2) Reland of https://skia-review.googlesource.com/c/8666/ (Expand use of GrMakeCachedBitmapProxy) with a fix for the non-GPU build Change-Id: I91d1658139b895b94e04d3f486e56b76bc6d184a Reviewed-on: https://skia-review.googlesource.com/8700 Reviewed-by: Robert Phillips Commit-Queue: Robert Phillips --- .../SkPerlinNoiseShader2/SkPerlinNoiseShader2.cpp | 40 +++++++++++++--------- src/core/SkSpecialImage.cpp | 4 +-- src/effects/SkPerlinNoiseShader.cpp | 39 ++++++++++++--------- src/effects/SkTableColorFilter.cpp | 18 +++++++--- 4 files changed, 60 insertions(+), 41 deletions(-) diff --git a/experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.cpp b/experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.cpp index 898f49b..980593f 100644 --- a/experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.cpp +++ b/experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.cpp @@ -20,6 +20,7 @@ #include "GrContext.h" #include "GrCoordTransform.h" #include "SkGr.h" +#include "SkGrPriv.h" #include "effects/GrConstColorProcessor.h" #include "glsl/GrGLSLFragmentProcessor.h" #include "glsl/GrGLSLFragmentShaderBuilder.h" @@ -621,14 +622,16 @@ private: class GrPerlinNoise2Effect : public GrFragmentProcessor { public: - static sk_sp Make(SkPerlinNoiseShader2::Type type, + static sk_sp Make(GrTextureProvider* textureProvider, + SkPerlinNoiseShader2::Type type, int numOctaves, bool stitchTiles, SkPerlinNoiseShader2::PaintingData* paintingData, - GrTexture* permutationsTexture, GrTexture* noiseTexture, + sk_sp permutationsProxy, + sk_sp noiseProxy, const SkMatrix& matrix) { return sk_sp( - new GrPerlinNoise2Effect(type, numOctaves, stitchTiles, paintingData, - permutationsTexture, noiseTexture, matrix)); + new GrPerlinNoise2Effect(textureProvider, type, numOctaves, stitchTiles, paintingData, + std::move(permutationsProxy), std::move(noiseProxy), matrix)); } virtual ~GrPerlinNoise2Effect() { delete fPaintingData; } @@ -662,16 +665,18 @@ private: fPaintingData->fStitchDataInit == s.fPaintingData->fStitchDataInit; } - GrPerlinNoise2Effect(SkPerlinNoiseShader2::Type type, int numOctaves, bool stitchTiles, + GrPerlinNoise2Effect(GrTextureProvider* textureProvider, + SkPerlinNoiseShader2::Type type, int numOctaves, bool stitchTiles, SkPerlinNoiseShader2::PaintingData* paintingData, - GrTexture* permutationsTexture, GrTexture* noiseTexture, + sk_sp permutationsProxy, + sk_sp noiseProxy, const SkMatrix& matrix) : INHERITED(kNone_OptimizationFlags) , fType(type) , fNumOctaves(numOctaves) , fStitchTiles(stitchTiles) - , fPermutationsSampler(permutationsTexture) - , fNoiseSampler(noiseTexture) + , fPermutationsSampler(textureProvider, std::move(permutationsProxy)) + , fNoiseSampler(textureProvider, std::move(noiseProxy)) , fPaintingData(paintingData) { this->initClassID(); this->addTextureSampler(&fPermutationsSampler); @@ -1334,20 +1339,21 @@ sk_sp SkPerlinNoiseShader2::asFragmentProcessor(const AsFPA GrConstColorProcessor::kIgnore_InputMode); } - sk_sp permutationsTexture( - GrRefCachedBitmapTexture(args.fContext, paintingData->getPermutationsBitmap(), - GrSamplerParams::ClampNoFilter(), nullptr)); - sk_sp noiseTexture( - GrRefCachedBitmapTexture(args.fContext, paintingData->getNoiseBitmap(), - GrSamplerParams::ClampNoFilter(), nullptr)); + sk_sp permutationsProxy = GrMakeCachedBitmapProxy( + args.fContext, + paintingData->getPermutationsBitmap()); + sk_sp noiseProxy = GrMakeCachedBitmapProxy(args.fContext, + paintingData->getNoiseBitmap()); - if ((permutationsTexture) && (noiseTexture)) { + if (permutationsProxy && noiseProxy) { sk_sp inner( - GrPerlinNoise2Effect::Make(fType, + GrPerlinNoise2Effect::Make(args.fContext->textureProvider(), + fType, fNumOctaves, fStitchTiles, paintingData, - permutationsTexture.get(), noiseTexture.get(), + std::move(permutationsProxy), + std::move(noiseProxy), m)); return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner)); } diff --git a/src/core/SkSpecialImage.cpp b/src/core/SkSpecialImage.cpp index cef87b7..0ae84d3 100644 --- a/src/core/SkSpecialImage.cpp +++ b/src/core/SkSpecialImage.cpp @@ -261,9 +261,7 @@ public: sk_sp onAsTextureProxy(GrContext* context) const override { if (context) { - sk_sp tex(sk_ref_sp(GrRefCachedBitmapTexture( - context, fBitmap, GrSamplerParams::ClampNoFilter(), nullptr))); - return GrSurfaceProxy::MakeWrapped(std::move(tex)); + return GrMakeCachedBitmapProxy(context, fBitmap); } return nullptr; diff --git a/src/effects/SkPerlinNoiseShader.cpp b/src/effects/SkPerlinNoiseShader.cpp index b67fb34..5f8fe32 100644 --- a/src/effects/SkPerlinNoiseShader.cpp +++ b/src/effects/SkPerlinNoiseShader.cpp @@ -19,6 +19,7 @@ #include "GrContext.h" #include "GrCoordTransform.h" #include "SkGr.h" +#include "SkGrPriv.h" #include "effects/GrConstColorProcessor.h" #include "glsl/GrGLSLFragmentProcessor.h" #include "glsl/GrGLSLFragmentShaderBuilder.h" @@ -485,14 +486,16 @@ private: class GrPerlinNoiseEffect : public GrFragmentProcessor { public: - static sk_sp Make(SkPerlinNoiseShader::Type type, + static sk_sp Make(GrTextureProvider* textureProvider, + SkPerlinNoiseShader::Type type, int numOctaves, bool stitchTiles, SkPerlinNoiseShader::PaintingData* paintingData, - GrTexture* permutationsTexture, GrTexture* noiseTexture, + sk_sp permutationsProxy, + sk_sp noiseProxy, const SkMatrix& matrix) { return sk_sp( - new GrPerlinNoiseEffect(type, numOctaves, stitchTiles, paintingData, - permutationsTexture, noiseTexture, matrix)); + new GrPerlinNoiseEffect(textureProvider, type, numOctaves, stitchTiles, paintingData, + std::move(permutationsProxy), std::move(noiseProxy), matrix)); } virtual ~GrPerlinNoiseEffect() { delete fPaintingData; } @@ -525,17 +528,18 @@ private: fPaintingData->fStitchDataInit == s.fPaintingData->fStitchDataInit; } - GrPerlinNoiseEffect(SkPerlinNoiseShader::Type type, int numOctaves, bool stitchTiles, + GrPerlinNoiseEffect(GrTextureProvider* textureProvider, + SkPerlinNoiseShader::Type type, int numOctaves, bool stitchTiles, SkPerlinNoiseShader::PaintingData* paintingData, - GrTexture* permutationsTexture, GrTexture* noiseTexture, + sk_sp permutationsProxy, sk_sp noiseProxy, const SkMatrix& matrix) : INHERITED(kNone_OptimizationFlags) , fType(type) , fCoordTransform(matrix) , fNumOctaves(numOctaves) , fStitchTiles(stitchTiles) - , fPermutationsSampler(permutationsTexture) - , fNoiseSampler(noiseTexture) + , fPermutationsSampler(textureProvider, std::move(permutationsProxy)) + , fNoiseSampler(textureProvider, std::move(noiseProxy)) , fPaintingData(paintingData) { this->initClassID(); this->addTextureSampler(&fPermutationsSampler); @@ -911,23 +915,24 @@ sk_sp SkPerlinNoiseShader::asFragmentProcessor(const AsFPAr SkPerlinNoiseShader::PaintingData* paintingData = new PaintingData(fTileSize, fSeed, fBaseFrequencyX, fBaseFrequencyY, matrix); - sk_sp permutationsTexture( - GrRefCachedBitmapTexture(args.fContext, paintingData->getPermutationsBitmap(), - GrSamplerParams::ClampNoFilter(), nullptr)); - sk_sp noiseTexture( - GrRefCachedBitmapTexture(args.fContext, paintingData->getNoiseBitmap(), - GrSamplerParams::ClampNoFilter(), nullptr)); + sk_sp permutationsProxy(GrMakeCachedBitmapProxy( + args.fContext, + paintingData->getPermutationsBitmap())); + sk_sp noiseProxy(GrMakeCachedBitmapProxy(args.fContext, + paintingData->getNoiseBitmap())); SkMatrix m = *args.fViewMatrix; m.setTranslateX(-localMatrix.getTranslateX() + SK_Scalar1); m.setTranslateY(-localMatrix.getTranslateY() + SK_Scalar1); - if ((permutationsTexture) && (noiseTexture)) { + if (permutationsProxy && noiseProxy) { sk_sp inner( - GrPerlinNoiseEffect::Make(fType, + GrPerlinNoiseEffect::Make(args.fContext->textureProvider(), + fType, fNumOctaves, fStitchTiles, paintingData, - permutationsTexture.get(), noiseTexture.get(), + std::move(permutationsProxy), + std::move(noiseProxy), m)); return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner)); } diff --git a/src/effects/SkTableColorFilter.cpp b/src/effects/SkTableColorFilter.cpp index 8960449..38f1f97 100644 --- a/src/effects/SkTableColorFilter.cpp +++ b/src/effects/SkTableColorFilter.cpp @@ -363,6 +363,7 @@ sk_sp SkTable_ColorFilter::makeComposed(sk_sp inne #include "GrFragmentProcessor.h" #include "GrTextureStripAtlas.h" #include "SkGr.h" +#include "SkGrPriv.h" #include "glsl/GrGLSLFragmentProcessor.h" #include "glsl/GrGLSLFragmentShaderBuilder.h" #include "glsl/GrGLSLProgramDataManager.h" @@ -370,7 +371,9 @@ sk_sp SkTable_ColorFilter::makeComposed(sk_sp inne class ColorTableEffect : public GrFragmentProcessor { public: - static sk_sp Make(GrContext* context, SkBitmap bitmap, unsigned flags); + static sk_sp Make(GrContext* context, + const SkBitmap& bitmap, + unsigned flags); virtual ~ColorTableEffect(); @@ -480,7 +483,7 @@ void GLColorTableEffect::emitCode(EmitArgs& args) { } /////////////////////////////////////////////////////////////////////////////// -sk_sp ColorTableEffect::Make(GrContext* context, SkBitmap bitmap, +sk_sp ColorTableEffect::Make(GrContext* context, const SkBitmap& bitmap, unsigned flags) { GrTextureStripAtlas::Desc desc; @@ -494,12 +497,19 @@ sk_sp ColorTableEffect::Make(GrContext* context, SkBitmap b sk_sp texture; if (-1 == row) { atlas = nullptr; - texture.reset( - GrRefCachedBitmapTexture(context, bitmap, GrSamplerParams::ClampNoFilter(), nullptr)); + + sk_sp proxy = GrMakeCachedBitmapProxy(context, bitmap); + if (proxy) { + texture.reset(proxy->instantiate(context->textureProvider())); + } } else { texture.reset(SkRef(atlas->getTexture())); } + if (!texture) { + return nullptr; + } + return sk_sp(new ColorTableEffect(texture.get(), atlas, row, flags)); } -- 2.7.4