@@ -40,20 +40,20 @@ namespace Diligent
4040namespace
4141{
4242
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" }, {}};
5757
5858} // namespace
5959
@@ -108,6 +108,88 @@ void AppendShaderTypeDefinitions(std::string& Source, SHADER_TYPE Type)
108108}
109109
110110
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+
111193ShaderSourceFileData ReadShaderSourceFile (const char * SourceCode,
112194 size_t SourceLength,
113195 IShaderSourceInputStreamFactory* pShaderSourceStreamFactory,
0 commit comments