1 /* 2 * Copyright 2023 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 #ifndef SkRuntimeShader_DEFINED 8 #define SkRuntimeShader_DEFINED 9 10 #include "include/core/SkData.h" 11 #include "include/core/SkFlattenable.h" 12 #include "include/core/SkRefCnt.h" 13 #include "include/core/SkSpan.h" 14 #include "include/effects/SkRuntimeEffect.h" 15 #include "include/private/base/SkDebug.h" 16 #include "src/core/SkRuntimeEffectPriv.h" 17 #include "src/shaders/SkShaderBase.h" 18 #include "src/sksl/tracing/SkSLDebugTracePriv.h" 19 20 #include <vector> 21 22 class SkColorSpace; 23 class SkReadBuffer; 24 class SkWriteBuffer; 25 struct SkIPoint; 26 struct SkStageRec; 27 28 using UniformsCallback = SkRuntimeEffectPriv::UniformsCallback; 29 30 class SkRuntimeShader : public SkShaderBase { 31 public: 32 SkRuntimeShader(sk_sp<SkRuntimeEffect> effect, 33 sk_sp<SkSL::DebugTracePriv> debugTrace, 34 sk_sp<const SkData> uniforms, 35 SkSpan<const SkRuntimeEffect::ChildPtr> children); 36 37 SkRuntimeShader(sk_sp<SkRuntimeEffect> effect, 38 sk_sp<SkSL::DebugTracePriv> debugTrace, 39 UniformsCallback uniformsCallback, 40 SkSpan<const SkRuntimeEffect::ChildPtr> children); 41 42 SkRuntimeEffect::TracedShader makeTracedClone(const SkIPoint& coord); 43 isOpaque()44 bool isOpaque() const override { return fEffect->alwaysOpaque(); } 45 type()46 ShaderType type() const override { return ShaderType::kRuntime; } 47 48 bool appendStages(const SkStageRec& rec, const SkShaders::MatrixRec& mRec) const override; 49 50 void flatten(SkWriteBuffer& buffer) const override; 51 asRuntimeEffect()52 SkRuntimeEffect* asRuntimeEffect() const override { return fEffect.get(); } 53 effect()54 sk_sp<SkRuntimeEffect> effect() const { return fEffect; } children()55 SkSpan<const SkRuntimeEffect::ChildPtr> children() const { return fChildren; } 56 57 sk_sp<const SkData> uniformData(const SkColorSpace* dstCS) const; 58 59 SK_FLATTENABLE_HOOKS(SkRuntimeShader) 60 61 private: 62 enum Flags { 63 kHasLegacyLocalMatrix_Flag = 1 << 1, 64 }; 65 66 sk_sp<SkRuntimeEffect> fEffect; 67 sk_sp<SkSL::DebugTracePriv> fDebugTrace; 68 sk_sp<const SkData> fUniformData; 69 UniformsCallback fUniformsCallback; 70 std::vector<SkRuntimeEffect::ChildPtr> fChildren; 71 }; 72 73 #endif 74