OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 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 #include "PictureRenderingFlags.h" | 8 #include "PictureRenderingFlags.h" |
9 | 9 |
10 #include "CopyTilesRenderer.h" | 10 #include "CopyTilesRenderer.h" |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 "\tpicture is large enough, it is broken into larger tiles to avoi
d\n" | 59 "\tpicture is large enough, it is broken into larger tiles to avoi
d\n" |
60 "\tcreating a large canvas.\n" | 60 "\tcreating a large canvas.\n" |
61 // TODO: If bench_pictures and render_pictures were two separate targets, we cou
ld use build flags | 61 // TODO: If bench_pictures and render_pictures were two separate targets, we cou
ld use build flags |
62 // to determine which modes to display. | 62 // to determine which modes to display. |
63 "record: (Only in bench_pictures) Time recording from a picture to
a new\n" | 63 "record: (Only in bench_pictures) Time recording from a picture to
a new\n" |
64 "\tpicture.\n" | 64 "\tpicture.\n" |
65 "playbackCreation: (Only in bench_pictures) Time creation of the \
n" | 65 "playbackCreation: (Only in bench_pictures) Time creation of the \
n" |
66 "\tSkPicturePlayback.\n" | 66 "\tSkPicturePlayback.\n" |
67 "rerecord: (Only in render_pictures) Record the picture as a new s
kp,\n" | 67 "rerecord: (Only in render_pictures) Record the picture as a new s
kp,\n" |
68 "\twith the bitmaps PNG encoded.\n"); | 68 "\twith the bitmaps PNG encoded.\n"); |
69 DEFINE_int32(multi, 1, "Set the number of threads for multi threaded drawing. " | |
70 "If > 1, requires tiled rendering."); | |
71 DEFINE_bool(pipe, false, "Use SkGPipe rendering. Currently incompatible with \"m
ode\"."); | 69 DEFINE_bool(pipe, false, "Use SkGPipe rendering. Currently incompatible with \"m
ode\"."); |
72 DEFINE_string2(readPath, r, "", "skp files or directories of skp files to proces
s."); | 70 DEFINE_string2(readPath, r, "", "skp files or directories of skp files to proces
s."); |
73 DEFINE_double(scale, 1, "Set the scale factor."); | 71 DEFINE_double(scale, 1, "Set the scale factor."); |
74 DEFINE_string(tiles, "", "Used with --mode copyTile to specify number of tiles p
er larger tile " | 72 DEFINE_string(tiles, "", "Used with --mode copyTile to specify number of tiles p
er larger tile " |
75 "in the x and y directions."); | 73 "in the x and y directions."); |
76 DEFINE_string(viewport, "", "width height: Set the viewport."); | 74 DEFINE_string(viewport, "", "width height: Set the viewport."); |
77 | 75 |
78 sk_tools::PictureRenderer* parseRenderer(SkString& error, PictureTool tool) { | 76 sk_tools::PictureRenderer* parseRenderer(SkString& error, PictureTool tool) { |
79 error.reset(); | 77 error.reset(); |
80 | 78 |
81 if (FLAGS_multi <= 0) { | |
82 error.printf("--multi must be > 0, was %i", FLAGS_multi); | |
83 return NULL; | |
84 } | |
85 | |
86 bool useTiles = false; | 79 bool useTiles = false; |
87 const char* widthString = NULL; | 80 const char* widthString = NULL; |
88 const char* heightString = NULL; | 81 const char* heightString = NULL; |
89 bool isPowerOf2Mode = false; | 82 bool isPowerOf2Mode = false; |
90 bool isCopyMode = false; | 83 bool isCopyMode = false; |
91 const char* mode = NULL; | 84 const char* mode = NULL; |
92 bool gridSupported = false; | 85 bool gridSupported = false; |
93 | 86 |
94 SkAutoTUnref<sk_tools::PictureRenderer> renderer; | 87 SkAutoTUnref<sk_tools::PictureRenderer> renderer; |
95 if (FLAGS_mode.count() >= 1) { | 88 if (FLAGS_mode.count() >= 1) { |
96 mode = FLAGS_mode[0]; | 89 mode = FLAGS_mode[0]; |
97 if (0 == strcmp(mode, "record")) { | 90 if (0 == strcmp(mode, "record")) { |
98 renderer.reset(SkNEW(sk_tools::RecordPictureRenderer)); | 91 renderer.reset(SkNEW(sk_tools::RecordPictureRenderer)); |
99 gridSupported = true; | 92 gridSupported = true; |
100 // undocumented | |
101 } else if (0 == strcmp(mode, "clone")) { | |
102 renderer.reset(sk_tools::CreatePictureCloneRenderer()); | |
103 } else if (0 == strcmp(mode, "tile") || 0 == strcmp(mode, "pow2tile") | 93 } else if (0 == strcmp(mode, "tile") || 0 == strcmp(mode, "pow2tile") |
104 || 0 == strcmp(mode, "copyTile")) { | 94 || 0 == strcmp(mode, "copyTile")) { |
105 useTiles = true; | 95 useTiles = true; |
106 | 96 |
107 if (0 == strcmp(mode, "pow2tile")) { | 97 if (0 == strcmp(mode, "pow2tile")) { |
108 isPowerOf2Mode = true; | 98 isPowerOf2Mode = true; |
109 } else if (0 == strcmp(mode, "copyTile")) { | 99 } else if (0 == strcmp(mode, "copyTile")) { |
110 isCopyMode = true; | 100 isCopyMode = true; |
111 } else { | 101 } else { |
112 gridSupported = true; | 102 gridSupported = true; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 x = xTiles; | 153 x = xTiles; |
164 y = yTiles; | 154 y = yTiles; |
165 if (x <= 0 || y <= 0) { | 155 if (x <= 0 || y <= 0) { |
166 error.printf("--tiles must be given values > 0\n"); | 156 error.printf("--tiles must be given values > 0\n"); |
167 return NULL; | 157 return NULL; |
168 } | 158 } |
169 } else { | 159 } else { |
170 x = y = 4; | 160 x = y = 4; |
171 } | 161 } |
172 tiledRenderer.reset(SkNEW_ARGS(sk_tools::CopyTilesRenderer, (x, y)))
; | 162 tiledRenderer.reset(SkNEW_ARGS(sk_tools::CopyTilesRenderer, (x, y)))
; |
173 } else if (FLAGS_multi > 1) { | |
174 tiledRenderer.reset(SkNEW_ARGS(sk_tools::MultiCorePictureRenderer, | |
175 (FLAGS_multi))); | |
176 } else { | 163 } else { |
177 tiledRenderer.reset(SkNEW(sk_tools::TiledPictureRenderer)); | 164 tiledRenderer.reset(SkNEW(sk_tools::TiledPictureRenderer)); |
178 } | 165 } |
179 | 166 |
180 if (isPowerOf2Mode) { | 167 if (isPowerOf2Mode) { |
181 int minWidth = atoi(widthString); | 168 int minWidth = atoi(widthString); |
182 if (!SkIsPow2(minWidth) || minWidth < 0) { | 169 if (!SkIsPow2(minWidth) || minWidth < 0) { |
183 SkString err; | 170 SkString err; |
184 error.printf("-mode %s must be given a width" | 171 error.printf("-mode %s must be given a width" |
185 " value that is a power of two\n", mode); | 172 " value that is a power of two\n", mode); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 } | 210 } |
224 } | 211 } |
225 | 212 |
226 renderer.reset(tiledRenderer.detach()); | 213 renderer.reset(tiledRenderer.detach()); |
227 if (FLAGS_pipe) { | 214 if (FLAGS_pipe) { |
228 error.printf("Pipe rendering is currently not compatible with tiling
.\n" | 215 error.printf("Pipe rendering is currently not compatible with tiling
.\n" |
229 "Turning off pipe.\n"); | 216 "Turning off pipe.\n"); |
230 } | 217 } |
231 | 218 |
232 } else { // useTiles | 219 } else { // useTiles |
233 if (FLAGS_multi > 1) { | |
234 error.printf("Multithreaded drawing requires tiled rendering.\n"); | |
235 return NULL; | |
236 } | |
237 if (FLAGS_pipe) { | 220 if (FLAGS_pipe) { |
238 if (renderer != NULL) { | 221 if (renderer != NULL) { |
239 error.printf("Pipe is incompatible with other modes.\n"); | 222 error.printf("Pipe is incompatible with other modes.\n"); |
240 return NULL; | 223 return NULL; |
241 } | 224 } |
242 renderer.reset(SkNEW(sk_tools::PipePictureRenderer)); | 225 renderer.reset(SkNEW(sk_tools::PipePictureRenderer)); |
243 } | 226 } |
244 } | 227 } |
245 | 228 |
246 if (NULL == renderer) { | 229 if (NULL == renderer) { |
(...skipping 16 matching lines...) Expand all Loading... |
263 #if SK_SUPPORT_GPU | 246 #if SK_SUPPORT_GPU |
264 int sampleCount = 0; | 247 int sampleCount = 0; |
265 #endif | 248 #endif |
266 if (FLAGS_config.count() > 0) { | 249 if (FLAGS_config.count() > 0) { |
267 if (0 == strcmp(FLAGS_config[0], "8888")) { | 250 if (0 == strcmp(FLAGS_config[0], "8888")) { |
268 deviceType = sk_tools::PictureRenderer::kBitmap_DeviceType; | 251 deviceType = sk_tools::PictureRenderer::kBitmap_DeviceType; |
269 } | 252 } |
270 #if SK_SUPPORT_GPU | 253 #if SK_SUPPORT_GPU |
271 else if (0 == strcmp(FLAGS_config[0], "gpu")) { | 254 else if (0 == strcmp(FLAGS_config[0], "gpu")) { |
272 deviceType = sk_tools::PictureRenderer::kGPU_DeviceType; | 255 deviceType = sk_tools::PictureRenderer::kGPU_DeviceType; |
273 if (FLAGS_multi > 1) { | |
274 error.printf("GPU not compatible with multithreaded tiling.\n"); | |
275 return NULL; | |
276 } | |
277 } | 256 } |
278 else if (0 == strcmp(FLAGS_config[0], "msaa4")) { | 257 else if (0 == strcmp(FLAGS_config[0], "msaa4")) { |
279 deviceType = sk_tools::PictureRenderer::kGPU_DeviceType; | 258 deviceType = sk_tools::PictureRenderer::kGPU_DeviceType; |
280 if (FLAGS_multi > 1) { | |
281 error.printf("GPU not compatible with multithreaded tiling.\n"); | |
282 return NULL; | |
283 } | |
284 sampleCount = 4; | 259 sampleCount = 4; |
285 } | 260 } |
286 else if (0 == strcmp(FLAGS_config[0], "msaa16")) { | 261 else if (0 == strcmp(FLAGS_config[0], "msaa16")) { |
287 deviceType = sk_tools::PictureRenderer::kGPU_DeviceType; | 262 deviceType = sk_tools::PictureRenderer::kGPU_DeviceType; |
288 if (FLAGS_multi > 1) { | |
289 error.printf("GPU not compatible with multithreaded tiling.\n"); | |
290 return NULL; | |
291 } | |
292 sampleCount = 16; | 263 sampleCount = 16; |
293 } | 264 } |
294 else if (0 == strcmp(FLAGS_config[0], "nvprmsaa4")) { | 265 else if (0 == strcmp(FLAGS_config[0], "nvprmsaa4")) { |
295 deviceType = sk_tools::PictureRenderer::kNVPR_DeviceType; | 266 deviceType = sk_tools::PictureRenderer::kNVPR_DeviceType; |
296 if (FLAGS_multi > 1) { | |
297 error.printf("GPU not compatible with multithreaded tiling.\n"); | |
298 return NULL; | |
299 } | |
300 sampleCount = 4; | 267 sampleCount = 4; |
301 } | 268 } |
302 else if (0 == strcmp(FLAGS_config[0], "nvprmsaa16")) { | 269 else if (0 == strcmp(FLAGS_config[0], "nvprmsaa16")) { |
303 deviceType = sk_tools::PictureRenderer::kNVPR_DeviceType; | 270 deviceType = sk_tools::PictureRenderer::kNVPR_DeviceType; |
304 if (FLAGS_multi > 1) { | |
305 error.printf("GPU not compatible with multithreaded tiling.\n"); | |
306 return NULL; | |
307 } | |
308 sampleCount = 16; | 271 sampleCount = 16; |
309 } | 272 } |
310 #if SK_ANGLE | 273 #if SK_ANGLE |
311 else if (0 == strcmp(FLAGS_config[0], "angle")) { | 274 else if (0 == strcmp(FLAGS_config[0], "angle")) { |
312 deviceType = sk_tools::PictureRenderer::kAngle_DeviceType; | 275 deviceType = sk_tools::PictureRenderer::kAngle_DeviceType; |
313 if (FLAGS_multi > 1) { | |
314 error.printf("Angle not compatible with multithreaded tiling.\n"
); | |
315 return NULL; | |
316 } | |
317 } | 276 } |
318 #endif | 277 #endif |
319 #if SK_MESA | 278 #if SK_MESA |
320 else if (0 == strcmp(FLAGS_config[0], "mesa")) { | 279 else if (0 == strcmp(FLAGS_config[0], "mesa")) { |
321 deviceType = sk_tools::PictureRenderer::kMesa_DeviceType; | 280 deviceType = sk_tools::PictureRenderer::kMesa_DeviceType; |
322 if (FLAGS_multi > 1) { | |
323 error.printf("Mesa not compatible with multithreaded tiling.\n")
; | |
324 return NULL; | |
325 } | |
326 } | 281 } |
327 #endif | 282 #endif |
328 #endif | 283 #endif |
329 else { | 284 else { |
330 error.printf("%s is not a valid mode for --config\n", FLAGS_config[0
]); | 285 error.printf("%s is not a valid mode for --config\n", FLAGS_config[0
]); |
331 return NULL; | 286 return NULL; |
332 } | 287 } |
333 renderer->setDeviceType(deviceType); | 288 renderer->setDeviceType(deviceType); |
334 #if SK_SUPPORT_GPU | 289 #if SK_SUPPORT_GPU |
335 renderer->setSampleCount(sampleCount); | 290 renderer->setSampleCount(sampleCount); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 if (FLAGS_pipe && sk_tools::PictureRenderer::kNone_BBoxHierarchyType !=
bbhType) { | 323 if (FLAGS_pipe && sk_tools::PictureRenderer::kNone_BBoxHierarchyType !=
bbhType) { |
369 error.printf("--pipe and --bbh cannot be used together\n"); | 324 error.printf("--pipe and --bbh cannot be used together\n"); |
370 return NULL; | 325 return NULL; |
371 } | 326 } |
372 } | 327 } |
373 renderer->setBBoxHierarchyType(bbhType); | 328 renderer->setBBoxHierarchyType(bbhType); |
374 renderer->setScaleFactor(SkDoubleToScalar(FLAGS_scale)); | 329 renderer->setScaleFactor(SkDoubleToScalar(FLAGS_scale)); |
375 | 330 |
376 return renderer.detach(); | 331 return renderer.detach(); |
377 } | 332 } |
OLD | NEW |