xref: /aosp_15_r20/external/skia/src/gpu/graphite/ShaderInfo.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2024 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef skgpu_graphite_ShaderInfo_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_ShaderInfo_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkArenaAlloc.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/Blend.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/Swizzle.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/Caps.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/ResourceTypes.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/UniquePaintParamsID.h"
18*c8dee2aaSAndroid Build Coastguard Worker 
19*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
20*c8dee2aaSAndroid Build Coastguard Worker 
21*c8dee2aaSAndroid Build Coastguard Worker class RenderStep;
22*c8dee2aaSAndroid Build Coastguard Worker class RuntimeEffectDictionary;
23*c8dee2aaSAndroid Build Coastguard Worker class ShaderCodeDictionary;
24*c8dee2aaSAndroid Build Coastguard Worker class ShaderNode;
25*c8dee2aaSAndroid Build Coastguard Worker 
26*c8dee2aaSAndroid Build Coastguard Worker // ShaderInfo holds all root ShaderNodes defined for a PaintParams as well as the extracted fixed
27*c8dee2aaSAndroid Build Coastguard Worker // function blending parameters and other aggregate requirements for the effect trees that have
28*c8dee2aaSAndroid Build Coastguard Worker // been linked into a single fragment program (sans any RenderStep fragment work and fixed SkSL
29*c8dee2aaSAndroid Build Coastguard Worker // logic required for all rendering in Graphite).
30*c8dee2aaSAndroid Build Coastguard Worker class ShaderInfo {
31*c8dee2aaSAndroid Build Coastguard Worker public:
32*c8dee2aaSAndroid Build Coastguard Worker     // Accepts a real or, by default, an invalid/nullptr pointer to a container of SamplerDescs.
33*c8dee2aaSAndroid Build Coastguard Worker     // Backend implementations which may utilize static / immutable samplers should pass in a real
34*c8dee2aaSAndroid Build Coastguard Worker     // pointer to indicate that shader node data must be analyzed to determine whether
35*c8dee2aaSAndroid Build Coastguard Worker     // immutable samplers are used, and if so, ascertain SamplerDescs for them.
36*c8dee2aaSAndroid Build Coastguard Worker     // TODO(b/366220690): Actually perform this analysis.
37*c8dee2aaSAndroid Build Coastguard Worker 
38*c8dee2aaSAndroid Build Coastguard Worker     // If provided a valid container ptr, this function will delegate the addition of SamplerDescs
39*c8dee2aaSAndroid Build Coastguard Worker     // for each sampler the nodes utilize (dynamic and immutable). This way, a SamplerDesc's index
40*c8dee2aaSAndroid Build Coastguard Worker     // within the container can inform its binding order. Each SamplerDesc will be either:
41*c8dee2aaSAndroid Build Coastguard Worker     // 1) a default-constructed SamplerDesc, indicating the use of a "regular" dynamic sampler which
42*c8dee2aaSAndroid Build Coastguard Worker     //    requires no special handling OR
43*c8dee2aaSAndroid Build Coastguard Worker     // 2) a real SamplerDesc describing an immutable sampler. Backend pipelines can then use the
44*c8dee2aaSAndroid Build Coastguard Worker     //    desc to obtain a real immutable sampler pointer (which typically must be included in
45*c8dee2aaSAndroid Build Coastguard Worker     //    pipeline layouts)
46*c8dee2aaSAndroid Build Coastguard Worker     static std::unique_ptr<ShaderInfo> Make(const Caps*,
47*c8dee2aaSAndroid Build Coastguard Worker                                             const ShaderCodeDictionary*,
48*c8dee2aaSAndroid Build Coastguard Worker                                             const RuntimeEffectDictionary*,
49*c8dee2aaSAndroid Build Coastguard Worker                                             const RenderStep*,
50*c8dee2aaSAndroid Build Coastguard Worker                                             UniquePaintParamsID,
51*c8dee2aaSAndroid Build Coastguard Worker                                             bool useStorageBuffers,
52*c8dee2aaSAndroid Build Coastguard Worker                                             skgpu::Swizzle writeSwizzle,
53*c8dee2aaSAndroid Build Coastguard Worker                                             skia_private::TArray<SamplerDesc>* outDescs = nullptr);
54*c8dee2aaSAndroid Build Coastguard Worker 
runtimeEffectDictionary()55*c8dee2aaSAndroid Build Coastguard Worker     const RuntimeEffectDictionary* runtimeEffectDictionary() const {
56*c8dee2aaSAndroid Build Coastguard Worker         return fRuntimeEffectDictionary;
57*c8dee2aaSAndroid Build Coastguard Worker     }
ssboIndex()58*c8dee2aaSAndroid Build Coastguard Worker     const char* ssboIndex() const { return fSsboIndex; }
59*c8dee2aaSAndroid Build Coastguard Worker 
dstReadRequirement()60*c8dee2aaSAndroid Build Coastguard Worker     DstReadRequirement dstReadRequirement() const { return fDstReadRequirement; }
blendInfo()61*c8dee2aaSAndroid Build Coastguard Worker     const skgpu::BlendInfo& blendInfo() const { return fBlendInfo; }
62*c8dee2aaSAndroid Build Coastguard Worker 
data()63*c8dee2aaSAndroid Build Coastguard Worker     const skia_private::TArray<uint32_t>& data() const { return fData; }
64*c8dee2aaSAndroid Build Coastguard Worker 
vertexSkSL()65*c8dee2aaSAndroid Build Coastguard Worker     const std::string& vertexSkSL() const { return fVertexSkSL; }
fragmentSkSL()66*c8dee2aaSAndroid Build Coastguard Worker     const std::string& fragmentSkSL() const { return fFragmentSkSL; }
vsLabel()67*c8dee2aaSAndroid Build Coastguard Worker     const std::string& vsLabel() const { return fVSLabel; }
fsLabel()68*c8dee2aaSAndroid Build Coastguard Worker     const std::string& fsLabel() const { return fFSLabel; }
69*c8dee2aaSAndroid Build Coastguard Worker 
numFragmentTexturesAndSamplers()70*c8dee2aaSAndroid Build Coastguard Worker     int numFragmentTexturesAndSamplers() const { return fNumFragmentTexturesAndSamplers; }
hasStepUniforms()71*c8dee2aaSAndroid Build Coastguard Worker     bool hasStepUniforms() const { return fHasStepUniforms; }
hasPaintUniforms()72*c8dee2aaSAndroid Build Coastguard Worker     bool hasPaintUniforms() const { return fHasPaintUniforms; }
hasGradientBuffer()73*c8dee2aaSAndroid Build Coastguard Worker     bool hasGradientBuffer() const { return fHasGradientBuffer; }
74*c8dee2aaSAndroid Build Coastguard Worker 
75*c8dee2aaSAndroid Build Coastguard Worker     // Name used in-shader for gradient buffer uniform.
76*c8dee2aaSAndroid Build Coastguard Worker     static constexpr char kGradientBufferName[] = "fsGradientBuffer";
77*c8dee2aaSAndroid Build Coastguard Worker 
78*c8dee2aaSAndroid Build Coastguard Worker private:
79*c8dee2aaSAndroid Build Coastguard Worker     ShaderInfo(const RuntimeEffectDictionary*, const char* ssboIndex);
80*c8dee2aaSAndroid Build Coastguard Worker 
81*c8dee2aaSAndroid Build Coastguard Worker     void generateVertexSkSL(const Caps*,
82*c8dee2aaSAndroid Build Coastguard Worker                             const RenderStep*,
83*c8dee2aaSAndroid Build Coastguard Worker                             bool useStorageBuffers);
84*c8dee2aaSAndroid Build Coastguard Worker 
85*c8dee2aaSAndroid Build Coastguard Worker     // Determines fNumFragmentTexturesAndSamplers, fHasPaintUniforms, fHasGradientBuffer, and if a
86*c8dee2aaSAndroid Build Coastguard Worker     // valid SamplerDesc ptr is passed in, any immutable sampler SamplerDescs.
87*c8dee2aaSAndroid Build Coastguard Worker     void generateFragmentSkSL(const Caps*,
88*c8dee2aaSAndroid Build Coastguard Worker                               const ShaderCodeDictionary*,
89*c8dee2aaSAndroid Build Coastguard Worker                               const RenderStep*,
90*c8dee2aaSAndroid Build Coastguard Worker                               UniquePaintParamsID,
91*c8dee2aaSAndroid Build Coastguard Worker                               bool useStorageBuffers,
92*c8dee2aaSAndroid Build Coastguard Worker                               skgpu::Swizzle writeSwizzle,
93*c8dee2aaSAndroid Build Coastguard Worker                               skia_private::TArray<SamplerDesc>* outDescs);
94*c8dee2aaSAndroid Build Coastguard Worker 
95*c8dee2aaSAndroid Build Coastguard Worker     bool needsLocalCoords() const;
96*c8dee2aaSAndroid Build Coastguard Worker 
97*c8dee2aaSAndroid Build Coastguard Worker     // Recursive method which traverses ShaderNodes in a depth-first manner to aggregate all
98*c8dee2aaSAndroid Build Coastguard Worker     // ShaderNode data (not owned by ShaderNode) into ShaderInfo's owned fData.
99*c8dee2aaSAndroid Build Coastguard Worker     // TODO(b/347072931): Ideally, this method could go away and each snippet's data could remain
100*c8dee2aaSAndroid Build Coastguard Worker     // tied to its ID instead of accumulating it all here.
101*c8dee2aaSAndroid Build Coastguard Worker     void aggregateSnippetData(const ShaderNode*);
102*c8dee2aaSAndroid Build Coastguard Worker 
103*c8dee2aaSAndroid Build Coastguard Worker     // All shader nodes and arrays of children pointers are held in this arena
104*c8dee2aaSAndroid Build Coastguard Worker     SkArenaAlloc fShaderNodeAlloc{256};
105*c8dee2aaSAndroid Build Coastguard Worker 
106*c8dee2aaSAndroid Build Coastguard Worker     const RuntimeEffectDictionary* fRuntimeEffectDictionary;
107*c8dee2aaSAndroid Build Coastguard Worker     const char* fSsboIndex;
108*c8dee2aaSAndroid Build Coastguard Worker 
109*c8dee2aaSAndroid Build Coastguard Worker     // De-compressed shader tree from a PaintParamsKey. There can be 1 or 2 root nodes, the first
110*c8dee2aaSAndroid Build Coastguard Worker     // being the paint effects (rooted with a BlendCompose for the final paint blend) and the
111*c8dee2aaSAndroid Build Coastguard Worker     // optional second being any analytic clip effect (geometric or shader treated as coverage).
112*c8dee2aaSAndroid Build Coastguard Worker     SkSpan<const ShaderNode*> fRootNodes;
113*c8dee2aaSAndroid Build Coastguard Worker     // The blendInfo represents the actual GPU blend operations, which may or may not completely
114*c8dee2aaSAndroid Build Coastguard Worker     // implement the paint and coverage blending defined by the root nodes.
115*c8dee2aaSAndroid Build Coastguard Worker     skgpu::BlendInfo fBlendInfo;
116*c8dee2aaSAndroid Build Coastguard Worker     DstReadRequirement fDstReadRequirement = DstReadRequirement::kNone;
117*c8dee2aaSAndroid Build Coastguard Worker 
118*c8dee2aaSAndroid Build Coastguard Worker     // Note that fData is currently only used to store SamplerDesc information for shaders that have
119*c8dee2aaSAndroid Build Coastguard Worker     // the option of using immutable samplers. However, other snippets could leverage this field to
120*c8dee2aaSAndroid Build Coastguard Worker     // convey other information once data can be tied to snippetIDs (b/347072931).
121*c8dee2aaSAndroid Build Coastguard Worker     skia_private::TArray<uint32_t> fData;
122*c8dee2aaSAndroid Build Coastguard Worker 
123*c8dee2aaSAndroid Build Coastguard Worker     std::string fVertexSkSL;
124*c8dee2aaSAndroid Build Coastguard Worker     std::string fFragmentSkSL;
125*c8dee2aaSAndroid Build Coastguard Worker     std::string fVSLabel;
126*c8dee2aaSAndroid Build Coastguard Worker     std::string fFSLabel;
127*c8dee2aaSAndroid Build Coastguard Worker 
128*c8dee2aaSAndroid Build Coastguard Worker     int fNumFragmentTexturesAndSamplers = 0;
129*c8dee2aaSAndroid Build Coastguard Worker     bool fHasStepUniforms = false;
130*c8dee2aaSAndroid Build Coastguard Worker     bool fHasPaintUniforms = false;
131*c8dee2aaSAndroid Build Coastguard Worker     bool fHasGradientBuffer = false;
132*c8dee2aaSAndroid Build Coastguard Worker };
133*c8dee2aaSAndroid Build Coastguard Worker 
134*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skgpu::graphite
135*c8dee2aaSAndroid Build Coastguard Worker 
136*c8dee2aaSAndroid Build Coastguard Worker #endif  // skgpu_graphite_ShaderInfo_DEFINED
137