Initial change to create GeometryProcessor

BUG=skia:
R=bsalomon@google.com, robertphillips@google.com, egdaniel@google.com, jvanverth@google.com

Author: joshualitt@chromium.org

Review URL: https://codereview.chromium.org/509153002
diff --git a/src/gpu/GrDrawState.h b/src/gpu/GrDrawState.h
index 00bec9f..a1b07de 100644
--- a/src/gpu/GrDrawState.h
+++ b/src/gpu/GrDrawState.h
@@ -165,6 +165,20 @@
 
     /// @}
 
+    /**
+     * The geometry processor is the sole element of the skia pipeline which can use the vertex,
+     * geometry, and tesselation shaders.  The GP may also compute a coverage in its fragment shader
+     * but is never put in the color processing pipeline.
+     */
+
+    const GrEffect* setGeometryProcessor(const GrEffect* effect, int attr0 = -1, int attr1 = -1) {
+        SkASSERT(NULL != effect);
+        SkASSERT(!this->hasGeometryProcessor());
+        fGeometryProcessor.reset(new GrEffectStage(effect, attr0, attr1));
+        this->invalidateBlendOptFlags();
+        return effect;
+    }
+
     ///////////////////////////////////////////////////////////////////////////
     /// @name Effect Stages
     /// Each stage hosts a GrEffect. The effect produces an output color or coverage in the fragment
@@ -242,6 +256,7 @@
 
     private:
         GrDrawState* fDrawState;
+        SkAutoTDelete<GrEffectStage> fGeometryProcessor;
         int fColorEffectCnt;
         int fCoverageEffectCnt;
     };
@@ -364,6 +379,7 @@
         GrDrawState*                                        fDrawState;
         SkMatrix                                            fViewMatrix;
         int                                                 fNumColorStages;
+        bool                                                fHasGeometryProcessor;
         SkAutoSTArray<8, GrEffectStage::SavedCoordChange>   fSavedCoordChanges;
     };