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

Side by Side Diff: src/gpu/GrAADistanceFieldPathRenderer.cpp

Issue 677463002: Set temporary paths volatile so we don't cache them. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 2 months 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 unified diff | Download patch
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2014 Google Inc. 3 * Copyright 2014 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "GrAADistanceFieldPathRenderer.h" 9 #include "GrAADistanceFieldPathRenderer.h"
10 10
(...skipping 13 matching lines...) Expand all
24 24
25 #define PLOT_WIDTH 256 25 #define PLOT_WIDTH 256
26 #define PLOT_HEIGHT 256 26 #define PLOT_HEIGHT 256
27 27
28 #define NUM_PLOTS_X (ATLAS_TEXTURE_WIDTH / PLOT_WIDTH) 28 #define NUM_PLOTS_X (ATLAS_TEXTURE_WIDTH / PLOT_WIDTH)
29 #define NUM_PLOTS_Y (ATLAS_TEXTURE_HEIGHT / PLOT_HEIGHT) 29 #define NUM_PLOTS_Y (ATLAS_TEXTURE_HEIGHT / PLOT_HEIGHT)
30 30
31 SK_CONF_DECLARE(bool, c_DumpPathCache, "gpu.dumpPathCache", false, 31 SK_CONF_DECLARE(bool, c_DumpPathCache, "gpu.dumpPathCache", false,
32 "Dump the contents of the path cache before every purge."); 32 "Dump the contents of the path cache before every purge.");
33 33
34 #ifdef DF_PATH_TRACKING
35 static int g_NumCachedPaths = 0;
36 static int g_NumFreedPaths = 0;
37 #endif
38
34 //////////////////////////////////////////////////////////////////////////////// 39 ////////////////////////////////////////////////////////////////////////////////
35 GrAADistanceFieldPathRenderer::~GrAADistanceFieldPathRenderer() { 40 GrAADistanceFieldPathRenderer::~GrAADistanceFieldPathRenderer() {
36 PathDataList::Iter iter; 41 PathDataList::Iter iter;
37 iter.init(fPathList, PathDataList::Iter::kHead_IterStart); 42 iter.init(fPathList, PathDataList::Iter::kHead_IterStart);
38 PathData* pathData; 43 PathData* pathData;
39 while ((pathData = iter.get())) { 44 while ((pathData = iter.get())) {
40 iter.next(); 45 iter.next();
41 fPathList.remove(pathData); 46 fPathList.remove(pathData);
42 SkDELETE(pathData); 47 SkDELETE(pathData);
43 } 48 }
44 49
45 SkDELETE(fAtlas); 50 SkDELETE(fAtlas);
51
52 #ifdef DF_PATH_TRACKING
53 SkDebugf("Num cached paths: %d\n", g_NumCachedPaths);
54 SkDebugf("Num freed paths: %d\n", g_NumFreedPaths);
55 #endif
46 } 56 }
47 57
48 //////////////////////////////////////////////////////////////////////////////// 58 ////////////////////////////////////////////////////////////////////////////////
49 bool GrAADistanceFieldPathRenderer::canDrawPath(const SkPath& path, 59 bool GrAADistanceFieldPathRenderer::canDrawPath(const SkPath& path,
50 const SkStrokeRec& stroke, 60 const SkStrokeRec& stroke,
51 const GrDrawTarget* target, 61 const GrDrawTarget* target,
52 bool antiAlias) const { 62 bool antiAlias) const {
63
53 // TODO: Support inverse fill 64 // TODO: Support inverse fill
54 // TODO: Support strokes 65 // TODO: Support strokes
55 if (!target->caps()->shaderDerivativeSupport() || !antiAlias || path.isInver seFillType() 66 if (!target->caps()->shaderDerivativeSupport() || !antiAlias || path.isInver seFillType()
56 || SkStrokeRec::kFill_Style != stroke.getStyle()) { 67 || path.isVolatile() || SkStrokeRec::kFill_Style != stroke.getStyle()) {
57 return false; 68 return false;
58 } 69 }
59 70
60 // currently don't support perspective or scaling more than 3x 71 // currently don't support perspective or scaling more than 3x
61 const GrDrawState& drawState = target->getDrawState(); 72 const GrDrawState& drawState = target->getDrawState();
62 const SkMatrix& vm = drawState.getViewMatrix(); 73 const SkMatrix& vm = drawState.getViewMatrix();
63 if (vm.hasPerspective() || vm.getMaxScale() > 3.0f) { 74 if (vm.hasPerspective() || vm.getMaxScale() > 3.0f) {
64 return false; 75 return false;
65 } 76 }
66 77
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 scaledBounds.offset(-SkIntToScalar(SK_DistanceFieldInset) - kAntiAliasPad + dx, 234 scaledBounds.offset(-SkIntToScalar(SK_DistanceFieldInset) - kAntiAliasPad + dx,
224 -SkIntToScalar(SK_DistanceFieldInset) - kAntiAliasPad + dy); 235 -SkIntToScalar(SK_DistanceFieldInset) - kAntiAliasPad + dy);
225 pathData->fBounds = scaledBounds; 236 pathData->fBounds = scaledBounds;
226 // origin we render from is inset from distance field edge 237 // origin we render from is inset from distance field edge
227 atlasLocation.fX += SK_DistanceFieldInset; 238 atlasLocation.fX += SK_DistanceFieldInset;
228 atlasLocation.fY += SK_DistanceFieldInset; 239 atlasLocation.fY += SK_DistanceFieldInset;
229 pathData->fAtlasLocation = atlasLocation; 240 pathData->fAtlasLocation = atlasLocation;
230 241
231 fPathCache.add(pathData); 242 fPathCache.add(pathData);
232 fPathList.addToTail(pathData); 243 fPathList.addToTail(pathData);
233 244 #ifdef DF_PATH_TRACKING
245 ++g_NumCachedPaths;
246 #endif
247
234 return pathData; 248 return pathData;
235 } 249 }
236 250
237 bool GrAADistanceFieldPathRenderer::freeUnusedPlot() { 251 bool GrAADistanceFieldPathRenderer::freeUnusedPlot() {
238 // find an unused plot 252 // find an unused plot
239 GrPlot* plot = fAtlas->getUnusedPlot(); 253 GrPlot* plot = fAtlas->getUnusedPlot();
240 if (NULL == plot) { 254 if (NULL == plot) {
241 return false; 255 return false;
242 } 256 }
243 plot->resetRects(); 257 plot->resetRects();
244 258
245 // remove any paths that use this plot 259 // remove any paths that use this plot
246 PathDataList::Iter iter; 260 PathDataList::Iter iter;
247 iter.init(fPathList, PathDataList::Iter::kHead_IterStart); 261 iter.init(fPathList, PathDataList::Iter::kHead_IterStart);
248 PathData* pathData; 262 PathData* pathData;
249 while ((pathData = iter.get())) { 263 while ((pathData = iter.get())) {
250 iter.next(); 264 iter.next();
251 if (plot == pathData->fPlot) { 265 if (plot == pathData->fPlot) {
252 fPathCache.remove(pathData->fGenID); 266 fPathCache.remove(pathData->fGenID);
253 fPathList.remove(pathData); 267 fPathList.remove(pathData);
254 SkDELETE(pathData); 268 SkDELETE(pathData);
269 #ifdef DF_PATH_TRACKING
270 --g_NumFreedPaths;
271 #endif
255 } 272 }
256 } 273 }
257 274
258 // tell the atlas to free the plot 275 // tell the atlas to free the plot
259 GrAtlas::RemovePlot(&fPlotUsage, plot); 276 GrAtlas::RemovePlot(&fPlotUsage, plot);
260 277
261 return true; 278 return true;
262 } 279 }
263 280
264 bool GrAADistanceFieldPathRenderer::internalDrawPath(const SkPath& path, 281 bool GrAADistanceFieldPathRenderer::internalDrawPath(const SkPath& path,
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 349
333 350
334 vm.mapRect(&r); 351 vm.mapRect(&r);
335 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6, &r); 352 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6, &r);
336 target->resetVertexSource(); 353 target->resetVertexSource();
337 target->resetIndexSource(); 354 target->resetIndexSource();
338 355
339 return true; 356 return true;
340 } 357 }
341 358
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698