@@ -40,20 +40,20 @@ namespace Diligent
40
40
namespace
41
41
{
42
42
43
- const ShaderMacro VSMacros[] = {{" VERTEX_SHADER" , " 1" }, {}};
44
- const ShaderMacro PSMacros[] = {{" FRAGMENT_SHADER" , " 1" }, {" PIXEL_SHADER" , " 1" }, {}};
45
- const ShaderMacro GSMacros[] = {{" GEOMETRY_SHADER" , " 1" }, {}};
46
- const ShaderMacro HSMacros[] = {{" TESS_CONTROL_SHADER" , " 1" }, {" HULL_SHADER" , " 1" }, {}};
47
- const ShaderMacro DSMacros[] = {{" TESS_EVALUATION_SHADER" , " 1" }, {" DOMAIN_SHADER" , " 1" }, {}};
48
- const ShaderMacro CSMacros[] = {{" COMPUTE_SHADER" , " 1" }, {}};
49
- const ShaderMacro ASMacros[] = {{" TASK_SHADER" , " 1" }, {" AMPLIFICATION_SHADER" , " 1" }, {}};
50
- const ShaderMacro MSMacros[] = {{" MESH_SHADER" , " 1" }, {}};
51
- const ShaderMacro RGMacros[] = {{" RAY_GEN_SHADER" , " 1" }, {}};
52
- const ShaderMacro RMMacros[] = {{" RAY_MISS_SHADER" , " 1" }, {}};
53
- const ShaderMacro RCHMacros[] = {{" RAY_CLOSEST_HIT_SHADER" , " 1" }, {}};
54
- const ShaderMacro RAHMacros[] = {{" RAY_ANY_HIT_SHADER" , " 1" }, {}};
55
- const ShaderMacro RIMacros[] = {{" RAY_INTERSECTION_SHADER" , " 1" }, {}};
56
- const ShaderMacro RCMacros[] = {{" RAY_CALLABLE_SHADER" , " 1" }, {}};
43
+ constexpr ShaderMacro VSMacros[] = {{" VERTEX_SHADER" , " 1" }, {}};
44
+ constexpr ShaderMacro PSMacros[] = {{" FRAGMENT_SHADER" , " 1" }, {" PIXEL_SHADER" , " 1" }, {}};
45
+ constexpr ShaderMacro GSMacros[] = {{" GEOMETRY_SHADER" , " 1" }, {}};
46
+ constexpr ShaderMacro HSMacros[] = {{" TESS_CONTROL_SHADER" , " 1" }, {" HULL_SHADER" , " 1" }, {}};
47
+ constexpr ShaderMacro DSMacros[] = {{" TESS_EVALUATION_SHADER" , " 1" }, {" DOMAIN_SHADER" , " 1" }, {}};
48
+ constexpr ShaderMacro CSMacros[] = {{" COMPUTE_SHADER" , " 1" }, {}};
49
+ constexpr ShaderMacro ASMacros[] = {{" TASK_SHADER" , " 1" }, {" AMPLIFICATION_SHADER" , " 1" }, {}};
50
+ constexpr ShaderMacro MSMacros[] = {{" MESH_SHADER" , " 1" }, {}};
51
+ constexpr ShaderMacro RGMacros[] = {{" RAY_GEN_SHADER" , " 1" }, {}};
52
+ constexpr ShaderMacro RMMacros[] = {{" RAY_MISS_SHADER" , " 1" }, {}};
53
+ constexpr ShaderMacro RCHMacros[] = {{" RAY_CLOSEST_HIT_SHADER" , " 1" }, {}};
54
+ constexpr ShaderMacro RAHMacros[] = {{" RAY_ANY_HIT_SHADER" , " 1" }, {}};
55
+ constexpr ShaderMacro RIMacros[] = {{" RAY_INTERSECTION_SHADER" , " 1" }, {}};
56
+ constexpr ShaderMacro RCMacros[] = {{" RAY_CALLABLE_SHADER" , " 1" }, {}};
57
57
58
58
} // namespace
59
59
@@ -108,6 +108,88 @@ void AppendShaderTypeDefinitions(std::string& Source, SHADER_TYPE Type)
108
108
}
109
109
110
110
111
+ static const std::string ShaderSourceLanguageKey = " $SHADER_SOURCE_LANGUAGE" ;
112
+
113
+ void AppendShaderSourceLanguageDefinition (std::string& Source, SHADER_SOURCE_LANGUAGE Language)
114
+ {
115
+ Source += " /*" ;
116
+ Source += ShaderSourceLanguageKey;
117
+ Source += ' =' ;
118
+ Source += std::to_string (static_cast <Uint32>(Language));
119
+ Source += " */" ;
120
+ }
121
+
122
+ SHADER_SOURCE_LANGUAGE ParseShaderSourceLanguageDefinition (const std::string& Source)
123
+ {
124
+ // /*$SHADER_SOURCE_LANGUAGE=1*/
125
+ // ^
126
+ auto it = Source.end ();
127
+ if (it == Source.begin ())
128
+ return SHADER_SOURCE_LANGUAGE_DEFAULT;
129
+
130
+ --it;
131
+ // /*$SHADER_SOURCE_LANGUAGE=1*/
132
+ // ^
133
+ if (it == Source.begin () || *it != ' /' )
134
+ return SHADER_SOURCE_LANGUAGE_DEFAULT;
135
+
136
+ --it;
137
+ // /*$SHADER_SOURCE_LANGUAGE=1*/
138
+ // ^
139
+ if (it == Source.begin () || *it != ' *' )
140
+ return SHADER_SOURCE_LANGUAGE_DEFAULT;
141
+
142
+ --it;
143
+ while (true )
144
+ {
145
+ if (it == Source.begin ())
146
+ return SHADER_SOURCE_LANGUAGE_DEFAULT;
147
+
148
+ if (*it == ' *' )
149
+ {
150
+ // /*$SHADER_SOURCE_LANGUAGE=1*/
151
+ // ^
152
+ --it;
153
+ if (*it == ' /' )
154
+ break ;
155
+ }
156
+ else
157
+ {
158
+ --it;
159
+ }
160
+ }
161
+
162
+ // /*$SHADER_SOURCE_LANGUAGE=1*/
163
+ // ^
164
+ const auto KeyPos = Source.find (ShaderSourceLanguageKey, it - Source.begin () + 2 );
165
+ if (KeyPos == std::string::npos)
166
+ return SHADER_SOURCE_LANGUAGE_DEFAULT;
167
+
168
+ it = Source.begin () + KeyPos + ShaderSourceLanguageKey.length ();
169
+ while (it != Source.end () && *it == ' ' )
170
+ ++it;
171
+
172
+ // /*$SHADER_SOURCE_LANGUAGE=1*/
173
+ // ^
174
+ if (it == Source.end () || *it != ' =' )
175
+ return SHADER_SOURCE_LANGUAGE_DEFAULT;
176
+
177
+ ++it;
178
+ while (it != Source.end () && *it == ' ' )
179
+ ++it;
180
+
181
+ if (it == Source.end () || !IsNum (*it))
182
+ return SHADER_SOURCE_LANGUAGE_DEFAULT;
183
+
184
+ Uint32 Lang = 0 ;
185
+ for (; it != Source.end () && IsNum (*it); ++it)
186
+ Lang = Lang * 10 + (*it - ' 0' );
187
+
188
+ return Lang >= 0 && Lang < SHADER_SOURCE_LANGUAGE_COUNT ?
189
+ static_cast <SHADER_SOURCE_LANGUAGE>(Lang) :
190
+ SHADER_SOURCE_LANGUAGE_DEFAULT;
191
+ }
192
+
111
193
ShaderSourceFileData ReadShaderSourceFile (const char * SourceCode,
112
194
size_t SourceLength,
113
195
IShaderSourceInputStreamFactory* pShaderSourceStreamFactory,
0 commit comments