Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(68)

Unified Diff: tools/VisualBench/WrappedBenchmark.h

Issue 1443263002: Optimize visualbench offscreen blits (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: one more check Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/VisualBench/VisualSKPBench.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/VisualBench/WrappedBenchmark.h
diff --git a/tools/VisualBench/WrappedBenchmark.h b/tools/VisualBench/WrappedBenchmark.h
index ffa0da342a8b314d496e41887e4079c0486f18b4..3d5d895773015cb9da4baa7b7da2cf7c9bef1e50 100644
--- a/tools/VisualBench/WrappedBenchmark.h
+++ b/tools/VisualBench/WrappedBenchmark.h
@@ -9,7 +9,10 @@
#define WrappedBenchmark_DEFINED
#include "Benchmark.h"
+#include "SkDevice.h"
#include "SkSurface.h"
+#include "GrContext.h"
+#include "GrRenderTarget.h"
// Wrap some other benchmark to allow specialization to either
// cpu or gpu backends. The derived class will override 'setupOffScreen'
@@ -28,7 +31,7 @@ public:
void onDelayedSetup() override { fBench->delayedSetup(); }
void onPerCanvasPreDraw(SkCanvas* canvas) override {
- fOffScreen.reset(this->setupOffScreen(canvas));
+ this->setupOffScreen(canvas);
fBench->perCanvasPreDraw(fOffScreen->getCanvas());
}
void onPreDraw(SkCanvas* canvas) override {
@@ -47,14 +50,18 @@ public:
void onDraw(int loops, SkCanvas* canvas) override {
SkASSERT(fOffScreen.get());
fBench->draw(loops, fOffScreen->getCanvas());
- SkAutoTUnref<SkImage> image(fOffScreen->newImageSnapshot());
- canvas->drawImage(image, 0,0);
+ this->blitToScreen(canvas);
}
virtual SkIPoint onGetSize() override { return fBench->getSize(); }
-private:
- virtual SkSurface* setupOffScreen(SkCanvas*)=0;
+protected:
+ virtual void setupOffScreen(SkCanvas*)=0;
+
+ virtual void blitToScreen(SkCanvas* canvas) {
+ SkAutoTUnref<SkImage> image(fOffScreen->newImageSnapshot());
+ canvas->drawImage(image, 0,0);
+ }
SkSurfaceProps fSurfaceProps;
SkAutoTUnref<SkSurface> fOffScreen;
@@ -68,8 +75,8 @@ public:
: INHERITED(surfaceProps, bench) {}
private:
- SkSurface* setupOffScreen(SkCanvas* canvas) override {
- return SkSurface::NewRaster(canvas->imageInfo(), &this->surfaceProps());
+ void setupOffScreen(SkCanvas* canvas) override {
+ fOffScreen.reset(SkSurface::NewRaster(canvas->imageInfo(), &this->surfaceProps()));
}
typedef WrappedBenchmark INHERITED;
@@ -84,12 +91,44 @@ public:
, fNumSamples(numSamples) {}
private:
- SkSurface* setupOffScreen(SkCanvas* canvas) override {
- return SkSurface::NewRenderTarget(canvas->getGrContext(),
- SkSurface::kNo_Budgeted,
- canvas->imageInfo(),
- fNumSamples,
- &this->surfaceProps());
+ void setupOffScreen(SkCanvas* canvas) override {
+ fOffScreen.reset(SkSurface::NewRenderTarget(canvas->getGrContext(),
+ SkSurface::kNo_Budgeted,
+ canvas->imageInfo(),
+ fNumSamples,
+ &this->surfaceProps()));
+ fOffScreen->getCanvas()->clear(SK_ColorWHITE);
+ }
+
+ void blitToScreen(SkCanvas* canvas) override {
+ // We call copySurface directly on the underlying GPU surfaces for a more efficient blit.
+ SkCanvas::LayerIter canvasIter(canvas, false);
Chris Dalton 2015/11/16 18:30:35 I'd rather call getTopDevice() than use the LayerI
bsalomon 2015/11/16 21:14:59 I think this is the best we can do right now.
+ GrRenderTarget* dst = canvasIter.device()->accessRenderTarget();
+
+ SkCanvas::LayerIter offscreenIter(fOffScreen->getCanvas(), false);
+ GrRenderTarget* src = offscreenIter.device()->accessRenderTarget();
+
+ if (!src || src->width() != fOffScreen->width() || src->height() != fOffScreen->height() ||
+ !dst || canvas->imageInfo().dimensions() != SkISize::Make(dst->width(),dst->height())) {
Chris Dalton 2015/11/16 18:30:35 I added the check of RT size because I understand
bsalomon 2015/11/16 21:14:59 I think the RT is always the size of the screen. J
Chris Dalton 2015/11/16 21:23:17 Oh that's right, unless running in windowed mode (
joshualitt 2015/11/18 17:02:03 just print not supported in that case.
+ SkDebugf("warning : blitToScreen() falling back on slow path for nvpr.");
+ INHERITED::blitToScreen(canvas);
+ return;
+ }
+
+ SkASSERT(dst->getContext() == src->getContext());
+
+ int w = SkTMin(fBench->getSize().fX, SkTMin(dst->width(), src->width()));
+ int h = SkTMin(fBench->getSize().fY, SkTMin(dst->height(), src->height()));
+ dst->getContext()->copySurface(dst, src, SkIRect::MakeWH(w, h), SkIPoint::Make(0, 0));
+
+#ifdef SK_DEBUG
+ // This method should not be called while layers are saved.
+ canvasIter.next();
+ SkASSERT(canvasIter.done());
+
+ offscreenIter.next();
+ SkASSERT(offscreenIter.done());
+#endif
}
int fNumSamples;
« no previous file with comments | « tools/VisualBench/VisualSKPBench.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698