diff options
Diffstat (limited to 'src/gpu')
-rw-r--r-- | src/gpu/GrContext.cpp | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp index 31f1787d56..7ea4abd0c0 100644 --- a/src/gpu/GrContext.cpp +++ b/src/gpu/GrContext.cpp @@ -919,16 +919,20 @@ sk_sp<GrFragmentProcessor> GrContext::createPMToUPMEffect(sk_sp<GrFragmentProces ASSERT_SINGLE_OWNER // We should have already called this->testPMConversionsIfNecessary(). SkASSERT(fDidTestPMConversions); - if (kRGBA_half_GrPixelConfig == config) { - return GrFragmentProcessor::UnpremulOutput(std::move(fp)); - } else if (kRGBA_8888_GrPixelConfig == config || kBGRA_8888_GrPixelConfig == config) { + // We have specialized effects that guarantee round-trip conversion for these formats + if (kRGBA_8888_GrPixelConfig == config || kBGRA_8888_GrPixelConfig == config) { GrConfigConversionEffect::PMConversion pmToUPM = static_cast<GrConfigConversionEffect::PMConversion>(fPMToUPMConversion); if (GrConfigConversionEffect::kPMConversionCnt != pmToUPM) { return GrConfigConversionEffect::Make(std::move(fp), pmToUPM); + } else { + return nullptr; } + } else { + // For everything else (sRGB, half-float, etc...), it doesn't make sense to try and + // explicitly round the results. Just do the obvious, naive thing in the shader. + return GrFragmentProcessor::UnpremulOutput(std::move(fp)); } - return nullptr; } sk_sp<GrFragmentProcessor> GrContext::createUPMToPMEffect(sk_sp<GrFragmentProcessor> fp, @@ -936,16 +940,20 @@ sk_sp<GrFragmentProcessor> GrContext::createUPMToPMEffect(sk_sp<GrFragmentProces ASSERT_SINGLE_OWNER // We should have already called this->testPMConversionsIfNecessary(). SkASSERT(fDidTestPMConversions); - if (kRGBA_half_GrPixelConfig == config) { - return GrFragmentProcessor::PremulOutput(std::move(fp)); - } else if (kRGBA_8888_GrPixelConfig == config || kBGRA_8888_GrPixelConfig == config) { + // We have specialized effects that guarantee round-trip conversion for these formats + if (kRGBA_8888_GrPixelConfig == config || kBGRA_8888_GrPixelConfig == config) { GrConfigConversionEffect::PMConversion upmToPM = static_cast<GrConfigConversionEffect::PMConversion>(fUPMToPMConversion); if (GrConfigConversionEffect::kPMConversionCnt != upmToPM) { return GrConfigConversionEffect::Make(std::move(fp), upmToPM); + } else { + return nullptr; } + } else { + // For everything else (sRGB, half-float, etc...), it doesn't make sense to try and + // explicitly round the results. Just do the obvious, naive thing in the shader. + return GrFragmentProcessor::PremulOutput(std::move(fp)); } - return nullptr; } bool GrContext::validPMUPMConversionExists(GrPixelConfig config) const { |