| OLD | NEW | 
|---|
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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 | 
| OLD | NEW | 
|---|