/* * Copyright 2020 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkSLSampleUsage_DEFINED #define SkSLSampleUsage_DEFINED #include "include/core/SkTypes.h" #include namespace SkSL { /** * Represents all of the ways that a fragment processor is sampled by its parent. */ class SampleUsage { public: enum class Kind { // Child is never sampled kNone, // Child is only sampled at the same coordinates as the parent kPassThrough, // Child is sampled with a matrix whose value is uniform kUniformMatrix, // Child is sampled with sk_FragCoord.xy kFragCoord, // Child is sampled using explicit coordinates kExplicit, }; // Make a SampleUsage that corresponds to no sampling of the child at all SampleUsage() = default; SampleUsage(Kind kind, bool hasPerspective) : fKind(kind), fHasPerspective(hasPerspective) { if (kind != Kind::kUniformMatrix) { SkASSERT(!fHasPerspective); } } // Child is sampled with a matrix whose value is uniform. The name is fixed. static SampleUsage UniformMatrix(bool hasPerspective) { return SampleUsage(Kind::kUniformMatrix, hasPerspective); } static SampleUsage Explicit() { return SampleUsage(Kind::kExplicit, false); } static SampleUsage PassThrough() { return SampleUsage(Kind::kPassThrough, false); } static SampleUsage FragCoord() { return SampleUsage(Kind::kFragCoord, false); } bool operator==(const SampleUsage& that) const { return fKind == that.fKind && fHasPerspective == that.fHasPerspective; } bool operator!=(const SampleUsage& that) const { return !(*this == that); } // Arbitrary name used by all uniform sampling matrices static const char* MatrixUniformName() { return "matrix"; } SampleUsage merge(const SampleUsage& other); Kind kind() const { return fKind; } bool hasPerspective() const { return fHasPerspective; } bool isSampled() const { return fKind != Kind::kNone; } bool isPassThrough() const { return fKind == Kind::kPassThrough; } bool isExplicit() const { return fKind == Kind::kExplicit; } bool isUniformMatrix() const { return fKind == Kind::kUniformMatrix; } bool isFragCoord() const { return fKind == Kind::kFragCoord; } std::string constructor() const; void setKind(Kind kind) { fKind = kind; } private: Kind fKind = Kind::kNone; bool fHasPerspective = false; // Only valid if fKind is kUniformMatrix }; } // namespace SkSL #endif