| 253 | } |
| 254 | |
| 255 | ShaderToolOutput ShaderProcessingTool::DisassembleShader(QWidget *window, |
| 256 | const ShaderReflection *shaderDetails, |
| 257 | rdcstr arguments) const |
| 258 | { |
| 259 | QStringList argList = ParseArgsList(arguments.isEmpty() ? DefaultArguments() : arguments); |
| 260 | // always append IO arguments for known tools, so we read/write to our own files and override any |
| 261 | // dangling output specified file in the embedded command line |
| 262 | argList.append(ParseArgsList(IOArguments())); |
| 263 | |
| 264 | QString input_file, output_file; |
| 265 | |
| 266 | input_file = tmpPath(lit("shader_input")); |
| 267 | |
| 268 | QString spirvVer = lit("spirv1.0"); |
| 269 | for(const ShaderCompileFlag &flag : shaderDetails->debugInfo.compileFlags.flags) |
| 270 | if(flag.name == "@spirver") |
| 271 | spirvVer = flag.value; |
| 272 | |
| 273 | // replace arguments after expansion to avoid problems with quoting paths etc |
| 274 | for(QString &arg : argList) |
| 275 | { |
| 276 | if(arg == lit("{input_file}")) |
| 277 | arg = input_file; |
| 278 | if(arg == lit("{output_file}")) |
| 279 | arg = output_file = tmpPath(lit("shader_output")); |
| 280 | if(arg == lit("{entry_point}")) |
| 281 | { |
| 282 | arg = shaderDetails->entryPoint; |
| 283 | if(arg.isEmpty()) |
| 284 | arg = lit("main"); |
| 285 | } |
| 286 | |
| 287 | // substring replacements to enable e.g. {hlsl_stage2}_6_0 and ={vulkan_ver} |
| 288 | arg.replace(lit("{glsl_stage4}"), glsl_stage4[int(shaderDetails->stage)]); |
| 289 | arg.replace(lit("{hlsl_stage2}"), hlsl_stage2[int(shaderDetails->stage)]); |
| 290 | arg.replace(lit("{full_stage}"), full_stage[int(shaderDetails->stage)]); |
| 291 | arg.replace(lit("{spirv_ver}"), spirvVer); |
| 292 | arg.replace(lit("{vulkan_ver}"), vulkanVerForSpirVer(spirvVer)); |
| 293 | } |
| 294 | |
| 295 | QFile binHandle(input_file); |
| 296 | if(binHandle.open(QFile::WriteOnly | QIODevice::Truncate)) |
| 297 | { |
| 298 | binHandle.write( |
| 299 | QByteArray((const char *)shaderDetails->rawBytes.data(), shaderDetails->rawBytes.count())); |
| 300 | binHandle.close(); |
| 301 | } |
| 302 | else |
| 303 | { |
| 304 | ShaderToolOutput ret; |
| 305 | |
| 306 | ret.log = QApplication::translate("ShaderProcessingTool", |
| 307 | "ERROR: Couldn't write input to temporary file '%1'") |
| 308 | .arg(input_file); |
| 309 | |
| 310 | return ret; |
| 311 | } |
| 312 |
nothing calls this directly
no test coverage detected