blob: 6ea09e71b646b3d70a5a54f51a9c31a1299ecb19 [file] [log] [blame]
/*
* 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 <string>
namespace SkSL {
/**
* Represents all of the ways that a fragment processor is sampled by its parent.
*/
struct SampleUsage {
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 using explicit coordinates
kExplicit,
};
// Make a SampleUsage that corresponds to no sampling of the child at all
SampleUsage() = default;
// Child is sampled with a matrix whose value is uniform (some expression only involving
// literals and uniform variables).
static SampleUsage UniformMatrix(std::string expression, bool hasPerspective = true) {
return SampleUsage(Kind::kUniformMatrix, std::move(expression), hasPerspective);
}
static SampleUsage Explicit() {
return SampleUsage(Kind::kExplicit, "", false);
}
static SampleUsage PassThrough() {
return SampleUsage(Kind::kPassThrough, "", false);
}
SampleUsage merge(const SampleUsage& other);
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; }
Kind fKind = Kind::kNone;
// The uniform expression representing the matrix, or empty for non-matrix sampling
std::string fExpression;
bool fHasPerspective = false;
SampleUsage(Kind kind, std::string expression, bool hasPerspective)
: fKind(kind), fExpression(expression), fHasPerspective(hasPerspective) {
if (kind == Kind::kUniformMatrix) {
SkASSERT(!fExpression.empty());
} else {
SkASSERT(fExpression.empty() && !fHasPerspective);
}
}
std::string constructor() const;
};
} // namespace SkSL
#endif