blob: 8a129b26fd5ecd9086e9c6bd163fb743bdfa7c15 [file] [log] [blame]
ethannicholasb3058bd2016-07-01 08:22:01 -07001/*
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 */
Ethan Nicholas11d53972016-11-28 11:23:23 -05007
ethannicholasb3058bd2016-07-01 08:22:01 -07008#ifndef SKSL_MODIFIERS
9#define SKSL_MODIFIERS
10
Ethan Nicholasdaed2592021-03-04 14:30:25 -050011#include "include/private/SkSLLayout.h"
ethannicholasb3058bd2016-07-01 08:22:01 -070012
Ethan Nicholas041fd0a2020-10-07 16:42:04 -040013#include <vector>
14
ethannicholasb3058bd2016-07-01 08:22:01 -070015namespace SkSL {
16
17/**
Ethan Nicholas11d53972016-11-28 11:23:23 -050018 * A set of modifier keywords (in, out, uniform, etc.) appearing before a declaration.
ethannicholasb3058bd2016-07-01 08:22:01 -070019 */
20struct Modifiers {
21 enum Flag {
Ethan Nicholascb670962017-04-20 19:31:52 -040022 kNo_Flag = 0,
23 kConst_Flag = 1 << 0,
24 kIn_Flag = 1 << 1,
25 kOut_Flag = 1 << 2,
Ethan Nicholas858fecc2019-03-07 13:19:18 -050026 kUniform_Flag = 1 << 3,
27 kFlat_Flag = 1 << 4,
28 kNoPerspective_Flag = 1 << 5,
Brian Osman58ee8982021-02-18 15:39:38 -050029 kHasSideEffects_Flag = 1 << 6,
John Stiles02014312021-08-04 16:03:12 -040030 kHighp_Flag = 1 << 7,
31 kMediump_Flag = 1 << 8,
32 kLowp_Flag = 1 << 9,
33 kInline_Flag = 1 << 10,
34 kNoInline_Flag = 1 << 11,
John Stilesefde90d2021-08-12 23:06:24 -040035 kES3_Flag = 1 << 12,
ethannicholasb3058bd2016-07-01 08:22:01 -070036 };
37
Ethan Nicholas3605ace2016-11-21 15:59:48 -050038 Modifiers()
39 : fLayout(Layout())
40 , fFlags(0) {}
41
Michael Ludwig9094f2c2018-09-07 13:44:21 -040042 Modifiers(const Layout& layout, int flags)
ethannicholasb3058bd2016-07-01 08:22:01 -070043 : fLayout(layout)
44 , fFlags(flags) {}
45
Ethan Nicholas0df1b042017-03-31 13:56:23 -040046 String description() const {
47 String result = fLayout.description();
John Stilesefde90d2021-08-12 23:06:24 -040048 if (fFlags & kES3_Flag) {
49 result += "$es3 ";
50 }
ethannicholasb3058bd2016-07-01 08:22:01 -070051 if (fFlags & kUniform_Flag) {
52 result += "uniform ";
53 }
54 if (fFlags & kConst_Flag) {
55 result += "const ";
56 }
ethannicholasf789b382016-08-03 12:43:36 -070057 if (fFlags & kFlat_Flag) {
58 result += "flat ";
59 }
60 if (fFlags & kNoPerspective_Flag) {
61 result += "noperspective ";
62 }
Ethan Nicholascb670962017-04-20 19:31:52 -040063 if (fFlags & kHasSideEffects_Flag) {
64 result += "sk_has_side_effects ";
65 }
John Stiles0dd1a772021-03-09 22:14:27 -050066 if (fFlags & kNoInline_Flag) {
67 result += "noinline ";
68 }
John Stiles02014312021-08-04 16:03:12 -040069 if (fFlags & kHighp_Flag) {
70 result += "highp ";
71 }
72 if (fFlags & kMediump_Flag) {
73 result += "mediump ";
74 }
75 if (fFlags & kLowp_Flag) {
76 result += "lowp ";
77 }
ethannicholasb3058bd2016-07-01 08:22:01 -070078 if ((fFlags & kIn_Flag) && (fFlags & kOut_Flag)) {
79 result += "inout ";
80 } else if (fFlags & kIn_Flag) {
81 result += "in ";
82 } else if (fFlags & kOut_Flag) {
83 result += "out ";
84 }
85
86 return result;
87 }
88
89 bool operator==(const Modifiers& other) const {
90 return fLayout == other.fLayout && fFlags == other.fFlags;
91 }
92
93 bool operator!=(const Modifiers& other) const {
94 return !(*this == other);
95 }
96
ethannicholasf789b382016-08-03 12:43:36 -070097 Layout fLayout;
98 int fFlags;
ethannicholasb3058bd2016-07-01 08:22:01 -070099};
100
Ethan Nicholas041fd0a2020-10-07 16:42:04 -0400101} // namespace SkSL
102
103namespace std {
104
105template <>
106struct hash<SkSL::Modifiers> {
107 size_t operator()(const SkSL::Modifiers& key) const {
Ethan Nicholasdaed2592021-03-04 14:30:25 -0500108 return (size_t) key.fFlags ^ ((size_t) key.fLayout.fFlags << 8) ^
109 ((size_t) key.fLayout.fBuiltin << 16);
Ethan Nicholas041fd0a2020-10-07 16:42:04 -0400110 }
111};
112
113} // namespace std
ethannicholasb3058bd2016-07-01 08:22:01 -0700114
115#endif