198d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips/*
298d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips * Copyright 2014 Google Inc.
398d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips *
498d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips * Use of this source code is governed by a BSD-style license that can be
598d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips * found in the LICENSE file.
698d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips */
798d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips
898d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips#ifndef GrLayerHoister_DEFINED
998d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips#define GrLayerHoister_DEFINED
1098d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips
1198d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips#include "SkPicture.h"
1298d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips#include "SkTDArray.h"
1398d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips
1498d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillipsclass GrAccelData;
1598d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillipsstruct GrCachedLayer;
161c4c528c2a5693c88ceb94888c747559c6a32091robertphillipsclass GrReplacements;
1798d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillipsstruct SkRect;
1898d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips
1998d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips// This class collects the layer hoisting functionality in one place.
2098d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips// For each picture rendering:
2198d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips//  FindLayersToHoist should be called once to collect the required layers
2298d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips//  DrawLayers should be called once to render them
2398d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips//  UnlockLayers should be called once to allow the texture resources to be recycled
2498d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillipsclass GrLayerHoister {
2598d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillipspublic:
2630d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips    struct HoistedLayer {
2730d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips        const SkPicture* fPicture;
2830d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips        GrCachedLayer*   fLayer;
2930d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips    };
3030d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips
3130d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips    /** Find the layers in 'topLevelPicture' that need hoisting. Note that the discovered
3230d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips        layers can be inside nested sub-pictures.
3330d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips        @param topLevelPicture The top-level picture that is about to be rendered
3430d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips        @param query       The rectangle that is about to be drawn.
3530d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips        @param atlased     Out parameter storing the layers that should be hoisted to the atlas
3630d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips        @param nonAtlased  Out parameter storing the layers that should be hoisted stand alone
371c4c528c2a5693c88ceb94888c747559c6a32091robertphillips        @param layerCache The source of new layers
3898d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips        Return true if any layers are suitable for hoisting; false otherwise
3998d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips    */
4030d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips    static bool FindLayersToHoist(const SkPicture* topLevelPicture,
4198d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips                                  const SkRect& query,
4230d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips                                  SkTDArray<HoistedLayer>* altased,
4330d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips                                  SkTDArray<HoistedLayer>* nonAtlased,
441c4c528c2a5693c88ceb94888c747559c6a32091robertphillips                                  GrLayerCache* layerCache);
4598d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips
4630d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips    /** Draw the specified layers into either the atlas or free floating textures.
471c4c528c2a5693c88ceb94888c747559c6a32091robertphillips        @param atlased      The layers to be drawn into the atlas
481c4c528c2a5693c88ceb94888c747559c6a32091robertphillips        @param nonAtlased   The layers to be drawn into their own textures
491c4c528c2a5693c88ceb94888c747559c6a32091robertphillips        @oaram replacements The replacement structure to fill in with the rendered layer info
5098d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips    */
5130d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips    static void DrawLayers(const SkTDArray<HoistedLayer>& atlased,
5230d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips                           const SkTDArray<HoistedLayer>& nonAtlased,
531c4c528c2a5693c88ceb94888c747559c6a32091robertphillips                           GrReplacements* replacements);
5498d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips
5530d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips    /** Unlock unneeded layers in the layer cache.
5698d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips        @param layerCache holder of the locked layers
5730d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips        @param atlased    Unneeded layers in the atlas
5830d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips        @param nonAtlased Unneeded layers in their own textures
5998d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips    */
6030d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips    static void UnlockLayers(GrLayerCache* layerCache,
6130d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips                             const SkTDArray<HoistedLayer>& atlased,
6230d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips                             const SkTDArray<HoistedLayer>& nonAtlased);
6398d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips};
6498d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips
6598d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips#endif
66