Make gradient effect creation fail if texture LUT creation fails

Bug: skia:6198
Change-Id: Ib8fb273564ca54ee9e6e045ac67e191af705a37a
Reviewed-on: https://skia-review.googlesource.com/19260
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/src/shaders/gradients/SkGradientShader.cpp b/src/shaders/gradients/SkGradientShader.cpp
index 2d21785..07860e4 100644
--- a/src/shaders/gradients/SkGradientShader.cpp
+++ b/src/shaders/gradients/SkGradientShader.cpp
@@ -1862,6 +1862,7 @@
                                                                 args.fContext->resourceProvider(),
                                                                 bitmap);
                 if (!proxy) {
+                    SkDebugf("Gradient won't draw. Could not create texture.");
                     return;
                 }
                 // This is 2/2 places where auto-normalization is disabled
diff --git a/src/shaders/gradients/SkGradientShaderPriv.h b/src/shaders/gradients/SkGradientShaderPriv.h
index c7c7761..5e55316 100644
--- a/src/shaders/gradients/SkGradientShaderPriv.h
+++ b/src/shaders/gradients/SkGradientShaderPriv.h
@@ -441,6 +441,9 @@
 
     const GrCoordTransform& getCoordTransform() const { return fCoordTransform; }
 
+    /** Checks whether the constructor failed to fully initialize the processor. */
+    bool isValid() const { return fColorType != kTexture_ColorType || fTextureSampler.proxy(); }
+
 private:
     static OptimizationFlags OptFlags(bool isOpaque);
 
diff --git a/src/shaders/gradients/SkLinearGradient.cpp b/src/shaders/gradients/SkLinearGradient.cpp
index f803d5e..02969bd 100644
--- a/src/shaders/gradients/SkLinearGradient.cpp
+++ b/src/shaders/gradients/SkLinearGradient.cpp
@@ -376,7 +376,8 @@
     class GLSLLinearProcessor;
 
     static sk_sp<GrFragmentProcessor> Make(const CreateArgs& args) {
-        return sk_sp<GrFragmentProcessor>(new GrLinearGradient(args));
+        auto processor = sk_sp<GrLinearGradient>(new GrLinearGradient(args));
+        return processor->isValid() ? std::move(processor) : nullptr;
     }
 
     ~GrLinearGradient() override {}
@@ -489,6 +490,9 @@
     sk_sp<GrFragmentProcessor> inner(GrLinearGradient::Make(
         GrGradientEffect::CreateArgs(args.fContext, this, &matrix, fTileMode,
                                      std::move(colorSpaceXform), SkToBool(args.fDstColorSpace))));
+    if (!inner) {
+        return nullptr;
+    }
     return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner));
 }
 
diff --git a/src/shaders/gradients/SkRadialGradient.cpp b/src/shaders/gradients/SkRadialGradient.cpp
index d49b3dd..8e12c88 100644
--- a/src/shaders/gradients/SkRadialGradient.cpp
+++ b/src/shaders/gradients/SkRadialGradient.cpp
@@ -247,7 +247,8 @@
     class GLSLRadialProcessor;
 
     static sk_sp<GrFragmentProcessor> Make(const CreateArgs& args) {
-        return sk_sp<GrFragmentProcessor>(new GrRadialGradient(args));
+        auto processor = sk_sp<GrRadialGradient>(new GrRadialGradient(args));
+        return processor->isValid() ? std::move(processor) : nullptr;
     }
 
     ~GrRadialGradient() override {}
@@ -363,6 +364,9 @@
     sk_sp<GrFragmentProcessor> inner(GrRadialGradient::Make(
         GrGradientEffect::CreateArgs(args.fContext, this, &matrix, fTileMode,
                                      std::move(colorSpaceXform), SkToBool(args.fDstColorSpace))));
+    if (!inner) {
+        return nullptr;
+    }
     return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner));
 }
 
diff --git a/src/shaders/gradients/SkSweepGradient.cpp b/src/shaders/gradients/SkSweepGradient.cpp
index 1e583c2..58e34fd 100644
--- a/src/shaders/gradients/SkSweepGradient.cpp
+++ b/src/shaders/gradients/SkSweepGradient.cpp
@@ -144,8 +144,10 @@
     class GLSLSweepProcessor;
 
     static sk_sp<GrFragmentProcessor> Make(const CreateArgs& args) {
-        return sk_sp<GrFragmentProcessor>(new GrSweepGradient(args));
+        auto processor = sk_sp<GrSweepGradient>(new GrSweepGradient(args));
+        return processor->isValid() ? std::move(processor) : nullptr;
     }
+
     ~GrSweepGradient() override {}
 
     const char* name() const override { return "Sweep Gradient"; }
@@ -267,6 +269,9 @@
     sk_sp<GrFragmentProcessor> inner(GrSweepGradient::Make(
         GrGradientEffect::CreateArgs(args.fContext, this, &matrix, SkShader::kClamp_TileMode,
                                      std::move(colorSpaceXform), SkToBool(args.fDstColorSpace))));
+    if (!inner) {
+        return nullptr;
+    }
     return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner));
 }
 
diff --git a/src/shaders/gradients/SkTwoPointConicalGradient.cpp b/src/shaders/gradients/SkTwoPointConicalGradient.cpp
index 4549527..399bce6 100644
--- a/src/shaders/gradients/SkTwoPointConicalGradient.cpp
+++ b/src/shaders/gradients/SkTwoPointConicalGradient.cpp
@@ -362,6 +362,9 @@
     sk_sp<GrFragmentProcessor> inner(Gr2PtConicalGradientEffect::Make(
         GrGradientEffect::CreateArgs(args.fContext, this, args.fLocalMatrix, fTileMode,
                                      std::move(colorSpaceXform), SkToBool(args.fDstColorSpace))));
+    if (!inner) {
+        return nullptr;
+    }
     return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner));
 }
 
diff --git a/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp b/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp
index 8402199..1e3404c 100644
--- a/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp
+++ b/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp
@@ -62,7 +62,8 @@
     class GLSLEdge2PtConicalProcessor;
 
     static sk_sp<GrFragmentProcessor> Make(const CreateArgs& args) {
-        return sk_sp<GrFragmentProcessor>(new Edge2PtConicalEffect(args));
+        auto processor = sk_sp<Edge2PtConicalEffect>(new Edge2PtConicalEffect(args));
+        return processor->isValid() ? std::move(processor) : nullptr;
     }
 
     ~Edge2PtConicalEffect() override {}
@@ -370,8 +371,9 @@
     class GLSLFocalOutside2PtConicalProcessor;
 
     static sk_sp<GrFragmentProcessor> Make(const CreateArgs& args, SkScalar focalX) {
-        return sk_sp<GrFragmentProcessor>(
-            new FocalOutside2PtConicalEffect(args, focalX));
+        auto processor =
+                sk_sp<FocalOutside2PtConicalEffect>(new FocalOutside2PtConicalEffect(args, focalX));
+        return processor->isValid() ? std::move(processor) : nullptr;
     }
 
     ~FocalOutside2PtConicalEffect() override {}
@@ -583,8 +585,9 @@
     class GLSLFocalInside2PtConicalProcessor;
 
     static sk_sp<GrFragmentProcessor> Make(const CreateArgs& args, SkScalar focalX) {
-        return sk_sp<GrFragmentProcessor>(
-            new FocalInside2PtConicalEffect(args, focalX));
+        auto processor =
+                sk_sp<FocalInside2PtConicalEffect>(new FocalInside2PtConicalEffect(args, focalX));
+        return processor->isValid() ? std::move(processor) : nullptr;
     }
 
     ~FocalInside2PtConicalEffect() override {}
@@ -821,8 +824,9 @@
     class GLSLCircleInside2PtConicalProcessor;
 
     static sk_sp<GrFragmentProcessor> Make(const CreateArgs& args, const CircleConicalInfo& info) {
-        return sk_sp<GrFragmentProcessor>(
-            new CircleInside2PtConicalEffect(args, info));
+        auto processor =
+                sk_sp<CircleInside2PtConicalEffect>(new CircleInside2PtConicalEffect(args, info));
+        return processor->isValid() ? std::move(processor) : nullptr;
     }
 
     ~CircleInside2PtConicalEffect() override {}