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

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

Issue 616023002: Allow previously-hoisted layers to be reused in the same draw (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Add comments 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 * Copyright 2014 Google Inc. 2 * Copyright 2014 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 "GrLayerCache.h" 8 #include "GrLayerCache.h"
9 #include "GrLayerHoister.h" 9 #include "GrLayerHoister.h"
10 #include "SkCanvas.h" 10 #include "SkCanvas.h"
11 #include "SkRecordDraw.h" 11 #include "SkRecordDraw.h"
12 #include "GrRecordReplaceDraw.h" 12 #include "GrRecordReplaceDraw.h"
13 #include "SkGrPixelRef.h" 13 #include "SkGrPixelRef.h"
14 #include "SkSurface.h" 14 #include "SkSurface.h"
15 15
16 // Return true if any layers are suitable for hoisting 16 // Return true if any layers are suitable for hoisting
17 bool GrLayerHoister::FindLayersToHoist(const SkPicture* topLevelPicture, 17 bool GrLayerHoister::FindLayersToHoist(const SkPicture* topLevelPicture,
18 const SkRect& query, 18 const SkRect& query,
19 SkTDArray<HoistedLayer>* atlased, 19 SkTDArray<HoistedLayer>* atlased,
20 SkTDArray<HoistedLayer>* nonAtlased, 20 SkTDArray<HoistedLayer>* nonAtlased,
21 SkTDArray<HoistedLayer>* recycled,
21 GrLayerCache* layerCache) { 22 GrLayerCache* layerCache) {
22 bool anyHoisted = false; 23 bool anyHoisted = false;
23 24
24 SkPicture::AccelData::Key key = GrAccelData::ComputeAccelDataKey(); 25 SkPicture::AccelData::Key key = GrAccelData::ComputeAccelDataKey();
25 26
26 const SkPicture::AccelData* topLevelData = topLevelPicture->EXPERIMENTAL_get AccelData(key); 27 const SkPicture::AccelData* topLevelData = topLevelPicture->EXPERIMENTAL_get AccelData(key);
27 if (NULL == topLevelData) { 28 if (NULL == topLevelData) {
28 return false; 29 return false;
29 } 30 }
30 31
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 desc.fHeight = info.fSize.fHeight; 95 desc.fHeight = info.fSize.fHeight;
95 desc.fConfig = kSkia8888_GrPixelConfig; 96 desc.fConfig = kSkia8888_GrPixelConfig;
96 // TODO: need to deal with sample count 97 // TODO: need to deal with sample count
97 98
98 bool needsRendering = layerCache->lock(layer, desc, 99 bool needsRendering = layerCache->lock(layer, desc,
99 info.fHasNestedLayers || info .fIsNested); 100 info.fHasNestedLayers || info .fIsNested);
100 if (NULL == layer->texture()) { 101 if (NULL == layer->texture()) {
101 continue; 102 continue;
102 } 103 }
103 104
105 HoistedLayer* hl;
106
104 if (needsRendering) { 107 if (needsRendering) {
105 HoistedLayer* hl;
106
107 if (layer->isAtlased()) { 108 if (layer->isAtlased()) {
108 hl = atlased->append(); 109 hl = atlased->append();
109 } else { 110 } else {
110 hl = nonAtlased->append(); 111 hl = nonAtlased->append();
111 } 112 }
112 113 } else {
113 hl->fLayer = layer; 114 hl = recycled->append();
114 hl->fPicture = pict;
115 hl->fOffset = info.fOffset;
116 hl->fCTM = info.fOriginXform;
117 } 115 }
116
117 hl->fLayer = layer;
118 hl->fPicture = pict;
119 hl->fOffset = info.fOffset;
120 hl->fCTM = info.fOriginXform;
118 } 121 }
119 } 122 }
120 123
121 return anyHoisted; 124 return anyHoisted;
122 } 125 }
123 126
124 static void wrap_texture(GrTexture* texture, int width, int height, SkBitmap* re sult) { 127 static void wrap_texture(GrTexture* texture, int width, int height, SkBitmap* re sult) {
125 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height); 128 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
126 result->setInfo(info); 129 result->setInfo(info);
127 result->setPixelRef(SkNEW_ARGS(SkGrPixelRef, (info, texture)))->unref(); 130 result->setPixelRef(SkNEW_ARGS(SkGrPixelRef, (info, texture)))->unref();
(...skipping 25 matching lines...) Expand all
153 156
154 layerInfo->fSrcRect = SkIRect::MakeXYWH(layers[i].fLayer->rect().fLeft, 157 layerInfo->fSrcRect = SkIRect::MakeXYWH(layers[i].fLayer->rect().fLeft,
155 layers[i].fLayer->rect().fTop, 158 layers[i].fLayer->rect().fTop,
156 layers[i].fLayer->rect().width() , 159 layers[i].fLayer->rect().width() ,
157 layers[i].fLayer->rect().height( )); 160 layers[i].fLayer->rect().height( ));
158 } 161 }
159 } 162 }
160 163
161 void GrLayerHoister::DrawLayers(const SkTDArray<HoistedLayer>& atlased, 164 void GrLayerHoister::DrawLayers(const SkTDArray<HoistedLayer>& atlased,
162 const SkTDArray<HoistedLayer>& nonAtlased, 165 const SkTDArray<HoistedLayer>& nonAtlased,
166 const SkTDArray<HoistedLayer>& recycled,
163 GrReplacements* replacements) { 167 GrReplacements* replacements) {
164 // Render the atlased layers that require it 168 // Render the atlased layers that require it
165 if (atlased.count() > 0) { 169 if (atlased.count() > 0) {
166 // All the atlased layers are rendered into the same GrTexture 170 // All the atlased layers are rendered into the same GrTexture
167 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTargetDirect( 171 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTargetDirect(
168 atlased[0].fLayer->texture()->asRenderTa rget(), NULL)); 172 atlased[0].fLayer->texture()->asRenderTa rget(), NULL));
169 173
170 SkCanvas* atlasCanvas = surface->getCanvas(); 174 SkCanvas* atlasCanvas = surface->getCanvas();
171 175
172 SkPaint paint; 176 SkPaint paint;
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 layerCanvas->concat(nonAtlased[i].fCTM); 250 layerCanvas->concat(nonAtlased[i].fCTM);
247 251
248 SkRecordPartialDraw(*pict->fRecord.get(), layerCanvas, bound, 252 SkRecordPartialDraw(*pict->fRecord.get(), layerCanvas, bound,
249 layer->start()+1, layer->stop(), initialCTM); 253 layer->start()+1, layer->stop(), initialCTM);
250 254
251 layerCanvas->flush(); 255 layerCanvas->flush();
252 } 256 }
253 257
254 convert_layers_to_replacements(atlased, replacements); 258 convert_layers_to_replacements(atlased, replacements);
255 convert_layers_to_replacements(nonAtlased, replacements); 259 convert_layers_to_replacements(nonAtlased, replacements);
260 convert_layers_to_replacements(recycled, replacements);
256 } 261 }
257 262
258 static void unlock_layer_in_cache(GrLayerCache* layerCache, 263 static void unlock_layer_in_cache(GrLayerCache* layerCache,
259 const SkPicture* picture, 264 const SkPicture* picture,
260 GrCachedLayer* layer) { 265 GrCachedLayer* layer) {
261 layerCache->unlock(layer); 266 layerCache->unlock(layer);
262 267
263 #if DISABLE_CACHING 268 #if DISABLE_CACHING
264 // This code completely clears out the atlas. It is required when 269 // This code completely clears out the atlas. It is required when
265 // caching is disabled so the atlas doesn't fill up and force more 270 // caching is disabled so the atlas doesn't fill up and force more
266 // free floating layers 271 // free floating layers
267 layerCache->purge(picture->uniqueID()); 272 layerCache->purge(picture->uniqueID());
268 #endif 273 #endif
269 } 274 }
270 275
271 void GrLayerHoister::UnlockLayers(GrLayerCache* layerCache, 276 void GrLayerHoister::UnlockLayers(GrLayerCache* layerCache,
272 const SkTDArray<HoistedLayer>& atlased, 277 const SkTDArray<HoistedLayer>& atlased,
273 const SkTDArray<HoistedLayer>& nonAtlased) { 278 const SkTDArray<HoistedLayer>& nonAtlased,
279 const SkTDArray<HoistedLayer>& recycled) {
274 280
275 for (int i = 0; i < atlased.count(); ++i) { 281 for (int i = 0; i < atlased.count(); ++i) {
276 unlock_layer_in_cache(layerCache, atlased[i].fPicture, atlased[i].fLayer ); 282 unlock_layer_in_cache(layerCache, atlased[i].fPicture, atlased[i].fLayer );
277 } 283 }
278 284
279 for (int i = 0; i < nonAtlased.count(); ++i) { 285 for (int i = 0; i < nonAtlased.count(); ++i) {
280 unlock_layer_in_cache(layerCache, nonAtlased[i].fPicture, nonAtlased[i]. fLayer); 286 unlock_layer_in_cache(layerCache, nonAtlased[i].fPicture, nonAtlased[i]. fLayer);
281 } 287 }
282 288
289 for (int i = 0; i < recycled.count(); ++i) {
290 unlock_layer_in_cache(layerCache, recycled[i].fPicture, recycled[i].fLay er);
291 }
292
283 #if DISABLE_CACHING 293 #if DISABLE_CACHING
284 // This code completely clears out the atlas. It is required when 294 // This code completely clears out the atlas. It is required when
285 // caching is disabled so the atlas doesn't fill up and force more 295 // caching is disabled so the atlas doesn't fill up and force more
286 // free floating layers 296 // free floating layers
287 layerCache->purgeAll(); 297 layerCache->purgeAll();
288 #endif 298 #endif
289 } 299 }
290 300
OLDNEW
« no previous file with comments | « src/gpu/GrLayerHoister.h ('k') | src/gpu/GrPictureUtils.cpp » ('j') | src/gpu/GrPictureUtils.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698