Coverage Report

Created: 2024-09-14 07:19

/src/skia/include/gpu/graphite/precompile/PrecompileShader.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 2024 Google LLC
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 skgpu_graphite_precompile_PrecompileShader_DEFINED
9
#define skgpu_graphite_precompile_PrecompileShader_DEFINED
10
11
#include "include/gpu/graphite/precompile/PrecompileBase.h"
12
13
#include "include/core/SkBlendMode.h"
14
15
class SkColorSpace;
16
17
namespace skgpu::graphite {
18
19
class PrecompileBlender;
20
class PrecompileColorFilter;
21
class PrecompileShaderPriv;
22
23
/** \class PrecompileShader
24
    This class corresponds to the SkShader class in the main API.
25
*/
26
class SK_API PrecompileShader : public PrecompileBase {
27
public:
28
    /**
29
     *  This is the Precompile correlate to SkShader::makeWithLocalMatrix. The actual matrix
30
     *  involved is abstracted away, except for whether or the not the matrix involves perspective
31
     *  so the correct generated shader variation is chosen.
32
     *  The PrecompileShaders::LocalMatrix factory can be used to generate a set of shaders
33
     *  that would've been generated via multiple makeWithLocalMatrix calls. That is, rather than
34
     *  performing:
35
     *     sk_sp<PrecompileShader> option1 = source1->makeWithLocalMatrix(false);
36
     *     sk_sp<PrecompileShader> option2 = source2->makeWithLocalMatrix(false);
37
     *  one could call:
38
     *     sk_sp<PrecompileShader> combinedOptions = LocalMatrix({ source1, source2 }, false);
39
     */
40
    sk_sp<PrecompileShader> makeWithLocalMatrix(bool isPerspective) const;
41
42
    /**
43
     *  This is the Precompile correlate to SkShader::makeWithColorFilter.
44
     *  The PrecompileShaders::ColorFilter factory can be used to generate a set of shaders that
45
     *  would've been generated via multiple makeWithColorFilter calls. That is, rather than
46
     *  performing:
47
     *     sk_sp<PrecompileShader> option1 = source->makeWithColorFilter(colorFilter1);
48
     *     sk_sp<PrecompileShader> option2 = source->makeWithColorFilter(colorFilter2);
49
     *  one could call:
50
     *     sk_sp<PrecompileShader> combinedOptions = ColorFilter({ source },
51
     *                                                           { colorFilter1, colorFilter2 });
52
     *  With an alternative use case one could also use the ColorFilter factory thusly:
53
     *     sk_sp<PrecompileShader> combinedOptions = ColorFilter({ source1, source2 },
54
     *                                                           { colorFilter });
55
     */
56
    sk_sp<PrecompileShader> makeWithColorFilter(sk_sp<PrecompileColorFilter>) const;
57
58
    /**
59
     *  This is the Precompile correlate to SkShader::makeWithWorkingColorSpace.
60
     *  The PrecompileShaders::WorkingColorSpace factory can be used to generate a set of shaders
61
     *  that would've been generated via multiple makeWithWorkingColorSpace calls. That is, rather
62
     *  than performing:
63
     *     sk_sp<PrecompileShader> option1 = source->makeWithWorkingColorSpace(colorSpace1);
64
     *     sk_sp<PrecompileShader> option2 = source->makeWithWorkingColorSpace(colorSpace2);
65
     *  one could call:
66
     *     sk_sp<PrecompileShader> combinedOptions = WorkingColorSpace({ source },
67
     *                                                                 { colorSpace1,
68
     *                                                                   colorSpace2 });
69
     *  With an alternative use case one could also use the WorkingColorSpace factory thusly:
70
     *     sk_sp<PrecompileShader> combinedOptions = WorkingColorSpace({ source1, source2 },
71
     *                                                                 { colorSpace });
72
     */
73
    sk_sp<PrecompileShader> makeWithWorkingColorSpace(sk_sp<SkColorSpace>) const;
74
75
    // Provides access to functions that aren't part of the public API.
76
    PrecompileShaderPriv priv();
77
    const PrecompileShaderPriv priv() const;  // NOLINT(readability-const-return-type)
78
79
protected:
80
    friend class PrecompileShaderPriv;
81
82
0
    PrecompileShader() : PrecompileBase(Type::kShader) {}
83
    ~PrecompileShader() override;
84
85
0
    virtual bool isConstant(int /* desiredCombination */) const { return false; }
86
87
0
    virtual bool isALocalMatrixShader() const { return false; }
88
};
89
90
//--------------------------------------------------------------------------------------------------
91
// This is the Precompile correlate to the SkShaders namespace in the main API
92
namespace PrecompileShaders {
93
    // --- This block of eight matches the SkShaders factories in SkShader.h
94
    // Note that some of the details of the main API have been elided since they don't impact
95
    // the generated shader (e.g., the color parameter to the Color() factories).
96
    SK_API sk_sp<PrecompileShader> Empty();
97
    SK_API sk_sp<PrecompileShader> Color();
98
    SK_API sk_sp<PrecompileShader> Color(sk_sp<SkColorSpace>);
99
    SK_API sk_sp<PrecompileShader> Blend(SkSpan<const SkBlendMode> blendModes,
100
                                         SkSpan<const sk_sp<PrecompileShader>> dsts,
101
                                         SkSpan<const sk_sp<PrecompileShader>> srcs);
102
    SK_API sk_sp<PrecompileShader> Blend(SkSpan<const sk_sp<PrecompileBlender>> blenders,
103
                                         SkSpan<const sk_sp<PrecompileShader>> dsts,
104
                                         SkSpan<const sk_sp<PrecompileShader>> srcs);
105
    SK_API sk_sp<PrecompileShader> CoordClamp(SkSpan<const sk_sp<PrecompileShader>>);
106
107
    // In the main Skia API ImageShaders are usually created via a SkImage::makeShader call.
108
    // Since the SkImage used to create the ImageShader is unlikely to be present at precompilation
109
    // time this entry point allows the equivalent precompilation program structure to be created.
110
    // Note that this factory is for non-YUV SkImages, the YUVImage factory (below) should be used
111
    // to represent the shading and sampling required for YUV images.
112
    SK_API sk_sp<PrecompileShader> Image();
113
    // As with the above Image call, raw ImageShaders are usually created via an
114
    // SkImage::makeRawShader call. The RawImage call allows the equivalent precompilation
115
    // program structure to be created without needing the SkImage.
116
    SK_API sk_sp<PrecompileShader> RawImage();
117
118
    // In the main Skia API, the specifics of the SkImage used for the SkImage::makeShader call
119
    // can determine whether normal or YUV sampling is required. This entry point allows clients
120
    // to specify that the future image will be a YUV image.
121
    SK_API sk_sp<PrecompileShader> YUVImage();
122
123
    // --- This block of two matches the SkShaders factories in SkPerlinNoiseShader.h
124
    // Again, most of the details have been elided.
125
    SK_API sk_sp<PrecompileShader> MakeFractalNoise();
126
    SK_API sk_sp<PrecompileShader> MakeTurbulence();
127
128
    // --- This block of four matches all the factories in SkGradientShader (SkGradientShader.h)
129
    SK_API sk_sp<PrecompileShader> LinearGradient();
130
    SK_API sk_sp<PrecompileShader> RadialGradient();
131
    SK_API sk_sp<PrecompileShader> TwoPointConicalGradient();
132
    SK_API sk_sp<PrecompileShader> SweepGradient();
133
134
    // Normally, SkPicture shaders are only created via SkPicture::makeShader. Since the
135
    // SkPicture to be drawn, most likely, won't be available at precompilation time, this
136
    // entry point can be used to create a precompilation equivalent.
137
    // Note: this will precompile the program that draws the SkPicture. It, obviously, won't
138
    // precompile any SkPaints within the SkPicture.
139
    SK_API sk_sp<PrecompileShader> Picture();
140
141
    // Normally, LocalMatrixShaders are only created via SkShader::makeWithLocalMatrix.
142
    // However, in the combination API, clients may want to create a set of precompile
143
    // LocalMatrixShaders (i.e., pass an SkSpan to the factory function vs just creating a
144
    // single option). This entry point allows that use case.
145
    // Note: PrecompileShader::makeWithLocalMatrix() can still be used and works as expected.
146
    SK_API sk_sp<PrecompileShader> LocalMatrix(SkSpan<const sk_sp<PrecompileShader>> wrapped,
147
                                               bool isPerspective = false);
148
149
    // Normally, ColorFilterShaders are only created via SkShader::makeWithColorFilter.
150
    // However, in the combination API, clients may want to create a set of precompile
151
    // ColorFilterShaders (i.e., pass SkSpans to the factory function vs just creating a
152
    // single option). This entry point allows that use case.
153
    // Note: PrecompileShader::makeWithColorFilter can still be used and works as expected.
154
    SK_API sk_sp<PrecompileShader> ColorFilter(
155
            SkSpan<const sk_sp<PrecompileShader>> shaders,
156
            SkSpan<const sk_sp<PrecompileColorFilter>> colorFilters);
157
158
    // Normally, WorkingColorSpaceShaders are only created via SkShader::makeWithWorkingColorSpace.
159
    // However, in the combination API, clients may want to create a set of precompile
160
    // WorkingColorSpaceShaders (i.e., pass SkSpans to the factory function vs just creating a
161
    // single option). This entry point allows that use case.
162
    // Note: PrecompileShader::makeWithWorkingColorSpace can still be used and works as expected.
163
    SK_API sk_sp<PrecompileShader> WorkingColorSpace(SkSpan<const sk_sp<PrecompileShader>> shaders,
164
                                                     SkSpan<const sk_sp<SkColorSpace>> colorSpaces);
165
166
} // namespace PrecompileShaders
167
168
} // namespace skgpu::graphite
169
170
#endif // skgpu_graphite_precompile_PrecompileShader_DEFINED