OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #ifndef WrappedBenchmark_DEFINED | 8 #ifndef WrappedBenchmark_DEFINED |
9 #define WrappedBenchmark_DEFINED | 9 #define WrappedBenchmark_DEFINED |
10 | 10 |
11 #include "Benchmark.h" | 11 #include "Benchmark.h" |
12 #include "SkDevice.h" | |
12 #include "SkSurface.h" | 13 #include "SkSurface.h" |
14 #include "GrContext.h" | |
15 #include "GrRenderTarget.h" | |
13 | 16 |
14 // Wrap some other benchmark to allow specialization to either | 17 // Wrap some other benchmark to allow specialization to either |
15 // cpu or gpu backends. The derived class will override 'setupOffScreen' | 18 // cpu or gpu backends. The derived class will override 'setupOffScreen' |
16 // to create an offscreen surface in which the actual rendering will occur. | 19 // to create an offscreen surface in which the actual rendering will occur. |
17 class WrappedBenchmark : public Benchmark { | 20 class WrappedBenchmark : public Benchmark { |
18 public: | 21 public: |
19 // Takes ownership of caller's ref on `bench`. | 22 // Takes ownership of caller's ref on `bench`. |
20 explicit WrappedBenchmark(const SkSurfaceProps& surfaceProps, Benchmark* ben ch) | 23 explicit WrappedBenchmark(const SkSurfaceProps& surfaceProps, Benchmark* ben ch) |
21 : fSurfaceProps(surfaceProps) | 24 : fSurfaceProps(surfaceProps) |
22 , fBench(bench) {} | 25 , fBench(bench) {} |
23 | 26 |
24 const SkSurfaceProps& surfaceProps() const { return fSurfaceProps; } | 27 const SkSurfaceProps& surfaceProps() const { return fSurfaceProps; } |
25 | 28 |
26 const char* onGetName() override { return fBench->getName(); } | 29 const char* onGetName() override { return fBench->getName(); } |
27 const char* onGetUniqueName() override { return fBench->getUniqueName(); } | 30 const char* onGetUniqueName() override { return fBench->getUniqueName(); } |
28 | 31 |
29 void onDelayedSetup() override { fBench->delayedSetup(); } | 32 void onDelayedSetup() override { fBench->delayedSetup(); } |
30 void onPerCanvasPreDraw(SkCanvas* canvas) override { | 33 void onPerCanvasPreDraw(SkCanvas* canvas) override { |
31 fOffScreen.reset(this->setupOffScreen(canvas)); | 34 this->setupOffScreen(canvas); |
32 fBench->perCanvasPreDraw(fOffScreen->getCanvas()); | 35 fBench->perCanvasPreDraw(fOffScreen->getCanvas()); |
33 } | 36 } |
34 void onPreDraw(SkCanvas* canvas) override { | 37 void onPreDraw(SkCanvas* canvas) override { |
35 SkASSERT(fOffScreen.get()); | 38 SkASSERT(fOffScreen.get()); |
36 fBench->preDraw(fOffScreen->getCanvas()); | 39 fBench->preDraw(fOffScreen->getCanvas()); |
37 } | 40 } |
38 void onPostDraw(SkCanvas* canvas) override { | 41 void onPostDraw(SkCanvas* canvas) override { |
39 SkASSERT(fOffScreen.get()); | 42 SkASSERT(fOffScreen.get()); |
40 fBench->postDraw(fOffScreen->getCanvas()); | 43 fBench->postDraw(fOffScreen->getCanvas()); |
41 } | 44 } |
42 void onPerCanvasPostDraw(SkCanvas* canvas) override { | 45 void onPerCanvasPostDraw(SkCanvas* canvas) override { |
43 SkASSERT(fOffScreen.get()); | 46 SkASSERT(fOffScreen.get()); |
44 fBench->perCanvasPostDraw(fOffScreen->getCanvas()); | 47 fBench->perCanvasPostDraw(fOffScreen->getCanvas()); |
45 } | 48 } |
46 | 49 |
47 void onDraw(int loops, SkCanvas* canvas) override { | 50 void onDraw(int loops, SkCanvas* canvas) override { |
48 SkASSERT(fOffScreen.get()); | 51 SkASSERT(fOffScreen.get()); |
49 fBench->draw(loops, fOffScreen->getCanvas()); | 52 fBench->draw(loops, fOffScreen->getCanvas()); |
53 this->blitToScreen(canvas); | |
54 } | |
55 | |
56 virtual SkIPoint onGetSize() override { return fBench->getSize(); } | |
57 | |
58 protected: | |
59 virtual void setupOffScreen(SkCanvas*)=0; | |
60 | |
61 virtual void blitToScreen(SkCanvas* canvas) { | |
50 SkAutoTUnref<SkImage> image(fOffScreen->newImageSnapshot()); | 62 SkAutoTUnref<SkImage> image(fOffScreen->newImageSnapshot()); |
51 canvas->drawImage(image, 0,0); | 63 canvas->drawImage(image, 0,0); |
52 } | 64 } |
53 | 65 |
54 virtual SkIPoint onGetSize() override { return fBench->getSize(); } | |
55 | |
56 private: | |
57 virtual SkSurface* setupOffScreen(SkCanvas*)=0; | |
58 | |
59 SkSurfaceProps fSurfaceProps; | 66 SkSurfaceProps fSurfaceProps; |
60 SkAutoTUnref<SkSurface> fOffScreen; | 67 SkAutoTUnref<SkSurface> fOffScreen; |
61 SkAutoTUnref<Benchmark> fBench; | 68 SkAutoTUnref<Benchmark> fBench; |
62 }; | 69 }; |
63 | 70 |
64 // Create a raster surface for off screen rendering | 71 // Create a raster surface for off screen rendering |
65 class CpuWrappedBenchmark : public WrappedBenchmark { | 72 class CpuWrappedBenchmark : public WrappedBenchmark { |
66 public: | 73 public: |
67 explicit CpuWrappedBenchmark(const SkSurfaceProps& surfaceProps, Benchmark* bench) | 74 explicit CpuWrappedBenchmark(const SkSurfaceProps& surfaceProps, Benchmark* bench) |
68 : INHERITED(surfaceProps, bench) {} | 75 : INHERITED(surfaceProps, bench) {} |
69 | 76 |
70 private: | 77 private: |
71 SkSurface* setupOffScreen(SkCanvas* canvas) override { | 78 void setupOffScreen(SkCanvas* canvas) override { |
72 return SkSurface::NewRaster(canvas->imageInfo(), &this->surfaceProps()); | 79 fOffScreen.reset(SkSurface::NewRaster(canvas->imageInfo(), &this->surfac eProps())); |
73 } | 80 } |
74 | 81 |
75 typedef WrappedBenchmark INHERITED; | 82 typedef WrappedBenchmark INHERITED; |
76 }; | 83 }; |
77 | 84 |
78 // Create an MSAA & NVPR-enabled GPU backend | 85 // Create an MSAA & NVPR-enabled GPU backend |
79 class NvprWrappedBenchmark : public WrappedBenchmark { | 86 class NvprWrappedBenchmark : public WrappedBenchmark { |
80 public: | 87 public: |
81 explicit NvprWrappedBenchmark(const SkSurfaceProps& surfaceProps, Benchmark* bench, | 88 explicit NvprWrappedBenchmark(const SkSurfaceProps& surfaceProps, Benchmark* bench, |
82 int numSamples) | 89 int numSamples) |
83 : INHERITED(surfaceProps, bench) | 90 : INHERITED(surfaceProps, bench) |
84 , fNumSamples(numSamples) {} | 91 , fNumSamples(numSamples) {} |
85 | 92 |
86 private: | 93 private: |
87 SkSurface* setupOffScreen(SkCanvas* canvas) override { | 94 void setupOffScreen(SkCanvas* canvas) override { |
88 return SkSurface::NewRenderTarget(canvas->getGrContext(), | 95 fOffScreen.reset(SkSurface::NewRenderTarget(canvas->getGrContext(), |
89 SkSurface::kNo_Budgeted, | 96 SkSurface::kNo_Budgeted, |
90 canvas->imageInfo(), | 97 canvas->imageInfo(), |
91 fNumSamples, | 98 fNumSamples, |
92 &this->surfaceProps()); | 99 &this->surfaceProps())); |
100 fOffScreen->getCanvas()->clear(SK_ColorWHITE); | |
101 } | |
102 | |
103 void blitToScreen(SkCanvas* canvas) override { | |
104 // We call copySurface directly on the underlying GPU surfaces for a mor e efficient blit. | |
105 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.
| |
106 GrRenderTarget* dst = canvasIter.device()->accessRenderTarget(); | |
107 | |
108 SkCanvas::LayerIter offscreenIter(fOffScreen->getCanvas(), false); | |
109 GrRenderTarget* src = offscreenIter.device()->accessRenderTarget(); | |
110 | |
111 if (!src || src->width() != fOffScreen->width() || src->height() != fOff Screen->height() || | |
112 !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.
| |
113 SkDebugf("warning : blitToScreen() falling back on slow path for nvp r."); | |
114 INHERITED::blitToScreen(canvas); | |
115 return; | |
116 } | |
117 | |
118 SkASSERT(dst->getContext() == src->getContext()); | |
119 | |
120 int w = SkTMin(fBench->getSize().fX, SkTMin(dst->width(), src->width())) ; | |
121 int h = SkTMin(fBench->getSize().fY, SkTMin(dst->height(), src->height() )); | |
122 dst->getContext()->copySurface(dst, src, SkIRect::MakeWH(w, h), SkIPoint ::Make(0, 0)); | |
123 | |
124 #ifdef SK_DEBUG | |
125 // This method should not be called while layers are saved. | |
126 canvasIter.next(); | |
127 SkASSERT(canvasIter.done()); | |
128 | |
129 offscreenIter.next(); | |
130 SkASSERT(offscreenIter.done()); | |
131 #endif | |
93 } | 132 } |
94 | 133 |
95 int fNumSamples; | 134 int fNumSamples; |
96 typedef WrappedBenchmark INHERITED; | 135 typedef WrappedBenchmark INHERITED; |
97 }; | 136 }; |
98 | 137 |
99 #endif //WrappedBenchmark_DEFINED | 138 #endif //WrappedBenchmark_DEFINED |
OLD | NEW |