Skip temp texture when config conversion test has already failed.
authorbsalomon <bsalomon@google.com>
Wed, 29 Jul 2015 13:08:46 +0000 (06:08 -0700)
committerCommit bot <commit-bot@chromium.org>
Wed, 29 Jul 2015 13:08:46 +0000 (06:08 -0700)
Review URL: https://codereview.chromium.org/1261033005

include/gpu/GrContext.h
src/gpu/GrContext.cpp

index 65fac23..c4691e4 100644 (file)
@@ -445,6 +445,9 @@ private:
                                                    bool swapRAndB, const SkMatrix&);
     const GrFragmentProcessor* createUPMToPMEffect(GrProcessorDataManager*, GrTexture*,
                                                    bool swapRAndB, const SkMatrix&);
+    /** Returns true if we've already determined that createPMtoUPMEffect and createUPMToPMEffect
+        will fail. In such cases fall back to SW conversion. */
+    bool didFailPMUPMConversionTest() const;
 
     /**
      *  This callback allows the resource cache to callback into the GrContext
index 6b7f552..b7f8ac1 100755 (executable)
@@ -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 {