diff options
author | robertphillips <robertphillips@google.com> | 2014-12-04 08:31:02 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-12-04 08:31:03 -0800 |
commit | 63242d7d24917f836eace34ee20faeb49def5e67 (patch) | |
tree | 4f7f34959349dc41243fe1cdc477363592f2a16d | |
parent | 89dee4298e79b69ef2f1ec045c90ffacff9cabec (diff) |
Fix SKPBench tiling so MPD and non-MPD match
Two issues with the SKPBench tile computation were causing the MPD path to do more work:
The clip from the parent canvas wasn't being used to trim content off the edges of the MPD tiles
The non-MPD path was not taking the scale into account in its tile placement (resulting in it having fewer, larger active tiles when scaling).
Review URL: https://codereview.chromium.org/776273002
-rw-r--r-- | bench/SKPBench.cpp | 15 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 4 |
2 files changed, 16 insertions, 3 deletions
diff --git a/bench/SKPBench.cpp b/bench/SKPBench.cpp index 3e692171db..222a878950 100644 --- a/bench/SKPBench.cpp +++ b/bench/SKPBench.cpp @@ -57,8 +57,16 @@ void SKPBench::onPerCanvasPreDraw(SkCanvas* canvas) { for (int y = bounds.fTop; y < bounds.fBottom; y += FLAGS_benchTile) { for (int x = bounds.fLeft; x < bounds.fRight; x += FLAGS_benchTile) { - *fTileRects.append() = SkIRect::MakeXYWH(x, y, FLAGS_benchTile, FLAGS_benchTile); + const SkIRect tileRect = SkIRect::MakeXYWH(x, y, FLAGS_benchTile, FLAGS_benchTile); + *fTileRects.append() = tileRect; *fSurfaces.push() = canvas->newSurface(ii); + + // Never want the contents of a tile to include stuff the parent + // canvas clips out + SkRect clip = SkRect::Make(bounds); + clip.offset(-SkIntToScalar(tileRect.fLeft), -SkIntToScalar(tileRect.fTop)); + fSurfaces.top()->getCanvas()->clipRect(clip); + fSurfaces.top()->getCanvas()->setMatrix(canvas->getTotalMatrix()); fSurfaces.top()->getCanvas()->scale(fScale, fScale); } @@ -120,8 +128,9 @@ void SKPBench::onDraw(const int loops, SkCanvas* canvas) { for (int y = bounds.fTop; y < bounds.fBottom; y += FLAGS_benchTile) { for (int x = bounds.fLeft; x < bounds.fRight; x += FLAGS_benchTile) { SkAutoCanvasRestore perTile(canvas, true/*save now*/); - canvas->clipRect(SkRect::Make( - SkIRect::MakeXYWH(x, y, FLAGS_benchTile, FLAGS_benchTile))); + canvas->clipRect(SkRect::MakeXYWH(x/fScale, y/fScale, + FLAGS_benchTile/fScale, + FLAGS_benchTile/fScale)); fPic->playback(canvas); } } diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index f09ebf291f..b4b24d9086 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -1823,6 +1823,7 @@ SkSurface* SkGpuDevice::newSurface(const SkImageInfo& info, const SkSurfaceProps bool SkGpuDevice::EXPERIMENTAL_drawPicture(SkCanvas* mainCanvas, const SkPicture* mainPicture, const SkMatrix* matrix, const SkPaint* paint) { +#ifndef SK_IGNORE_GPU_LAYER_HOISTING // todo: should handle this natively if (paint) { return false; @@ -1874,6 +1875,9 @@ bool SkGpuDevice::EXPERIMENTAL_drawPicture(SkCanvas* mainCanvas, const SkPicture GrLayerHoister::UnlockLayers(fContext, atlasedRecycled); return true; +#else + return false; +#endif } SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { |