aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkMultiPictureDraw.cpp
diff options
context:
space:
mode:
authorGravatar robertphillips <robertphillips@google.com>2014-10-08 05:17:02 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2014-10-08 05:17:02 -0700
commitd61ef01f176328619d29045da3ec72e4732276b6 (patch)
treee47a01f6b8509c268416e98e95cd0b2d9d4ac222 /src/core/SkMultiPictureDraw.cpp
parent10805961ce424868e8315e00f6dbeeaa62d466ac (diff)
Expose layer hoisting API in GrContext
This CL exposes the layer hoisting API in GrContext for use in SkMultiPictureDraw::draw. It basically mirrors what SkGpuDevice::EXPERIMENTAL_drawPicture has been doing. Review URL: https://codereview.chromium.org/533673002
Diffstat (limited to 'src/core/SkMultiPictureDraw.cpp')
-rw-r--r--src/core/SkMultiPictureDraw.cpp65
1 files changed, 62 insertions, 3 deletions
diff --git a/src/core/SkMultiPictureDraw.cpp b/src/core/SkMultiPictureDraw.cpp
index eb1e55e550..19b26ca607 100644
--- a/src/core/SkMultiPictureDraw.cpp
+++ b/src/core/SkMultiPictureDraw.cpp
@@ -5,6 +5,11 @@
* found in the LICENSE file.
*/
+#if SK_SUPPORT_GPU
+#include "GrLayerHoister.h"
+#include "GrRecordReplaceDraw.h"
+#endif
+
#include "SkCanvas.h"
#include "SkMultiPictureDraw.h"
#include "SkPicture.h"
@@ -50,12 +55,66 @@ void SkMultiPictureDraw::add(SkCanvas* canvas,
}
}
+#undef SK_IGNORE_GPU_LAYER_HOISTING
+#define SK_IGNORE_GPU_LAYER_HOISTING 1
+
void SkMultiPictureDraw::draw() {
+
+#ifndef SK_IGNORE_GPU_LAYER_HOISTING
+ GrContext* context = NULL;
+
+ SkTDArray<GrHoistedLayer> atlased, nonAtlased, recycled;
+
for (int i = 0; i < fDrawData.count(); ++i) {
- fDrawData[i].canvas->drawPicture(fDrawData[i].picture,
- &fDrawData[i].matrix,
- fDrawData[i].paint);
+ if (fDrawData[i].canvas->getGrContext() &&
+ !fDrawData[i].paint && fDrawData[i].matrix.isIdentity()) {
+ SkASSERT(NULL == context || context == fDrawData[i].canvas->getGrContext());
+ context = fDrawData[i].canvas->getGrContext();
+
+ // TODO: this path always tries to optimize pictures. Should we
+ // switch to this API approach (vs. SkCanvas::EXPERIMENTAL_optimize)?
+ fDrawData[i].canvas->EXPERIMENTAL_optimize(fDrawData[i].picture);
+
+ SkRect clipBounds;
+ if (!fDrawData[i].canvas->getClipBounds(&clipBounds)) {
+ continue;
+ }
+
+ GrLayerHoister::FindLayersToHoist(context, fDrawData[i].picture,
+ clipBounds, &atlased, &nonAtlased, &recycled);
+ }
+ }
+
+ GrReplacements replacements;
+
+ if (NULL != context) {
+ GrLayerHoister::DrawLayers(atlased, nonAtlased, recycled, &replacements);
+ }
+#endif
+
+ for (int i = 0; i < fDrawData.count(); ++i) {
+#ifndef SK_IGNORE_GPU_LAYER_HOISTING
+ if (fDrawData[i].canvas->getGrContext() &&
+ !fDrawData[i].paint && fDrawData[i].matrix.isIdentity()) {
+ // Render the entire picture using new layers
+ const SkMatrix initialMatrix = fDrawData[i].canvas->getTotalMatrix();
+
+ GrRecordReplaceDraw(fDrawData[i].picture, fDrawData[i].canvas,
+ &replacements, initialMatrix, NULL);
+ } else
+#endif
+ {
+ fDrawData[i].canvas->drawPicture(fDrawData[i].picture,
+ &fDrawData[i].matrix,
+ fDrawData[i].paint);
+ }
+ }
+
+#ifndef SK_IGNORE_GPU_LAYER_HOISTING
+ if (NULL != context) {
+ GrLayerHoister::UnlockLayers(context, atlased, nonAtlased, recycled);
}
+#endif
this->reset();
}