xref: /aosp_15_r20/external/skia/src/shaders/SkRuntimeShader.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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