Coverage Report

Created: 2024-05-20 07:14

/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/SkColorType.h"
12
#include "include/core/SkRefCnt.h"
13
#include "include/core/SkString.h" // IWYU pragma: keep
14
#include "include/core/SkTypes.h"
15
#include "include/private/base/SkTArray.h"
16
#include "include/private/gpu/ganesh/GrContext_Base.h"
17
#include "include/private/gpu/ganesh/GrImageContext.h"
18
19
#include <map>
20
#include <memory>
21
#include <string>
22
23
class GrAuditTrail;
24
class GrContextThreadSafeProxy;
25
class GrDirectContext;
26
class GrDrawingManager;
27
class GrOnFlushCallbackObject;
28
class GrProgramDesc;
29
class GrProgramInfo;
30
class GrProxyProvider;
31
class GrRecordingContextPriv;
32
class GrThreadSafeCache;
33
class SkArenaAlloc;
34
class SkCapabilities;
35
class SkJSONWriter;
36
37
namespace sktext::gpu {
38
class SubRunAllocator;
39
class TextBlobRedrawCoordinator;
40
}
41
42
class GrRecordingContext : public GrImageContext {
43
public:
44
    ~GrRecordingContext() override;
45
46
    /**
47
     * Reports whether the GrDirectContext associated with this GrRecordingContext is abandoned.
48
     * When called on a GrDirectContext it may actively check whether the underlying 3D API
49
     * device/context has been disconnected before reporting the status. If so, calling this
50
     * method will transition the GrDirectContext to the abandoned state.
51
     */
52
1.21M
    bool abandoned() override { return GrImageContext::abandoned(); }
53
54
    /*
55
     * Can a SkSurface be created with the given color type. To check whether MSAA is supported
56
     * use maxSurfaceSampleCountForColorType().
57
     */
58
32.9k
    SK_API bool colorTypeSupportedAsSurface(SkColorType colorType) const {
59
32.9k
        if (kR16G16_unorm_SkColorType == colorType ||
60
32.9k
            kA16_unorm_SkColorType == colorType ||
61
32.9k
            kA16_float_SkColorType == colorType ||
62
32.9k
            kR16G16_float_SkColorType == colorType ||
63
32.9k
            kR16G16B16A16_unorm_SkColorType == colorType ||
64
32.9k
            kGray_8_SkColorType == colorType) {
65
0
            return false;
66
0
        }
67
68
32.9k
        return this->maxSurfaceSampleCountForColorType(colorType) > 0;
69
32.9k
    }
70
71
    /**
72
     * Gets the maximum supported texture size.
73
     */
74
    SK_API int maxTextureSize() const;
75
76
    /**
77
     * Gets the maximum supported render target size.
78
     */
79
    SK_API int maxRenderTargetSize() const;
80
81
    /**
82
     * Can a SkImage be created with the given color type.
83
     */
84
    SK_API bool colorTypeSupportedAsImage(SkColorType) const;
85
86
    /**
87
     * Does this context support protected content?
88
     */
89
    SK_API bool supportsProtectedContent() const;
90
91
    /**
92
     * Gets the maximum supported sample count for a color type. 1 is returned if only non-MSAA
93
     * rendering is supported for the color type. 0 is returned if rendering to this color type
94
     * is not supported at all.
95
     */
96
32.9k
    SK_API int maxSurfaceSampleCountForColorType(SkColorType colorType) const {
97
32.9k
        return GrImageContext::maxSurfaceSampleCountForColorType(colorType);
98
32.9k
    }
99
100
    SK_API sk_sp<const SkCapabilities> skCapabilities() const;
101
102
    // Provides access to functions that aren't part of the public API.
103
    GrRecordingContextPriv priv();
104
    const GrRecordingContextPriv priv() const;  // NOLINT(readability-const-return-type)
105
106
    // The collection of specialized memory arenas for different types of data recorded by a
107
    // GrRecordingContext. Arenas does not maintain ownership of the pools it groups together.
108
    class Arenas {
109
    public:
110
        Arenas(SkArenaAlloc*, sktext::gpu::SubRunAllocator*);
111
112
        // For storing pipelines and other complex data as-needed by ops
113
0
        SkArenaAlloc* recordTimeAllocator() { return fRecordTimeAllocator; }
114
115
        // For storing GrTextBlob SubRuns
116
0
        sktext::gpu::SubRunAllocator* recordTimeSubRunAllocator() {
117
0
            return fRecordTimeSubRunAllocator;
118
0
        }
119
120
    private:
121
        SkArenaAlloc* fRecordTimeAllocator;
122
        sktext::gpu::SubRunAllocator* fRecordTimeSubRunAllocator;
123
    };
124
125
protected:
126
    friend class GrRecordingContextPriv;    // for hidden functions
127
    friend class GrDeferredDisplayList;     // for OwnedArenas
128
    friend class GrDeferredDisplayListPriv; // for ProgramData
129
130
    // Like Arenas, but preserves ownership of the underlying pools.
131
    class OwnedArenas {
132
    public:
133
        OwnedArenas(bool ddlRecording);
134
        ~OwnedArenas();
135
136
        Arenas get();
137
138
        OwnedArenas& operator=(OwnedArenas&&);
139
140
    private:
141
        bool fDDLRecording;
142
        std::unique_ptr<SkArenaAlloc> fRecordTimeAllocator;
143
        std::unique_ptr<sktext::gpu::SubRunAllocator> fRecordTimeSubRunAllocator;
144
    };
145
146
    GrRecordingContext(sk_sp<GrContextThreadSafeProxy>, bool ddlRecording);
147
148
    bool init() override;
149
150
    void abandonContext() override;
151
152
    GrDrawingManager* drawingManager();
153
154
    // There is no going back from this method. It should only be called to control the timing
155
    // during abandon or destruction of the context.
156
    void destroyDrawingManager();
157
158
0
    Arenas arenas() { return fArenas.get(); }
159
    // This entry point should only be used for DDL creation where we want the ops' lifetime to
160
    // match that of the DDL.
161
    OwnedArenas&& detachArenas();
162
163
211k
    GrProxyProvider* proxyProvider() { return fProxyProvider.get(); }
164
0
    const GrProxyProvider* proxyProvider() const { return fProxyProvider.get(); }
165
166
    struct ProgramData {
167
        ProgramData(std::unique_ptr<const GrProgramDesc>, const GrProgramInfo*);
168
        ProgramData(ProgramData&&);                     // for SkTArray
169
        ProgramData(const ProgramData&) = delete;
170
        ~ProgramData();
171
172
0
        const GrProgramDesc& desc() const { return *fDesc; }
173
0
        const GrProgramInfo& info() const { return *fInfo; }
174
175
    private:
176
        // TODO: store the GrProgramDescs in the 'fRecordTimeData' arena
177
        std::unique_ptr<const GrProgramDesc> fDesc;
178
        // The program infos should be stored in 'fRecordTimeData' so do not need to be ref
179
        // counted or deleted in the destructor.
180
        const GrProgramInfo* fInfo = nullptr;
181
    };
182
183
    // This entry point gives the recording context a chance to cache the provided
184
    // programInfo. The DDL context takes this opportunity to store programInfos as a sidecar
185
    // to the DDL.
186
0
    virtual void recordProgramInfo(const GrProgramInfo*) {}
187
    // This asks the recording context to return any programInfos it may have collected
188
    // via the 'recordProgramInfo' call. It is up to the caller to ensure that the lifetime
189
    // of the programInfos matches the intended use. For example, in DDL-record mode it
190
    // is known that all the programInfos will have been allocated in an arena with the
191
    // same lifetime at the DDL itself.
192
0
    virtual void detachProgramData(skia_private::TArray<ProgramData>*) {}
193
194
    sktext::gpu::TextBlobRedrawCoordinator* getTextBlobRedrawCoordinator();
195
    const sktext::gpu::TextBlobRedrawCoordinator* getTextBlobRedrawCoordinator() const;
196
197
    GrThreadSafeCache* threadSafeCache();
198
    const GrThreadSafeCache* threadSafeCache() const;
199
200
    /**
201
     * Registers an object for flush-related callbacks. (See GrOnFlushCallbackObject.)
202
     *
203
     * NOTE: the drawing manager tracks this object as a raw pointer; it is up to the caller to
204
     * ensure its lifetime is tied to that of the context.
205
     */
206
    void addOnFlushCallbackObject(GrOnFlushCallbackObject*);
207
208
0
    GrRecordingContext* asRecordingContext() override { return this; }
209
210
    class Stats {
211
    public:
212
2.58k
        Stats() = default;
213
214
#if GR_GPU_STATS
215
0
        void reset() { *this = {}; }
216
217
0
        int numPathMasksGenerated() const { return fNumPathMasksGenerated; }
218
5.67k
        void incNumPathMasksGenerated() { fNumPathMasksGenerated++; }
219
220
0
        int numPathMaskCacheHits() const { return fNumPathMaskCacheHits; }
221
0
        void incNumPathMasksCacheHits() { fNumPathMaskCacheHits++; }
222
223
#if defined(GR_TEST_UTILS)
224
        void dump(SkString* out) const;
225
        void dumpKeyValuePairs(skia_private::TArray<SkString>* keys,
226
                               skia_private::TArray<double>* values) const;
227
#endif
228
229
    private:
230
        int fNumPathMasksGenerated{0};
231
        int fNumPathMaskCacheHits{0};
232
233
#else // GR_GPU_STATS
234
        void incNumPathMasksGenerated() {}
235
        void incNumPathMasksCacheHits() {}
236
237
#if defined(GR_TEST_UTILS)
238
        void dump(SkString*) const {}
239
        void dumpKeyValuePairs(skia_private::TArray<SkString>* keys,
240
                               skia_private::TArray<double>* values) const {}
241
#endif
242
#endif // GR_GPU_STATS
243
    } fStats;
244
245
#if GR_GPU_STATS && defined(GR_TEST_UTILS)
246
    struct DMSAAStats {
247
        void dumpKeyValuePairs(skia_private::TArray<SkString>* keys,
248
                               skia_private::TArray<double>* values) const;
249
        void dump() const;
250
        void merge(const DMSAAStats&);
251
        int fNumRenderPasses = 0;
252
        int fNumMultisampleRenderPasses = 0;
253
        std::map<std::string, int> fTriggerCounts;
254
    };
255
256
    DMSAAStats fDMSAAStats;
257
#endif
258
259
0
    Stats* stats() { return &fStats; }
260
0
    const Stats* stats() const { return &fStats; }
261
    void dumpJSON(SkJSONWriter*) const;
262
263
protected:
264
    // Delete last in case other objects call it during destruction.
265
    std::unique_ptr<GrAuditTrail>     fAuditTrail;
266
267
private:
268
    OwnedArenas                       fArenas;
269
270
    std::unique_ptr<GrDrawingManager> fDrawingManager;
271
    std::unique_ptr<GrProxyProvider>  fProxyProvider;
272
273
#if defined(GR_TEST_UTILS)
274
    int fSuppressWarningMessages = 0;
275
#endif
276
};
277
278
/**
279
 * Safely cast a possibly-null base context to direct context.
280
 */
281
125k
static inline GrDirectContext* GrAsDirectContext(GrContext_Base* base) {
282
125k
    return base ? base->asDirectContext() : nullptr;
283
125k
}
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: ProtectedUtils.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: MockTestContext.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: VkTestContext.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: VkTestHelper.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: VkYcbcrSamplerHelper.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: AtlasTextOpTools.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrAtlasTools.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: DDLPromiseImageHelper.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: DDLTileHelper.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GpuToolUtils.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: MSKPPlayer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: DebugCanvas.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: DrawCommand.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDeferredDisplayList.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDeferredDisplayListRecorder.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDirectContext.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDirectContextPriv.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDrawOpAtlas.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: 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: 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: GrTextureRenderTargetProxy.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: PathRendererChain.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkGr.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SurfaceContext.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SurfaceDrawContext.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SurfaceFillContext.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrImageUtils.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrTextureGenerator.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkImage_Ganesh.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkImage_GaneshBase.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkImage_GaneshFactories.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkImage_GaneshYUVA.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkImage_LazyTexture.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkImage_RasterPinnable.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkSpecialImage_Ganesh.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: AtlasPathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: AtlasRenderTask.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: AtlasTextOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: ClearOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: DashLinePathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: DashOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: DefaultPathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: DrawAtlasOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: DrawAtlasPathOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: DrawMeshOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: DrawableOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: FillRRectOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: FillRectOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrMeshDrawOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrOvalOpFactory.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrSimpleMeshDrawOpHelper.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrSimpleMeshDrawOpHelperWithStencil.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: LatticeOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: OpsTask.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: PathStencilCoverOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: QuadPerEdgeAA.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: RegionOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: ShadowRRectOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SmallPathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SoftwarePathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: StrokeRectOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: TessellationPathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: TextureOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: TriangulatingPathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SkSurface_Ganesh.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: PathTessellator.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrVkDirectContext.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrVkGpu.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrVkMSAALoadManager.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrVkOpsRenderPass.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrVkPipelineStateCache.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrVkPipelineStateDataManager.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrVkRenderTarget.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrVkResourceProvider.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrVkTextureRenderTarget.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrVkUtil.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: SubRunContainer.cpp:GrAsDirectContext(GrContext_Base*)
Device.cpp:GrAsDirectContext(GrContext_Base*)
Line
Count
Source
281
452
static inline GrDirectContext* GrAsDirectContext(GrContext_Base* base) {
282
452
    return base ? base->asDirectContext() : nullptr;
283
452
}
Unexecuted instantiation: Device_drawTexture.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrBackendTextureImageGenerator.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrBlurUtils.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrBufferAllocPool.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrBufferTransferRenderTask.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrBufferUpdateRenderTask.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrClientMappedBufferManager.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrCopyRenderTask.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDDLContext.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDDLTask.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrDynamicAtlas.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrFragmentProcessors.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrMeshDrawTarget.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrOnFlushResourceProvider.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrProcessorUnitTest.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrSWMaskHelper.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: PathRenderer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrGradientShader.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: PathInnerTriangulateOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: PathTessellateOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: StrokeTessellateOp.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: StrokeTessellator.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrVkBuffer.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrVkCommandPool.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrVkPipelineStateBuilder.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: ClipStack.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: StencilMaskHelper.cpp:GrAsDirectContext(GrContext_Base*)
FuzzCanvas.cpp:GrAsDirectContext(GrContext_Base*)
Line
Count
Source
281
125k
static inline GrDirectContext* GrAsDirectContext(GrContext_Base* base) {
282
125k
    return base ? base->asDirectContext() : nullptr;
283
125k
}
Unexecuted instantiation: FuzzPrecompile.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: GrRenderTargetProxy.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: FuzzCreateDDL.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: FuzzSkParagraph.cpp:GrAsDirectContext(GrContext_Base*)
Unexecuted instantiation: FuzzDDLThreading.cpp:GrAsDirectContext(GrContext_Base*)
284
285
#endif