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

Side by Side Diff: src/core/SkPicturePlayback.cpp

Issue 324293004: Remove picture pre-allocation from SkPictureRecorder (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix initializer list order Created 6 years, 6 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
« no previous file with comments | « src/core/SkPicturePlayback.h ('k') | src/core/SkPictureRecord.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 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 #include <new> 7 #include <new>
8 #include "SkBBoxHierarchy.h" 8 #include "SkBBoxHierarchy.h"
9 #include "SkPicturePlayback.h" 9 #include "SkPicturePlayback.h"
10 #include "SkPictureRecord.h" 10 #include "SkPictureRecord.h"
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 if (record.fTextWrites != 0) 92 if (record.fTextWrites != 0)
93 SkDebugf("text size %zd (text strings:%d) ", record.fTextBytes, record.f TextWrites); 93 SkDebugf("text size %zd (text strings:%d) ", record.fTextBytes, record.f TextWrites);
94 94
95 SkDebugf("\n"); 95 SkDebugf("\n");
96 #endif 96 #endif
97 #ifdef SK_DEBUG_DUMP 97 #ifdef SK_DEBUG_DUMP
98 record.dumpMatrices(); 98 record.dumpMatrices();
99 record.dumpPaints(); 99 record.dumpPaints();
100 #endif 100 #endif
101 101
102 record.validate(record.writeStream().bytesWritten(), 0);
103 const SkWriter32& writer = record.writeStream();
104 this->init(); 102 this->init();
105 SkASSERT(!fOpData); 103
106 if (writer.bytesWritten() == 0) { 104 fOpData = record.opData(deepCopyOps);
107 fOpData = SkData::NewEmpty();
108 return;
109 }
110 if (deepCopyOps) {
111 // Don't try to do anything clever w.r.t. copy on write
112 fOpData = SkData::NewWithCopy(writer.contiguousArray(), writer.bytesWrit ten());
113 } else {
114 fOpData = writer.snapshotAsData();
115 }
116 105
117 fBoundingHierarchy = record.fBoundingHierarchy; 106 fBoundingHierarchy = record.fBoundingHierarchy;
118 fStateTree = record.fStateTree; 107 fStateTree = record.fStateTree;
119 108
120 SkSafeRef(fBoundingHierarchy); 109 SkSafeRef(fBoundingHierarchy);
121 SkSafeRef(fStateTree); 110 SkSafeRef(fStateTree);
111 fContentInfo.set(record.fContentInfo);
122 112
123 if (NULL != fBoundingHierarchy) { 113 if (NULL != fBoundingHierarchy) {
124 fBoundingHierarchy->flushDeferredInserts(); 114 fBoundingHierarchy->flushDeferredInserts();
125 } 115 }
126 116
127 // copy over the refcnt dictionary to our reader 117 // copy over the refcnt dictionary to our reader
128 record.fFlattenableHeap.setupPlaybacks(); 118 record.fFlattenableHeap.setupPlaybacks();
129 119
130 fBitmaps = record.fBitmapHeap->extractBitmaps(); 120 fBitmaps = record.fBitmapHeap->extractBitmaps();
131 fPaints = record.fPaints.unflattenToArray(); 121 fPaints = record.fPaints.unflattenToArray();
(...skipping 27 matching lines...) Expand all
159 if (paths != 0) 149 if (paths != 0)
160 SkDebugf("paths size %zd (paths:%d) ", pathBytes, paths); 150 SkDebugf("paths size %zd (paths:%d) ", pathBytes, paths);
161 if (pictures != 0) 151 if (pictures != 0)
162 SkDebugf("pictures size %zd (pictures:%d) ", pictureBytes, pictures); 152 SkDebugf("pictures size %zd (pictures:%d) ", pictureBytes, pictures);
163 if (regions != 0) 153 if (regions != 0)
164 SkDebugf("regions size %zd (regions:%d) ", regionBytes, regions); 154 SkDebugf("regions size %zd (regions:%d) ", regionBytes, regions);
165 SkDebugf("\n"); 155 SkDebugf("\n");
166 #endif 156 #endif
167 } 157 }
168 158
169 SkPicturePlayback::SkPicturePlayback(const SkPicture* picture, const SkPicturePl ayback& src, 159 SkPicturePlayback::SkPicturePlayback(const SkPicture* picture,
160 const SkPicturePlayback& src,
170 SkPictCopyInfo* deepCopyInfo) 161 SkPictCopyInfo* deepCopyInfo)
171 : fPicture(picture) 162 : fPicture(picture)
172 , fInfo(src.fInfo) { 163 , fInfo(src.fInfo) {
173 this->init(); 164 this->init();
174 165
175 fBitmapHeap.reset(SkSafeRef(src.fBitmapHeap.get())); 166 fBitmapHeap.reset(SkSafeRef(src.fBitmapHeap.get()));
176 167
177 fOpData = SkSafeRef(src.fOpData); 168 fOpData = SkSafeRef(src.fOpData);
178 169
179 fBoundingHierarchy = src.fBoundingHierarchy; 170 fBoundingHierarchy = src.fBoundingHierarchy;
180 fStateTree = src.fStateTree; 171 fStateTree = src.fStateTree;
172 fContentInfo.set(src.fContentInfo);
181 173
182 SkSafeRef(fBoundingHierarchy); 174 SkSafeRef(fBoundingHierarchy);
183 SkSafeRef(fStateTree); 175 SkSafeRef(fStateTree);
184 176
185 if (deepCopyInfo) { 177 if (deepCopyInfo) {
186 SkASSERT(deepCopyInfo->initialized); 178 SkASSERT(deepCopyInfo->initialized);
187 179
188 int paintCount = SafeCount(src.fPaints); 180 int paintCount = SafeCount(src.fPaints);
189 181
190 if (src.fBitmaps) { 182 if (src.fBitmaps) {
(...skipping 1137 matching lines...) Expand 10 before | Expand all | Expand 10 after
1328 skipCull.fSize; 1320 skipCull.fSize;
1329 SkDebugf("--- Clip skips %d%% rect:%d rrect:%d path:%d rgn:%d cull:%d\n" , 1321 SkDebugf("--- Clip skips %d%% rect:%d rrect:%d path:%d rgn:%d cull:%d\n" ,
1330 size * 100 / reader.offset(), skipRect.fCount, skipRRect.fCount, 1322 size * 100 / reader.offset(), skipRect.fCount, skipRRect.fCount,
1331 skipPath.fCount, skipRegion.fCount, skipCull.fCount); 1323 skipPath.fCount, skipRegion.fCount, skipCull.fCount);
1332 SkDebugf("--- Total ops: %d\n", opCount); 1324 SkDebugf("--- Total ops: %d\n", opCount);
1333 } 1325 }
1334 #endif 1326 #endif
1335 // this->dumpSize(); 1327 // this->dumpSize();
1336 } 1328 }
1337 1329
1330
1331 #if SK_SUPPORT_GPU
1332 bool SkPicturePlayback::suitableForGpuRasterization(GrContext* context, const ch ar **reason) const {
1333 // TODO: the heuristic used here needs to be refined
1334 static const int kNumPaintWithPathEffectUsesTol = 1;
1335 static const int kNumAAConcavePaths = 5;
1336
1337 SkASSERT(fContentInfo.numAAHairlineConcavePaths() <= fContentInfo.numAAConca vePaths());
1338
1339 bool ret = fContentInfo.numPaintWithPathEffectUses() < kNumPaintWithPathEffe ctUsesTol &&
1340 (fContentInfo.numAAConcavePaths() - fContentInfo.numAAHairli neConcavePaths())
1341 < kNumAAConcavePaths;
1342 if (!ret && NULL != reason) {
1343 if (fContentInfo.numPaintWithPathEffectUses() >= kNumPaintWithPathEffect UsesTol)
1344 *reason = "Too many path effects.";
1345 else if ((fContentInfo.numAAConcavePaths() - fContentInfo.numAAHairlineC oncavePaths())
1346 >= kNumAAConcavePaths)
1347 *reason = "Too many anti-aliased concave paths.";
1348 else
1349 *reason = "Unknown reason for GPU unsuitability.";
1350 }
1351 return ret;
1352 }
1353 #endif
1338 /////////////////////////////////////////////////////////////////////////////// 1354 ///////////////////////////////////////////////////////////////////////////////
1339 1355
1340 #ifdef SK_DEBUG_SIZE 1356 #ifdef SK_DEBUG_SIZE
1341 int SkPicturePlayback::size(size_t* sizePtr) { 1357 int SkPicturePlayback::size(size_t* sizePtr) {
1342 int objects = bitmaps(sizePtr); 1358 int objects = bitmaps(sizePtr);
1343 objects += paints(sizePtr); 1359 objects += paints(sizePtr);
1344 objects += paths(sizePtr); 1360 objects += paths(sizePtr);
1345 objects += pictures(sizePtr); 1361 objects += pictures(sizePtr);
1346 objects += regions(sizePtr); 1362 objects += regions(sizePtr);
1347 *sizePtr = fOpData.size(); 1363 *sizePtr = fOpData.size();
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after
1839 for (index = 0; index < fPictureCount; index++) 1855 for (index = 0; index < fPictureCount; index++)
1840 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer ), 1856 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer ),
1841 "picture%p, ", fPictureRefs[index]); 1857 "picture%p, ", fPictureRefs[index]);
1842 if (fPictureCount > 0) 1858 if (fPictureCount > 0)
1843 SkDebugf("%s0};\n", pBuffer); 1859 SkDebugf("%s0};\n", pBuffer);
1844 1860
1845 const_cast<SkPicturePlayback*>(this)->dumpStream(); 1861 const_cast<SkPicturePlayback*>(this)->dumpStream();
1846 } 1862 }
1847 1863
1848 #endif 1864 #endif
OLDNEW
« no previous file with comments | « src/core/SkPicturePlayback.h ('k') | src/core/SkPictureRecord.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698