1 | /* |
2 | * Copyright 2017 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_SECTIONANDPARAMETERHELPER |
9 | #define SKSL_SECTIONANDPARAMETERHELPER |
10 | |
11 | #include "src/sksl/SkSLErrorReporter.h" |
12 | #include "src/sksl/ir/SkSLProgram.h" |
13 | #include "src/sksl/ir/SkSLSection.h" |
14 | #include "src/sksl/ir/SkSLVarDeclarations.h" |
15 | #include <unordered_map> |
16 | #include <vector> |
17 | |
18 | namespace SkSL { |
19 | |
20 | inline constexpr char kClassSection[] = "class" ; |
21 | inline constexpr char kCloneSection[] = "clone" ; |
22 | inline constexpr char kConstructorSection[] = "constructor" ; |
23 | inline constexpr char kConstructorCodeSection[] = "constructorCode" ; |
24 | inline constexpr char kConstructorParamsSection[] = "constructorParams" ; |
25 | inline constexpr char kCppSection[] = "cpp" ; |
26 | inline constexpr char kCppEndSection[] = "cppEnd" ; |
27 | inline constexpr char kDumpInfoSection[] = "dumpInfo" ; |
28 | inline constexpr char kEmitCodeSection[] = "emitCode" ; |
29 | inline constexpr char kFieldsSection[] = "fields" ; |
30 | inline constexpr char [] = "header" ; |
31 | inline constexpr char [] = "headerEnd" ; |
32 | inline constexpr char [] = "initializers" ; |
33 | inline constexpr char kMakeSection[] = "make" ; |
34 | inline constexpr char kOptimizationFlagsSection[] = "optimizationFlags" ; |
35 | inline constexpr char kSamplerParamsSection[] = "samplerParams" ; |
36 | inline constexpr char kSetDataSection[] = "setData" ; |
37 | inline constexpr char kTestCodeSection[] = "test" ; |
38 | |
39 | class SectionAndParameterHelper { |
40 | public: |
41 | SectionAndParameterHelper(const Program* program, ErrorReporter& errors); |
42 | |
43 | const Section* getSection(const char* name) { |
44 | SkASSERT(!SectionPermitsDuplicates(name)); |
45 | auto found = fSections.find(name); |
46 | if (found == fSections.end()) { |
47 | return nullptr; |
48 | } |
49 | SkASSERT(found->second.size() == 1); |
50 | return found->second[0]; |
51 | } |
52 | |
53 | std::vector<const Section*> getSections(const char* name) { |
54 | auto found = fSections.find(name); |
55 | if (found == fSections.end()) { |
56 | return std::vector<const Section*>(); |
57 | } |
58 | return found->second; |
59 | } |
60 | |
61 | const std::vector<const Variable*>& getParameters() { |
62 | return fParameters; |
63 | } |
64 | |
65 | static bool IsParameter(const Variable& var) { |
66 | return (var.fModifiers.fFlags & Modifiers::kIn_Flag) && |
67 | -1 == var.fModifiers.fLayout.fBuiltin; |
68 | } |
69 | |
70 | static bool IsSupportedSection(const char* name) { |
71 | return !strcmp(name, kClassSection) || |
72 | !strcmp(name, kCloneSection) || |
73 | !strcmp(name, kConstructorSection) || |
74 | !strcmp(name, kConstructorCodeSection) || |
75 | !strcmp(name, kConstructorParamsSection) || |
76 | !strcmp(name, kCppSection) || |
77 | !strcmp(name, kCppEndSection) || |
78 | !strcmp(name, kDumpInfoSection) || |
79 | !strcmp(name, kEmitCodeSection) || |
80 | !strcmp(name, kFieldsSection) || |
81 | !strcmp(name, kHeaderSection) || |
82 | !strcmp(name, kHeaderEndSection) || |
83 | !strcmp(name, kInitializersSection) || |
84 | !strcmp(name, kMakeSection) || |
85 | !strcmp(name, kOptimizationFlagsSection) || |
86 | !strcmp(name, kSamplerParamsSection) || |
87 | !strcmp(name, kSetDataSection) || |
88 | !strcmp(name, kTestCodeSection); |
89 | } |
90 | |
91 | static bool SectionAcceptsArgument(const char* name) { |
92 | return !strcmp(name, kSamplerParamsSection) || |
93 | !strcmp(name, kSetDataSection) || |
94 | !strcmp(name, kTestCodeSection); |
95 | } |
96 | |
97 | static bool SectionRequiresArgument(const char* name) { |
98 | return !strcmp(name, kSamplerParamsSection) || |
99 | !strcmp(name, kSetDataSection) || |
100 | !strcmp(name, kTestCodeSection); |
101 | } |
102 | |
103 | static bool SectionPermitsDuplicates(const char* name) { |
104 | return !strcmp(name, kSamplerParamsSection); |
105 | } |
106 | |
107 | private: |
108 | const Program& fProgram; |
109 | std::vector<const Variable*> fParameters; |
110 | std::unordered_map<String, std::vector<const Section*>> fSections; |
111 | }; |
112 | |
113 | } // namespace SkSL |
114 | |
115 | #endif |
116 | |