@@ -113,36 +113,41 @@ static void try_upgrade_shader_stage(std::vector<std::wstring>& arguments, asset
113
113
114
114
constexpr int MajorReqVersion = 6 ,
115
115
MinorReqVersion = 7 ;
116
-
116
+ auto overrideStageStr = ShaderStageToString (shaderStageOverrideFromPragma);
117
117
auto foundShaderStageArgument = std::find (arguments.begin (), arguments.end (), L" -T" );
118
118
if (foundShaderStageArgument != arguments.end () && foundShaderStageArgument + 1 != arguments.end ()) {
119
119
auto foundShaderStageArgumentValueIdx = foundShaderStageArgument - arguments.begin () + 1 ;
120
120
std::wstring s = arguments[foundShaderStageArgumentValueIdx];
121
121
if (s.length () >= 6 ) {
122
+ std::wstring stageStr, majorVersionString, minorVersionString;
122
123
std::vector<std::wstring::iterator> underscorePositions = {};
123
124
auto it = std::find (s.begin (), s.end (), ' _' );
124
125
while (it != s.end ()) {
125
126
underscorePositions.push_back (it);
126
127
it = std::find (it + 1 , s.end (), ' _' );
127
128
}
128
- if (shaderStageOverrideFromPragma != IShader::ESS_UNKNOWN)
129
+
130
+ // Bad input check
131
+ if (underscorePositions.size () < 2 )
129
132
{
130
- // replace first 2 characters if shaderStageOverrideFromPragma != Unknown
131
- auto stageStr = ShaderStageToString (shaderStageOverrideFromPragma);
132
- if (!stageStr) {
133
- logger.log (" invalid shader stage %i" , system::ILogger::ELL_ERROR, shaderStageOverrideFromPragma);
134
- return ;
135
- }
136
- if (underscorePositions.size () == 0 )
137
- {
138
- logger.log (" incorrect format for shader stage parameter, expecting shader stage, underscore, then version" , system::ILogger::ELL_ERROR, shaderStageOverrideFromPragma);
133
+ logger.log (" Incorrect -T argument value.\n Expecting string with at least 2 '_' delimiters: between shader stage, version major and version minor." ,
134
+ system::ILogger::ELL_ERROR);
135
+ return ;
136
+ }
137
+
138
+ // Stage
139
+ stageStr = std::wstring (s.begin (), underscorePositions[0 ]);
140
+ if (shaderStageOverrideFromPragma != IShader::ESS_UNKNOWN) // replace first 2 characters if shaderStageOverrideFromPragma != Unknown
141
+ {
142
+ if (!overrideStageStr) {
143
+ logger.log (" Invalid shader stage with int value '%i'.\n This value does not have a known string representation." ,
144
+ system::ILogger::ELL_ERROR, shaderStageOverrideFromPragma);
139
145
return ;
140
146
}
141
- int len = underscorePositions[0 ] - s.begin ();
142
- s.replace (0 , len, stageStr);
147
+ stageStr = std::wstring (overrideStageStr);
143
148
}
144
149
145
- std::wstring majorVersionString, minorVersionString;
150
+ // Version
146
151
int size = underscorePositions.size ();
147
152
auto secondLastUnderscore = underscorePositions[size - 2 ];
148
153
auto lastUnderscore = underscorePositions[size - 1 ];
@@ -152,23 +157,44 @@ static void try_upgrade_shader_stage(std::vector<std::wstring>& arguments, asset
152
157
{
153
158
int major = std::stoi (majorVersionString);
154
159
int minor = std::stoi (minorVersionString);
155
- if (major < MajorReqVersion || (major == MajorReqVersion && minor < MinorReqVersion))
160
+ if (major < MajorReqVersion || (major == MajorReqVersion && minor < MinorReqVersion))
156
161
{
162
+ // Overwrite the version
157
163
logger.log (" Upgrading shader stage version number to %i %i" , system::ILogger::ELL_DEBUG, MajorReqVersion, MinorReqVersion);
158
- arguments[foundShaderStageArgumentValueIdx] = std::wstring (s.begin (), secondLastUnderscore + 1 ) + std::to_wstring (MajorReqVersion) + L" _" + std::to_wstring (MinorReqVersion);
164
+ arguments[foundShaderStageArgumentValueIdx] = stageStr + L" _" + std::to_wstring (MajorReqVersion) + L" _" + std::to_wstring (MinorReqVersion);
165
+ }
166
+ else
167
+ {
168
+ // keep the version as it was
169
+ arguments[foundShaderStageArgumentValueIdx] = stageStr + L" _" + majorVersionString + L" _" + minorVersionString;
159
170
}
171
+ return ;
160
172
}
161
173
catch (const std::invalid_argument& e) {
162
174
logger.log (" Parsing shader version failed, invalid argument exception: %s" , system::ILogger::ELL_ERROR, e.what ());
175
+
163
176
}
164
177
catch (const std::out_of_range& e) {
165
178
logger.log (" Parsing shader version failed, out of range exception: %s" , system::ILogger::ELL_ERROR, e.what ());
166
179
}
180
+
181
+ // In case of an exception
182
+ arguments[foundShaderStageArgumentValueIdx] = stageStr + L" _" + std::to_wstring (MajorReqVersion) + L" _" + std::to_wstring (MinorReqVersion);
183
+ return ;
167
184
}
168
185
else {
169
186
logger.log (" invalid shader stage '%s' argument, expecting a string of length >= 6 " , system::ILogger::ELL_ERROR, s);
170
187
}
171
188
}
189
+ else if (overrideStageStr) { // in case of no -T
190
+ // push back default values for -T argument
191
+ // can be safely pushed to the back of argument list as output files should be evicted from args before passing to this func
192
+ // leaving only compiler flags
193
+ arguments.push_back (L" -T" );
194
+ arguments.push_back (std::wstring (overrideStageStr) + L" _" + std::to_wstring (MajorReqVersion) + L" _" + std::to_wstring (MinorReqVersion));
195
+ }
196
+
197
+
172
198
}
173
199
174
200
0 commit comments