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

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

Issue 533673002: Expose layer hoisting API in GrContext (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix No GPU build 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
« no previous file with comments | « src/gpu/GrLayerHoister.h ('k') | src/gpu/SkGpuDevice.cpp » ('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 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(GrContext* context,
18 const SkPicture* topLevelPicture,
18 const SkRect& query, 19 const SkRect& query,
19 SkTDArray<HoistedLayer>* atlased, 20 SkTDArray<GrHoistedLayer>* atlased,
20 SkTDArray<HoistedLayer>* nonAtlased, 21 SkTDArray<GrHoistedLayer>* nonAtlased,
21 SkTDArray<HoistedLayer>* recycled, 22 SkTDArray<GrHoistedLayer>* recycled) {
22 GrLayerCache* layerCache) {
23 bool anyHoisted = false; 23 bool anyHoisted = false;
24 24
25 GrLayerCache* layerCache = context->getLayerCache();
26
27 layerCache->processDeletedPictures();
28
25 SkPicture::AccelData::Key key = GrAccelData::ComputeAccelDataKey(); 29 SkPicture::AccelData::Key key = GrAccelData::ComputeAccelDataKey();
26 30
27 const SkPicture::AccelData* topLevelData = topLevelPicture->EXPERIMENTAL_get AccelData(key); 31 const SkPicture::AccelData* topLevelData = topLevelPicture->EXPERIMENTAL_get AccelData(key);
28 if (NULL == topLevelData) { 32 if (NULL == topLevelData) {
29 return false; 33 return false;
30 } 34 }
31 35
32 const GrAccelData *topLevelGPUData = static_cast<const GrAccelData*>(topLeve lData); 36 const GrAccelData *topLevelGPUData = static_cast<const GrAccelData*>(topLeve lData);
33 if (0 == topLevelGPUData->numSaveLayers()) { 37 if (0 == topLevelGPUData->numSaveLayers()) {
34 return false; 38 return false;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 desc.fHeight = info.fSize.fHeight; 99 desc.fHeight = info.fSize.fHeight;
96 desc.fConfig = kSkia8888_GrPixelConfig; 100 desc.fConfig = kSkia8888_GrPixelConfig;
97 // TODO: need to deal with sample count 101 // TODO: need to deal with sample count
98 102
99 bool needsRendering = layerCache->lock(layer, desc, 103 bool needsRendering = layerCache->lock(layer, desc,
100 info.fHasNestedLayers || info .fIsNested); 104 info.fHasNestedLayers || info .fIsNested);
101 if (NULL == layer->texture()) { 105 if (NULL == layer->texture()) {
102 continue; 106 continue;
103 } 107 }
104 108
105 HoistedLayer* hl; 109 GrHoistedLayer* hl;
106 110
107 if (needsRendering) { 111 if (needsRendering) {
108 if (layer->isAtlased()) { 112 if (layer->isAtlased()) {
109 hl = atlased->append(); 113 hl = atlased->append();
110 } else { 114 } else {
111 hl = nonAtlased->append(); 115 hl = nonAtlased->append();
112 } 116 }
113 } else { 117 } else {
114 hl = recycled->append(); 118 hl = recycled->append();
115 } 119 }
116 120
117 hl->fLayer = layer; 121 hl->fLayer = layer;
118 hl->fPicture = pict; 122 hl->fPicture = pict;
119 hl->fOffset = info.fOffset; 123 hl->fOffset = info.fOffset;
120 hl->fCTM = info.fOriginXform; 124 hl->fCTM = info.fOriginXform;
121 } 125 }
122 } 126 }
123 127
124 return anyHoisted; 128 return anyHoisted;
125 } 129 }
126 130
127 static void wrap_texture(GrTexture* texture, int width, int height, SkBitmap* re sult) { 131 static void wrap_texture(GrTexture* texture, int width, int height, SkBitmap* re sult) {
128 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height); 132 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
129 result->setInfo(info); 133 result->setInfo(info);
130 result->setPixelRef(SkNEW_ARGS(SkGrPixelRef, (info, texture)))->unref(); 134 result->setPixelRef(SkNEW_ARGS(SkGrPixelRef, (info, texture)))->unref();
131 } 135 }
132 136
133 static void convert_layers_to_replacements(const SkTDArray<GrLayerHoister::Hoist edLayer>& layers, 137 static void convert_layers_to_replacements(const SkTDArray<GrHoistedLayer>& laye rs,
134 GrReplacements* replacements) { 138 GrReplacements* replacements) {
135 // TODO: just replace GrReplacements::ReplacementInfo with GrCachedLayer? 139 // TODO: just replace GrReplacements::ReplacementInfo with GrCachedLayer?
136 for (int i = 0; i < layers.count(); ++i) { 140 for (int i = 0; i < layers.count(); ++i) {
137 GrCachedLayer* layer = layers[i].fLayer; 141 GrCachedLayer* layer = layers[i].fLayer;
138 const SkPicture* picture = layers[i].fPicture; 142 const SkPicture* picture = layers[i].fPicture;
139 143
140 GrReplacements::ReplacementInfo* layerInfo = 144 GrReplacements::ReplacementInfo* layerInfo =
141 replacements->newReplacement(picture->uniqueID(), 145 replacements->newReplacement(picture->uniqueID(),
142 layer->start(), 146 layer->start(),
143 layers[i].fCTM); 147 layers[i].fCTM);
(...skipping 13 matching lines...) Expand all
157 ? SkNEW_ARGS(SkPaint, (*layers[i].fLayer->paint( ))) 161 ? SkNEW_ARGS(SkPaint, (*layers[i].fLayer->paint( )))
158 : NULL; 162 : NULL;
159 163
160 layerInfo->fSrcRect = SkIRect::MakeXYWH(layers[i].fLayer->rect().fLeft, 164 layerInfo->fSrcRect = SkIRect::MakeXYWH(layers[i].fLayer->rect().fLeft,
161 layers[i].fLayer->rect().fTop, 165 layers[i].fLayer->rect().fTop,
162 layers[i].fLayer->rect().width() , 166 layers[i].fLayer->rect().width() ,
163 layers[i].fLayer->rect().height( )); 167 layers[i].fLayer->rect().height( ));
164 } 168 }
165 } 169 }
166 170
167 void GrLayerHoister::DrawLayers(const SkTDArray<HoistedLayer>& atlased, 171 void GrLayerHoister::DrawLayers(const SkTDArray<GrHoistedLayer>& atlased,
168 const SkTDArray<HoistedLayer>& nonAtlased, 172 const SkTDArray<GrHoistedLayer>& nonAtlased,
169 const SkTDArray<HoistedLayer>& recycled, 173 const SkTDArray<GrHoistedLayer>& recycled,
170 GrReplacements* replacements) { 174 GrReplacements* replacements) {
171 // Render the atlased layers that require it 175 // Render the atlased layers that require it
172 if (atlased.count() > 0) { 176 if (atlased.count() > 0) {
173 // All the atlased layers are rendered into the same GrTexture 177 // All the atlased layers are rendered into the same GrTexture
174 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTargetDirect( 178 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTargetDirect(
175 atlased[0].fLayer->texture()->asRenderTa rget(), NULL)); 179 atlased[0].fLayer->texture()->asRenderTa rget(), NULL));
176 180
177 SkCanvas* atlasCanvas = surface->getCanvas(); 181 SkCanvas* atlasCanvas = surface->getCanvas();
178 182
179 SkPaint paint; 183 SkPaint paint;
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 layerCache->unlock(layer); 273 layerCache->unlock(layer);
270 274
271 #if DISABLE_CACHING 275 #if DISABLE_CACHING
272 // This code completely clears out the atlas. It is required when 276 // This code completely clears out the atlas. It is required when
273 // caching is disabled so the atlas doesn't fill up and force more 277 // caching is disabled so the atlas doesn't fill up and force more
274 // free floating layers 278 // free floating layers
275 layerCache->purge(picture->uniqueID()); 279 layerCache->purge(picture->uniqueID());
276 #endif 280 #endif
277 } 281 }
278 282
279 void GrLayerHoister::UnlockLayers(GrLayerCache* layerCache, 283 void GrLayerHoister::UnlockLayers(GrContext* context,
280 const SkTDArray<HoistedLayer>& atlased, 284 const SkTDArray<GrHoistedLayer>& atlased,
281 const SkTDArray<HoistedLayer>& nonAtlased, 285 const SkTDArray<GrHoistedLayer>& nonAtlased,
282 const SkTDArray<HoistedLayer>& recycled) { 286 const SkTDArray<GrHoistedLayer>& recycled) {
287 GrLayerCache* layerCache = context->getLayerCache();
283 288
284 for (int i = 0; i < atlased.count(); ++i) { 289 for (int i = 0; i < atlased.count(); ++i) {
285 unlock_layer_in_cache(layerCache, atlased[i].fPicture, atlased[i].fLayer ); 290 unlock_layer_in_cache(layerCache, atlased[i].fPicture, atlased[i].fLayer );
286 } 291 }
287 292
288 for (int i = 0; i < nonAtlased.count(); ++i) { 293 for (int i = 0; i < nonAtlased.count(); ++i) {
289 unlock_layer_in_cache(layerCache, nonAtlased[i].fPicture, nonAtlased[i]. fLayer); 294 unlock_layer_in_cache(layerCache, nonAtlased[i].fPicture, nonAtlased[i]. fLayer);
290 } 295 }
291 296
292 for (int i = 0; i < recycled.count(); ++i) { 297 for (int i = 0; i < recycled.count(); ++i) {
293 unlock_layer_in_cache(layerCache, recycled[i].fPicture, recycled[i].fLay er); 298 unlock_layer_in_cache(layerCache, recycled[i].fPicture, recycled[i].fLay er);
294 } 299 }
295 300
296 #if DISABLE_CACHING 301 #if DISABLE_CACHING
297 // This code completely clears out the atlas. It is required when 302 // This code completely clears out the atlas. It is required when
298 // caching is disabled so the atlas doesn't fill up and force more 303 // caching is disabled so the atlas doesn't fill up and force more
299 // free floating layers 304 // free floating layers
300 layerCache->purgeAll(); 305 layerCache->purgeAll();
301 #endif 306 #endif
302 } 307 }
303 308
OLDNEW
« no previous file with comments | « src/gpu/GrLayerHoister.h ('k') | src/gpu/SkGpuDevice.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698