blob: 845aa9f73eaa50547df88a5ecc15d0aa3973267f [file] [log] [blame]
keyar@chromium.org451bb9f2012-07-26 17:27:57 +00001/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef PictureRenderer_DEFINED
9#define PictureRenderer_DEFINED
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +000010#include "SkMath.h"
scroggo@google.com9a412522012-09-07 15:21:18 +000011#include "SkPicture.h"
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000012#include "SkTypes.h"
13#include "SkTDArray.h"
scroggo@google.comacfb30e2012-09-18 14:32:35 +000014#include "SkRect.h"
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000015#include "SkRefCnt.h"
scroggo@google.com9a412522012-09-07 15:21:18 +000016#include "SkString.h"
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000017
keyar@chromium.org06125642012-08-20 15:03:33 +000018#if SK_SUPPORT_GPU
19#include "GrContextFactory.h"
20#include "GrContext.h"
21#endif
22
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000023class SkBitmap;
24class SkCanvas;
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000025class SkGLContext;
scroggo@google.combcdf2ec2012-09-20 14:42:33 +000026class ThreadSafePipeController;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000027
28namespace sk_tools {
29
30class PictureRenderer : public SkRefCnt {
31public:
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000032 enum SkDeviceTypes {
33 kBitmap_DeviceType,
34#if SK_SUPPORT_GPU
35 kGPU_DeviceType
36#endif
37 };
38
keyar@chromium.org9d696c02012-08-07 17:11:33 +000039 virtual void init(SkPicture* pict);
scroggo@google.com9a412522012-09-07 15:21:18 +000040
41 /**
42 * Perform any setup that should done prior to each iteration of render() which should not be
43 * timed.
44 */
45 virtual void setup() {}
46
47 /**
48 * Perform work that is to be timed. Typically this is rendering, but is also used for recording
49 * and preparing picture for playback by the subclasses which do those.
50 * @param doExtraWorkToDrawToBaseCanvas Perform extra work to draw to fCanvas. Some subclasses
51 * will automatically draw to fCanvas, but in the tiled
52 * case, for example, true needs to be passed so that
53 * the tiles will be stitched together on fCanvas.
54 */
55 virtual void render(bool doExtraWorkToDrawToBaseCanvas) = 0;
56
keyar@chromium.org9d696c02012-08-07 17:11:33 +000057 virtual void end();
keyar@chromium.org28136b32012-08-20 15:04:15 +000058 void resetState();
keyar@chromium.org9d696c02012-08-07 17:11:33 +000059
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000060 void setDeviceType(SkDeviceTypes deviceType) {
61 fDeviceType = deviceType;
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000062 }
63
64 bool isUsingBitmapDevice() {
keyar@chromium.org78a35c52012-08-20 15:03:44 +000065 return kBitmap_DeviceType == fDeviceType;
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000066 }
67
scroggo@google.com9a412522012-09-07 15:21:18 +000068 virtual SkString getPerIterTimeFormat() { return SkString("%.2f"); }
69
70 virtual SkString getNormalTimeFormat() { return SkString("%6.2f"); }
71
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000072#if SK_SUPPORT_GPU
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000073 bool isUsingGpuDevice() {
keyar@chromium.org78a35c52012-08-20 15:03:44 +000074 return kGPU_DeviceType == fDeviceType;
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000075 }
keyar@chromium.org77a55222012-08-20 15:03:47 +000076
77 SkGLContext* getGLContext() {
78 if (this->isUsingGpuDevice()) {
79 return fGrContextFactory.getGLContext(GrContextFactory::kNative_GLContextType);
80 } else {
81 return NULL;
82 }
83 }
robertphillips@google.com163c84b2012-09-13 15:40:37 +000084
85 GrContext* getGrContext() {
86 return fGrContext;
87 }
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000088#endif
89
keyar@chromium.org02dfb122012-08-20 15:03:36 +000090 PictureRenderer()
keyar@chromium.org06125642012-08-20 15:03:33 +000091 : fPicture(NULL)
92 , fDeviceType(kBitmap_DeviceType)
93#if SK_SUPPORT_GPU
94 , fGrContext(fGrContextFactory.get(GrContextFactory::kNative_GLContextType))
95#endif
96 {}
97
keyar@chromium.org9299ede2012-08-21 19:05:08 +000098 bool write(const SkString& path) const;
99
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000100protected:
keyar@chromium.orga474ce32012-08-20 15:03:57 +0000101 SkCanvas* setupCanvas();
scroggo@google.combcdf2ec2012-09-20 14:42:33 +0000102 virtual SkCanvas* setupCanvas(int width, int height);
keyar@chromium.orga474ce32012-08-20 15:03:57 +0000103
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000104 SkAutoTUnref<SkCanvas> fCanvas;
105 SkPicture* fPicture;
keyar@chromium.org4ea96c52012-08-20 15:03:29 +0000106 SkDeviceTypes fDeviceType;
keyar@chromium.org06125642012-08-20 15:03:33 +0000107
108#if SK_SUPPORT_GPU
109 GrContextFactory fGrContextFactory;
110 GrContext* fGrContext;
111#endif
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000112
113private:
114 typedef SkRefCnt INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000115};
116
scroggo@google.com9a412522012-09-07 15:21:18 +0000117/**
118 * This class does not do any rendering, but its render function executes recording, which we want
119 * to time.
120 */
121class RecordPictureRenderer : public PictureRenderer {
122 virtual void render(bool doExtraWorkToDrawToBaseCanvas) SK_OVERRIDE;
123
124 virtual SkString getPerIterTimeFormat() SK_OVERRIDE { return SkString("%.4f"); }
125
126 virtual SkString getNormalTimeFormat() SK_OVERRIDE { return SkString("%6.4f"); }
127};
128
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000129class PipePictureRenderer : public PictureRenderer {
keyar@chromium.org163b5672012-08-01 17:53:29 +0000130public:
scroggo@google.com9a412522012-09-07 15:21:18 +0000131 virtual void render(bool doExtraWorkToDrawToBaseCanvas) SK_OVERRIDE;
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000132
133private:
134 typedef PictureRenderer INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000135};
136
137class SimplePictureRenderer : public PictureRenderer {
keyar@chromium.org163b5672012-08-01 17:53:29 +0000138public:
scroggo@google.com9a412522012-09-07 15:21:18 +0000139 virtual void render(bool doExtraWorkToDrawToBaseCanvas) SK_OVERRIDE;
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000140
141private:
142 typedef PictureRenderer INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000143};
144
145class TiledPictureRenderer : public PictureRenderer {
146public:
147 TiledPictureRenderer();
148
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000149 virtual void init(SkPicture* pict) SK_OVERRIDE;
scroggo@google.combcdf2ec2012-09-20 14:42:33 +0000150 virtual void setup() SK_OVERRIDE;
scroggo@google.com9a412522012-09-07 15:21:18 +0000151 virtual void render(bool doExtraWorkToDrawToBaseCanvas) SK_OVERRIDE;
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000152 virtual void end() SK_OVERRIDE;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000153
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000154 void setTileWidth(int width) {
155 fTileWidth = width;
156 }
157
158 int getTileWidth() const {
159 return fTileWidth;
160 }
161
162 void setTileHeight(int height) {
163 fTileHeight = height;
164 }
165
166 int getTileHeight() const {
167 return fTileHeight;
168 }
169
170 void setTileWidthPercentage(double percentage) {
171 fTileWidthPercentage = percentage;
172 }
173
keyar@chromium.org163b5672012-08-01 17:53:29 +0000174 double getTileWidthPercentage() const {
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000175 return fTileWidthPercentage;
176 }
177
178 void setTileHeightPercentage(double percentage) {
179 fTileHeightPercentage = percentage;
180 }
181
keyar@chromium.org163b5672012-08-01 17:53:29 +0000182 double getTileHeightPercentage() const {
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000183 return fTileHeightPercentage;
184 }
185
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +0000186 void setTileMinPowerOf2Width(int width) {
187 SkASSERT(SkIsPow2(width) && width > 0);
188 if (!SkIsPow2(width) || width <= 0) {
189 return;
190 }
191
192 fTileMinPowerOf2Width = width;
193 }
194
195 int getTileMinPowerOf2Width() const {
196 return fTileMinPowerOf2Width;
197 }
198
scroggo@google.combcdf2ec2012-09-20 14:42:33 +0000199 /**
200 * Set the number of threads to use for drawing. Non-positive numbers will set it to 1.
201 */
202 void setNumberOfThreads(int num) {
203 fNumThreads = SkMax32(num, 1);
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000204 }
205
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000206 void setUsePipe(bool usePipe) {
207 fUsePipe = usePipe;
208 }
209
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000210 ~TiledPictureRenderer();
211
212private:
scroggo@google.combcdf2ec2012-09-20 14:42:33 +0000213 bool fUsePipe;
214 int fTileWidth;
215 int fTileHeight;
216 double fTileWidthPercentage;
217 double fTileHeightPercentage;
218 int fTileMinPowerOf2Width;
scroggo@google.comacfb30e2012-09-18 14:32:35 +0000219 SkTDArray<SkRect> fTileRects;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000220
scroggo@google.combcdf2ec2012-09-20 14:42:33 +0000221 // These are only used for multithreaded rendering
222 int32_t fTileCounter;
223 int fNumThreads;
224 SkTDArray<SkCanvas*> fCanvasPool;
225 SkPicture* fPictureClones;
226 ThreadSafePipeController* fPipeController;
227
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000228 void setupTiles();
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +0000229 void setupPowerOf2Tiles();
scroggo@google.combcdf2ec2012-09-20 14:42:33 +0000230 virtual SkCanvas* setupCanvas(int width, int height) SK_OVERRIDE;
231 bool multiThreaded() { return fNumThreads > 1; }
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000232
233 typedef PictureRenderer INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000234};
235
scroggo@google.com9a412522012-09-07 15:21:18 +0000236/**
237 * This class does not do any rendering, but its render function executes turning an SkPictureRecord
238 * into an SkPicturePlayback, which we want to time.
239 */
240class PlaybackCreationRenderer : public PictureRenderer {
241public:
242 virtual void setup() SK_OVERRIDE;
243
244 virtual void render(bool doExtraWorkToDrawToBaseCanvas) SK_OVERRIDE;
245
246 virtual SkString getPerIterTimeFormat() SK_OVERRIDE { return SkString("%.4f"); }
247
248 virtual SkString getNormalTimeFormat() SK_OVERRIDE { return SkString("%6.4f"); }
249
250private:
251 SkPicture fReplayer;
252 typedef PictureRenderer INHERITED;
253};
254
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000255}
256
257#endif // PictureRenderer_DEFINED