| 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 "GrRecordReplaceDraw.h" | 10 #include "GrRecordReplaceDraw.h" |
| 11 | 11 |
| 12 #include "SkBigPicture.h" | |
| 13 #include "SkCanvas.h" | 12 #include "SkCanvas.h" |
| 14 #include "SkDeviceImageFilterProxy.h" | 13 #include "SkDeviceImageFilterProxy.h" |
| 15 #include "SkDeviceProperties.h" | 14 #include "SkDeviceProperties.h" |
| 16 #include "SkGpuDevice.h" | 15 #include "SkGpuDevice.h" |
| 17 #include "SkGrPixelRef.h" | 16 #include "SkGrPixelRef.h" |
| 18 #include "SkLayerInfo.h" | 17 #include "SkLayerInfo.h" |
| 19 #include "SkRecordDraw.h" | 18 #include "SkRecordDraw.h" |
| 20 #include "SkSurface.h" | 19 #include "SkSurface.h" |
| 21 #include "SkSurface_Gpu.h" | 20 #include "SkSurface_Gpu.h" |
| 22 | 21 |
| 23 // Create the layer information for the hoisted layer and secure the | 22 // Create the layer information for the hoisted layer and secure the |
| 24 // required texture/render target resources. | 23 // required texture/render target resources. |
| 25 static void prepare_for_hoisting(GrLayerCache* layerCache, | 24 static void prepare_for_hoisting(GrLayerCache* layerCache, |
| 26 const SkPicture* topLevelPicture, | 25 const SkPicture* topLevelPicture, |
| 27 const SkMatrix& initialMat, | 26 const SkMatrix& initialMat, |
| 28 const SkLayerInfo::BlockInfo& info, | 27 const SkLayerInfo::BlockInfo& info, |
| 29 const SkIRect& srcIR, | 28 const SkIRect& srcIR, |
| 30 const SkIRect& dstIR, | 29 const SkIRect& dstIR, |
| 31 SkTDArray<GrHoistedLayer>* needRendering, | 30 SkTDArray<GrHoistedLayer>* needRendering, |
| 32 SkTDArray<GrHoistedLayer>* recycled, | 31 SkTDArray<GrHoistedLayer>* recycled, |
| 33 bool attemptToAtlas, | 32 bool attemptToAtlas, |
| 34 int numSamples) { | 33 int numSamples) { |
| 35 const SkPicture* pict = info.fPicture ? info.fPicture : topLevelPicture; | 34 const SkPicture* pict = info.fPicture ? info.fPicture : topLevelPicture; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 GrHoistedLayer* hl; | 67 GrHoistedLayer* hl; |
| 69 | 68 |
| 70 if (needsRendering) { | 69 if (needsRendering) { |
| 71 if (!attemptToAtlas) { | 70 if (!attemptToAtlas) { |
| 72 SkASSERT(!layer->isAtlased()); | 71 SkASSERT(!layer->isAtlased()); |
| 73 } | 72 } |
| 74 hl = needRendering->append(); | 73 hl = needRendering->append(); |
| 75 } else { | 74 } else { |
| 76 hl = recycled->append(); | 75 hl = recycled->append(); |
| 77 } | 76 } |
| 78 | 77 |
| 79 layerCache->addUse(layer); | 78 layerCache->addUse(layer); |
| 80 hl->fLayer = layer; | 79 hl->fLayer = layer; |
| 81 hl->fPicture = pict; | 80 hl->fPicture = pict; |
| 82 hl->fLocalMat = info.fLocalMat; | 81 hl->fLocalMat = info.fLocalMat; |
| 83 hl->fInitialMat = initialMat; | 82 hl->fInitialMat = initialMat; |
| 84 hl->fPreMat = initialMat; | 83 hl->fPreMat = initialMat; |
| 85 hl->fPreMat.preConcat(info.fPreMat); | 84 hl->fPreMat.preConcat(info.fPreMat); |
| 86 } | 85 } |
| 87 | 86 |
| 88 // Compute the source rect and return false if it is empty. | 87 // Compute the source rect and return false if it is empty. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 const SkRect& query, | 122 const SkRect& query, |
| 124 SkTDArray<GrHoistedLayer>* atlased, | 123 SkTDArray<GrHoistedLayer>* atlased, |
| 125 SkTDArray<GrHoistedLayer>* recycled, | 124 SkTDArray<GrHoistedLayer>* recycled, |
| 126 int numSamples) { | 125 int numSamples) { |
| 127 if (0 != numSamples) { | 126 if (0 != numSamples) { |
| 128 // MSAA layers are currently never atlased | 127 // MSAA layers are currently never atlased |
| 129 return; | 128 return; |
| 130 } | 129 } |
| 131 | 130 |
| 132 GrLayerCache* layerCache = context->getLayerCache(); | 131 GrLayerCache* layerCache = context->getLayerCache(); |
| 132 |
| 133 layerCache->processDeletedPictures(); | 133 layerCache->processDeletedPictures(); |
| 134 | 134 |
| 135 const SkBigPicture::AccelData* topLevelData = NULL; | 135 SkPicture::AccelData::Key key = SkLayerInfo::ComputeKey(); |
| 136 if (const SkBigPicture* bp = topLevelPicture->asSkBigPicture()) { | 136 |
| 137 topLevelData = bp->accelData(); | 137 const SkPicture::AccelData* topLevelData = topLevelPicture->EXPERIMENTAL_get
AccelData(key); |
| 138 } | |
| 139 if (!topLevelData) { | 138 if (!topLevelData) { |
| 140 return; | 139 return; |
| 141 } | 140 } |
| 142 | 141 |
| 143 const SkLayerInfo *topLevelGPUData = static_cast<const SkLayerInfo*>(topLeve
lData); | 142 const SkLayerInfo *topLevelGPUData = static_cast<const SkLayerInfo*>(topLeve
lData); |
| 144 if (0 == topLevelGPUData->numBlocks()) { | 143 if (0 == topLevelGPUData->numBlocks()) { |
| 145 return; | 144 return; |
| 146 } | 145 } |
| 147 | 146 |
| 148 atlased->setReserve(atlased->count() + topLevelGPUData->numBlocks()); | 147 atlased->setReserve(atlased->count() + topLevelGPUData->numBlocks()); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 const SkPicture* topLevelPicture, | 182 const SkPicture* topLevelPicture, |
| 184 const SkMatrix& initialMat, | 183 const SkMatrix& initialMat, |
| 185 const SkRect& query, | 184 const SkRect& query, |
| 186 SkTDArray<GrHoistedLayer>* needRendering, | 185 SkTDArray<GrHoistedLayer>* needRendering, |
| 187 SkTDArray<GrHoistedLayer>* recycled, | 186 SkTDArray<GrHoistedLayer>* recycled, |
| 188 int numSamples) { | 187 int numSamples) { |
| 189 GrLayerCache* layerCache = context->getLayerCache(); | 188 GrLayerCache* layerCache = context->getLayerCache(); |
| 190 | 189 |
| 191 layerCache->processDeletedPictures(); | 190 layerCache->processDeletedPictures(); |
| 192 | 191 |
| 193 const SkBigPicture::AccelData* topLevelData = NULL; | 192 SkPicture::AccelData::Key key = SkLayerInfo::ComputeKey(); |
| 194 if (const SkBigPicture* bp = topLevelPicture->asSkBigPicture()) { | 193 |
| 195 topLevelData = bp->accelData(); | 194 const SkPicture::AccelData* topLevelData = topLevelPicture->EXPERIMENTAL_get
AccelData(key); |
| 196 } | |
| 197 if (!topLevelData) { | 195 if (!topLevelData) { |
| 198 return; | 196 return; |
| 199 } | 197 } |
| 200 | 198 |
| 201 const SkLayerInfo *topLevelGPUData = static_cast<const SkLayerInfo*>(topLeve
lData); | 199 const SkLayerInfo *topLevelGPUData = static_cast<const SkLayerInfo*>(topLeve
lData); |
| 202 if (0 == topLevelGPUData->numBlocks()) { | 200 if (0 == topLevelGPUData->numBlocks()) { |
| 203 return; | 201 return; |
| 204 } | 202 } |
| 205 | 203 |
| 206 // Find and prepare for hoisting all the layers that intersect the query rec
t | 204 // Find and prepare for hoisting all the layers that intersect the query rec
t |
| (...skipping 27 matching lines...) Expand all Loading... |
| 234 if (atlased.count() > 0) { | 232 if (atlased.count() > 0) { |
| 235 // All the atlased layers are rendered into the same GrTexture | 233 // All the atlased layers are rendered into the same GrTexture |
| 236 SkSurfaceProps props(0, kUnknown_SkPixelGeometry); | 234 SkSurfaceProps props(0, kUnknown_SkPixelGeometry); |
| 237 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTargetDirect( | 235 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTargetDirect( |
| 238 atlased[0].fLayer->texture()->asRenderTa
rget(), &props)); | 236 atlased[0].fLayer->texture()->asRenderTa
rget(), &props)); |
| 239 | 237 |
| 240 SkCanvas* atlasCanvas = surface->getCanvas(); | 238 SkCanvas* atlasCanvas = surface->getCanvas(); |
| 241 | 239 |
| 242 for (int i = 0; i < atlased.count(); ++i) { | 240 for (int i = 0; i < atlased.count(); ++i) { |
| 243 const GrCachedLayer* layer = atlased[i].fLayer; | 241 const GrCachedLayer* layer = atlased[i].fLayer; |
| 244 const SkBigPicture* pict = atlased[i].fPicture->asSkBigPicture(); | 242 const SkPicture* pict = atlased[i].fPicture; |
| 245 if (!pict) { | |
| 246 // TODO: can we assume / assert this? | |
| 247 continue; | |
| 248 } | |
| 249 const SkIPoint offset = SkIPoint::Make(layer->srcIR().fLeft, layer->
srcIR().fTop); | 243 const SkIPoint offset = SkIPoint::Make(layer->srcIR().fLeft, layer->
srcIR().fTop); |
| 250 SkDEBUGCODE(const SkPaint* layerPaint = layer->paint();) | 244 SkDEBUGCODE(const SkPaint* layerPaint = layer->paint();) |
| 251 | 245 |
| 252 SkASSERT(!layerPaint || !layerPaint->getImageFilter()); | 246 SkASSERT(!layerPaint || !layerPaint->getImageFilter()); |
| 253 SkASSERT(!layer->filter()); | 247 SkASSERT(!layer->filter()); |
| 254 | 248 |
| 255 atlasCanvas->save(); | 249 atlasCanvas->save(); |
| 256 | 250 |
| 257 // Add a rect clip to make sure the rendering doesn't | 251 // Add a rect clip to make sure the rendering doesn't |
| 258 // extend beyond the boundaries of the atlased sub-rect | 252 // extend beyond the boundaries of the atlased sub-rect |
| 259 const SkRect bound = SkRect::Make(layer->rect()); | 253 const SkRect bound = SkRect::Make(layer->rect()); |
| 260 atlasCanvas->clipRect(bound); | 254 atlasCanvas->clipRect(bound); |
| 261 atlasCanvas->clear(0); | 255 atlasCanvas->clear(0); |
| 262 | 256 |
| 263 // '-offset' maps the layer's top/left to the origin. | 257 // '-offset' maps the layer's top/left to the origin. |
| 264 // Since this layer is atlased, the top/left corner needs | 258 // Since this layer is atlased, the top/left corner needs |
| 265 // to be offset to the correct location in the backing texture. | 259 // to be offset to the correct location in the backing texture. |
| 266 SkMatrix initialCTM; | 260 SkMatrix initialCTM; |
| 267 initialCTM.setTranslate(SkIntToScalar(-offset.fX), SkIntToScalar(-of
fset.fY)); | 261 initialCTM.setTranslate(SkIntToScalar(-offset.fX), SkIntToScalar(-of
fset.fY)); |
| 268 initialCTM.preTranslate(bound.fLeft, bound.fTop); | 262 initialCTM.preTranslate(bound.fLeft, bound.fTop); |
| 269 initialCTM.preConcat(atlased[i].fPreMat); | 263 initialCTM.preConcat(atlased[i].fPreMat); |
| 270 | 264 |
| 271 atlasCanvas->setMatrix(initialCTM); | 265 atlasCanvas->setMatrix(initialCTM); |
| 272 atlasCanvas->concat(atlased[i].fLocalMat); | 266 atlasCanvas->concat(atlased[i].fLocalMat); |
| 273 | 267 |
| 274 pict->partialPlayback(atlasCanvas, layer->start() + 1, layer->stop()
, initialCTM); | 268 SkRecordPartialDraw(*pict->fRecord.get(), atlasCanvas, |
| 269 pict->drawablePicts(), pict->drawableCount(), |
| 270 layer->start() + 1, layer->stop(), initialCTM); |
| 271 |
| 275 atlasCanvas->restore(); | 272 atlasCanvas->restore(); |
| 276 } | 273 } |
| 277 | 274 |
| 278 atlasCanvas->flush(); | 275 atlasCanvas->flush(); |
| 279 } | 276 } |
| 280 } | 277 } |
| 281 | 278 |
| 282 SkBitmap wrap_texture(GrTexture* texture) { | 279 SkBitmap wrap_texture(GrTexture* texture) { |
| 283 SkASSERT(texture); | 280 SkASSERT(texture); |
| 284 | 281 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 } | 321 } |
| 325 | 322 |
| 326 SkIRect newRect = SkIRect::MakeWH(filteredBitmap.width(), filteredBitmap.hei
ght()); | 323 SkIRect newRect = SkIRect::MakeWH(filteredBitmap.width(), filteredBitmap.hei
ght()); |
| 327 layer->setTexture(filteredBitmap.getTexture(), newRect); | 324 layer->setTexture(filteredBitmap.getTexture(), newRect); |
| 328 layer->setOffset(offset); | 325 layer->setOffset(offset); |
| 329 } | 326 } |
| 330 | 327 |
| 331 void GrLayerHoister::DrawLayers(GrContext* context, const SkTDArray<GrHoistedLay
er>& layers) { | 328 void GrLayerHoister::DrawLayers(GrContext* context, const SkTDArray<GrHoistedLay
er>& layers) { |
| 332 for (int i = 0; i < layers.count(); ++i) { | 329 for (int i = 0; i < layers.count(); ++i) { |
| 333 GrCachedLayer* layer = layers[i].fLayer; | 330 GrCachedLayer* layer = layers[i].fLayer; |
| 334 const SkBigPicture* pict = layers[i].fPicture->asSkBigPicture(); | 331 const SkPicture* pict = layers[i].fPicture; |
| 335 if (!pict) { | |
| 336 // TODO: can we assume / assert this? | |
| 337 continue; | |
| 338 } | |
| 339 const SkIPoint offset = SkIPoint::Make(layer->srcIR().fLeft, layer->srcI
R().fTop); | 332 const SkIPoint offset = SkIPoint::Make(layer->srcIR().fLeft, layer->srcI
R().fTop); |
| 340 | 333 |
| 341 // Each non-atlased layer has its own GrTexture | 334 // Each non-atlased layer has its own GrTexture |
| 342 SkSurfaceProps props(0, kUnknown_SkPixelGeometry); | 335 SkSurfaceProps props(0, kUnknown_SkPixelGeometry); |
| 343 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTargetDirect( | 336 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTargetDirect( |
| 344 layer->texture()->asRenderTarget(), &pro
ps)); | 337 layer->texture()->asRenderTarget(), &pro
ps)); |
| 345 | 338 |
| 346 SkCanvas* layerCanvas = surface->getCanvas(); | 339 SkCanvas* layerCanvas = surface->getCanvas(); |
| 347 | 340 |
| 348 SkASSERT(0 == layer->rect().fLeft && 0 == layer->rect().fTop); | 341 SkASSERT(0 == layer->rect().fLeft && 0 == layer->rect().fTop); |
| 349 | 342 |
| 350 // Add a rect clip to make sure the rendering doesn't | 343 // Add a rect clip to make sure the rendering doesn't |
| 351 // extend beyond the boundaries of the layer | 344 // extend beyond the boundaries of the layer |
| 352 const SkRect bound = SkRect::Make(layer->rect()); | 345 const SkRect bound = SkRect::Make(layer->rect()); |
| 353 layerCanvas->clipRect(bound); | 346 layerCanvas->clipRect(bound); |
| 354 layerCanvas->clear(SK_ColorTRANSPARENT); | 347 layerCanvas->clear(SK_ColorTRANSPARENT); |
| 355 | 348 |
| 356 SkMatrix initialCTM; | 349 SkMatrix initialCTM; |
| 357 initialCTM.setTranslate(SkIntToScalar(-offset.fX), SkIntToScalar(-offset
.fY)); | 350 initialCTM.setTranslate(SkIntToScalar(-offset.fX), SkIntToScalar(-offset
.fY)); |
| 358 initialCTM.preConcat(layers[i].fPreMat); | 351 initialCTM.preConcat(layers[i].fPreMat); |
| 359 | 352 |
| 360 layerCanvas->setMatrix(initialCTM); | 353 layerCanvas->setMatrix(initialCTM); |
| 361 layerCanvas->concat(layers[i].fLocalMat); | 354 layerCanvas->concat(layers[i].fLocalMat); |
| 362 | 355 |
| 363 pict->partialPlayback(layerCanvas, layer->start()+1, layer->stop(), init
ialCTM); | 356 SkRecordPartialDraw(*pict->fRecord.get(), layerCanvas, |
| 357 pict->drawablePicts(), pict->drawableCount(), |
| 358 layer->start()+1, layer->stop(), initialCTM); |
| 359 |
| 364 layerCanvas->flush(); | 360 layerCanvas->flush(); |
| 365 | 361 |
| 366 if (layer->filter()) { | 362 if (layer->filter()) { |
| 367 SkSurface_Gpu* gpuSurf = static_cast<SkSurface_Gpu*>(surface.get()); | 363 SkSurface_Gpu* gpuSurf = static_cast<SkSurface_Gpu*>(surface.get()); |
| 368 | 364 |
| 369 FilterLayer(context, gpuSurf->getDevice(), layers[i]); | 365 FilterLayer(context, gpuSurf->getDevice(), layers[i]); |
| 370 } | 366 } |
| 371 } | 367 } |
| 372 } | 368 } |
| 373 | 369 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 385 void GrLayerHoister::PurgeCache(GrContext* context) { | 381 void GrLayerHoister::PurgeCache(GrContext* context) { |
| 386 #if !GR_CACHE_HOISTED_LAYERS | 382 #if !GR_CACHE_HOISTED_LAYERS |
| 387 GrLayerCache* layerCache = context->getLayerCache(); | 383 GrLayerCache* layerCache = context->getLayerCache(); |
| 388 | 384 |
| 389 // This code completely clears out the atlas. It is required when | 385 // This code completely clears out the atlas. It is required when |
| 390 // caching is disabled so the atlas doesn't fill up and force more | 386 // caching is disabled so the atlas doesn't fill up and force more |
| 391 // free floating layers | 387 // free floating layers |
| 392 layerCache->purgeAll(); | 388 layerCache->purgeAll(); |
| 393 #endif | 389 #endif |
| 394 } | 390 } |
| OLD | NEW |