Index: src/gpu/GrLayerHoister.cpp |
diff --git a/src/gpu/GrLayerHoister.cpp b/src/gpu/GrLayerHoister.cpp |
index e9e3a3f710afcd6e4c4fa77d965d40f2e402901b..929c12285d2596ec9cb649882ec39bc1d1738a02 100644 |
--- a/src/gpu/GrLayerHoister.cpp |
+++ b/src/gpu/GrLayerHoister.cpp |
@@ -7,10 +7,11 @@ |
#include "GrLayerCache.h" |
#include "GrLayerHoister.h" |
-#include "SkCanvas.h" |
-#include "SkRecordDraw.h" |
#include "GrRecordReplaceDraw.h" |
+ |
+#include "SkCanvas.h" |
#include "SkGrPixelRef.h" |
+#include "SkRecordDraw.h" |
#include "SkSurface.h" |
// Create the layer information for the hoisted layer and secure the |
@@ -18,6 +19,7 @@ |
static void prepare_for_hoisting(GrLayerCache* layerCache, |
const SkPicture* topLevelPicture, |
const GrAccelData::SaveLayerInfo& info, |
+ const SkIRect& layerRect, |
SkTDArray<GrHoistedLayer>* atlased, |
SkTDArray<GrHoistedLayer>* nonAtlased, |
SkTDArray<GrHoistedLayer>* recycled) { |
@@ -26,17 +28,22 @@ static void prepare_for_hoisting(GrLayerCache* layerCache, |
GrCachedLayer* layer = layerCache->findLayerOrCreate(pict->uniqueID(), |
info.fSaveLayerOpID, |
info.fRestoreOpID, |
+ layerRect, |
info.fOriginXform, |
info.fPaint); |
GrTextureDesc desc; |
desc.fFlags = kRenderTarget_GrTextureFlagBit; |
- desc.fWidth = info.fSize.fWidth; |
- desc.fHeight = info.fSize.fHeight; |
+ desc.fWidth = layerRect.width(); |
+ desc.fHeight = layerRect.height(); |
desc.fConfig = kSkia8888_GrPixelConfig; |
// TODO: need to deal with sample count |
- bool needsRendering = layerCache->lock(layer, desc, info.fHasNestedLayers || info.fIsNested); |
+ |
+ bool disallowAtlasing = info.fHasNestedLayers || info.fIsNested || |
+ (layer->paint() && layer->paint()->getImageFilter()); |
+ |
+ bool needsRendering = layerCache->lock(layer, desc, disallowAtlasing); |
if (NULL == layer->texture()) { |
// GPU resources could not be secured for the hoisting of this layer |
return; |
@@ -57,7 +64,7 @@ static void prepare_for_hoisting(GrLayerCache* layerCache, |
layerCache->addUse(layer); |
hl->fLayer = layer; |
hl->fPicture = pict; |
- hl->fOffset = info.fOffset; |
+ hl->fOffset = SkIPoint::Make(layerRect.fLeft, layerRect.fTop); |
hl->fCTM = info.fOriginXform; |
} |
@@ -68,7 +75,6 @@ bool GrLayerHoister::FindLayersToHoist(GrContext* context, |
SkTDArray<GrHoistedLayer>* atlased, |
SkTDArray<GrHoistedLayer>* nonAtlased, |
SkTDArray<GrHoistedLayer>* recycled) { |
- |
GrLayerCache* layerCache = context->getLayerCache(); |
layerCache->processDeletedPictures(); |
@@ -102,15 +108,15 @@ bool GrLayerHoister::FindLayersToHoist(GrContext* context, |
const GrAccelData::SaveLayerInfo& info = topLevelGPUData->saveLayerInfo(i); |
- SkRect layerRect = SkRect::MakeXYWH(SkIntToScalar(info.fOffset.fX), |
- SkIntToScalar(info.fOffset.fY), |
- SkIntToScalar(info.fSize.fWidth), |
- SkIntToScalar(info.fSize.fHeight)); |
- |
- if (!SkRect::Intersects(query, layerRect)) { |
+ SkRect layerRect = SkRect::Make(info.fBounds); |
+ if (!layerRect.intersect(query)) { |
continue; |
} |
+ |
+ SkIRect ir; |
+ layerRect.roundOut(&ir); |
+ |
// TODO: ignore perspective projected layers here! |
// TODO: once this code is more stable unsuitable layers can |
// just be omitted during the optimization stage |
@@ -118,7 +124,7 @@ bool GrLayerHoister::FindLayersToHoist(GrContext* context, |
continue; |
} |
- prepare_for_hoisting(layerCache, topLevelPicture, info, atlased, nonAtlased, recycled); |
+ prepare_for_hoisting(layerCache, topLevelPicture, info, ir, atlased, nonAtlased, recycled); |
anyHoisted = true; |
} |