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