1 | /* |
2 | * Copyright 2016 Google Inc. |
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 SKSL_MODIFIERS |
9 | #define SKSL_MODIFIERS |
10 | |
11 | #include "src/sksl/ir/SkSLLayout.h" |
12 | |
13 | namespace SkSL { |
14 | |
15 | /** |
16 | * A set of modifier keywords (in, out, uniform, etc.) appearing before a declaration. |
17 | */ |
18 | struct Modifiers { |
19 | enum Flag { |
20 | kNo_Flag = 0, |
21 | kConst_Flag = 1 << 0, |
22 | kIn_Flag = 1 << 1, |
23 | kOut_Flag = 1 << 2, |
24 | kUniform_Flag = 1 << 3, |
25 | kFlat_Flag = 1 << 4, |
26 | kNoPerspective_Flag = 1 << 5, |
27 | kReadOnly_Flag = 1 << 6, |
28 | kWriteOnly_Flag = 1 << 7, |
29 | kCoherent_Flag = 1 << 8, |
30 | kVolatile_Flag = 1 << 9, |
31 | kRestrict_Flag = 1 << 10, |
32 | kBuffer_Flag = 1 << 11, |
33 | kHasSideEffects_Flag = 1 << 12, |
34 | kPLS_Flag = 1 << 13, |
35 | kPLSIn_Flag = 1 << 14, |
36 | kPLSOut_Flag = 1 << 15, |
37 | kVarying_Flag = 1 << 16, |
38 | }; |
39 | |
40 | Modifiers() |
41 | : fLayout(Layout()) |
42 | , fFlags(0) {} |
43 | |
44 | Modifiers(const Layout& layout, int flags) |
45 | : fLayout(layout) |
46 | , fFlags(flags) {} |
47 | |
48 | String description() const { |
49 | String result = fLayout.description(); |
50 | if (fFlags & kUniform_Flag) { |
51 | result += "uniform " ; |
52 | } |
53 | if (fFlags & kConst_Flag) { |
54 | result += "const " ; |
55 | } |
56 | if (fFlags & kFlat_Flag) { |
57 | result += "flat " ; |
58 | } |
59 | if (fFlags & kNoPerspective_Flag) { |
60 | result += "noperspective " ; |
61 | } |
62 | if (fFlags & kReadOnly_Flag) { |
63 | result += "readonly " ; |
64 | } |
65 | if (fFlags & kWriteOnly_Flag) { |
66 | result += "writeonly " ; |
67 | } |
68 | if (fFlags & kCoherent_Flag) { |
69 | result += "coherent " ; |
70 | } |
71 | if (fFlags & kVolatile_Flag) { |
72 | result += "volatile " ; |
73 | } |
74 | if (fFlags & kRestrict_Flag) { |
75 | result += "restrict " ; |
76 | } |
77 | if (fFlags & kBuffer_Flag) { |
78 | result += "buffer " ; |
79 | } |
80 | if (fFlags & kHasSideEffects_Flag) { |
81 | result += "sk_has_side_effects " ; |
82 | } |
83 | if (fFlags & kPLS_Flag) { |
84 | result += "__pixel_localEXT " ; |
85 | } |
86 | if (fFlags & kPLSIn_Flag) { |
87 | result += "__pixel_local_inEXT " ; |
88 | } |
89 | if (fFlags & kPLSOut_Flag) { |
90 | result += "__pixel_local_outEXT " ; |
91 | } |
92 | if (fFlags & kVarying_Flag) { |
93 | result += "varying " ; |
94 | } |
95 | if ((fFlags & kIn_Flag) && (fFlags & kOut_Flag)) { |
96 | result += "inout " ; |
97 | } else if (fFlags & kIn_Flag) { |
98 | result += "in " ; |
99 | } else if (fFlags & kOut_Flag) { |
100 | result += "out " ; |
101 | } |
102 | |
103 | return result; |
104 | } |
105 | |
106 | bool operator==(const Modifiers& other) const { |
107 | return fLayout == other.fLayout && fFlags == other.fFlags; |
108 | } |
109 | |
110 | bool operator!=(const Modifiers& other) const { |
111 | return !(*this == other); |
112 | } |
113 | |
114 | Layout fLayout; |
115 | int fFlags; |
116 | }; |
117 | |
118 | } // namespace |
119 | |
120 | #endif |
121 | |