• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2021 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_ContextUtils_DEFINED
9 #define skgpu_graphite_ContextUtils_DEFINED
10 
11 #include "src/gpu/Blend.h"
12 #include "src/gpu/graphite/PaintParamsKey.h"
13 #include "src/gpu/graphite/PipelineDataCache.h"
14 
15 #include <optional>
16 #include <tuple>
17 
18 class SkColorInfo;
19 class SkM44;
20 class SkPaint;
21 
22 namespace skgpu {
23 class Swizzle;
24 }
25 
26 namespace skgpu::graphite {
27 
28 class ComputeStep;
29 enum class Coverage;
30 class DrawParams;
31 enum class DstReadRequirement;
32 class Geometry;
33 class GraphicsPipelineDesc;
34 class PaintParams;
35 class PipelineDataGatherer;
36 class Recorder;
37 struct RenderPassDesc;
38 class RenderStep;
39 class RuntimeEffectDictionary;
40 class ShaderNode;
41 class UniquePaintParamsID;
42 
43 struct ResourceBindingRequirements;
44 
45 struct VertSkSLInfo {
46     std::string fSkSL;
47 
48     std::string fLabel;
49 
50     int fRenderStepUniformsTotalBytes = 0;
51 };
52 
53 struct FragSkSLInfo {
54     std::string fSkSL;
55     BlendInfo fBlendInfo;
56 
57     std::string fLabel;
58 
59     bool fRequiresLocalCoords = false;
60     int fNumTexturesAndSamplers = 0;
61     int fNumPaintUniforms = 0;
62     int fRenderStepUniformsTotalBytes = 0;
63     int fPaintUniformsTotalBytes = 0;
64     bool fHasGradientBuffer = false;
65 };
66 
67 std::tuple<UniquePaintParamsID, const UniformDataBlock*, const TextureDataBlock*> ExtractPaintData(
68         Recorder*,
69         PipelineDataGatherer* gatherer,
70         PaintParamsKeyBuilder* builder,
71         const Layout layout,
72         const SkM44& local2Dev,
73         const PaintParams&,
74         const Geometry& geometry,
75         sk_sp<TextureProxy> dstTexture,
76         SkIPoint dstOffset,
77         const SkColorInfo& targetColorInfo);
78 
79 std::tuple<const UniformDataBlock*, const TextureDataBlock*> ExtractRenderStepData(
80         UniformDataCache* uniformDataCache,
81         TextureDataCache* textureDataCache,
82         PipelineDataGatherer* gatherer,
83         const Layout layout,
84         const RenderStep* step,
85         const DrawParams& params);
86 
87 DstReadRequirement GetDstReadRequirement(const Caps*, std::optional<SkBlendMode>, Coverage);
88 
89 VertSkSLInfo BuildVertexSkSL(const ResourceBindingRequirements&,
90                              const RenderStep* step,
91                              bool defineShadingSsboIndexVarying,
92                              bool defineLocalCoordsVarying);
93 
94 FragSkSLInfo BuildFragmentSkSL(const Caps* caps,
95                                const ShaderCodeDictionary*,
96                                const RuntimeEffectDictionary*,
97                                const RenderStep* renderStep,
98                                UniquePaintParamsID paintID,
99                                bool useStorageBuffers,
100                                skgpu::Swizzle writeSwizzle);
101 
102 std::string GetPipelineLabel(const ShaderCodeDictionary*,
103                              const RenderPassDesc& renderPassDesc,
104                              const RenderStep* renderStep,
105                              UniquePaintParamsID paintID);
106 
107 std::string BuildComputeSkSL(const Caps*, const ComputeStep*);
108 
109 std::string EmitPaintParamsUniforms(int bufferID,
110                                     const Layout layout,
111                                     SkSpan<const ShaderNode*> nodes,
112                                     int* numPaintUniforms,
113                                     int* paintUniformsTotalBytes,
114                                     bool* wrotePaintColor);
115 std::string EmitRenderStepUniforms(int bufferID,
116                                    const Layout layout,
117                                    SkSpan<const Uniform> uniforms,
118                                    int* renderStepUniformsTotalBytes);
119 std::string EmitPaintParamsStorageBuffer(int bufferID,
120                                          SkSpan<const ShaderNode*> nodes,
121                                          int* numPaintUniforms,
122                                          bool* wrotePaintColor);
123 std::string EmitRenderStepStorageBuffer(int bufferID,
124                                         SkSpan<const Uniform> uniforms);
125 std::string EmitUniformsFromStorageBuffer(const char* bufferNamePrefix,
126                                           const char* ssboIndex,
127                                           SkSpan<const Uniform> uniforms);
128 std::string EmitStorageBufferAccess(const char* bufferNamePrefix,
129                                     const char* ssboIndex,
130                                     const char* uniformName);
131 std::string EmitTexturesAndSamplers(const ResourceBindingRequirements&,
132                                     SkSpan<const ShaderNode*> nodes,
133                                     int* binding);
134 std::string EmitSamplerLayout(const ResourceBindingRequirements&, int* binding);
135 std::string EmitVaryings(const RenderStep* step,
136                          const char* direction,
137                          bool emitSsboIndicesVarying,
138                          bool emitLocalCoordsVarying);
139 
140 } // namespace skgpu::graphite
141 
142 #endif // skgpu_graphite_ContextUtils_DEFINED
143