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