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