| 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 { | 
|  |