diff options
author | robertphillips <robertphillips@google.com> | 2014-10-08 05:17:02 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-10-08 05:17:02 -0700 |
commit | d61ef01f176328619d29045da3ec72e4732276b6 (patch) | |
tree | e47a01f6b8509c268416e98e95cd0b2d9d4ac222 /src/core/SkMultiPictureDraw.cpp | |
parent | 10805961ce424868e8315e00f6dbeeaa62d466ac (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.cpp | 65 |
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(); } |