diff options
author | 2018-01-08 13:40:32 -0500 | |
---|---|---|
committer | 2018-01-08 19:05:31 +0000 | |
commit | 1afd4cdb0800e2e395b465da24eb71e0e834dafa (patch) | |
tree | d3353e7e4487a86d00002ab882f34ec24347000b /src/effects | |
parent | 5ec5d677b02c41a3c58609461cd8b62c2feaeddc (diff) |
Add GrProxyProvider
This pulls all the proxy tracking & creation functionality out of the GrResourceCache and GrResourceProvider and consolidates it in the GrProxyProvider.
Change-Id: I7256f7c544319a70c1bd93dd5a9ccbe5fa0a544f
Reviewed-on: https://skia-review.googlesource.com/91501
Commit-Queue: Robert Phillips <robertphillips@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
Diffstat (limited to 'src/effects')
-rw-r--r-- | src/effects/GrCircleBlurFragmentProcessor.cpp | 18 | ||||
-rw-r--r-- | src/effects/GrCircleBlurFragmentProcessor.fp | 27 | ||||
-rw-r--r-- | src/effects/GrCircleBlurFragmentProcessor.h | 7 | ||||
-rw-r--r-- | src/effects/SkBlurMaskFilter.cpp | 12 | ||||
-rw-r--r-- | src/effects/SkTableColorFilter.cpp | 3 |
5 files changed, 33 insertions, 34 deletions
diff --git a/src/effects/GrCircleBlurFragmentProcessor.cpp b/src/effects/GrCircleBlurFragmentProcessor.cpp index 41ea482b9e..55095e0099 100644 --- a/src/effects/GrCircleBlurFragmentProcessor.cpp +++ b/src/effects/GrCircleBlurFragmentProcessor.cpp @@ -11,7 +11,7 @@ #include "GrCircleBlurFragmentProcessor.h" #if SK_SUPPORT_GPU -#include "GrResourceProvider.h" +#include "GrProxyProvider.h" // Computes an unnormalized half kernel (right side). Returns the summation of all the half // kernel values. @@ -166,7 +166,7 @@ static uint8_t* create_half_plane_profile(int profileWidth) { return profile; } -static sk_sp<GrTextureProxy> create_profile_texture(GrResourceProvider* resourceProvider, +static sk_sp<GrTextureProxy> create_profile_texture(GrProxyProvider* proxyProvider, const SkRect& circle, float sigma, float* solidRadius, float* textureRadius) { float circleR = circle.width() / 2.0f; @@ -208,7 +208,7 @@ static sk_sp<GrTextureProxy> create_profile_texture(GrResourceProvider* resource builder.finish(); sk_sp<GrTextureProxy> blurProfile = - resourceProvider->findOrCreateProxyByUniqueKey(key, kTopLeft_GrSurfaceOrigin); + proxyProvider->findOrCreateProxyByUniqueKey(key, kTopLeft_GrSurfaceOrigin); if (!blurProfile) { static constexpr int kProfileTextureWidth = 512; GrSurfaceDesc texDesc; @@ -227,30 +227,30 @@ static sk_sp<GrTextureProxy> create_profile_texture(GrResourceProvider* resource create_circle_profile(sigma * scale, circleR * scale, kProfileTextureWidth)); } - blurProfile = GrSurfaceProxy::MakeDeferred(resourceProvider, texDesc, SkBudgeted::kYes, + blurProfile = GrSurfaceProxy::MakeDeferred(proxyProvider, texDesc, SkBudgeted::kYes, profile.get(), 0); if (!blurProfile) { return nullptr; } SkASSERT(blurProfile->origin() == kTopLeft_GrSurfaceOrigin); - resourceProvider->assignUniqueKeyToProxy(key, blurProfile.get()); + proxyProvider->assignUniqueKeyToProxy(key, blurProfile.get()); } return blurProfile; } std::unique_ptr<GrFragmentProcessor> GrCircleBlurFragmentProcessor::Make( - GrResourceProvider* resourceProvider, const SkRect& circle, float sigma) { + GrProxyProvider* proxyProvider, const SkRect& circle, float sigma) { float solidRadius; float textureRadius; sk_sp<GrTextureProxy> profile( - create_profile_texture(resourceProvider, circle, sigma, &solidRadius, &textureRadius)); + create_profile_texture(proxyProvider, circle, sigma, &solidRadius, &textureRadius)); if (!profile) { return nullptr; } return std::unique_ptr<GrFragmentProcessor>(new GrCircleBlurFragmentProcessor( - circle, textureRadius, solidRadius, std::move(profile), resourceProvider)); + circle, textureRadius, solidRadius, std::move(profile))); } #include "glsl/GrGLSLFragmentProcessor.h" #include "glsl/GrGLSLFragmentShaderBuilder.h" @@ -344,7 +344,7 @@ std::unique_ptr<GrFragmentProcessor> GrCircleBlurFragmentProcessor::TestCreate( SkScalar wh = testData->fRandom->nextRangeScalar(100.f, 1000.f); SkScalar sigma = testData->fRandom->nextRangeF(1.f, 10.f); SkRect circle = SkRect::MakeWH(wh, wh); - return GrCircleBlurFragmentProcessor::Make(testData->resourceProvider(), circle, sigma); + return GrCircleBlurFragmentProcessor::Make(testData->proxyProvider(), circle, sigma); } #endif #endif diff --git a/src/effects/GrCircleBlurFragmentProcessor.fp b/src/effects/GrCircleBlurFragmentProcessor.fp index a93d2bacf7..d09103e73d 100644 --- a/src/effects/GrCircleBlurFragmentProcessor.fp +++ b/src/effects/GrCircleBlurFragmentProcessor.fp @@ -13,12 +13,8 @@ uniform half4 circleData; kCompatibleWithCoverageAsAlpha_OptimizationFlag } -@constructorParams { - GrResourceProvider* resourceProvider -} - @make { - static std::unique_ptr<GrFragmentProcessor> Make(GrResourceProvider* resourceProvider, + static std::unique_ptr<GrFragmentProcessor> Make(GrProxyProvider*, const SkRect& circle, float sigma); } @@ -28,7 +24,7 @@ uniform half4 circleData; } @cpp { - #include "GrResourceProvider.h" + #include "GrProxyProvider.h" // Computes an unnormalized half kernel (right side). Returns the summation of all the half // kernel values. @@ -184,11 +180,14 @@ uniform half4 circleData; return profile; } - static sk_sp<GrTextureProxy> create_profile_texture(GrResourceProvider* resourceProvider, + static sk_sp<GrTextureProxy> create_profile_texture(GrProxyProvider* proxyProvider, const SkRect& circle, float sigma, float* solidRadius, float* textureRadius) { float circleR = circle.width() / 2.0f; + if (circleR < SK_ScalarNearlyZero) { + return nullptr; + } // Profile textures are cached by the ratio of sigma to circle radius and by the size of the // profile texture (binned by powers of 2). SkScalar sigmaToCircleRRatio = sigma / circleR; @@ -224,7 +223,7 @@ uniform half4 circleData; builder.finish(); sk_sp<GrTextureProxy> blurProfile = - resourceProvider->findOrCreateProxyByUniqueKey(key, kTopLeft_GrSurfaceOrigin); + proxyProvider->findOrCreateProxyByUniqueKey(key, kTopLeft_GrSurfaceOrigin); if (!blurProfile) { static constexpr int kProfileTextureWidth = 512; GrSurfaceDesc texDesc; @@ -243,30 +242,30 @@ uniform half4 circleData; kProfileTextureWidth)); } - blurProfile = GrSurfaceProxy::MakeDeferred(resourceProvider, + blurProfile = GrSurfaceProxy::MakeDeferred(proxyProvider, texDesc, SkBudgeted::kYes, profile.get(), 0); if (!blurProfile) { return nullptr; } SkASSERT(blurProfile->origin() == kTopLeft_GrSurfaceOrigin); - resourceProvider->assignUniqueKeyToProxy(key, blurProfile.get()); + proxyProvider->assignUniqueKeyToProxy(key, blurProfile.get()); } return blurProfile; } std::unique_ptr<GrFragmentProcessor> GrCircleBlurFragmentProcessor::Make( - GrResourceProvider* resourceProvider, const SkRect& circle, float sigma) { + GrProxyProvider* proxyProvider, const SkRect& circle, float sigma) { float solidRadius; float textureRadius; - sk_sp<GrTextureProxy> profile(create_profile_texture(resourceProvider, circle, sigma, + sk_sp<GrTextureProxy> profile(create_profile_texture(proxyProvider, circle, sigma, &solidRadius, &textureRadius)); if (!profile) { return nullptr; } return std::unique_ptr<GrFragmentProcessor>(new GrCircleBlurFragmentProcessor( - circle, textureRadius, solidRadius, std::move(profile), resourceProvider)); + circle, textureRadius, solidRadius, std::move(profile))); } } @@ -283,5 +282,5 @@ void main() { SkScalar wh = testData->fRandom->nextRangeScalar(100.f, 1000.f); SkScalar sigma = testData->fRandom->nextRangeF(1.f,10.f); SkRect circle = SkRect::MakeWH(wh, wh); - return GrCircleBlurFragmentProcessor::Make(testData->resourceProvider(), circle, sigma); + return GrCircleBlurFragmentProcessor::Make(testData->proxyProvider(), circle, sigma); } diff --git a/src/effects/GrCircleBlurFragmentProcessor.h b/src/effects/GrCircleBlurFragmentProcessor.h index 747c0adbf7..4b5c4b311f 100644 --- a/src/effects/GrCircleBlurFragmentProcessor.h +++ b/src/effects/GrCircleBlurFragmentProcessor.h @@ -20,16 +20,15 @@ public: float textureRadius() const { return fTextureRadius; } float solidRadius() const { return fSolidRadius; } - static std::unique_ptr<GrFragmentProcessor> Make(GrResourceProvider* resourceProvider, - const SkRect& circle, float sigma); + static std::unique_ptr<GrFragmentProcessor> Make(GrProxyProvider*, const SkRect& circle, + float sigma); GrCircleBlurFragmentProcessor(const GrCircleBlurFragmentProcessor& src); std::unique_ptr<GrFragmentProcessor> clone() const override; const char* name() const override { return "CircleBlurFragmentProcessor"; } private: GrCircleBlurFragmentProcessor(SkRect circleRect, float textureRadius, float solidRadius, - sk_sp<GrTextureProxy> blurProfileSampler, - GrResourceProvider* resourceProvider) + sk_sp<GrTextureProxy> blurProfileSampler) : INHERITED(kGrCircleBlurFragmentProcessor_ClassID, (OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag) , fCircleRect(circleRect) diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp index a7e0d24a45..396bed9dd6 100644 --- a/src/effects/SkBlurMaskFilter.cpp +++ b/src/effects/SkBlurMaskFilter.cpp @@ -783,7 +783,7 @@ bool SkBlurMaskFilterImpl::directFilterMaskGPU(GrContext* context, SkScalar xformedSigma = this->computeXformedSigma(viewMatrix); - GrResourceProvider* resourceProvider = context->resourceProvider(); + GrProxyProvider* proxyProvider = context->contextPriv().proxyProvider(); std::unique_ptr<GrFragmentProcessor> fp; SkRect rect; @@ -791,9 +791,9 @@ bool SkBlurMaskFilterImpl::directFilterMaskGPU(GrContext* context, SkScalar pad = 3.0f * xformedSigma; rect.outset(pad, pad); - fp = GrRectBlurEffect::Make(resourceProvider, rect, xformedSigma); + fp = GrRectBlurEffect::Make(proxyProvider, rect, xformedSigma); } else if (path.isOval(&rect) && SkScalarNearlyEqual(rect.width(), rect.height())) { - fp = GrCircleBlurFragmentProcessor::Make(resourceProvider, rect, xformedSigma); + fp = GrCircleBlurFragmentProcessor::Make(proxyProvider, rect, xformedSigma); // expand the rect for the coverage geometry int pad = SkScalarCeilToInt(6*xformedSigma)/2; @@ -835,7 +835,7 @@ bool SkBlurMaskFilterImpl::directFilterRRectMaskGPU(GrContext* context, return false; } - GrResourceProvider* resourceProvider = context->resourceProvider(); + GrProxyProvider* proxyProvider = context->contextPriv().proxyProvider(); SkScalar xformedSigma = this->computeXformedSigma(viewMatrix); if (devRRect.isRect() || devRRect.isCircle()) { @@ -844,9 +844,9 @@ bool SkBlurMaskFilterImpl::directFilterRRectMaskGPU(GrContext* context, SkScalar pad = 3.0f * xformedSigma; const SkRect dstCoverageRect = devRRect.rect().makeOutset(pad, pad); - fp = GrRectBlurEffect::Make(resourceProvider, dstCoverageRect, xformedSigma); + fp = GrRectBlurEffect::Make(proxyProvider, dstCoverageRect, xformedSigma); } else { - fp = GrCircleBlurFragmentProcessor::Make(resourceProvider, + fp = GrCircleBlurFragmentProcessor::Make(proxyProvider, devRRect.rect(), xformedSigma); } diff --git a/src/effects/SkTableColorFilter.cpp b/src/effects/SkTableColorFilter.cpp index 1d506256f5..d808c6fb12 100644 --- a/src/effects/SkTableColorFilter.cpp +++ b/src/effects/SkTableColorFilter.cpp @@ -315,6 +315,7 @@ sk_sp<SkColorFilter> SkTable_ColorFilter::makeComposed(sk_sp<SkColorFilter> inne #include "GrColorSpaceInfo.h" #include "GrContext.h" +#include "GrContextPriv.h" #include "GrFragmentProcessor.h" #include "GrTextureStripAtlas.h" #include "SkGr.h" @@ -453,7 +454,7 @@ std::unique_ptr<GrFragmentProcessor> ColorTableEffect::Make(GrContext* context, if (-1 == row) { atlas = nullptr; - proxy = GrMakeCachedBitmapProxy(context->resourceProvider(), bitmap); + proxy = GrMakeCachedBitmapProxy(context->contextPriv().proxyProvider(), bitmap); } else { proxy = atlas->asTextureProxyRef(); } |