Merge latest Skia into master (6 commits)

https://skia.googlesource.com/skia.git/+log/52b346e..f87e2b9

Test: Presubmit checks will test this change.
Change-Id: Ife60f84b4d8a50c2e003209cc081dae1b42e4db6
diff --git a/include/core/SkMilestone.h b/include/core/SkMilestone.h
index 221f071..d91b076 100644
--- a/include/core/SkMilestone.h
+++ b/include/core/SkMilestone.h
@@ -5,5 +5,5 @@
  * found in the LICENSE file.
  */
 #ifndef SK_MILESTONE
-#define SK_MILESTONE 57
+#define SK_MILESTONE 58
 #endif
diff --git a/src/core/SkPM4fPriv.h b/src/core/SkPM4fPriv.h
index dd0e550..a6232be 100644
--- a/src/core/SkPM4fPriv.h
+++ b/src/core/SkPM4fPriv.h
@@ -132,8 +132,7 @@
 
 static inline bool append_gamut_transform(SkRasterPipeline* p, SkArenaAlloc* scratch,
                                           SkColorSpace* src, SkColorSpace* dst) {
-    struct matrix_3x4 { float arr[12]; };
-    return append_gamut_transform(p, scratch->make<matrix_3x4>()->arr, src, dst);
+    return append_gamut_transform(p, scratch->makeArrayDefault<float>(12), src, dst);
 }
 
 static inline SkColor4f SkColor4f_from_SkColor(SkColor color, SkColorSpace* dst) {
diff --git a/src/gpu/GrPipeline.cpp b/src/gpu/GrPipeline.cpp
index 96051ea..af8529a 100644
--- a/src/gpu/GrPipeline.cpp
+++ b/src/gpu/GrPipeline.cpp
@@ -21,8 +21,6 @@
 
 GrPipeline* GrPipeline::CreateAt(void* memory, const CreateArgs& args,
                                  GrPipelineOptimizations* optimizations) {
-    const GrPipelineBuilder& builder = *args.fPipelineBuilder;
-    const GrUserStencilSettings* userStencil = builder.getUserStencil();
     GrRenderTarget* rt = args.fRenderTargetContext->accessRenderTarget();
     if (!rt) {
         return nullptr;
@@ -33,36 +31,32 @@
     SkASSERT(pipeline->fRenderTarget);
     pipeline->fScissorState = args.fAppliedClip->scissorState();
     pipeline->fWindowRectsState = args.fAppliedClip->windowRectsState();
-    pipeline->fUserStencilSettings = userStencil;
-    pipeline->fDrawFace = builder.getDrawFace();
+    pipeline->fUserStencilSettings = args.fUserStencil;
+    pipeline->fDrawFace = static_cast<int16_t>(args.fDrawFace);
 
-    pipeline->fFlags = 0;
-    if (builder.isHWAntialias()) {
-        pipeline->fFlags |= kHWAA_Flag;
-    }
-    if (builder.snapVerticesToPixelCenters()) {
-        pipeline->fFlags |= kSnapVertices_Flag;
-    }
-    if (builder.getDisableOutputConversionToSRGB()) {
-        pipeline->fFlags |= kDisableOutputConversionToSRGB_Flag;
-    }
-    if (builder.getAllowSRGBInputs()) {
-        pipeline->fFlags |= kAllowSRGBInputs_Flag;
-    }
-    if (builder.getUsesDistanceVectorField()) {
+    pipeline->fFlags = args.fFlags;
+    if (args.fProcessors->usesDistanceVectorField()) {
         pipeline->fFlags |= kUsesDistanceVectorField_Flag;
     }
     if (args.fAppliedClip->hasStencilClip()) {
         pipeline->fFlags |= kHasStencilClip_Flag;
     }
-    if (!userStencil->isDisabled(args.fAppliedClip->hasStencilClip())) {
+    if (!args.fUserStencil->isDisabled(args.fAppliedClip->hasStencilClip())) {
         pipeline->fFlags |= kStencilEnabled_Flag;
     }
+    if (args.fProcessors->disableOutputConversionToSRGB()) {
+        pipeline->fFlags |= kDisableOutputConversionToSRGB_Flag;
+    }
+    if (args.fProcessors->allowSRGBInputs()) {
+        pipeline->fFlags |= kAllowSRGBInputs_Flag;
+    }
+
+    bool isHWAA = kHWAntialias_Flag & args.fFlags;
 
     // Create XferProcessor from DS's XPFactory
     bool hasMixedSamples = args.fRenderTargetContext->hasMixedSamples() &&
-                           (builder.isHWAntialias() || pipeline->isStencilEnabled());
-    const GrXPFactory* xpFactory = builder.getXPFactory();
+                           (isHWAA || pipeline->isStencilEnabled());
+    const GrXPFactory* xpFactory = args.fProcessors->xpFactory();
     sk_sp<GrXferProcessor> xferProcessor;
     if (xpFactory) {
         xferProcessor.reset(xpFactory->createXferProcessor(
@@ -86,7 +80,7 @@
     const GrXferProcessor* xpForOpts = xferProcessor ? xferProcessor.get() :
                                                        &GrPorterDuffXPFactory::SimpleSrcOverXP();
     optFlags = xpForOpts->getOptimizations(
-            args.fAnalysis, userStencil->doesWrite(args.fAppliedClip->hasStencilClip()),
+            args.fAnalysis, args.fUserStencil->doesWrite(args.fAppliedClip->hasStencilClip()),
             &overrideColor, *args.fCaps);
 
     // When path rendering the stencil settings are not always set on the GrPipelineBuilder
@@ -113,30 +107,32 @@
 
     if ((optFlags & GrXferProcessor::kIgnoreColor_OptFlag) ||
         (optFlags & GrXferProcessor::kOverrideColor_OptFlag)) {
-        firstColorProcessorIdx = builder.numColorFragmentProcessors();
+        firstColorProcessorIdx = args.fProcessors->numColorFragmentProcessors();
     }
 
     bool usesLocalCoords = false;
 
     // Copy GrFragmentProcessors from GrPipelineBuilder to Pipeline
-    pipeline->fNumColorProcessors = builder.numColorFragmentProcessors() - firstColorProcessorIdx;
+    pipeline->fNumColorProcessors =
+            args.fProcessors->numColorFragmentProcessors() - firstColorProcessorIdx;
     int numTotalProcessors = pipeline->fNumColorProcessors +
-                             builder.numCoverageFragmentProcessors() - firstCoverageProcessorIdx;
+                             args.fProcessors->numCoverageFragmentProcessors() -
+                             firstCoverageProcessorIdx;
     if (args.fAppliedClip->clipCoverageFragmentProcessor()) {
         ++numTotalProcessors;
     }
     pipeline->fFragmentProcessors.reset(numTotalProcessors);
     int currFPIdx = 0;
-    for (int i = firstColorProcessorIdx; i < builder.numColorFragmentProcessors();
+    for (int i = firstColorProcessorIdx; i < args.fProcessors->numColorFragmentProcessors();
          ++i, ++currFPIdx) {
-        const GrFragmentProcessor* fp = builder.getColorFragmentProcessor(i);
+        const GrFragmentProcessor* fp = args.fProcessors->colorFragmentProcessor(i);
         pipeline->fFragmentProcessors[currFPIdx].reset(fp);
         usesLocalCoords = usesLocalCoords || fp->usesLocalCoords();
     }
 
-    for (int i = firstCoverageProcessorIdx; i < builder.numCoverageFragmentProcessors();
+    for (int i = firstCoverageProcessorIdx; i < args.fProcessors->numCoverageFragmentProcessors();
          ++i, ++currFPIdx) {
-        const GrFragmentProcessor* fp = builder.getCoverageFragmentProcessor(i);
+        const GrFragmentProcessor* fp = args.fProcessors->coverageFragmentProcessor(i);
         pipeline->fFragmentProcessors[currFPIdx].reset(fp);
         usesLocalCoords = usesLocalCoords || fp->usesLocalCoords();
     }
diff --git a/src/gpu/GrPipeline.h b/src/gpu/GrPipeline.h
index f00fbf3..3949a75 100644
--- a/src/gpu/GrPipeline.h
+++ b/src/gpu/GrPipeline.h
@@ -60,6 +60,8 @@
     bool fUsesPLSDstRead = false;
 };
 
+class GrProcessorSet;
+
 /**
  * Class that holds an optimized version of a GrPipelineBuilder. It is meant to be an immutable
  * class, and contains all data needed to set the state for a gpu draw.
@@ -69,11 +71,28 @@
     ///////////////////////////////////////////////////////////////////////////
     /// @name Creation
 
+    enum Flags {
+        /**
+         * Perform HW anti-aliasing. This means either HW FSAA, if supported by the render target,
+         * or smooth-line rendering if a line primitive is drawn and line smoothing is supported by
+         * the 3D API.
+         */
+        kHWAntialias_Flag = 0x1,
+
+        /**
+         * Modifies the vertex shader so that vertices will be positioned at pixel centers.
+         */
+        kSnapVerticesToPixelCenters_Flag = 0x2,
+    };
+
     struct CreateArgs {
-        const GrPipelineBuilder* fPipelineBuilder;
-        GrAppliedClip* fAppliedClip;
-        GrRenderTargetContext* fRenderTargetContext;
-        const GrCaps* fCaps;
+        uint32_t fFlags = 0;
+        GrDrawFace fDrawFace = GrDrawFace::kBoth;
+        const GrProcessorSet* fProcessors = nullptr;
+        const GrUserStencilSettings* fUserStencil = &GrUserStencilSettings::kUnused;
+        GrAppliedClip* fAppliedClip = nullptr;
+        GrRenderTargetContext* fRenderTargetContext = nullptr;
+        const GrCaps* fCaps = nullptr;
         GrPipelineAnalysis fAnalysis;
         GrXferProcessor::DstTexture fDstTexture;
     };
@@ -168,8 +187,10 @@
 
     const GrWindowRectsState& getWindowRectsState() const { return fWindowRectsState; }
 
-    bool isHWAntialiasState() const { return SkToBool(fFlags & kHWAA_Flag); }
-    bool snapVerticesToPixelCenters() const { return SkToBool(fFlags & kSnapVertices_Flag); }
+    bool isHWAntialiasState() const { return SkToBool(fFlags & kHWAntialias_Flag); }
+    bool snapVerticesToPixelCenters() const {
+        return SkToBool(fFlags & kSnapVerticesToPixelCenters_Flag);
+    }
     bool getDisableOutputConversionToSRGB() const {
         return SkToBool(fFlags & kDisableOutputConversionToSRGB_Flag);
     }
@@ -195,28 +216,18 @@
      * or both faces.
      * @return the current draw face(s).
      */
-    GrDrawFace getDrawFace() const { return fDrawFace; }
-
+    GrDrawFace getDrawFace() const { return static_cast<GrDrawFace>(fDrawFace); }
 
 private:
     GrPipeline() { /** Initialized in factory function*/ }
 
-    /**
-     * Calculates the primary and secondary output types of the shader. For certain output types
-     * the function may adjust the blend coefficients. After this function is called the src and dst
-     * blend coeffs will represent those used by backend API.
-     */
-    void setOutputStateInfo(const GrPipelineBuilder& ds, GrXferProcessor::OptFlags,
-                            const GrCaps&);
-
-    enum Flags {
-        kHWAA_Flag                          = 0x1,
-        kSnapVertices_Flag                  = 0x2,
+    /** This is a continuation of the public "Flags" enum. */
+    enum PrivateFlags {
         kDisableOutputConversionToSRGB_Flag = 0x4,
-        kAllowSRGBInputs_Flag               = 0x8,
-        kUsesDistanceVectorField_Flag       = 0x10,
-        kHasStencilClip_Flag                = 0x20,
-        kStencilEnabled_Flag                = 0x40,
+        kAllowSRGBInputs_Flag = 0x8,
+        kUsesDistanceVectorField_Flag = 0x10,
+        kHasStencilClip_Flag = 0x20,
+        kStencilEnabled_Flag = 0x40,
     };
 
     typedef GrPendingIOResource<GrRenderTarget, kWrite_GrIOType> RenderTarget;
@@ -227,8 +238,8 @@
     GrScissorState                      fScissorState;
     GrWindowRectsState                  fWindowRectsState;
     const GrUserStencilSettings*        fUserStencilSettings;
-    GrDrawFace                          fDrawFace;
-    uint32_t                            fFlags;
+    uint16_t                            fDrawFace;
+    uint16_t                            fFlags;
     ProgramXferProcessor                fXferProcessor;
     FragmentProcessorArray              fFragmentProcessors;
 
diff --git a/src/gpu/GrPipelineBuilder.cpp b/src/gpu/GrPipelineBuilder.cpp
index ce38718..d249d58 100644
--- a/src/gpu/GrPipelineBuilder.cpp
+++ b/src/gpu/GrPipelineBuilder.cpp
@@ -17,23 +17,18 @@
 
 GrPipelineBuilder::GrPipelineBuilder(GrPaint&& paint, GrAAType aaType)
         : fFlags(0x0)
-        , fUserStencilSettings(&GrUserStencilSettings::kUnused)
         , fDrawFace(GrDrawFace::kBoth)
+        , fUserStencilSettings(&GrUserStencilSettings::kUnused)
         , fProcessors(std::move(paint)) {
-    this->setState(GrPipelineBuilder::kHWAntialias_Flag, GrAATypeIsHW(aaType));
-    // The processors have been moved out of paint, but its flags should still be unmodified.
-    this->setState(GrPipelineBuilder::kDisableOutputConversionToSRGB_Flag,
-                   paint.getDisableOutputConversionToSRGB());
-    this->setState(GrPipelineBuilder::kAllowSRGBInputs_Flag,
-                   paint.getAllowSRGBInputs());
-    this->setState(GrPipelineBuilder::kUsesDistanceVectorField_Flag,
-                   paint.usesDistanceVectorField());
+    if (GrAATypeIsHW(aaType)) {
+        fFlags |= GrPipeline::kHWAntialias_Flag;
+    }
 }
 
 bool GrPipelineBuilder::willXPNeedDstTexture(const GrCaps& caps,
                                              const GrPipelineAnalysis& analysis) const {
-    if (this->getXPFactory()) {
-        return this->getXPFactory()->willNeedDstTexture(caps, analysis);
+    if (fProcessors.xpFactory()) {
+        return fProcessors.xpFactory()->willNeedDstTexture(caps, analysis);
     }
     return GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(caps, analysis);
 }
diff --git a/src/gpu/GrPipelineBuilder.h b/src/gpu/GrPipelineBuilder.h
index e0c4d3d..aca1925 100644
--- a/src/gpu/GrPipelineBuilder.h
+++ b/src/gpu/GrPipelineBuilder.h
@@ -9,6 +9,7 @@
 #define GrPipelineBuilder_DEFINED
 
 #include "GrGpuResourceRef.h"
+#include "GrPipeline.h"
 #include "GrProcessorSet.h"
 #include "GrRenderTarget.h"
 #include "GrUserStencilSettings.h"
@@ -63,8 +64,6 @@
     /// @name Blending
     ////
 
-    const GrXPFactory* getXPFactory() const { return fProcessors.xpFactory(); }
-
     /**
      * Checks whether the xp will need destination in a texture to correctly blend.
      */
@@ -78,7 +77,6 @@
     ////
 
     bool hasUserStencilSettings() const { return !fUserStencilSettings->isUnused(); }
-    const GrUserStencilSettings* getUserStencil() const { return fUserStencilSettings; }
 
     /**
      * Sets the user stencil settings for the next draw.
@@ -88,7 +86,6 @@
      * @param settings  the stencil settings to use.
      */
     void setUserStencil(const GrUserStencilSettings* settings) { fUserStencilSettings = settings; }
-    void disableUserStencil() { fUserStencilSettings = &GrUserStencilSettings::kUnused; }
 
     /// @}
 
@@ -96,77 +93,13 @@
     /// @name State Flags
     ////
 
-    /**
-     *  Flags that affect rendering. Controlled using enable/disableState(). All
-     *  default to disabled.
-     */
-    enum Flags {
-        /**
-         * Perform HW anti-aliasing. This means either HW FSAA, if supported by the render target,
-         * or smooth-line rendering if a line primitive is drawn and line smoothing is supported by
-         * the 3D API.
-         */
-        kHWAntialias_Flag   = 0x01,
+    bool isHWAntialias() const { return SkToBool(fFlags & GrPipeline::kHWAntialias_Flag); }
 
-        /**
-         * Modifies the vertex shader so that vertices will be positioned at pixel centers.
-         */
-        kSnapVerticesToPixelCenters_Flag = 0x02,
-
-        /**
-         * Suppress linear -> sRGB conversion when rendering to sRGB render targets.
-         */
-        kDisableOutputConversionToSRGB_Flag = 0x04,
-
-        /**
-         * Allow sRGB -> linear conversion when reading from sRGB inputs.
-         */
-        kAllowSRGBInputs_Flag = 0x08,
-
-        /**
-         * Signals that one or more FPs need access to the distance vector field to the nearest
-         * edge
-         */
-        kUsesDistanceVectorField_Flag = 0x10,
-
-        kLast_Flag = kUsesDistanceVectorField_Flag,
-    };
-
-    bool isHWAntialias() const { return SkToBool(fFlags & kHWAntialias_Flag); }
-    bool snapVerticesToPixelCenters() const {
-        return SkToBool(fFlags & kSnapVerticesToPixelCenters_Flag); }
-    bool getDisableOutputConversionToSRGB() const {
-        return SkToBool(fFlags & kDisableOutputConversionToSRGB_Flag); }
-    bool getAllowSRGBInputs() const {
-        return SkToBool(fFlags & kAllowSRGBInputs_Flag); }
-    bool getUsesDistanceVectorField() const {
-        return SkToBool(fFlags & kUsesDistanceVectorField_Flag); }
-
-    /**
-     * Enable render state settings.
-     *
-     * @param flags bitfield of Flags specifying the states to enable
-     */
-    void enableState(uint32_t flags) { fFlags |= flags; }
-
-    /**
-     * Disable render state settings.
-     *
-     * @param flags bitfield of Flags specifying the states to disable
-     */
-    void disableState(uint32_t flags) { fFlags &= ~(flags); }
-
-    /**
-     * Enable or disable flags based on a boolean.
-     *
-     * @param flags bitfield of Flags to enable or disable
-     * @param enable    if true enable stateBits, otherwise disable
-     */
-    void setState(uint32_t flags, bool enable) {
+    void setSnapVerticesToPixelCenters(bool enable) {
         if (enable) {
-            this->enableState(flags);
+            fFlags |= GrPipeline::kSnapVerticesToPixelCenters_Flag;
         } else {
-            this->disableState(flags);
+            fFlags &= ~GrPipeline::kSnapVerticesToPixelCenters_Flag;
         }
     }
 
@@ -177,13 +110,6 @@
     ////
 
     /**
-     * Gets whether the target is drawing clockwise, counterclockwise,
-     * or both faces.
-     * @return the current draw face(s).
-     */
-    GrDrawFace getDrawFace() const { return fDrawFace; }
-
-    /**
      * Controls whether clockwise, counterclockwise, or both faces are drawn.
      * @param face  the face(s) to draw.
      */
@@ -194,14 +120,17 @@
 
     /// @}
 
-    ///////////////////////////////////////////////////////////////////////////
-
-    bool usePLSDstRead(const GrDrawOp*) const;
+    void initPipelineCreateArgs(GrPipeline::CreateArgs* args) const {
+        args->fFlags = fFlags;
+        args->fUserStencil = fUserStencilSettings;
+        args->fDrawFace = fDrawFace;
+        args->fProcessors = &fProcessors;
+    }
 
 private:
     uint32_t fFlags;
-    const GrUserStencilSettings* fUserStencilSettings;
     GrDrawFace fDrawFace;
+    const GrUserStencilSettings* fUserStencilSettings;
     GrProcessorSet fProcessors;
 };
 
diff --git a/src/gpu/GrProcessorSet.cpp b/src/gpu/GrProcessorSet.cpp
index 0d72d9b..595d05c 100644
--- a/src/gpu/GrProcessorSet.cpp
+++ b/src/gpu/GrProcessorSet.cpp
@@ -18,4 +18,14 @@
     for (auto& fp : paint.fCoverageFragmentProcessors) {
         fFragmentProcessors[i++] = fp.release();
     }
+    fFlags = 0;
+    if (paint.usesDistanceVectorField()) {
+        fFlags |= kUseDistanceVectorField_Flag;
+    }
+    if (paint.getDisableOutputConversionToSRGB()) {
+        fFlags |= kDisableOutputConversionToSRGB_Flag;
+    }
+    if (paint.getAllowSRGBInputs()) {
+        fFlags |= kAllowSRGBInputs_Flag;
+    }
 }
diff --git a/src/gpu/GrProcessorSet.h b/src/gpu/GrProcessorSet.h
index de9c0a6..19c3b22 100644
--- a/src/gpu/GrProcessorSet.h
+++ b/src/gpu/GrProcessorSet.h
@@ -50,10 +50,22 @@
         analysis->fCoveragePOI.analyzeProcessors(fps, this->numCoverageFragmentProcessors());
     }
 
+    bool usesDistanceVectorField() const { return SkToBool(fFlags & kUseDistanceVectorField_Flag); }
+    bool disableOutputConversionToSRGB() const {
+        return SkToBool(fFlags & kDisableOutputConversionToSRGB_Flag);
+    }
+    bool allowSRGBInputs() const { return SkToBool(fFlags & kAllowSRGBInputs_Flag); }
+
 private:
     const GrXPFactory* fXPFactory = nullptr;
     SkAutoSTArray<4, const GrFragmentProcessor*> fFragmentProcessors;
     int fColorFragmentProcessorCnt;
+    enum Flags : uint32_t {
+        kUseDistanceVectorField_Flag = 0x1,
+        kDisableOutputConversionToSRGB_Flag = 0x2,
+        kAllowSRGBInputs_Flag = 0x4
+    };
+    uint32_t fFlags;
 };
 
 #endif
diff --git a/src/gpu/GrRenderTargetContext.cpp b/src/gpu/GrRenderTargetContext.cpp
index 39d5597..0dd7d97 100644
--- a/src/gpu/GrRenderTargetContext.cpp
+++ b/src/gpu/GrRenderTargetContext.cpp
@@ -660,12 +660,7 @@
 
         if (op) {
             GrPipelineBuilder pipelineBuilder(std::move(paint), aaType);
-
-            if (snapToPixelCenters) {
-                pipelineBuilder.setState(GrPipelineBuilder::kSnapVerticesToPixelCenters_Flag,
-                                         snapToPixelCenters);
-            }
-
+            pipelineBuilder.setSnapVerticesToPixelCenters(snapToPixelCenters);
             this->getOpList()->addDrawOp(pipelineBuilder, this, clip, std::move(op));
             return;
         }
diff --git a/src/gpu/GrRenderTargetOpList.cpp b/src/gpu/GrRenderTargetOpList.cpp
index 144b399..1c0243b 100644
--- a/src/gpu/GrRenderTargetOpList.cpp
+++ b/src/gpu/GrRenderTargetOpList.cpp
@@ -287,7 +287,7 @@
     }
 
     GrPipeline::CreateArgs args;
-    args.fPipelineBuilder = &pipelineBuilder;
+    pipelineBuilder.initPipelineCreateArgs(&args);
     args.fAppliedClip = &appliedClip;
     args.fRenderTargetContext = renderTargetContext;
     args.fCaps = this->caps();
diff --git a/tests/GpuSampleLocationsTest.cpp b/tests/GpuSampleLocationsTest.cpp
index b4c4fe5..a690400 100644
--- a/tests/GpuSampleLocationsTest.cpp
+++ b/tests/GpuSampleLocationsTest.cpp
@@ -99,7 +99,7 @@
 
     GrAppliedClip dummyAppliedClip(SkRect::MakeLargest());
     GrPipeline::CreateArgs args;
-    args.fPipelineBuilder = &dummyBuilder;
+    dummyBuilder.initPipelineCreateArgs(&args);
     args.fRenderTargetContext = dc;
     args.fCaps = dc->caps();
     args.fAppliedClip = &dummyAppliedClip;
diff --git a/tools/gpu/GrTest.cpp b/tools/gpu/GrTest.cpp
index b1c179b..0760a4f 100644
--- a/tools/gpu/GrTest.cpp
+++ b/tools/gpu/GrTest.cpp
@@ -257,9 +257,7 @@
     if (uss) {
         pipelineBuilder.setUserStencil(uss);
     }
-    if (snapToCenters) {
-        pipelineBuilder.setState(GrPipelineBuilder::kSnapVerticesToPixelCenters_Flag, true);
-    }
+    pipelineBuilder.setSnapVerticesToPixelCenters(snapToCenters);
 
     fRenderTargetContext->getOpList()->addDrawOp(pipelineBuilder, fRenderTargetContext, GrNoClip(),
                                                  std::move(op));