1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2020 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 SkSLSampleUsage_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkSLSampleUsage_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker namespace SkSL { 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker /** 16*c8dee2aaSAndroid Build Coastguard Worker * Represents all of the ways that a fragment processor is sampled by its parent. 17*c8dee2aaSAndroid Build Coastguard Worker */ 18*c8dee2aaSAndroid Build Coastguard Worker class SampleUsage { 19*c8dee2aaSAndroid Build Coastguard Worker public: 20*c8dee2aaSAndroid Build Coastguard Worker enum class Kind { 21*c8dee2aaSAndroid Build Coastguard Worker // Child is never sampled 22*c8dee2aaSAndroid Build Coastguard Worker kNone, 23*c8dee2aaSAndroid Build Coastguard Worker // Child is only sampled at the same coordinates as the parent 24*c8dee2aaSAndroid Build Coastguard Worker kPassThrough, 25*c8dee2aaSAndroid Build Coastguard Worker // Child is sampled with a matrix whose value is uniform 26*c8dee2aaSAndroid Build Coastguard Worker kUniformMatrix, 27*c8dee2aaSAndroid Build Coastguard Worker // Child is sampled with sk_FragCoord.xy 28*c8dee2aaSAndroid Build Coastguard Worker kFragCoord, 29*c8dee2aaSAndroid Build Coastguard Worker // Child is sampled using explicit coordinates 30*c8dee2aaSAndroid Build Coastguard Worker kExplicit, 31*c8dee2aaSAndroid Build Coastguard Worker }; 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker // Make a SampleUsage that corresponds to no sampling of the child at all 34*c8dee2aaSAndroid Build Coastguard Worker SampleUsage() = default; 35*c8dee2aaSAndroid Build Coastguard Worker SampleUsage(Kind kind,bool hasPerspective)36*c8dee2aaSAndroid Build Coastguard Worker SampleUsage(Kind kind, bool hasPerspective) : fKind(kind), fHasPerspective(hasPerspective) { 37*c8dee2aaSAndroid Build Coastguard Worker if (kind != Kind::kUniformMatrix) { 38*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!fHasPerspective); 39*c8dee2aaSAndroid Build Coastguard Worker } 40*c8dee2aaSAndroid Build Coastguard Worker } 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker // Child is sampled with a matrix whose value is uniform. The name is fixed. UniformMatrix(bool hasPerspective)43*c8dee2aaSAndroid Build Coastguard Worker static SampleUsage UniformMatrix(bool hasPerspective) { 44*c8dee2aaSAndroid Build Coastguard Worker return SampleUsage(Kind::kUniformMatrix, hasPerspective); 45*c8dee2aaSAndroid Build Coastguard Worker } 46*c8dee2aaSAndroid Build Coastguard Worker Explicit()47*c8dee2aaSAndroid Build Coastguard Worker static SampleUsage Explicit() { 48*c8dee2aaSAndroid Build Coastguard Worker return SampleUsage(Kind::kExplicit, false); 49*c8dee2aaSAndroid Build Coastguard Worker } 50*c8dee2aaSAndroid Build Coastguard Worker PassThrough()51*c8dee2aaSAndroid Build Coastguard Worker static SampleUsage PassThrough() { 52*c8dee2aaSAndroid Build Coastguard Worker return SampleUsage(Kind::kPassThrough, false); 53*c8dee2aaSAndroid Build Coastguard Worker } 54*c8dee2aaSAndroid Build Coastguard Worker FragCoord()55*c8dee2aaSAndroid Build Coastguard Worker static SampleUsage FragCoord() { return SampleUsage(Kind::kFragCoord, false); } 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker bool operator==(const SampleUsage& that) const { 58*c8dee2aaSAndroid Build Coastguard Worker return fKind == that.fKind && fHasPerspective == that.fHasPerspective; 59*c8dee2aaSAndroid Build Coastguard Worker } 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker bool operator!=(const SampleUsage& that) const { return !(*this == that); } 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker // Arbitrary name used by all uniform sampling matrices MatrixUniformName()64*c8dee2aaSAndroid Build Coastguard Worker static const char* MatrixUniformName() { return "matrix"; } 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker SampleUsage merge(const SampleUsage& other); 67*c8dee2aaSAndroid Build Coastguard Worker kind()68*c8dee2aaSAndroid Build Coastguard Worker Kind kind() const { return fKind; } 69*c8dee2aaSAndroid Build Coastguard Worker hasPerspective()70*c8dee2aaSAndroid Build Coastguard Worker bool hasPerspective() const { return fHasPerspective; } 71*c8dee2aaSAndroid Build Coastguard Worker isSampled()72*c8dee2aaSAndroid Build Coastguard Worker bool isSampled() const { return fKind != Kind::kNone; } isPassThrough()73*c8dee2aaSAndroid Build Coastguard Worker bool isPassThrough() const { return fKind == Kind::kPassThrough; } isExplicit()74*c8dee2aaSAndroid Build Coastguard Worker bool isExplicit() const { return fKind == Kind::kExplicit; } isUniformMatrix()75*c8dee2aaSAndroid Build Coastguard Worker bool isUniformMatrix() const { return fKind == Kind::kUniformMatrix; } isFragCoord()76*c8dee2aaSAndroid Build Coastguard Worker bool isFragCoord() const { return fKind == Kind::kFragCoord; } 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker private: 79*c8dee2aaSAndroid Build Coastguard Worker Kind fKind = Kind::kNone; 80*c8dee2aaSAndroid Build Coastguard Worker bool fHasPerspective = false; // Only valid if fKind is kUniformMatrix 81*c8dee2aaSAndroid Build Coastguard Worker }; 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker } // namespace SkSL 84*c8dee2aaSAndroid Build Coastguard Worker 85*c8dee2aaSAndroid Build Coastguard Worker #endif 86