@@ -113,36 +113,41 @@ static void try_upgrade_shader_stage(std::vector<std::wstring>& arguments, asset
113113
114114 constexpr int MajorReqVersion = 6 ,
115115 MinorReqVersion = 7 ;
116-
116+ auto overrideStageStr = ShaderStageToString (shaderStageOverrideFromPragma);
117117 auto foundShaderStageArgument = std::find (arguments.begin (), arguments.end (), L" -T" );
118118 if (foundShaderStageArgument != arguments.end () && foundShaderStageArgument + 1 != arguments.end ()) {
119119 auto foundShaderStageArgumentValueIdx = foundShaderStageArgument - arguments.begin () + 1 ;
120120 std::wstring s = arguments[foundShaderStageArgumentValueIdx];
121121 if (s.length () >= 6 ) {
122+ std::wstring stageStr, majorVersionString, minorVersionString;
122123 std::vector<std::wstring::iterator> underscorePositions = {};
123124 auto it = std::find (s.begin (), s.end (), ' _' );
124125 while (it != s.end ()) {
125126 underscorePositions.push_back (it);
126127 it = std::find (it + 1 , s.end (), ' _' );
127128 }
128- if (shaderStageOverrideFromPragma != IShader::ESS_UNKNOWN)
129+
130+ // Bad input check
131+ if (underscorePositions.size () < 2 )
129132 {
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);
139145 return ;
140146 }
141- int len = underscorePositions[0 ] - s.begin ();
142- s.replace (0 , len, stageStr);
147+ stageStr = std::wstring (overrideStageStr);
143148 }
144149
145- std::wstring majorVersionString, minorVersionString;
150+ // Version
146151 int size = underscorePositions.size ();
147152 auto secondLastUnderscore = underscorePositions[size - 2 ];
148153 auto lastUnderscore = underscorePositions[size - 1 ];
@@ -152,23 +157,44 @@ static void try_upgrade_shader_stage(std::vector<std::wstring>& arguments, asset
152157 {
153158 int major = std::stoi (majorVersionString);
154159 int minor = std::stoi (minorVersionString);
155- if (major < MajorReqVersion || (major == MajorReqVersion && minor < MinorReqVersion))
160+ if (major < MajorReqVersion || (major == MajorReqVersion && minor < MinorReqVersion))
156161 {
162+ // Overwrite the version
157163 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;
159170 }
171+ return ;
160172 }
161173 catch (const std::invalid_argument& e) {
162174 logger.log (" Parsing shader version failed, invalid argument exception: %s" , system::ILogger::ELL_ERROR, e.what ());
175+
163176 }
164177 catch (const std::out_of_range& e) {
165178 logger.log (" Parsing shader version failed, out of range exception: %s" , system::ILogger::ELL_ERROR, e.what ());
166179 }
180+
181+ // In case of an exception
182+ arguments[foundShaderStageArgumentValueIdx] = stageStr + L" _" + std::to_wstring (MajorReqVersion) + L" _" + std::to_wstring (MinorReqVersion);
183+ return ;
167184 }
168185 else {
169186 logger.log (" invalid shader stage '%s' argument, expecting a string of length >= 6 " , system::ILogger::ELL_ERROR, s);
170187 }
171188 }
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+
172198}
173199
174200
0 commit comments