diff options
author | 2017-03-24 18:27:56 +0000 | |
---|---|---|
committer | 2017-03-24 18:28:00 +0000 | |
commit | 31f96a68af509f41ed0ffb2145f355229ae9aaf0 (patch) | |
tree | b547d69173860d12f79b49ce556315f30ffe561e /src | |
parent | ec715e827a75b839e5ff554bea57d4be42354e18 (diff) |
Revert "Remove texture sampling from GrConfigConversionEffect"
This reverts commit 3e7cddaf32e280fe9f32eec5bfdd8168ca4941b6.
Reason for revert: Precision issue on some mobile GPUs.
Original change's description:
> Remove texture sampling from GrConfigConversionEffect
>
> Re-land fixed version of https://skia-review.googlesource.com/c/10026/
>
> BUG=skia:
>
> Change-Id: I0754ffb72da2966eb57e5cd7ec818b1cdce84a74
> Reviewed-on: https://skia-review.googlesource.com/10056
> Reviewed-by: Brian Salomon <bsalomon@google.com>
> Commit-Queue: Brian Osman <brianosman@google.com>
>
TBR=bsalomon@google.com,robertphillips@google.com,brianosman@google.com,reviews@skia.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:
Change-Id: I66f52efe191b170612775e26d84a2af3d3f856af
Reviewed-on: https://skia-review.googlesource.com/10118
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/gpu/GrContext.cpp | 48 | ||||
-rw-r--r-- | src/gpu/effects/GrConfigConversionEffect.cpp | 88 | ||||
-rw-r--r-- | src/gpu/effects/GrConfigConversionEffect.h | 22 |
3 files changed, 102 insertions, 56 deletions
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp index f6302a9a1e..56d811761b 100644 --- a/src/gpu/GrContext.cpp +++ b/src/gpu/GrContext.cpp @@ -870,18 +870,18 @@ sk_sp<GrFragmentProcessor> GrContext::createPMToUPMEffect(GrTexture* texture, ASSERT_SINGLE_OWNER // We should have already called this->testPMConversionsIfNecessary(). SkASSERT(fDidTestPMConversions); - GrPixelConfig config = texture->config(); - sk_sp<GrFragmentProcessor> fp = GrSimpleTextureEffect::Make(texture, nullptr, matrix); - if (kRGBA_half_GrPixelConfig == config) { - return GrFragmentProcessor::UnpremulOutput(std::move(fp)); - } else if (kRGBA_8888_GrPixelConfig == config || kBGRA_8888_GrPixelConfig == config) { + if (kRGBA_half_GrPixelConfig == texture->config()) { + return GrFragmentProcessor::UnpremulOutput( + GrSimpleTextureEffect::Make(texture, nullptr, matrix)); + } else { GrConfigConversionEffect::PMConversion pmToUPM = static_cast<GrConfigConversionEffect::PMConversion>(fPMToUPMConversion); if (GrConfigConversionEffect::kPMConversionCnt != pmToUPM) { - return GrConfigConversionEffect::Make(std::move(fp), pmToUPM); + return GrConfigConversionEffect::Make(texture, pmToUPM, matrix); + } else { + return nullptr; } } - return nullptr; } sk_sp<GrFragmentProcessor> GrContext::createPMToUPMEffect(sk_sp<GrTextureProxy> proxy, @@ -889,19 +889,20 @@ sk_sp<GrFragmentProcessor> GrContext::createPMToUPMEffect(sk_sp<GrTextureProxy> ASSERT_SINGLE_OWNER // We should have already called this->testPMConversionsIfNecessary(). SkASSERT(fDidTestPMConversions); - GrPixelConfig config = proxy->config(); - sk_sp<GrFragmentProcessor> fp = GrSimpleTextureEffect::Make(this->resourceProvider(), - std::move(proxy), nullptr, matrix); - if (kRGBA_half_GrPixelConfig == config) { - return GrFragmentProcessor::UnpremulOutput(std::move(fp)); - } else if (kRGBA_8888_GrPixelConfig == config || kBGRA_8888_GrPixelConfig == config) { + if (kRGBA_half_GrPixelConfig == proxy->config()) { + return GrFragmentProcessor::UnpremulOutput( + GrSimpleTextureEffect::Make(this->resourceProvider(), std::move(proxy), + nullptr, matrix)); + } else { GrConfigConversionEffect::PMConversion pmToUPM = static_cast<GrConfigConversionEffect::PMConversion>(fPMToUPMConversion); if (GrConfigConversionEffect::kPMConversionCnt != pmToUPM) { - return GrConfigConversionEffect::Make(std::move(fp), pmToUPM); + return GrConfigConversionEffect::Make(this->resourceProvider(), std::move(proxy), + pmToUPM, matrix); + } else { + return nullptr; } } - return nullptr; } sk_sp<GrFragmentProcessor> GrContext::createUPMToPMEffect(sk_sp<GrTextureProxy> proxy, @@ -909,19 +910,20 @@ sk_sp<GrFragmentProcessor> GrContext::createUPMToPMEffect(sk_sp<GrTextureProxy> ASSERT_SINGLE_OWNER // We should have already called this->testPMConversionsIfNecessary(). SkASSERT(fDidTestPMConversions); - GrPixelConfig config = proxy->config(); - sk_sp<GrFragmentProcessor> fp = GrSimpleTextureEffect::Make(this->resourceProvider(), - std::move(proxy), nullptr, matrix); - if (kRGBA_half_GrPixelConfig == config) { - return GrFragmentProcessor::PremulOutput(std::move(fp)); - } else if (kRGBA_8888_GrPixelConfig == config || kBGRA_8888_GrPixelConfig == config) { + if (kRGBA_half_GrPixelConfig == proxy->config()) { + return GrFragmentProcessor::PremulOutput( + GrSimpleTextureEffect::Make(this->resourceProvider(), std::move(proxy), + nullptr, matrix)); + } else { GrConfigConversionEffect::PMConversion upmToPM = static_cast<GrConfigConversionEffect::PMConversion>(fUPMToPMConversion); if (GrConfigConversionEffect::kPMConversionCnt != upmToPM) { - return GrConfigConversionEffect::Make(std::move(fp), upmToPM); + return GrConfigConversionEffect::Make(this->resourceProvider(), std::move(proxy), + upmToPM, matrix); + } else { + return nullptr; } } - return nullptr; } bool GrContext::validPMUPMConversionExists(GrPixelConfig config) const { diff --git a/src/gpu/effects/GrConfigConversionEffect.cpp b/src/gpu/effects/GrConfigConversionEffect.cpp index b2c9e3e4fd..2c6589d6aa 100644 --- a/src/gpu/effects/GrConfigConversionEffect.cpp +++ b/src/gpu/effects/GrConfigConversionEffect.cpp @@ -10,6 +10,7 @@ #include "GrClip.h" #include "GrContext.h" #include "GrRenderTargetContext.h" +#include "GrSimpleTextureEffect.h" #include "SkMatrix.h" #include "glsl/GrGLSLFragmentProcessor.h" #include "glsl/GrGLSLFragmentShaderBuilder.h" @@ -29,11 +30,10 @@ public: fragBuilder->codeAppendf("%s;", tmpDecl.c_str()); - if (nullptr == args.fInputColor) { - // could optimize this case, but we aren't for now. - args.fInputColor = "vec4(1)"; - } - fragBuilder->codeAppendf("%s = %s;", tmpVar.c_str(), args.fInputColor); + fragBuilder->codeAppendf("%s = ", tmpVar.c_str()); + fragBuilder->appendTextureLookup(args.fTexSamplers[0], args.fTransformedCoords[0].c_str(), + args.fTransformedCoords[0].getType()); + fragBuilder->codeAppend(";"); switch (pmConversion) { case GrConfigConversionEffect::kMulByAlpha_RoundUp_PMConversion: @@ -68,6 +68,10 @@ public: break; } fragBuilder->codeAppendf("%s = %s;", args.fOutputColor, tmpVar.c_str()); + + SkString modulate; + GrGLSLMulVarBy4f(&modulate, args.fOutputColor, args.fInputColor); + fragBuilder->codeAppend(modulate.c_str()); } static inline void GenKey(const GrProcessor& processor, const GrShaderCaps&, @@ -83,11 +87,29 @@ private: }; /////////////////////////////////////////////////////////////////////////////// +GrConfigConversionEffect::GrConfigConversionEffect(GrTexture* texture, + PMConversion pmConversion, + const SkMatrix& matrix) + : INHERITED(texture, nullptr, matrix, kNone_OptimizationFlags) + , fPMConversion(pmConversion) { + this->initClassID<GrConfigConversionEffect>(); + // We expect to get here with non-BGRA/RGBA only if we're doing not doing a premul/unpremul + // conversion. + SkASSERT(kRGBA_8888_GrPixelConfig == texture->config() || + kBGRA_8888_GrPixelConfig == texture->config()); +} -GrConfigConversionEffect::GrConfigConversionEffect(PMConversion pmConversion) - : INHERITED(kNone_OptimizationFlags) +GrConfigConversionEffect::GrConfigConversionEffect(GrResourceProvider* resourceProvider, + sk_sp<GrTextureProxy> proxy, + PMConversion pmConversion, + const SkMatrix& matrix) + : INHERITED(resourceProvider, kNone_OptimizationFlags, proxy, nullptr, matrix) , fPMConversion(pmConversion) { this->initClassID<GrConfigConversionEffect>(); + // We expect to get here with non-BGRA/RGBA only if we're doing not doing a premul/unpremul + // conversion. + SkASSERT(kRGBA_8888_GrPixelConfig == proxy->config() || + kBGRA_8888_GrPixelConfig == proxy->config()); } bool GrConfigConversionEffect::onIsEqual(const GrFragmentProcessor& s) const { @@ -108,7 +130,10 @@ GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrConfigConversionEffect); #if GR_TEST_UTILS sk_sp<GrFragmentProcessor> GrConfigConversionEffect::TestCreate(GrProcessorTestData* d) { PMConversion pmConv = static_cast<PMConversion>(d->fRandom->nextULessThan(kPMConversionCnt)); - return sk_sp<GrFragmentProcessor>(new GrConfigConversionEffect(pmConv)); + return sk_sp<GrFragmentProcessor>(new GrConfigConversionEffect( + d->resourceProvider(), + d->textureProxy(GrProcessorUnitTest::kSkiaPMTextureIdx), + pmConv, GrTest::TestMatrix(d->fRandom))); } #endif @@ -201,11 +226,14 @@ void GrConfigConversionEffect::TestForPreservingPMConversions(GrContext* context GrPaint paint1; GrPaint paint2; GrPaint paint3; - sk_sp<GrFragmentProcessor> pmToUPM(new GrConfigConversionEffect(*pmToUPMRule)); - sk_sp<GrFragmentProcessor> upmToPM(new GrConfigConversionEffect(*upmToPMRule)); - - paint1.addColorTextureProcessor(resourceProvider, dataProxy, nullptr, SkMatrix::I()); - paint1.addColorFragmentProcessor(pmToUPM); + sk_sp<GrFragmentProcessor> pmToUPM1(new GrConfigConversionEffect( + resourceProvider, dataProxy, *pmToUPMRule, SkMatrix::I())); + sk_sp<GrFragmentProcessor> upmToPM(new GrConfigConversionEffect( + resourceProvider, readRTC->asTextureProxyRef(), *upmToPMRule, SkMatrix::I())); + sk_sp<GrFragmentProcessor> pmToUPM2(new GrConfigConversionEffect( + resourceProvider, tempRTC->asTextureProxyRef(), *pmToUPMRule, SkMatrix::I())); + + paint1.addColorFragmentProcessor(std::move(pmToUPM1)); paint1.setPorterDuffXPFactory(SkBlendMode::kSrc); readRTC->fillRectToRect(GrNoClip(), std::move(paint1), GrAA::kNo, SkMatrix::I(), kDstRect, @@ -215,17 +243,13 @@ void GrConfigConversionEffect::TestForPreservingPMConversions(GrContext* context continue; } - paint2.addColorTextureProcessor(resourceProvider, readRTC->asTextureProxyRef(), nullptr, - SkMatrix::I()); paint2.addColorFragmentProcessor(std::move(upmToPM)); paint2.setPorterDuffXPFactory(SkBlendMode::kSrc); tempRTC->fillRectToRect(GrNoClip(), std::move(paint2), GrAA::kNo, SkMatrix::I(), kDstRect, kSrcRect); - paint3.addColorTextureProcessor(resourceProvider, tempRTC->asTextureProxyRef(), nullptr, - SkMatrix::I()); - paint3.addColorFragmentProcessor(std::move(pmToUPM)); + paint3.addColorFragmentProcessor(std::move(pmToUPM2)); paint3.setPorterDuffXPFactory(SkBlendMode::kSrc); readRTC->fillRectToRect(GrNoClip(), std::move(paint3), GrAA::kNo, SkMatrix::I(), kDstRect, @@ -251,12 +275,28 @@ void GrConfigConversionEffect::TestForPreservingPMConversions(GrContext* context } } -sk_sp<GrFragmentProcessor> GrConfigConversionEffect::Make(sk_sp<GrFragmentProcessor> fp, - PMConversion pmConversion) { - if (!fp) { +sk_sp<GrFragmentProcessor> GrConfigConversionEffect::Make(GrTexture* texture, + PMConversion pmConversion, + const SkMatrix& matrix) { + if (kRGBA_8888_GrPixelConfig != texture->config() && + kBGRA_8888_GrPixelConfig != texture->config()) { + // The PM conversions assume colors are 0..255 + return nullptr; + } + return sk_sp<GrFragmentProcessor>( + new GrConfigConversionEffect(texture, pmConversion, matrix)); +} + +sk_sp<GrFragmentProcessor> GrConfigConversionEffect::Make(GrResourceProvider* resourceProvider, + sk_sp<GrTextureProxy> proxy, + PMConversion pmConversion, + const SkMatrix& matrix) { + if (kRGBA_8888_GrPixelConfig != proxy->config() && + kBGRA_8888_GrPixelConfig != proxy->config()) { + // The PM conversions assume colors are 0..255 return nullptr; } - sk_sp<GrFragmentProcessor> ccFP(new GrConfigConversionEffect(pmConversion)); - sk_sp<GrFragmentProcessor> fpPipeline[] = { fp, ccFP }; - return GrFragmentProcessor::RunInSeries(fpPipeline, 2); + return sk_sp<GrFragmentProcessor>(new GrConfigConversionEffect(resourceProvider, + std::move(proxy), + pmConversion, matrix)); } diff --git a/src/gpu/effects/GrConfigConversionEffect.h b/src/gpu/effects/GrConfigConversionEffect.h index e5fa10cd9b..d71b228a7b 100644 --- a/src/gpu/effects/GrConfigConversionEffect.h +++ b/src/gpu/effects/GrConfigConversionEffect.h @@ -8,13 +8,15 @@ #ifndef GrConfigConversionEffect_DEFINED #define GrConfigConversionEffect_DEFINED -#include "GrFragmentProcessor.h" +#include "GrSingleTextureEffect.h" + +class GrInvariantOutput; /** * This class is used to perform config conversions. Clients may want to read/write data that is * unpremultiplied. */ -class GrConfigConversionEffect : public GrFragmentProcessor { +class GrConfigConversionEffect : public GrSingleTextureEffect { public: /** * The PM->UPM or UPM->PM conversions to apply. @@ -28,11 +30,10 @@ public: kPMConversionCnt }; - /** - * Returns a fragment processor that calls the passed in fragment processor, and then performs - * the requested premul or unpremul conversion. - */ - static sk_sp<GrFragmentProcessor> Make(sk_sp<GrFragmentProcessor>, PMConversion); + static sk_sp<GrFragmentProcessor> Make(GrTexture*, PMConversion, const SkMatrix&); + + static sk_sp<GrFragmentProcessor> Make(GrResourceProvider*, sk_sp<GrTextureProxy>, + PMConversion, const SkMatrix&); const char* name() const override { return "Config Conversion"; } @@ -47,7 +48,10 @@ public: PMConversion* PMToUPMRule, PMConversion* UPMToPMRule); private: - GrConfigConversionEffect(PMConversion); + GrConfigConversionEffect(GrTexture*, PMConversion, const SkMatrix& matrix); + + GrConfigConversionEffect(GrResourceProvider*, sk_sp<GrTextureProxy>, + PMConversion, const SkMatrix& matrix); GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; @@ -59,7 +63,7 @@ private: GR_DECLARE_FRAGMENT_PROCESSOR_TEST; - typedef GrFragmentProcessor INHERITED; + typedef GrSingleTextureEffect INHERITED; }; #endif |