Index: src/gpu/GrContext.cpp |
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp |
index 6b7f5528954e5161c6f89640f6608f55240ca4c0..b7f8ac19c2946ae3bed947856a82d38bbcc41a5d 100755 |
--- a/src/gpu/GrContext.cpp |
+++ b/src/gpu/GrContext.cpp |
@@ -345,9 +345,14 @@ bool GrContext::writeSurfacePixels(GrSurface* surface, |
} |
applyPremulToSrc = true; |
} |
- GrGpu::DrawPreference drawPreference = applyPremulToSrc ? |
- GrGpu::kCallerPrefersDraw_DrawPreference : |
- GrGpu::kNoDraw_DrawPreference; |
+ |
+ GrGpu::DrawPreference drawPreference = GrGpu::kNoDraw_DrawPreference; |
+ // Don't prefer to draw for the conversion (and thereby access a texture from the cache) when |
+ // we've already determined that there isn't a roundtrip preserving conversion processor pair. |
+ if (applyPremulToSrc && !this->didFailPMUPMConversionTest()) { |
+ drawPreference = GrGpu::kCallerPrefersDraw_DrawPreference; |
+ } |
+ |
GrGpu::WritePixelTempDrawInfo tempDrawInfo; |
if (!fGpu->getWritePixelsInfo(surface, width, height, rowBytes, srcConfig, &drawPreference, |
&tempDrawInfo)) { |
@@ -476,8 +481,13 @@ bool GrContext::readSurfacePixels(GrSurface* src, |
return false; |
} |
- GrGpu::DrawPreference drawPreference = unpremul ? GrGpu::kCallerPrefersDraw_DrawPreference : |
- GrGpu::kNoDraw_DrawPreference; |
+ GrGpu::DrawPreference drawPreference = GrGpu::kNoDraw_DrawPreference; |
+ // Don't prefer to draw for the conversion (and thereby access a texture from the cache) when |
+ // we've already determined that there isn't a roundtrip preserving conversion processor pair. |
+ if (unpremul && !this->didFailPMUPMConversionTest()) { |
+ drawPreference = GrGpu::kCallerPrefersDraw_DrawPreference; |
+ } |
+ |
GrGpu::ReadPixelTempDrawInfo tempDrawInfo; |
if (!fGpu->getReadPixelsInfo(src, width, height, rowBytes, dstConfig, &drawPreference, |
&tempDrawInfo)) { |
@@ -719,6 +729,12 @@ const GrFragmentProcessor* GrContext::createUPMToPMEffect(GrProcessorDataManager |
} |
} |
+bool GrContext::didFailPMUPMConversionTest() const { |
+ // The PM<->UPM tests fail or succeed together so we only need to check one. |
+ return fDidTestPMConversions && |
+ GrConfigConversionEffect::kNone_PMConversion == fPMToUPMConversion; |
+} |
+ |
////////////////////////////////////////////////////////////////////////////// |
void GrContext::getResourceCacheLimits(int* maxTextures, size_t* maxTextureBytes) const { |