Make GrContext cache the gpu paths

Creating paths for nv_path_rendering is costly. Try to reduce this
cost by caching paths based on the SkPath "hash" (i.e. SkPathRef
generation id) and stroke properties.

Adds the paths to GrContext::fTextureCache instance. Later this should
be renamed and the GrContext API should reflect the nature of the cache
better.

R=bsalomon@google.com, mtklein@google.com

Author: kkinnunen@nvidia.com

Review URL: https://codereview.chromium.org/26557003

git-svn-id: http://skia.googlecode.com/svn/trunk@12083 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/GrPath.h b/src/gpu/GrPath.h
index 37dc959..f481ea4 100644
--- a/src/gpu/GrPath.h
+++ b/src/gpu/GrPath.h
@@ -9,6 +9,8 @@
 #define GrPath_DEFINED
 
 #include "GrResource.h"
+#include "GrResourceCache.h"
+#include "SkPath.h"
 #include "SkRect.h"
 #include "SkStrokeRec.h"
 
@@ -16,9 +18,17 @@
 public:
     SK_DECLARE_INST_COUNT(GrPath);
 
-    GrPath(GrGpu* gpu, bool isWrapped, const SkStrokeRec& stroke)
+    GrPath(GrGpu* gpu, bool isWrapped, const SkPath& skPath, const SkStrokeRec& stroke)
         : INHERITED(gpu, isWrapped),
-          fStroke(stroke) {
+          fSkPath(skPath),
+          fStroke(stroke),
+          fBounds(skPath.getBounds()) {
+    }
+
+    static GrResourceKey ComputeKey(const SkPath& path, const SkStrokeRec& stroke);
+
+    bool isEqualTo(const SkPath& path, const SkStrokeRec& stroke) {
+        return fSkPath == path && fStroke == stroke;
     }
 
     const SkRect& getBounds() const { return fBounds; }
@@ -26,8 +36,9 @@
     const SkStrokeRec& getStroke() const { return fStroke; }
 
 protected:
-    SkRect fBounds;
+    SkPath fSkPath;
     SkStrokeRec fStroke;
+    SkRect fBounds;
 
 private:
     typedef GrResource INHERITED;