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