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