OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright 2014 Google Inc. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license that can be | |
5 * found in the LICENSE file. | |
6 */ | |
7 | |
8 #ifndef GrLayerHoister_DEFINED | |
9 #define GrLayerHoister_DEFINED | |
10 | |
11 #define SK_IGNORE_GPU_LAYER_HOISTING | |
12 | |
13 | |
14 #include "SkPicture.h" | |
15 #include "SkTDArray.h" | |
16 | |
17 #if !defined(SK_IGNORE_GPU_LAYER_HOISTING) && SK_SUPPORT_GPU | |
18 | |
19 struct GrCachedLayer; | |
20 class GrReplacements; | |
21 class SkGpuDevice; | |
22 struct SkRect; | |
23 | |
24 class GrHoistedLayer { | |
25 public: | |
26 const SkPicture* fPicture; // the picture that actually contains the layer | |
27 // (not necessarily the top-most picture) | |
28 GrCachedLayer* fLayer; | |
29 SkMatrix fInitialMat; | |
30 SkMatrix fPreMat; | |
31 SkMatrix fLocalMat; | |
32 }; | |
33 | |
34 // This class collects the layer hoisting functionality in one place. | |
35 // For each picture rendering: | |
36 // FindLayersToHoist should be called once to collect the required layers | |
37 // DrawLayers should be called once to render them | |
38 // UnlockLayers should be called once to allow the texture resources to be recy
cled | |
39 class GrLayerHoister { | |
40 public: | |
41 /** Attempt to reattach layers that may have been atlased in the past | |
42 */ | |
43 static void Begin(GrContext* context); | |
44 | |
45 /** Release cache resources | |
46 */ | |
47 static void End(GrContext* context); | |
48 | |
49 /** Find the layers in 'topLevelPicture' that can be atlased. Note that the
discovered | |
50 layers can be inside nested sub-pictures. | |
51 @param context Owner of the layer cache (the source of new layers) | |
52 @param topLevelPicture The top-level picture that is about to be rendere
d | |
53 @param initialMat The CTM of the canvas into which the layers will be d
rawn | |
54 @param query The rectangle that is about to be drawn. | |
55 @param atlasedNeedRendering Out parameter storing the layers that | |
56 should be hoisted to the atlas | |
57 @param recycled Out parameter storing layers that are atlased but do
not need rendering | |
58 @param numSamples The number if MSAA samples required | |
59 */ | |
60 static void FindLayersToAtlas(GrContext* context, | |
61 const SkPicture* topLevelPicture, | |
62 const SkMatrix& initialMat, | |
63 const SkRect& query, | |
64 SkTDArray<GrHoistedLayer>* atlasedNeedRenderin
g, | |
65 SkTDArray<GrHoistedLayer>* recycled, | |
66 int numSamples); | |
67 | |
68 /** Find the layers in 'topLevelPicture' that need hoisting. Note that the d
iscovered | |
69 layers can be inside nested sub-pictures. | |
70 @param context Owner of the layer cache (the source of new layers) | |
71 @param topLevelPicture The top-level picture that is about to be rendere
d | |
72 @param initialMat The CTM of the canvas into which the layers will be d
rawn | |
73 @param query The rectangle that is about to be drawn. | |
74 @param needRendering Out parameter storing the layers that need renderin
g. | |
75 This should never include atlased layers. | |
76 @param recycled Out parameter storing layers that need hoisting but n
ot rendering | |
77 @param numSamples The number if MSAA samples required | |
78 */ | |
79 static void FindLayersToHoist(GrContext* context, | |
80 const SkPicture* topLevelPicture, | |
81 const SkMatrix& initialMat, | |
82 const SkRect& query, | |
83 SkTDArray<GrHoistedLayer>* needRendering, | |
84 SkTDArray<GrHoistedLayer>* recycled, | |
85 int numSamples); | |
86 | |
87 /** Draw the specified layers into the atlas. | |
88 @param context Owner of the layer cache (and thus the layers) | |
89 @param layers The layers to be drawn into the atlas | |
90 */ | |
91 static void DrawLayersToAtlas(GrContext* context, const SkTDArray<GrHoistedL
ayer>& layers); | |
92 | |
93 /** Draw the specified layers into their own individual textures. | |
94 @param context Owner of the layer cache (and thus the layers) | |
95 @param layers The layers to be drawn | |
96 */ | |
97 static void DrawLayers(GrContext* context, const SkTDArray<GrHoistedLayer>&
layers); | |
98 | |
99 /** Convert all the layers in 'layers' into replacement objects in 'replacem
ents'. | |
100 @param layers The hoisted layers | |
101 @param replacements Replacement object that will be used for a replaceme
nt draw | |
102 */ | |
103 static void ConvertLayersToReplacements(const SkPicture* topLevelPicture, | |
104 const SkTDArray<GrHoistedLayer>& lay
ers, | |
105 GrReplacements* replacements); | |
106 | |
107 /** Unlock a group of layers in the layer cache. | |
108 @param context Owner of the layer cache (and thus the layers) | |
109 @param layers Unneeded layers in the atlas | |
110 */ | |
111 static void UnlockLayers(GrContext* context, const SkTDArray<GrHoistedLayer>
& layers); | |
112 | |
113 /** Forceably remove all cached layers and release the atlas. Useful for deb
ugging and timing. | |
114 This is only functional when GR_CACHE_HOISTED_LAYERS is set to 1 in GrLa
yerCache.h | |
115 @param context Owner of the layer cache (and thus the layers) | |
116 */ | |
117 static void PurgeCache(GrContext* context); | |
118 | |
119 private: | |
120 /** Update the GrTexture in 'layer' with its filtered version | |
121 @param context Owner of the layer cache (and thus the layers) | |
122 @param props Surface properties | |
123 @param info Layer info for a layer needing filtering prior to bein
g composited | |
124 */ | |
125 static void FilterLayer(GrContext* context, const SkSurfaceProps*, const GrH
oistedLayer& info); | |
126 | |
127 }; | |
128 #endif | |
129 | |
130 #endif | |
OLD | NEW |