@@ -118,38 +118,56 @@ static void try_upgrade_shader_stage(std::vector<std::wstring>& arguments, asset
118118 if (foundShaderStageArgument != arguments.end () && foundShaderStageArgument + 1 != arguments.end ()) {
119119 auto foundShaderStageArgumentValueIdx = foundShaderStageArgument - arguments.begin () + 1 ;
120120 std::wstring s = arguments[foundShaderStageArgumentValueIdx];
121- if (s.length () >= 6 ) {
122- if (shaderStageOverrideFromPragma != IShader::ESS_UNKNOWN)
123- {
124- // replace first 2 characters if shaderStageOverrideFromPragma != Unknown
125- auto stageStr = ShaderStageToString (shaderStageOverrideFromPragma);
126- if (!stageStr) {
127- logger.log (" invalid shader stage %i" , system::ILogger::ELL_ERROR, shaderStageOverrideFromPragma);
128- return ;
129- }
130- s.replace (0 , 2 , stageStr);
131- }
132-
133- std::vector<std::wstring::iterator> underscorePositions = {};
134- auto it = std::find (s.begin (), s.end (), ' _' );
121+ if (s.length () >= 6 ) {
122+ std::vector<std::wstring::iterator> underscorePositions = {};
123+ auto it = std::find (s.begin (), s.end (), ' _' );
135124 while (it != s.end ()) {
136- underscorePositions.push_back (it);
125+ underscorePositions.push_back (it);
137126 it = std::find (it + 1 , s.end (), ' _' );
138127 }
139- std::wstring majorVersionString, minorVersionString;
140- int size = underscorePositions.size ();
141- auto secondLastUnderscore = underscorePositions[size - 2 ];
142- auto lastUnderscore = underscorePositions[size - 1 ];
143- majorVersionString = std::wstring (secondLastUnderscore + 1 , lastUnderscore);
144- minorVersionString = std::wstring (lastUnderscore + 1 , s.end ());
145-
146- int major = std::stoi (majorVersionString);
147- int minor = std::stoi (minorVersionString);
148- if (major < MajorReqVersion || (major == MajorReqVersion && minor < MinorReqVersion))
149- {
150- arguments[foundShaderStageArgumentValueIdx] = std::wstring (s.begin (), secondLastUnderscore + 1 ) + std::to_wstring (MajorReqVersion) + L" _" + std::to_wstring (MinorReqVersion);
151- }
152- }
128+ if (shaderStageOverrideFromPragma != IShader::ESS_UNKNOWN)
129+ {
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);
139+ return ;
140+ }
141+ int len = underscorePositions[0 ] - s.begin ();
142+ s.replace (0 , len, stageStr);
143+ }
144+
145+ std::wstring majorVersionString, minorVersionString;
146+ int size = underscorePositions.size ();
147+ auto secondLastUnderscore = underscorePositions[size - 2 ];
148+ auto lastUnderscore = underscorePositions[size - 1 ];
149+ majorVersionString = std::wstring (secondLastUnderscore + 1 , lastUnderscore);
150+ minorVersionString = std::wstring (lastUnderscore + 1 , s.end ());
151+ try
152+ {
153+ int major = std::stoi (majorVersionString);
154+ int minor = std::stoi (minorVersionString);
155+ if (major < MajorReqVersion || (major == MajorReqVersion && minor < MinorReqVersion))
156+ {
157+ 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);
159+ }
160+ }
161+ catch (const std::invalid_argument& e) {
162+ logger.log (" Parsing shader version failed, invalid argument exception: %s" , system::ILogger::ELL_ERROR, e.what ());
163+ }
164+ catch (const std::out_of_range& e) {
165+ logger.log (" Parsing shader version failed, out of range exception: %s" , system::ILogger::ELL_ERROR, e.what ());
166+ }
167+ }
168+ else {
169+ logger.log (" invalid shader stage '%s' argument, expecting a string of length >= 6 " , system::ILogger::ELL_ERROR, s);
170+ }
153171 }
154172}
155173
0 commit comments