Add DDLTileHelper option to tile separately in x & y

afaik Chrome only tiles in Y which should yield less threaded text blob contention

Change-Id: I9ff484ed2ce66428e2d7ca6188eba79cd99b1547
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/376608
Reviewed-by: Adlai Holler <adlai@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
index 9478331..21fd738 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -1833,7 +1833,8 @@
     // one. About all it can be consistently used for is GrCaps access and 'defaultBackendFormat'
     // calls.
     constexpr int kNumDivisions = 3;
-    DDLTileHelper tiles(gpuThreadCtx, dstCharacterization, viewport, kNumDivisions,
+    DDLTileHelper tiles(gpuThreadCtx, dstCharacterization, viewport,
+                        kNumDivisions, kNumDivisions,
                         /* addRandomPaddingToDst */ false);
 
     tiles.createBackendTextures(gpuTaskGroup, gpuThreadCtx);
diff --git a/experimental/ddlbench/ddlbench.cpp b/experimental/ddlbench/ddlbench.cpp
index 4e28c2f..d44cf89 100644
--- a/experimental/ddlbench/ddlbench.cpp
+++ b/experimental/ddlbench/ddlbench.cpp
@@ -26,6 +26,8 @@
 using sk_gpu_test::TestContext;
 
 static DEFINE_int(ddlNumRecordingThreads, 1, "number of DDL recording threads");
+static DEFINE_int(numTilesX, 3, "number of tiles horizontally");
+static DEFINE_int(numTilesY, 3, "number of tiles vertically");
 static DEFINE_string(src, "", "input .skp file");
 
 static void exitf(const char* format, ...) {
diff --git a/tools/DDLTileHelper.cpp b/tools/DDLTileHelper.cpp
index 1035982..315c8a8 100644
--- a/tools/DDLTileHelper.cpp
+++ b/tools/DDLTileHelper.cpp
@@ -262,24 +262,25 @@
 DDLTileHelper::DDLTileHelper(GrDirectContext* direct,
                              const SkSurfaceCharacterization& dstChar,
                              const SkIRect& viewport,
-                             int numDivisions,
+                             int numXDivisions, int numYDivisions,
                              bool addRandomPaddingToDst)
-        : fNumDivisions(numDivisions)
-        , fTiles(numDivisions * numDivisions)
+        : fNumXDivisions(numXDivisions)
+        , fNumYDivisions(numYDivisions)
+        , fTiles(numXDivisions * numYDivisions)
         , fDstCharacterization(dstChar) {
-    SkASSERT(fNumDivisions > 0);
+    SkASSERT(fNumXDivisions > 0 && fNumYDivisions > 0);
 
-    int xTileSize = viewport.width()/fNumDivisions;
-    int yTileSize = viewport.height()/fNumDivisions;
+    int xTileSize = viewport.width()/fNumXDivisions;
+    int yTileSize = viewport.height()/fNumYDivisions;
 
     SkRandom rand;
 
     // Create the destination tiles
-    for (int y = 0, yOff = 0; y < fNumDivisions; ++y, yOff += yTileSize) {
-        int ySize = (y < fNumDivisions-1) ? yTileSize : viewport.height()-yOff;
+    for (int y = 0, yOff = 0; y < fNumYDivisions; ++y, yOff += yTileSize) {
+        int ySize = (y < fNumYDivisions-1) ? yTileSize : viewport.height()-yOff;
 
-        for (int x = 0, xOff = 0; x < fNumDivisions; ++x, xOff += xTileSize) {
-            int xSize = (x < fNumDivisions-1) ? xTileSize : viewport.width()-xOff;
+        for (int x = 0, xOff = 0; x < fNumXDivisions; ++x, xOff += xTileSize) {
+            int xSize = (x < fNumXDivisions-1) ? xTileSize : viewport.width()-xOff;
 
             SkIRect clip = SkIRect::MakeXYWH(xOff, yOff, xSize, ySize);
 
@@ -291,7 +292,7 @@
             int32_t rPad = addRandomPaddingToDst ? rand.nextRangeU(0, kMaxPad) : 0;
             int32_t bPad = addRandomPaddingToDst ? rand.nextRangeU(0, kMaxPad) : 0;
 
-            fTiles[y*fNumDivisions+x].init(y*fNumDivisions+x, direct, dstChar, clip,
+            fTiles[y*fNumXDivisions+x].init(y*fNumXDivisions+x, direct, dstChar, clip,
                                            {lPad, tPad, rPad, bPad});
         }
     }
diff --git a/tools/DDLTileHelper.h b/tools/DDLTileHelper.h
index f760a4c..755ffa9 100644
--- a/tools/DDLTileHelper.h
+++ b/tools/DDLTileHelper.h
@@ -108,7 +108,7 @@
     DDLTileHelper(GrDirectContext*,
                   const SkSurfaceCharacterization& dstChar,
                   const SkIRect& viewport,
-                  int numDivisions,
+                  int numXDivisions, int numYDivisions,
                   bool addRandomPaddingToDst);
 
     void createSKPPerTile(SkData* compressedPictureData, const DDLPromiseImageHelper&);
@@ -137,14 +137,15 @@
     void dropCallbackContexts();
     void resetAllTiles();
 
-    int numTiles() const { return fNumDivisions * fNumDivisions; }
+    int numTiles() const { return fNumXDivisions * fNumYDivisions; }
 
     void createBackendTextures(SkTaskGroup*, GrDirectContext*);
     void deleteBackendTextures(SkTaskGroup*, GrDirectContext*);
 
 private:
-    int                                    fNumDivisions; // number of tiles along a side
-    SkAutoTArray<TileData>                 fTiles;        // 'fNumDivisions' x 'fNumDivisions'
+    int                                    fNumXDivisions; // number of tiles horizontally
+    int                                    fNumYDivisions; // number of tiles vertically
+    SkAutoTArray<TileData>                 fTiles;        // 'fNumXDivisions' x 'fNumYDivisions'
 
     sk_sp<SkDeferredDisplayList>           fComposeDDL;
 
diff --git a/tools/skpbench/skpbench.cpp b/tools/skpbench/skpbench.cpp
index 34ab43b..b544af3 100644
--- a/tools/skpbench/skpbench.cpp
+++ b/tools/skpbench/skpbench.cpp
@@ -271,7 +271,8 @@
 
     promiseImageHelper.uploadAllToGPU(nullptr, context);
 
-    DDLTileHelper tiles(context, dstCharacterization, viewport, FLAGS_ddlTilingWidthHeight,
+    DDLTileHelper tiles(context, dstCharacterization, viewport,
+                        FLAGS_ddlTilingWidthHeight, FLAGS_ddlTilingWidthHeight,
                         /* addRandomPaddingToDst */ false);
 
     tiles.createBackendTextures(nullptr, context);