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>
This commit is contained in:
Robert Phillips 2021-02-26 10:41:06 -05:00 committed by Skia Commit-Bot
parent e7f071acc1
commit 96f6d9a37f
5 changed files with 23 additions and 17 deletions

View File

@ -1833,7 +1833,8 @@ Result GPUDDLSink::ddlDraw(const Src& src,
// 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);

View File

@ -26,6 +26,8 @@ using sk_gpu_test::GrContextFactory;
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, ...) {

View File

@ -262,24 +262,25 @@ void DDLTileHelper::TileData::DeleteBackendTexture(GrDirectContext*, TileData* t
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 @@ DDLTileHelper::DDLTileHelper(GrDirectContext* direct,
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});
}
}

View File

@ -108,7 +108,7 @@ public:
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 @@ public:
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;

View File

@ -271,7 +271,8 @@ static void run_ddl_benchmark(sk_gpu_test::TestContext* testContext, GrDirectCon
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);