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

source code of flutter_engine/third_party/skia/include/private/SkSLSampleUsage.h