added drawVertices path to GameBench

https://codereview.chromium.org/21168006/



git-svn-id: http://skia.googlecode.com/svn/trunk@10459 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/bench/GameBench.cpp b/bench/GameBench.cpp
index 2e11136..bfb2337 100644
--- a/bench/GameBench.cpp
+++ b/bench/GameBench.cpp
@@ -9,6 +9,7 @@
 #include "SkCanvas.h"
 #include "SkPaint.h"
 #include "SkRandom.h"
+#include "SkShader.h"
 #include "SkString.h"
 
 // This bench simulates the calls Skia sees from various HTML5 canvas
@@ -27,12 +28,14 @@
     };
 
     GameBench(void* param, Type type, Clear clear,
-               bool aligned = false, bool useAtlas = false)
+              bool aligned = false, bool useAtlas = false,
+              bool useDrawVertices = false)
         : INHERITED(param)
         , fType(type)
         , fClear(clear)
         , fAligned(aligned)
         , fUseAtlas(useAtlas)
+        , fUseDrawVertices(useDrawVertices)
         , fName("game")
         , fNumSaved(0)
         , fInitialized(false) {
@@ -63,6 +66,10 @@
             fName.append("_atlas");
         }
 
+        if (useDrawVertices) {
+            fName.append("_drawVerts");
+        }
+
         // It's HTML 5 canvas, so always AA
         fName.append("_aa");
     }
@@ -81,9 +88,9 @@
     }
 
     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
-        static SkMWCRandom scaleRand;
-        static SkMWCRandom transRand;
-        static SkMWCRandom rotRand;
+        SkMWCRandom scaleRand;
+        SkMWCRandom transRand;
+        SkMWCRandom rotRand;
 
         int width, height;
         if (fUseAtlas) {
@@ -116,14 +123,27 @@
         }
 
         SkMatrix mat;
-        SkIRect src = { 0, 0, width, height };
         SkRect dst = { 0, 0, SkIntToScalar(width), SkIntToScalar(height) };
         SkRect clearRect = { -1.0f, -1.0f, width+1.0f, height+1.0f };
+        SkPoint verts[4] = { // for drawVertices path
+            { 0, 0 },
+            { 0, SkIntToScalar(height) },
+            { SkIntToScalar(width), SkIntToScalar(height) },
+            { SkIntToScalar(width), 0 }
+        };
+        uint16_t indices[6] = { 0, 1, 2, 0, 2, 3 };
 
         SkPaint p;
         p.setColor(0xFF000000);
         p.setFilterBitmap(true);
 
+        SkPaint p2;         // for drawVertices path
+        p2.setColor(0xFF000000);
+        p2.setFilterBitmap(true);
+        p2.setShader(SkShader::CreateBitmapShader(fAtlas, 
+                                                  SkShader::kClamp_TileMode,
+                                                  SkShader::kClamp_TileMode))->unref();
+
         for (int i = 0; i < kNumRects; ++i, ++fNumSaved) {
 
             if (0 == i % kNumBeforeClear) {
@@ -173,11 +193,24 @@
             canvas->concat(mat);
             if (fUseAtlas) {
                 static int curCell = 0;
-                src = fAtlasRects[curCell % (kNumAtlasedX)][curCell / (kNumAtlasedX)];
+                SkIRect src = fAtlasRects[curCell % (kNumAtlasedX)][curCell / (kNumAtlasedX)];
                 curCell = (curCell + 1) % (kNumAtlasedX*kNumAtlasedY);
-                canvas->drawBitmapRect(fAtlas, &src, dst, &p);
+
+                if (fUseDrawVertices) {
+                    SkPoint uvs[4] = { 
+                        { SkIntToScalar(src.fLeft),  SkIntToScalar(src.fBottom) },
+                        { SkIntToScalar(src.fLeft),  SkIntToScalar(src.fTop) },
+                        { SkIntToScalar(src.fRight), SkIntToScalar(src.fTop) },
+                        { SkIntToScalar(src.fRight), SkIntToScalar(src.fBottom) },
+                    };
+                    canvas->drawVertices(SkCanvas::kTriangles_VertexMode,
+                                         4, verts, uvs, NULL, NULL, 
+                                         indices, 6, p2);
+                } else {
+                    canvas->drawBitmapRect(fAtlas, &src, dst, &p);
+                }
             } else {
-                canvas->drawBitmapRect(fCheckerboard, &src, dst, &p);
+                canvas->drawBitmapRect(fCheckerboard, NULL, dst, &p);
             }
         }
     }
@@ -209,6 +242,7 @@
     Clear    fClear;
     bool     fAligned;
     bool     fUseAtlas;
+    bool     fUseDrawVertices;
     SkString fName;
     int      fNumSaved; // num draws stored in 'fSaved'
     bool     fInitialized;
@@ -259,7 +293,6 @@
             }
         }
 
-
         fAtlas.setConfig(SkBitmap::kARGB_8888_Config, kTotAtlasWidth, kTotAtlasHeight);
         fAtlas.allocPixels();
         SkAutoLockPixels lock(fAtlas);
@@ -310,3 +343,5 @@
 // Atlased
 DEF_BENCH( return SkNEW_ARGS(GameBench, (p, GameBench::kTranslate_Type,
                                             GameBench::kFull_Clear, false, true)); )
+DEF_BENCH( return SkNEW_ARGS(GameBench, (p, GameBench::kTranslate_Type,
+                                            GameBench::kFull_Clear, false, true, true)); )