xref: /aosp_15_r20/external/skia/src/sksl/ir/SkSLModifierFlags.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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_MODIFIERFLAGS
9 #define SKSL_MODIFIERFLAGS
10 
11 #include "include/private/base/SkTo.h"
12 #include "src/base/SkEnumBitMask.h"
13 
14 #include <string>
15 
16 namespace SkSL {
17 
18 class Context;
19 class Position;
20 
21 enum class ModifierFlag : int {
22     kNone           =       0,
23     // Real GLSL modifiers
24     kFlat           = 1 <<  0,
25     kNoPerspective  = 1 <<  1,
26     kConst          = 1 <<  2,
27     kUniform        = 1 <<  3,
28     kIn             = 1 <<  4,
29     kOut            = 1 <<  5,
30     kHighp          = 1 <<  6,
31     kMediump        = 1 <<  7,
32     kLowp           = 1 <<  8,
33     kReadOnly       = 1 <<  9,
34     kWriteOnly      = 1 << 10,
35     kBuffer         = 1 << 11,
36     kPixelLocal     = 1 << 12,
37     // Corresponds to the GLSL 'shared' modifier. Only allowed in a compute program.
38     kWorkgroup      = 1 << 13,
39     // SkSL extensions, not present in GLSL
40     kExport         = 1 << 14,
41     kES3            = 1 << 15,
42     kPure           = 1 << 16,
43     kInline         = 1 << 17,
44     kNoInline       = 1 << 18,
45 };
46 
47 }  // namespace SkSL
48 
49 SK_MAKE_BITMASK_OPS(SkSL::ModifierFlag);
50 
51 namespace SkSL {
52 
53 class ModifierFlags : public SkEnumBitMask<SkSL::ModifierFlag> {
54 public:
55     using SkEnumBitMask<SkSL::ModifierFlag>::SkEnumBitMask;
ModifierFlags(SkEnumBitMask<SkSL::ModifierFlag> that)56     ModifierFlags(SkEnumBitMask<SkSL::ModifierFlag> that)
57             : SkEnumBitMask<SkSL::ModifierFlag>(that) {}
58 
59     std::string description() const;
60     std::string paddedDescription() const;
61 
62     /**
63      * Verifies that only permitted modifier flags are included. Reports errors and returns false in
64      * the event of a violation.
65      */
66     bool checkPermittedFlags(const Context& context,
67                              Position pos,
68                              ModifierFlags permittedModifierFlags) const;
69 
isConst()70     bool isConst() const         { return SkToBool(*this & ModifierFlag::kConst); }
isUniform()71     bool isUniform() const       { return SkToBool(*this & ModifierFlag::kUniform); }
isReadOnly()72     bool isReadOnly() const      { return SkToBool(*this & ModifierFlag::kReadOnly); }
isWriteOnly()73     bool isWriteOnly() const     { return SkToBool(*this & ModifierFlag::kWriteOnly); }
isBuffer()74     bool isBuffer() const        { return SkToBool(*this & ModifierFlag::kBuffer); }
isPixelLocal()75     bool isPixelLocal() const    { return SkToBool(*this & ModifierFlag::kPixelLocal); }
isWorkgroup()76     bool isWorkgroup() const     { return SkToBool(*this & ModifierFlag::kWorkgroup); }
isExport()77     bool isExport() const        { return SkToBool(*this & ModifierFlag::kExport); }
isES3()78     bool isES3() const           { return SkToBool(*this & ModifierFlag::kES3); }
isPure()79     bool isPure() const          { return SkToBool(*this & ModifierFlag::kPure); }
isInline()80     bool isInline() const        { return SkToBool(*this & ModifierFlag::kInline); }
isNoInline()81     bool isNoInline() const      { return SkToBool(*this & ModifierFlag::kNoInline); }
isFlat()82     bool isFlat() const          { return SkToBool(*this & ModifierFlag::kFlat); }
isNoPerspective()83     bool isNoPerspective() const { return SkToBool(*this & ModifierFlag::kNoPerspective); }
84 };
85 
86 }  // namespace SkSL
87 
88 #endif
89