blob: 8bb765baca734cb1d8f819946a9cbd3ef97e6776 [file] [log] [blame]
/*
* Copyright 2016 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SKSL_MODIFIERFLAGS
#define SKSL_MODIFIERFLAGS
#include "include/private/base/SkTo.h"
#include "src/base/SkEnumBitMask.h"
#include <string>
namespace SkSL {
class Context;
class Position;
enum class ModifierFlag : int {
kNone = 0,
// Real GLSL modifiers
kFlat = 1 << 0,
kNoPerspective = 1 << 1,
kConst = 1 << 2,
kUniform = 1 << 3,
kIn = 1 << 4,
kOut = 1 << 5,
kHighp = 1 << 6,
kMediump = 1 << 7,
kLowp = 1 << 8,
kReadOnly = 1 << 9,
kWriteOnly = 1 << 10,
kBuffer = 1 << 11,
kPixelLocal = 1 << 12,
// Corresponds to the GLSL 'shared' modifier. Only allowed in a compute program.
kWorkgroup = 1 << 13,
// SkSL extensions, not present in GLSL
kExport = 1 << 14,
kES3 = 1 << 15,
kPure = 1 << 16,
kInline = 1 << 17,
kNoInline = 1 << 18,
};
} // namespace SkSL
SK_MAKE_BITMASK_OPS(SkSL::ModifierFlag)
namespace SkSL {
class ModifierFlags : public SkEnumBitMask<SkSL::ModifierFlag> {
public:
using SkEnumBitMask<SkSL::ModifierFlag>::SkEnumBitMask;
ModifierFlags(SkEnumBitMask<SkSL::ModifierFlag> that)
: SkEnumBitMask<SkSL::ModifierFlag>(that) {}
std::string description() const;
std::string paddedDescription() const;
/**
* Verifies that only permitted modifier flags are included. Reports errors and returns false in
* the event of a violation.
*/
bool checkPermittedFlags(const Context& context,
Position pos,
ModifierFlags permittedModifierFlags) const;
bool isConst() const { return SkToBool(*this & ModifierFlag::kConst); }
bool isUniform() const { return SkToBool(*this & ModifierFlag::kUniform); }
bool isReadOnly() const { return SkToBool(*this & ModifierFlag::kReadOnly); }
bool isWriteOnly() const { return SkToBool(*this & ModifierFlag::kWriteOnly); }
bool isBuffer() const { return SkToBool(*this & ModifierFlag::kBuffer); }
bool isPixelLocal() const { return SkToBool(*this & ModifierFlag::kPixelLocal); }
bool isWorkgroup() const { return SkToBool(*this & ModifierFlag::kWorkgroup); }
bool isExport() const { return SkToBool(*this & ModifierFlag::kExport); }
bool isES3() const { return SkToBool(*this & ModifierFlag::kES3); }
bool isPure() const { return SkToBool(*this & ModifierFlag::kPure); }
bool isInline() const { return SkToBool(*this & ModifierFlag::kInline); }
bool isNoInline() const { return SkToBool(*this & ModifierFlag::kNoInline); }
bool isFlat() const { return SkToBool(*this & ModifierFlag::kFlat); }
bool isNoPerspective() const { return SkToBool(*this & ModifierFlag::kNoPerspective); }
};
} // namespace SkSL
#endif