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

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

Issue 753253002: Use variable length key (rather than accumulated matrix) as save layer hoisting key (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: more cleanup Created 6 years 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 "GrRecordReplaceDraw.h" 10 #include "GrRecordReplaceDraw.h"
11 11
12 #include "SkCanvas.h" 12 #include "SkCanvas.h"
13 #include "SkGrPixelRef.h" 13 #include "SkGrPixelRef.h"
14 #include "SkLayerInfo.h" 14 #include "SkLayerInfo.h"
15 #include "SkRecordDraw.h" 15 #include "SkRecordDraw.h"
16 #include "SkSurface.h" 16 #include "SkSurface.h"
17 17
18 // Create the layer information for the hoisted layer and secure the 18 // Create the layer information for the hoisted layer and secure the
19 // required texture/render target resources. 19 // required texture/render target resources.
20 static void prepare_for_hoisting(GrLayerCache* layerCache, 20 static void prepare_for_hoisting(GrLayerCache* layerCache,
21 const SkPicture* topLevelPicture, 21 const SkPicture* topLevelPicture,
22 const SkMatrix& matrix, 22 const SkMatrix& initialMat,
23 const SkLayerInfo::BlockInfo& info, 23 const SkLayerInfo::BlockInfo& info,
24 const SkIRect& layerRect, 24 const SkIRect& layerRect,
25 SkTDArray<GrHoistedLayer>* needRendering, 25 SkTDArray<GrHoistedLayer>* needRendering,
26 SkTDArray<GrHoistedLayer>* recycled, 26 SkTDArray<GrHoistedLayer>* recycled,
27 bool attemptToAtlas, 27 bool attemptToAtlas,
28 int numSamples) { 28 int numSamples) {
29 const SkPicture* pict = info.fPicture ? info.fPicture : topLevelPicture; 29 const SkPicture* pict = info.fPicture ? info.fPicture : topLevelPicture;
30 30
31 SkMatrix combined = matrix; 31 GrCachedLayer* layer = layerCache->findLayerOrCreate(topLevelPicture->unique ID(),
32 combined.preConcat(info.fPreMat);
33 combined.preConcat(info.fLocalMat);
34
35 GrCachedLayer* layer = layerCache->findLayerOrCreate(pict->uniqueID(),
36 info.fSaveLayerOpID, 32 info.fSaveLayerOpID,
37 info.fRestoreOpID, 33 info.fRestoreOpID,
38 layerRect, 34 layerRect,
39 combined, 35 initialMat,
36 info.fKey,
37 info.fKeySize,
40 info.fPaint); 38 info.fPaint);
41 GrSurfaceDesc desc; 39 GrSurfaceDesc desc;
42 desc.fFlags = kRenderTarget_GrSurfaceFlag; 40 desc.fFlags = kRenderTarget_GrSurfaceFlag;
43 desc.fWidth = layerRect.width(); 41 desc.fWidth = layerRect.width();
44 desc.fHeight = layerRect.height(); 42 desc.fHeight = layerRect.height();
45 desc.fConfig = kSkia8888_GrPixelConfig; 43 desc.fConfig = kSkia8888_GrPixelConfig;
46 desc.fSampleCnt = numSamples; 44 desc.fSampleCnt = numSamples;
47 45
48 bool locked, needsRendering; 46 bool locked, needsRendering;
49 if (attemptToAtlas) { 47 if (attemptToAtlas) {
(...skipping 19 matching lines...) Expand all
69 hl = needRendering->append(); 67 hl = needRendering->append();
70 } else { 68 } else {
71 hl = recycled->append(); 69 hl = recycled->append();
72 } 70 }
73 71
74 layerCache->addUse(layer); 72 layerCache->addUse(layer);
75 hl->fLayer = layer; 73 hl->fLayer = layer;
76 hl->fPicture = pict; 74 hl->fPicture = pict;
77 hl->fOffset = SkIPoint::Make(layerRect.fLeft, layerRect.fTop); 75 hl->fOffset = SkIPoint::Make(layerRect.fLeft, layerRect.fTop);
78 hl->fLocalMat = info.fLocalMat; 76 hl->fLocalMat = info.fLocalMat;
79 hl->fPreMat = matrix; 77 hl->fInitialMat = initialMat;
78 hl->fPreMat = initialMat;
80 hl->fPreMat.preConcat(info.fPreMat); 79 hl->fPreMat.preConcat(info.fPreMat);
81 } 80 }
82 81
83 // Atlased layers must be small enough to fit in the atlas, not have a 82 // Atlased layers must be small enough to fit in the atlas, not have a
84 // paint with an image filter and be neither nested nor nesting. 83 // paint with an image filter and be neither nested nor nesting.
85 // TODO: allow leaf nested layers to appear in the atlas. 84 // TODO: allow leaf nested layers to appear in the atlas.
86 void GrLayerHoister::FindLayersToAtlas(GrContext* context, 85 void GrLayerHoister::FindLayersToAtlas(GrContext* context,
87 const SkPicture* topLevelPicture, 86 const SkPicture* topLevelPicture,
88 const SkMatrix& initialMat, 87 const SkMatrix& initialMat,
89 const SkRect& query, 88 const SkRect& query,
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 needRendering, recycled, false, numSamples); 184 needRendering, recycled, false, numSamples);
186 } 185 }
187 } 186 }
188 187
189 static void wrap_texture(GrTexture* texture, int width, int height, SkBitmap* re sult) { 188 static void wrap_texture(GrTexture* texture, int width, int height, SkBitmap* re sult) {
190 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height); 189 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
191 result->setInfo(info); 190 result->setInfo(info);
192 result->setPixelRef(SkNEW_ARGS(SkGrPixelRef, (info, texture)))->unref(); 191 result->setPixelRef(SkNEW_ARGS(SkGrPixelRef, (info, texture)))->unref();
193 } 192 }
194 193
195 void GrLayerHoister::ConvertLayersToReplacements(const SkTDArray<GrHoistedLayer> & layers, 194 void GrLayerHoister::ConvertLayersToReplacements(const SkPicture* topLevelPictur e,
195 const SkTDArray<GrHoistedLayer> & layers,
196 GrReplacements* replacements) { 196 GrReplacements* replacements) {
197 // TODO: just replace GrReplacements::ReplacementInfo with GrCachedLayer? 197 // TODO: just replace GrReplacements::ReplacementInfo with GrCachedLayer?
198 for (int i = 0; i < layers.count(); ++i) { 198 for (int i = 0; i < layers.count(); ++i) {
199 GrCachedLayer* layer = layers[i].fLayer; 199 GrCachedLayer* layer = layers[i].fLayer;
200 const SkPicture* picture = layers[i].fPicture;
201
202 SkMatrix combined = SkMatrix::Concat(layers[i].fPreMat, layers[i].fLocal Mat);
203 200
204 GrReplacements::ReplacementInfo* layerInfo = 201 GrReplacements::ReplacementInfo* layerInfo =
205 replacements->newReplacement(picture->uniqueID(), 202 replacements->newReplacement(topLevelPicture->uniqueID(),
206 layer->start(), 203 layers[i].fInitialMat,
207 combined); 204 layer->key(), layer->keySize()) ;
208 layerInfo->fStop = layer->stop(); 205 layerInfo->fStop = layer->stop();
209 layerInfo->fPos = layers[i].fOffset; 206 layerInfo->fPos = layers[i].fOffset;
210 207
211 SkBitmap bm; 208 SkBitmap bm;
212 wrap_texture(layers[i].fLayer->texture(), 209 wrap_texture(layers[i].fLayer->texture(),
213 !layers[i].fLayer->isAtlased() ? layers[i].fLayer->rect().w idth() 210 !layers[i].fLayer->isAtlased() ? layers[i].fLayer->rect().w idth()
214 : layers[i].fLayer->texture( )->width(), 211 : layers[i].fLayer->texture( )->width(),
215 !layers[i].fLayer->isAtlased() ? layers[i].fLayer->rect().h eight() 212 !layers[i].fLayer->isAtlased() ? layers[i].fLayer->rect().h eight()
216 : layers[i].fLayer->texture( )->height(), 213 : layers[i].fLayer->texture( )->height(),
217 &bm); 214 &bm);
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 void GrLayerHoister::PurgeCache(GrContext* context) { 335 void GrLayerHoister::PurgeCache(GrContext* context) {
339 #if !GR_CACHE_HOISTED_LAYERS 336 #if !GR_CACHE_HOISTED_LAYERS
340 GrLayerCache* layerCache = context->getLayerCache(); 337 GrLayerCache* layerCache = context->getLayerCache();
341 338
342 // This code completely clears out the atlas. It is required when 339 // This code completely clears out the atlas. It is required when
343 // caching is disabled so the atlas doesn't fill up and force more 340 // caching is disabled so the atlas doesn't fill up and force more
344 // free floating layers 341 // free floating layers
345 layerCache->purgeAll(); 342 layerCache->purgeAll();
346 #endif 343 #endif
347 } 344 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698