@@ -109,30 +109,46 @@ static void try_upgrade_hlsl_version(std::vector<std::wstring>& arguments, syste
109
109
}
110
110
111
111
112
- static void try_upgrade_shader_stage (std::vector<std::wstring> &arguments, asset::IShader::E_SHADER_STAGE shaderStageOverrideFromPragma, system::logger_opt_ptr& logger) {
113
- auto foundShaderStageArgument = std::find (arguments.begin (), arguments.end (), L" -T" );
114
- if (foundShaderStageArgument != arguments.end ()) {
115
- auto foundShaderStageArgumentValueIdx = foundShaderStageArgument - arguments.begin () + 1 ;
116
- std::wstring s = arguments[foundShaderStageArgumentValueIdx];
117
- if (s.length () >= 6 ) {
118
- // TODO replace first 2 if shaderStageOverrideFromPragma != Unknown
119
-
120
- // TODO fix this parsing in case 6_10 gets released
121
- // Even though they could name it 7_0 at that point
122
-
123
- auto it = std::find (s.begin (), s.end (), ' _' );
124
- while (it != s.end ())
125
- {
126
-
127
- }
128
- /* int argument_version = (targetProfile[3] - '0') * 10 + (targetProfile[5] - '0');
129
- if (argument_version < 67)
130
- {
131
- targetProfile.replace(3, 3, L"6_7");
132
- arguments[foundShaderStageArgumentValueIdx] = targetProfile;
133
- }*/
134
- }
135
- }
112
+ static void try_upgrade_shader_stage (std::vector<std::wstring>& arguments, asset::IShader::E_SHADER_STAGE shaderStageOverrideFromPragma, system::logger_opt_ptr& logger) {
113
+
114
+ constexpr int MajorReqVersion = 6 ,
115
+ MinorReqVersion = 7 ;
116
+
117
+ auto foundShaderStageArgument = std::find (arguments.begin (), arguments.end (), L" -T" );
118
+ if (foundShaderStageArgument != arguments.end () && foundShaderStageArgument + 1 != arguments.end ()) {
119
+ auto foundShaderStageArgumentValueIdx = foundShaderStageArgument - arguments.begin () + 1 ;
120
+ 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 (), ' _' );
135
+ while (it != s.end ())
136
+ underscorePositions.push_back (it);
137
+ std::wstring majorVersionString, minorVersionString;
138
+ int size = underscorePositions.size ();
139
+ auto secondLastUnderscore = underscorePositions[size - 2 ];
140
+ auto lastUnderscore = underscorePositions[size - 1 ];
141
+ majorVersionString = std::wstring (secondLastUnderscore + 1 , lastUnderscore);
142
+ minorVersionString = std::wstring (lastUnderscore + 1 , s.end ());
143
+
144
+ int major = std::stoi (majorVersionString);
145
+ int minor = std::stoi (minorVersionString);
146
+ if (major < MajorReqVersion || (major == MajorReqVersion && minor < MinorReqVersion))
147
+ {
148
+ arguments[foundShaderStageArgumentValueIdx] = std::wstring (s.begin (), secondLastUnderscore + 1 ) + std::to_wstring (MajorReqVersion) + L" _" + std::to_wstring (MinorReqVersion);
149
+ }
150
+ }
151
+ }
136
152
}
137
153
138
154
0 commit comments