Coverage Report

Created: 2021-08-22 09:07

/src/skia/include/gpu/GrRecordingContext.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 2019 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 GrRecordingContext_DEFINED
9
#define GrRecordingContext_DEFINED
10
11
#include "include/core/SkRefCnt.h"
12
#include "include/private/GrImageContext.h"
13
#include "include/private/SkTArray.h"
14
15
#if GR_GPU_STATS && GR_TEST_UTILS
16
#include <map>
17
#include <string>
18
#endif
19
20
class GrAuditTrail;
21
class GrBackendFormat;
22
class GrDrawingManager;
23
class GrOnFlushCallbackObject;
24
class GrMemoryPool;
25
class GrProgramDesc;
26
class GrProgramInfo;
27
class GrProxyProvider;
28
class GrRecordingContextPriv;
29
class GrSubRunAllocator;
30
class GrSurfaceProxy;
31
class GrTextBlobCache;
32
class GrThreadSafeCache;
33
class SkArenaAlloc;
34
class SkJSONWriter;
35
36
#if GR_TEST_UTILS
37
class SkString;
38
#endif
39
40
class GrRecordingContext : public GrImageContext {
41
public:
42
    ~GrRecordingContext() override;
43
44
0
    SK_API GrBackendFormat defaultBackendFormat(SkColorType ct, GrRenderable renderable) const {
45
0
        return INHERITED::defaultBackendFormat(ct, renderable);
46
0
    }
47
48
    /**
49
     * Reports whether the GrDirectContext associated with this GrRecordingContext is abandoned.
50
     * When called on a GrDirectContext it may actively check whether the underlying 3D API
51
     * device/context has been disconnected before reporting the status. If so, calling this
52
     * method will transition the GrDirectContext to the abandoned state.
53
     */
54
1.03M
    bool abandoned() override { return INHERITED::abandoned(); }
55
56
    /*
57
     * Can a SkSurface be created with the given color type. To check whether MSAA is supported
58
     * use maxSurfaceSampleCountForColorType().
59
     */
60
11.0k
    SK_API bool colorTypeSupportedAsSurface(SkColorType colorType) const {
61
11.0k
        if (kR16G16_unorm_SkColorType == colorType ||
62
11.0k
            kA16_unorm_SkColorType == colorType ||
63
11.0k
            kA16_float_SkColorType == colorType ||
64
11.0k
            kR16G16_float_SkColorType == colorType ||
65
11.0k
            kR16G16B16A16_unorm_SkColorType == colorType ||
66
11.0k
            kGray_8_SkColorType == colorType) {
67
0
            return false;
68
0
        }
69
70
11.0k
        return this->maxSurfaceSampleCountForColorType(colorType) > 0;
71
11.0k
    }
72
73
    /**
74
     * Gets the maximum supported texture size.
75
     */
76
    SK_API int maxTextureSize() const;
77
78
    /**
79
     * Gets the maximum supported render target size.
80
     */
81
    SK_API int maxRenderTargetSize() const;
82
83
    /**
84
     * Can a SkImage be created with the given color type.
85
     */
86
    SK_API bool colorTypeSupportedAsImage(SkColorType) const;
87
88
    /**
89
     * Gets the maximum supported sample count for a color type. 1 is returned if only non-MSAA
90
     * rendering is supported for the color type. 0 is returned if rendering to this color type
91
     * is not supported at all.
92
     */
93
    SK_API int maxSurfaceSampleCountForColorType(SkColorType) const;
94
95
    // Provides access to functions that aren't part of the public API.
96
    GrRecordingContextPriv priv();
97
    const GrRecordingContextPriv priv() const;  // NOLINT(readability-const-return-type)
98
99
    // The collection of specialized memory arenas for different types of data recorded by a
100
    // GrRecordingContext. Arenas does not maintain ownership of the pools it groups together.
101
    class Arenas {
102
    public:
103
        Arenas(SkArenaAlloc*, GrSubRunAllocator*);
104
105
        // For storing pipelines and other complex data as-needed by ops
106
0
        SkArenaAlloc* recordTimeAllocator() { return fRecordTimeAllocator; }
107
108
        // For storing GrTextBlob SubRuns
109
0
        GrSubRunAllocator* recordTimeSubRunAllocator() { return fRecordTimeSubRunAllocator; }
110
111
    private:
112
        SkArenaAlloc* fRecordTimeAllocator;
113
        GrSubRunAllocator* fRecordTimeSubRunAllocator;
114
    };
115
116
protected:
117
    friend class GrRecordingContextPriv;    // for hidden functions
118
    friend class SkDeferredDisplayList;     // for OwnedArenas
119
    friend class SkDeferredDisplayListPriv; // for ProgramData
120
121
    // Like Arenas, but preserves ownership of the underlying pools.
122
    class OwnedArenas {
123
    public:
124
        OwnedArenas(bool ddlRecording);
125
        ~OwnedArenas();
126
127
        Arenas get();
128
129
        OwnedArenas& operator=(OwnedArenas&&);
130
131
    private:
132
        bool fDDLRecording;
133
        std::unique_ptr<SkArenaAlloc> fRecordTimeAllocator;
134
        std::unique_ptr<GrSubRunAllocator> fRecordTimeSubRunAllocator;
135
    };
136
137
    GrRecordingContext(sk_sp<GrContextThreadSafeProxy>, bool ddlRecording);
138
139
    bool init() override;
140
141
    void abandonContext() override;
142
143
    GrDrawingManager* drawingManager();
144
145
    // There is no going back from this method. It should only be called to control the timing
146
    // during abandon or destruction of the context.
147
    void destroyDrawingManager();
148
149
0
    Arenas arenas() { return fArenas.get(); }
150
    // This entry point should only be used for DDL creation where we want the ops' lifetime to
151
    // match that of the DDL.
152
    OwnedArenas&& detachArenas();
153
154
198k
    GrProxyProvider* proxyProvider() { return fProxyProvider.get(); }
155
0
    const GrProxyProvider* proxyProvider() const { return fProxyProvider.get(); }
156
157
    struct ProgramData {
158
        ProgramData(std::unique_ptr<const GrProgramDesc>, const GrProgramInfo*);
159
        ProgramData(ProgramData&&);                     // for SkTArray
160
        ProgramData(const ProgramData&) = delete;
161
        ~ProgramData();
162
163
0
        const GrProgramDesc& desc() const { return *fDesc; }
164
0
        const GrProgramInfo& info() const { return *fInfo; }
165
166
    private:
167
        // TODO: store the GrProgramDescs in the 'fRecordTimeData' arena
168
        std::unique_ptr<const GrProgramDesc> fDesc;
169
        // The program infos should be stored in 'fRecordTimeData' so do not need to be ref
170
        // counted or deleted in the destructor.
171
        const GrProgramInfo* fInfo = nullptr;
172
    };
173
174
    // This entry point gives the recording context a chance to cache the provided
175
    // programInfo. The DDL context takes this opportunity to store programInfos as a sidecar
176
    // to the DDL.
177
0
    virtual void recordProgramInfo(const GrProgramInfo*) {}
178
    // This asks the recording context to return any programInfos it may have collected
179
    // via the 'recordProgramInfo' call. It is up to the caller to ensure that the lifetime
180
    // of the programInfos matches the intended use. For example, in DDL-record mode it
181
    // is known that all the programInfos will have been allocated in an arena with the
182
    // same lifetime at the DDL itself.
183
0
    virtual void detachProgramData(SkTArray<ProgramData>*) {}
184
185
    GrTextBlobCache* getTextBlobCache();
186
    const GrTextBlobCache* getTextBlobCache() const;
187
188
    GrThreadSafeCache* threadSafeCache();
189
    const GrThreadSafeCache* threadSafeCache() const;
190
191
    /**
192
     * Registers an object for flush-related callbacks. (See GrOnFlushCallbackObject.)
193
     *
194
     * NOTE: the drawing manager tracks this object as a raw pointer; it is up to the caller to
195
     * ensure its lifetime is tied to that of the context.
196
     */
197
    void addOnFlushCallbackObject(GrOnFlushCallbackObject*);
198
199
0
    GrRecordingContext* asRecordingContext() override { return this; }
200
201
    class Stats {
202
    public:
203
1.32k
        Stats() = default;
204
205
#if GR_GPU_STATS
206
0
        void reset() { *this = {}; }
207
208
0
        int numPathMasksGenerated() const { return fNumPathMasksGenerated; }
209
7.52k
        void incNumPathMasksGenerated() { fNumPathMasksGenerated++; }
210
211
0
        int numPathMaskCacheHits() const { return fNumPathMaskCacheHits; }
212
29
        void incNumPathMasksCacheHits() { fNumPathMaskCacheHits++; }
213
214
#if GR_TEST_UTILS
215
        void dump(SkString* out) const;
216
        void dumpKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) const;
217
#endif
218
219
    private:
220
        int fNumPathMasksGenerated{0};
221
        int fNumPathMaskCacheHits{0};
222
223
#else // GR_GPU_STATS
224
        void incNumPathMasksGenerated() {}
225
        void incNumPathMasksCacheHits() {}
226
227
#if GR_TEST_UTILS
228
        void dump(SkString*) const {}
229
        void dumpKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) const {}
230
#endif
231
#endif // GR_GPU_STATS
232
    } fStats;
233
234
#if GR_GPU_STATS && GR_TEST_UTILS
235
    struct DMSAAStats {
236
        void dumpKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) const;
237
        void dump() const;
238
        void merge(const DMSAAStats&);
239
        int fNumRenderPasses = 0;
240
        int fNumMultisampleRenderPasses = 0;
241
        std::map<std::string, int> fTriggerCounts;
242
    };
243
244
    DMSAAStats fDMSAAStats;
245
#endif
246
247
0
    Stats* stats() { return &fStats; }
248
0
    const Stats* stats() const { return &fStats; }
249
    void dumpJSON(SkJSONWriter*) const;
250
251
protected:
252
    // Delete last in case other objects call it during destruction.
253
    std::unique_ptr<GrAuditTrail>     fAuditTrail;
254
255
private:
256
    OwnedArenas                       fArenas;
257
258
    std::unique_ptr<GrDrawingManager> fDrawingManager;
259
    std::unique_ptr<GrProxyProvider>  fProxyProvider;
260
261
#if GR_TEST_UTILS
262
    int fSuppressWarningMessages = 0;
263
#endif
264
265
    using INHERITED = GrImageContext;
266
};
267
268
/**
269
 * Safely cast a possibly-null base context to direct context.
270
 */
271
906k
static inline GrDirectContext* GrAsDirectContext(GrContext_Base* base) {
272
886k
    return base ? base->asDirectContext() : nullptr;
273
906k
}
Unexecuted instantiation: BackendSurfaceFactory.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: BackendTextureImageFactory.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: FlushFinishTracker.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrContextFactory.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrTest.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: ManagedBackendTexture.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: ProxyUtils.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: TestContext.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: TestOps.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: YUVUtils.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GLTestContext.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: MockTestContext.cpp:GrAsDirectContext(GrContext_Base*)
SkCanvas.cpp:GrAsDirectContext(GrContext_Base*)
Line
Count
Source
271
808k
static inline GrDirectContext* GrAsDirectContext(GrContext_Base* base) {
272
789k
    return base ? base->asDirectContext() : nullptr;
273
808k
}
Unexecuted instantiation: SkImageFilter.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkRuntimeEffect.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkSpecialImage.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkSpecialSurface.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkTextBlob.cpp:GrAsDirectContext(GrContext_Base*)
SkImage.cpp:GrAsDirectContext(GrContext_Base*)
Line
Count
Source
271
97.1k
static inline GrDirectContext* GrAsDirectContext(GrContext_Base* base) {
272
97.1k
    return base ? base->asDirectContext() : nullptr;
273
97.1k
}
Unexecuted instantiation: SkImage_Lazy.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkImage_Raster.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkSurface.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkSurface_Raster.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkComposeShader.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkPictureImageGenerator.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrContext_Base.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDirectContext.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDrawingManager.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrGpu.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrGpuResource.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrImageContext.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrOpFlushState.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrProxyProvider.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrRecordingContext.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrRecordingContextPriv.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrRenderTargetProxy.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrRenderTask.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrRenderTaskCluster.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrResourceAllocator.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrResourceCache.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrResourceProvider.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrRingBuffer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrStagingBufferManager.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrSurface.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrSurfaceProxy.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrTexture.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrTextureProxy.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrTextureResolveRenderTask.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrThreadSafeCache.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrTransferFromRenderTask.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrWaitRenderTask.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrWritePixelsRenderTask.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SurfaceContext.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SurfaceFillContext.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrTextBlobCache.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: BaseDevice.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkGr.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkImage_Gpu.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkImage_GpuBase.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkImage_GpuYUVA.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkSurface_Gpu.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrAuditTrail.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrOpsTask.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: AAConvexPathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: AAHairLinePathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: AALinearizingConvexPathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: DefaultPathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrAtlasTextOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDashOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDrawAtlasOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDrawVerticesOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrFillRectOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrLatticeOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrMeshDrawOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrOvalOpFactory.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrQuadPerEdgeAA.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrRegionOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrShadowRRectOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrSimpleMeshDrawOpHelper.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrSimpleMeshDrawOpHelperWithStencil.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrStrokeRectOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrTextureOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SmallPathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SoftwarePathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: TriangulatingPathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: Device.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: Device_drawTexture.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: PathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: PathRendererChain.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SurfaceDrawContext.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SurfaceFillContext_v1.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrGLGpu.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrGLGpuProgramCache.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrGLRenderTarget.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrGLTextureRenderTarget.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrGLProgramBuilder.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkBlurMF.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkDeferredDisplayList.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkGlyphRunPainter.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkGpuBlurUtils.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkPictureShader.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkTableColorFilter.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkPerlinNoiseShader.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkAlphaThresholdImageFilter.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkArithmeticImageFilter.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkBlendImageFilter.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkBlurImageFilter.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkDisplacementMapImageFilter.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkLightingImageFilter.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkMatrixConvolutionImageFilter.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkMorphologyImageFilter.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrBackendTextureImageGenerator.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrBufferAllocPool.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrClientMappedBufferManager.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrContextThreadSafeProxy.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrCopyRenderTask.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDDLTask.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDirectContextPriv.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDrawOpAtlas.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrMeshDrawTarget.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrProcessorUnitTest.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrSWMaskHelper.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrMatrixConvolutionEffect.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrGradientShader.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrTextBlob.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrBlurUtils.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: AtlasPathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: DashLinePathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrClearOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDrawAtlasPathOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDrawableOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrFillRRectOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: TessellationPathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrAtlasRenderTask.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: ClipStack.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: StencilMaskHelper.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDynamicAtlas.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrOnFlushResourceProvider.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: PathInnerTriangulateOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: PathStencilCoverOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: PathTessellateOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: StrokeTessellateOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrPathCurveTessellator.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrPathWedgeTessellator.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrStrokeFixedCountTessellator.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrStrokeHardwareTessellator.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: FuzzDDLThreading.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkDeferredDisplayListRecorder.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDDLContext.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: FuzzSkParagraph.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrTextureRenderTargetProxy.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrAtlasManager.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrGLOpsRenderPass.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkSurfaceCharacterization.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: FuzzCanvas.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: DebugCanvas.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: DrawCommand.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: FuzzCreateDDL.cpp:GrAsDirectContext(GrContext_Base*)
274
275
#endif