xref: /aosp_15_r20/external/skia/src/gpu/graphite/KeyContext.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2022 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_KeyContext_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_KeyContext_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkM44.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/SkColorData.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkColorSpaceXformSteps.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/TextureProxy.h"
17*c8dee2aaSAndroid Build Coastguard Worker 
18*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker class Caps;
21*c8dee2aaSAndroid Build Coastguard Worker enum class DstReadRequirement;
22*c8dee2aaSAndroid Build Coastguard Worker class Recorder;
23*c8dee2aaSAndroid Build Coastguard Worker class RuntimeEffectDictionary;
24*c8dee2aaSAndroid Build Coastguard Worker class ShaderCodeDictionary;
25*c8dee2aaSAndroid Build Coastguard Worker 
26*c8dee2aaSAndroid Build Coastguard Worker // The key context must always be able to provide a valid ShaderCodeDictionary and
27*c8dee2aaSAndroid Build Coastguard Worker // SkRuntimeEffectDictionary. Depending on the calling context it can also supply a
28*c8dee2aaSAndroid Build Coastguard Worker // backend-specific resource providing object (e.g., a Recorder).
29*c8dee2aaSAndroid Build Coastguard Worker class KeyContext {
30*c8dee2aaSAndroid Build Coastguard Worker public:
31*c8dee2aaSAndroid Build Coastguard Worker     enum class OptimizeSampling : bool { kNo = false, kYes = true };
32*c8dee2aaSAndroid Build Coastguard Worker     // Constructor for the pre-compile code path (i.e., no Recorder)
KeyContext(const Caps * caps,ShaderCodeDictionary * dict,RuntimeEffectDictionary * rtEffectDict,const SkColorInfo & dstColorInfo)33*c8dee2aaSAndroid Build Coastguard Worker     KeyContext(const Caps* caps,
34*c8dee2aaSAndroid Build Coastguard Worker                ShaderCodeDictionary* dict,
35*c8dee2aaSAndroid Build Coastguard Worker                RuntimeEffectDictionary* rtEffectDict,
36*c8dee2aaSAndroid Build Coastguard Worker                const SkColorInfo& dstColorInfo)
37*c8dee2aaSAndroid Build Coastguard Worker             : fDictionary(dict)
38*c8dee2aaSAndroid Build Coastguard Worker             , fRTEffectDict(rtEffectDict)
39*c8dee2aaSAndroid Build Coastguard Worker             , fDstColorInfo(dstColorInfo)
40*c8dee2aaSAndroid Build Coastguard Worker             , fCaps(caps) {}
41*c8dee2aaSAndroid Build Coastguard Worker 
42*c8dee2aaSAndroid Build Coastguard Worker     // Constructor for the ExtractPaintData code path (i.e., with a Recorder)
43*c8dee2aaSAndroid Build Coastguard Worker     KeyContext(Recorder*,
44*c8dee2aaSAndroid Build Coastguard Worker                const SkM44& local2Dev,
45*c8dee2aaSAndroid Build Coastguard Worker                const SkColorInfo& dstColorInfo,
46*c8dee2aaSAndroid Build Coastguard Worker                OptimizeSampling optimizeSampling,
47*c8dee2aaSAndroid Build Coastguard Worker                const SkColor4f& paintColor);
48*c8dee2aaSAndroid Build Coastguard Worker 
49*c8dee2aaSAndroid Build Coastguard Worker     KeyContext(const KeyContext&);
50*c8dee2aaSAndroid Build Coastguard Worker 
recorder()51*c8dee2aaSAndroid Build Coastguard Worker     Recorder* recorder() const { return fRecorder; }
52*c8dee2aaSAndroid Build Coastguard Worker 
caps()53*c8dee2aaSAndroid Build Coastguard Worker     const Caps* caps() const { return fCaps; }
54*c8dee2aaSAndroid Build Coastguard Worker 
local2Dev()55*c8dee2aaSAndroid Build Coastguard Worker     const SkM44& local2Dev() const { return fLocal2Dev; }
localMatrix()56*c8dee2aaSAndroid Build Coastguard Worker     const SkMatrix* localMatrix() const { return fLocalMatrix; }
57*c8dee2aaSAndroid Build Coastguard Worker 
dict()58*c8dee2aaSAndroid Build Coastguard Worker     ShaderCodeDictionary* dict() const { return fDictionary; }
rtEffectDict()59*c8dee2aaSAndroid Build Coastguard Worker     RuntimeEffectDictionary* rtEffectDict() const { return fRTEffectDict; }
60*c8dee2aaSAndroid Build Coastguard Worker 
dstColorInfo()61*c8dee2aaSAndroid Build Coastguard Worker     const SkColorInfo& dstColorInfo() const { return fDstColorInfo; }
62*c8dee2aaSAndroid Build Coastguard Worker 
paintColor()63*c8dee2aaSAndroid Build Coastguard Worker     const SkPMColor4f& paintColor() const { return fPaintColor; }
64*c8dee2aaSAndroid Build Coastguard Worker 
65*c8dee2aaSAndroid Build Coastguard Worker     enum class Scope {
66*c8dee2aaSAndroid Build Coastguard Worker         kDefault,
67*c8dee2aaSAndroid Build Coastguard Worker         kRuntimeEffect,
68*c8dee2aaSAndroid Build Coastguard Worker     };
69*c8dee2aaSAndroid Build Coastguard Worker 
scope()70*c8dee2aaSAndroid Build Coastguard Worker     Scope scope() const { return fScope; }
optimizeSampling()71*c8dee2aaSAndroid Build Coastguard Worker     OptimizeSampling optimizeSampling() const { return fOptimizeSampling; }
72*c8dee2aaSAndroid Build Coastguard Worker 
73*c8dee2aaSAndroid Build Coastguard Worker protected:
74*c8dee2aaSAndroid Build Coastguard Worker     Recorder* fRecorder = nullptr;
75*c8dee2aaSAndroid Build Coastguard Worker     SkM44 fLocal2Dev;
76*c8dee2aaSAndroid Build Coastguard Worker     SkMatrix* fLocalMatrix = nullptr;
77*c8dee2aaSAndroid Build Coastguard Worker     ShaderCodeDictionary* fDictionary;
78*c8dee2aaSAndroid Build Coastguard Worker     RuntimeEffectDictionary* fRTEffectDict;
79*c8dee2aaSAndroid Build Coastguard Worker     SkColorInfo fDstColorInfo;
80*c8dee2aaSAndroid Build Coastguard Worker     // Although stored as premul the paint color is actually comprised of an opaque RGB portion
81*c8dee2aaSAndroid Build Coastguard Worker     // and a separate alpha portion. The two portions will never be used together but are stored
82*c8dee2aaSAndroid Build Coastguard Worker     // together to reduce the number of uniforms.
83*c8dee2aaSAndroid Build Coastguard Worker     SkPMColor4f fPaintColor = SK_PMColor4fBLACK;
84*c8dee2aaSAndroid Build Coastguard Worker     Scope fScope = Scope::kDefault;
85*c8dee2aaSAndroid Build Coastguard Worker     OptimizeSampling fOptimizeSampling = OptimizeSampling::kNo;
86*c8dee2aaSAndroid Build Coastguard Worker 
87*c8dee2aaSAndroid Build Coastguard Worker private:
88*c8dee2aaSAndroid Build Coastguard Worker     const Caps* fCaps = nullptr;
89*c8dee2aaSAndroid Build Coastguard Worker };
90*c8dee2aaSAndroid Build Coastguard Worker 
91*c8dee2aaSAndroid Build Coastguard Worker class KeyContextWithLocalMatrix : public KeyContext {
92*c8dee2aaSAndroid Build Coastguard Worker public:
KeyContextWithLocalMatrix(const KeyContext & other,const SkMatrix & childLM)93*c8dee2aaSAndroid Build Coastguard Worker     KeyContextWithLocalMatrix(const KeyContext& other, const SkMatrix& childLM)
94*c8dee2aaSAndroid Build Coastguard Worker             : KeyContext(other) {
95*c8dee2aaSAndroid Build Coastguard Worker         if (fLocalMatrix) {
96*c8dee2aaSAndroid Build Coastguard Worker             fStorage = SkMatrix::Concat(childLM, *fLocalMatrix);
97*c8dee2aaSAndroid Build Coastguard Worker         } else {
98*c8dee2aaSAndroid Build Coastguard Worker             fStorage = childLM;
99*c8dee2aaSAndroid Build Coastguard Worker         }
100*c8dee2aaSAndroid Build Coastguard Worker 
101*c8dee2aaSAndroid Build Coastguard Worker         fLocalMatrix = &fStorage;
102*c8dee2aaSAndroid Build Coastguard Worker     }
103*c8dee2aaSAndroid Build Coastguard Worker 
104*c8dee2aaSAndroid Build Coastguard Worker private:
105*c8dee2aaSAndroid Build Coastguard Worker     KeyContextWithLocalMatrix(const KeyContextWithLocalMatrix&) = delete;
106*c8dee2aaSAndroid Build Coastguard Worker     KeyContextWithLocalMatrix& operator=(const KeyContextWithLocalMatrix&) = delete;
107*c8dee2aaSAndroid Build Coastguard Worker 
108*c8dee2aaSAndroid Build Coastguard Worker     SkMatrix fStorage;
109*c8dee2aaSAndroid Build Coastguard Worker };
110*c8dee2aaSAndroid Build Coastguard Worker 
111*c8dee2aaSAndroid Build Coastguard Worker class KeyContextWithColorInfo : public KeyContext {
112*c8dee2aaSAndroid Build Coastguard Worker public:
KeyContextWithColorInfo(const KeyContext & other,const SkColorInfo & info)113*c8dee2aaSAndroid Build Coastguard Worker     KeyContextWithColorInfo(const KeyContext& other, const SkColorInfo& info) : KeyContext(other) {
114*c8dee2aaSAndroid Build Coastguard Worker         // We want to keep fPaintColor's alpha value but replace the RGB with values in the new
115*c8dee2aaSAndroid Build Coastguard Worker         // color space
116*c8dee2aaSAndroid Build Coastguard Worker         SkPMColor4f tmp = fPaintColor;
117*c8dee2aaSAndroid Build Coastguard Worker         tmp.fA = 1.0f;
118*c8dee2aaSAndroid Build Coastguard Worker         SkColorSpaceXformSteps(fDstColorInfo, info).apply(tmp.vec());
119*c8dee2aaSAndroid Build Coastguard Worker         fPaintColor.fR = tmp.fR;
120*c8dee2aaSAndroid Build Coastguard Worker         fPaintColor.fG = tmp.fG;
121*c8dee2aaSAndroid Build Coastguard Worker         fPaintColor.fB = tmp.fB;
122*c8dee2aaSAndroid Build Coastguard Worker         fDstColorInfo = info;
123*c8dee2aaSAndroid Build Coastguard Worker     }
124*c8dee2aaSAndroid Build Coastguard Worker 
125*c8dee2aaSAndroid Build Coastguard Worker private:
126*c8dee2aaSAndroid Build Coastguard Worker     KeyContextWithColorInfo(const KeyContextWithColorInfo&) = delete;
127*c8dee2aaSAndroid Build Coastguard Worker     KeyContextWithColorInfo& operator=(const KeyContextWithColorInfo&) = delete;
128*c8dee2aaSAndroid Build Coastguard Worker };
129*c8dee2aaSAndroid Build Coastguard Worker 
130*c8dee2aaSAndroid Build Coastguard Worker class KeyContextWithScope : public KeyContext {
131*c8dee2aaSAndroid Build Coastguard Worker public:
KeyContextWithScope(const KeyContext & other,KeyContext::Scope scope)132*c8dee2aaSAndroid Build Coastguard Worker     KeyContextWithScope(const KeyContext& other, KeyContext::Scope scope) : KeyContext(other) {
133*c8dee2aaSAndroid Build Coastguard Worker         fScope = scope;
134*c8dee2aaSAndroid Build Coastguard Worker         // We skip optimized sampling for runtime effects because these might have arbitrary
135*c8dee2aaSAndroid Build Coastguard Worker         // coordinate sampling.
136*c8dee2aaSAndroid Build Coastguard Worker         if (fScope == Scope::kRuntimeEffect) {
137*c8dee2aaSAndroid Build Coastguard Worker             fOptimizeSampling = OptimizeSampling::kNo;
138*c8dee2aaSAndroid Build Coastguard Worker         }
139*c8dee2aaSAndroid Build Coastguard Worker     }
140*c8dee2aaSAndroid Build Coastguard Worker 
141*c8dee2aaSAndroid Build Coastguard Worker private:
142*c8dee2aaSAndroid Build Coastguard Worker     KeyContextWithScope(const KeyContextWithScope&) = delete;
143*c8dee2aaSAndroid Build Coastguard Worker     KeyContextWithScope& operator=(const KeyContextWithScope&) = delete;
144*c8dee2aaSAndroid Build Coastguard Worker };
145*c8dee2aaSAndroid Build Coastguard Worker 
146*c8dee2aaSAndroid Build Coastguard Worker class KeyContextWithCoordClamp : public KeyContext {
147*c8dee2aaSAndroid Build Coastguard Worker public:
KeyContextWithCoordClamp(const KeyContext & other)148*c8dee2aaSAndroid Build Coastguard Worker     KeyContextWithCoordClamp(const KeyContext& other) : KeyContext(other) {
149*c8dee2aaSAndroid Build Coastguard Worker         // Subtlies in clampling implmentation can lead to texture samples at non pixel aligned
150*c8dee2aaSAndroid Build Coastguard Worker         // coordinates.
151*c8dee2aaSAndroid Build Coastguard Worker         fOptimizeSampling = OptimizeSampling::kNo;
152*c8dee2aaSAndroid Build Coastguard Worker     }
153*c8dee2aaSAndroid Build Coastguard Worker 
154*c8dee2aaSAndroid Build Coastguard Worker private:
155*c8dee2aaSAndroid Build Coastguard Worker     KeyContextWithCoordClamp(const KeyContextWithScope&) = delete;
156*c8dee2aaSAndroid Build Coastguard Worker     KeyContextWithCoordClamp& operator=(const KeyContextWithScope&) = delete;
157*c8dee2aaSAndroid Build Coastguard Worker };
158*c8dee2aaSAndroid Build Coastguard Worker 
159*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite
160*c8dee2aaSAndroid Build Coastguard Worker 
161*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_KeyContext_DEFINED
162