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