blob: 7f121b07c03e0ea44f7f26b8a514c3a227df5d87 [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 SkSLSampleMatrix_DEFINED
#define SkSLSampleMatrix_DEFINED
#include "src/sksl/SkSLDefines.h"
#include "src/sksl/SkSLString.h"
class GrFragmentProcessor;
namespace SkSL {
struct Expression;
/**
* Represents the matrix applied to a fragment processor by its parent's sample(child, matrix) call.
*/
struct SampleMatrix {
enum class Kind {
// No sample(child, matrix) call affects the FP.
kNone,
// The FP is sampled with a matrix whose value is fixed and based only on constants or
// uniforms, and thus the transform can be hoisted to the vertex shader.
kConstantOrUniform,
// The FP is sampled with a non-constant/uniform value, or sampled multiple times, and
// thus the transform cannot be hoisted to the vertex shader.
kVariable,
// The FP is sampled with a constant or uniform value, *and* also inherits a variable
// transform from an ancestor. The transform cannot be hoisted to the vertex shader, and
// both matrices need to be applied.
kMixed,
};
SampleMatrix()
: fOwner(nullptr)
, fKind(Kind::kNone) {}
SampleMatrix(Kind kind)
: fOwner(nullptr)
, fKind(kind) {
SkASSERT(kind == Kind::kNone || kind == Kind::kVariable);
}
SampleMatrix(Kind kind, GrFragmentProcessor* owner, String expression)
: fOwner(owner)
, fKind(kind)
, fExpression(expression) {}
SampleMatrix merge(const SampleMatrix& other);
bool operator==(const SampleMatrix& other) const {
return fKind == other.fKind && fExpression == other.fExpression;
}
#ifdef SK_DEBUG
String description() {
switch (fKind) {
case Kind::kNone:
return "SampleMatrix<None>";
case Kind::kConstantOrUniform:
return "SampleMatrix<ConstantOrUniform(" + fExpression + ")>";
case Kind::kVariable:
return "SampleMatrix<Variable>";
case Kind::kMixed:
return "SampleMatrix<Mixed(" + fExpression + ")>";
}
}
#endif
GrFragmentProcessor* fOwner;
Kind fKind;
// The constant or uniform expression representing the matrix (will be the empty string when
// kind == kNone or kVariable)
String fExpression;
};
} // namespace
#endif