| 1482 | } |
| 1483 | |
| 1484 | bool PipelineStateViewer::SaveShaderFile(const ShaderReflection *shader) |
| 1485 | { |
| 1486 | if(!shader) |
| 1487 | return false; |
| 1488 | |
| 1489 | QString filter; |
| 1490 | |
| 1491 | switch(shader->encoding) |
| 1492 | { |
| 1493 | case ShaderEncoding::DXBC: filter = tr("DXBC Shader files (*.dxbc)"); break; |
| 1494 | case ShaderEncoding::HLSL: filter = tr("HLSL files (*.hlsl)"); break; |
| 1495 | case ShaderEncoding::GLSL: filter = tr("GLSL files (*.glsl)"); break; |
| 1496 | case ShaderEncoding::SPIRV: |
| 1497 | case ShaderEncoding::OpenGLSPIRV: filter = tr("SPIR-V files (*.spv)"); break; |
| 1498 | case ShaderEncoding::SPIRVAsm: |
| 1499 | case ShaderEncoding::OpenGLSPIRVAsm: filter = tr("SPIR-V assembly files (*.spvasm)"); break; |
| 1500 | case ShaderEncoding::DXIL: filter = tr("DXIL Shader files (*.dxbc)"); break; |
| 1501 | case ShaderEncoding::Slang: filter = tr("Slang Shader files (*.slang)"); break; |
| 1502 | case ShaderEncoding::Unknown: |
| 1503 | case ShaderEncoding::Count: filter = tr("All files (*.*)"); break; |
| 1504 | } |
| 1505 | |
| 1506 | QString filename = RDDialog::getSaveFileName(this, tr("Save Shader As"), QString(), filter); |
| 1507 | |
| 1508 | if(!filename.isEmpty()) |
| 1509 | { |
| 1510 | ANALYTIC_SET(Export.Shader, true); |
| 1511 | |
| 1512 | QDir dirinfo = QFileInfo(filename).dir(); |
| 1513 | if(dirinfo.exists()) |
| 1514 | { |
| 1515 | QFile f(filename); |
| 1516 | if(f.open(QIODevice::WriteOnly | QIODevice::Truncate)) |
| 1517 | { |
| 1518 | f.write((const char *)shader->rawBytes.data(), (qint64)shader->rawBytes.size()); |
| 1519 | } |
| 1520 | else |
| 1521 | { |
| 1522 | RDDialog::critical( |
| 1523 | this, tr("Error saving shader"), |
| 1524 | tr("Couldn't open path %1 for write.\n%2").arg(filename).arg(f.errorString())); |
| 1525 | return false; |
| 1526 | } |
| 1527 | } |
| 1528 | else |
| 1529 | { |
| 1530 | RDDialog::critical(this, tr("Invalid directory"), |
| 1531 | tr("Cannot find target directory to save to")); |
| 1532 | return false; |
| 1533 | } |
| 1534 | } |
| 1535 | |
| 1536 | return true; |
| 1537 | } |
| 1538 | |
| 1539 | void PipelineStateViewer::SelectPipelineStage(PipelineStage stage) |
| 1540 | { |
no test coverage detected