Reland "Set multitexturing threshold for NVIDIA"

This is a reland of b4ec10431818200a41a082cfe2e82fe58a9b1ecc
Original change's description:
> Set multitexturing threshold for NVIDIA
> 
> Change-Id: Ie992b34b8fdd3bf569241cce7c851880258f05df
> Reviewed-on: https://skia-review.googlesource.com/78261
> Commit-Queue: Brian Salomon <bsalomon@google.com>
> Reviewed-by: Robert Phillips <robertphillips@google.com>

Change-Id: I13254698530e6f7b13f632a4a7b034ea6aef130f
Reviewed-on: https://skia-review.googlesource.com/79262
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp
index a2bb363..134692d 100644
--- a/src/gpu/gl/GrGLCaps.cpp
+++ b/src/gpu/gl/GrGLCaps.cpp
@@ -358,6 +358,17 @@
     GR_GL_GetIntegerv(gli, GR_GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxSamplers);
     shaderCaps->fMaxCombinedSamplers = SkTMin<GrGLint>(kMaxSaneSamplers, maxSamplers);
 
+    // This is all *very* approximate.
+    switch (ctxInfo.vendor()) {
+        case kNVIDIA_GrGLVendor:
+            // We've seen a range from 100 x 100 (TegraK1, GTX660) up to 300 x 300 (GTX 1070)
+            // but it doesn't clearly align with Pascal vs Maxwell vs Kepler.
+            fShaderCaps->fDisableImageMultitexturingDstRectAreaThreshold = 150 * 150;
+            break;
+        default:
+            break;
+    }
+
     // SGX and Mali GPUs that are based on a tiled-deferred architecture that have trouble with
     // frequently changing VBOs. We've measured a performance increase using non-VBO vertex
     // data for dynamic content on these GPUs. Perhaps we should read the renderer string and
diff --git a/src/gpu/ops/GrTextureOp.cpp b/src/gpu/ops/GrTextureOp.cpp
index be37bd3..f9600e5 100644
--- a/src/gpu/ops/GrTextureOp.cpp
+++ b/src/gpu/ops/GrTextureOp.cpp
@@ -488,6 +488,11 @@
                 fDraws[i].fTextureIdx = map[fDraws[i].fTextureIdx];
             }
         } else {
+            // We can get here when one of the ops is already multitextured but the other cannot
+            // be because of the dst rect size.
+            if (fProxyCnt > 1 || that->fProxyCnt > 1) {
+                return false;
+            }
             if (fProxy0->uniqueID() != that->fProxy0->uniqueID() || fFilter0 != that->fFilter0) {
                 return false;
             }
@@ -580,13 +585,13 @@
         GrTextureProxy* fProxy0;
         GrTextureProxy** fProxyArray;
     };
+    size_t fMaxApproxDstPixelArea;
     // The next four members should pack.
     GrSamplerState::Filter fFilter0;
     uint8_t fProxyCnt;
     // Used to track whether fProxy is ref'ed or has a pending IO after finalize() is called.
     uint8_t fFinalized;
     uint8_t fAllowSRGBInputs;
-    size_t fMaxApproxDstPixelArea;
 
     typedef GrMeshDrawOp INHERITED;
 };