Index: src/gpu/SkGpuDevice.cpp |
=================================================================== |
--- src/gpu/SkGpuDevice.cpp (revision 13968) |
+++ src/gpu/SkGpuDevice.cpp (working copy) |
@@ -14,6 +14,7 @@ |
#include "GrContext.h" |
#include "GrBitmapTextContext.h" |
#include "GrDistanceFieldTextContext.h" |
+#include "GrPictureUtils.h" |
#include "SkGrTexturePixelRef.h" |
@@ -1944,16 +1945,6 @@ |
return SkSurface::NewRenderTarget(fContext, info, fRenderTarget->numSamples()); |
} |
-class GPUAccelData : public SkPicture::AccelData { |
-public: |
- GPUAccelData(Key key) : INHERITED(key) { } |
- |
-protected: |
- |
-private: |
- typedef SkPicture::AccelData INHERITED; |
-}; |
- |
// In the future this may not be a static method if we need to incorporate the |
// clip and matrix state into the key |
SkPicture::AccelData::Key SkGpuDevice::ComputeAccelDataKey() { |
@@ -1968,19 +1959,85 @@ |
GPUAccelData* data = SkNEW_ARGS(GPUAccelData, (key)); |
picture->EXPERIMENTAL_addAccelData(data); |
+ |
+ GatherGPUInfo(picture, data); |
} |
-bool SkGpuDevice::EXPERIMENTAL_drawPicture(const SkPicture& picture) { |
+bool SkGpuDevice::EXPERIMENTAL_drawPicture(SkPicture* picture) { |
+ |
SkPicture::AccelData::Key key = ComputeAccelDataKey(); |
- const SkPicture::AccelData* data = picture.EXPERIMENTAL_getAccelData(key); |
+ const SkPicture::AccelData* data = picture->EXPERIMENTAL_getAccelData(key); |
if (NULL == data) { |
return false; |
} |
-#if 0 |
const GPUAccelData *gpuData = static_cast<const GPUAccelData*>(data); |
+ |
+//#define SK_PRINT_PULL_FORWARD_INFO 1 |
+ |
+#ifdef SK_PRINT_PULL_FORWARD_INFO |
+ static bool gPrintedAccelData = false; |
+ |
+ if (!gPrintedAccelData) { |
+ for (int i = 0; i < gpuData->numSaveLayers(); ++i) { |
+ const GPUAccelData::SaveLayerInfo& info = gpuData->saveLayerInfo(i); |
+ |
+ SkDebugf("%d: Width: %d Height: %d SL: %d R: %d hasNestedLayers: %s\n", |
+ i, |
+ info.fSize.fWidth, |
+ info.fSize.fHeight, |
+ info.fSaveLayerOpID, |
+ info.fRestoreOpID, |
+ info.fHasNestedLayers ? "T" : "F"); |
+ } |
+ gPrintedAccelData = true; |
+ } |
#endif |
+ SkAutoTArray<bool> pullForward(gpuData->numSaveLayers()); |
+ for (int i = 0; i < gpuData->numSaveLayers(); ++i) { |
+ pullForward[i] = false; |
+ } |
+ |
+ SkIRect clip; |
+ |
+ fClipData.getConservativeBounds(this->width(), this->height(), &clip, NULL); |
+ |
+ SkMatrix inv; |
+ if (!fContext->getMatrix().invert(&inv)) { |
+ return false; |
+ } |
+ |
+ SkRect r = SkRect::Make(clip); |
+ inv.mapRect(&r); |
+ r.roundOut(&clip); |
+ |
+ const SkPicture::OperationList& ops = picture->EXPERIMENTAL_getActiveOps(clip); |
+ |
+#ifdef SK_PRINT_PULL_FORWARD_INFO |
+ SkDebugf("rect: %d %d %d %d\n", clip.fLeft, clip.fTop, clip.fRight, clip.fBottom); |
+#endif |
+ |
+ for (int i = 0; i < ops.numOps(); ++i) { |
+ for (int j = 0; j < gpuData->numSaveLayers(); ++j) { |
+ const GPUAccelData::SaveLayerInfo& info = gpuData->saveLayerInfo(j); |
+ |
+ if (ops.offset(i) > info.fSaveLayerOpID && ops.offset(i) < info.fRestoreOpID) { |
+ pullForward[j] = true; |
+ } |
+ } |
+ } |
+ |
+#ifdef SK_PRINT_PULL_FORWARD_INFO |
+ SkDebugf("Need SaveLayers: "); |
+ for (int i = 0; i < gpuData->numSaveLayers(); ++i) { |
+ if (pullForward[i]) { |
+ SkDebugf("%d, ", i); |
+ } |
+ } |
+ SkDebugf("\n"); |
+#endif |
+ |
return false; |
} |