1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 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_Uniform_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_Uniform_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkSLTypeShared.h" 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker // TODO: can SkRuntimeEffect::Uniform be absorbed into this class!? 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker /** 18*c8dee2aaSAndroid Build Coastguard Worker * Describes a uniform. Uniforms consist of: 19*c8dee2aaSAndroid Build Coastguard Worker * name: The constant string name to use in the generated SkSL (with mangling) 20*c8dee2aaSAndroid Build Coastguard Worker * type: The type of the uniform 21*c8dee2aaSAndroid Build Coastguard Worker * count: Number of elements of 'type' in the array or kNonArray if not an array. 22*c8dee2aaSAndroid Build Coastguard Worker */ 23*c8dee2aaSAndroid Build Coastguard Worker class Uniform { 24*c8dee2aaSAndroid Build Coastguard Worker public: 25*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kNonArray = 0; 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker constexpr Uniform(const char* name, SkSLType type, int count = kNonArray) Uniform(name,type,count,false)28*c8dee2aaSAndroid Build Coastguard Worker : Uniform(name, type, count, /*isPaintColor=*/false) {} 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker /* 31*c8dee2aaSAndroid Build Coastguard Worker * The paint color uniform is treated special and will only be added to the uniform block 32*c8dee2aaSAndroid Build Coastguard Worker * once. Its name will not be mangled. 33*c8dee2aaSAndroid Build Coastguard Worker */ PaintColor()34*c8dee2aaSAndroid Build Coastguard Worker static constexpr Uniform PaintColor() { 35*c8dee2aaSAndroid Build Coastguard Worker return Uniform("paintColor", SkSLType::kFloat4, 36*c8dee2aaSAndroid Build Coastguard Worker Uniform::kNonArray, /*isPaintColor=*/true); 37*c8dee2aaSAndroid Build Coastguard Worker } 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker constexpr Uniform(const Uniform&) = default; 40*c8dee2aaSAndroid Build Coastguard Worker Uniform& operator=(const Uniform&) = default; 41*c8dee2aaSAndroid Build Coastguard Worker name()42*c8dee2aaSAndroid Build Coastguard Worker constexpr const char* name() const { return fName; } type()43*c8dee2aaSAndroid Build Coastguard Worker constexpr SkSLType type() const { return static_cast<SkSLType>(fType); } count()44*c8dee2aaSAndroid Build Coastguard Worker constexpr int count() const { return static_cast<int>(fCount); } 45*c8dee2aaSAndroid Build Coastguard Worker isPaintColor()46*c8dee2aaSAndroid Build Coastguard Worker constexpr bool isPaintColor() const { return static_cast<bool>(fIsPaintColor); } 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker private: Uniform(const char * name,SkSLType type,int count,bool isPaintColor)49*c8dee2aaSAndroid Build Coastguard Worker constexpr Uniform(const char* name, SkSLType type, int count, bool isPaintColor) 50*c8dee2aaSAndroid Build Coastguard Worker : fName(name) 51*c8dee2aaSAndroid Build Coastguard Worker , fType(static_cast<unsigned>(type)) 52*c8dee2aaSAndroid Build Coastguard Worker , fIsPaintColor(static_cast<unsigned>(isPaintColor)) 53*c8dee2aaSAndroid Build Coastguard Worker , fCount(static_cast<unsigned>(count)) { 54*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(SkSLTypeCanBeUniformValue(type)); 55*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(count >= 0); 56*c8dee2aaSAndroid Build Coastguard Worker } 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker // Uniform definitions for all encountered SkRuntimeEffects are stored permanently in the 61*c8dee2aaSAndroid Build Coastguard Worker // ShaderCodeDictionary as part of the stable ShaderSnippet and code ID assigned to the 62*c8dee2aaSAndroid Build Coastguard Worker // effect, including de-duplicating equivalent or re-created SkRuntimeEffects with the same 63*c8dee2aaSAndroid Build Coastguard Worker // SkSL. To help keep this memory overhead as low as possible, we pack the Uniform fields 64*c8dee2aaSAndroid Build Coastguard Worker // as tightly as possible. 65*c8dee2aaSAndroid Build Coastguard Worker uint32_t fType : 6; 66*c8dee2aaSAndroid Build Coastguard Worker uint32_t fIsPaintColor : 1; 67*c8dee2aaSAndroid Build Coastguard Worker uint32_t fCount : 25; 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker static_assert(kSkSLTypeCount <= (1 << 6)); 70*c8dee2aaSAndroid Build Coastguard Worker }; 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_Uniform_DEFINED 75