From 3e2340fe16c5b1cb63c9ec8a9bb6fa4b1f09a443 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 1 Mar 2024 11:41:47 +0000 Subject: [PATCH] Add identified support for slang (the language and the tool) --- .../Code/Interface/PersistantConfig.cpp | 7 ++++++ .../Code/Interface/ShaderProcessingTool.cpp | 9 +++++++ .../PipelineState/PipelineStateViewer.cpp | 1 + qrenderdoc/Windows/ShaderViewer.cpp | 15 +++++++----- qrenderdoc/Windows/TextureViewer.cpp | 3 ++- renderdoc/api/replay/renderdoc_tostr.inl | 3 +++ renderdoc/api/replay/replay_enums.h | 24 ++++++++++++++++++- renderdoc/driver/d3d12/d3d12_replay.cpp | 1 + .../driver/shaders/spirv/spirv_reflect.cpp | 5 +++- renderdoc/driver/vulkan/vk_replay.cpp | 1 + 10 files changed, 60 insertions(+), 9 deletions(-) diff --git a/qrenderdoc/Code/Interface/PersistantConfig.cpp b/qrenderdoc/Code/Interface/PersistantConfig.cpp index 5f954585e..2893fecdb 100644 --- a/qrenderdoc/Code/Interface/PersistantConfig.cpp +++ b/qrenderdoc/Code/Interface/PersistantConfig.cpp @@ -724,6 +724,11 @@ rdcstr ShaderProcessingTool::DefaultArguments() const return "-T {hlsl_stage2}_6_0 -E {entry_point}"; else if(tool == KnownShaderTool::fxc) return "/T {hlsl_stage2}_5_0 /E {entry_point}"; + else if(tool == KnownShaderTool::slangSPIRV) + return "-lang slang -target spirv -emit-spirv-directly -g2 -entry {entry_point} -stage " + "{full_stage}"; + else if(tool == KnownShaderTool::slangDXIL) + return "-lang slang -target dxil -g2 -entry {entry_point} -stage {full_stage}"; return args; } @@ -747,6 +752,8 @@ rdcstr ShaderProcessingTool::IOArguments() const return "-Fo {output_file} {input_file}"; else if(tool == KnownShaderTool::fxc) return "/Fo {output_file} {input_file}"; + else if(tool == KnownShaderTool::slangSPIRV || tool == KnownShaderTool::slangDXIL) + return "-o {output_file} {input_file}"; return rdcstr(); } diff --git a/qrenderdoc/Code/Interface/ShaderProcessingTool.cpp b/qrenderdoc/Code/Interface/ShaderProcessingTool.cpp index a54cde846..a48fdac10 100644 --- a/qrenderdoc/Code/Interface/ShaderProcessingTool.cpp +++ b/qrenderdoc/Code/Interface/ShaderProcessingTool.cpp @@ -33,6 +33,11 @@ static const QString glsl_stage4[arraydim()] = { lit("frag"), lit("comp"), lit("task"), lit("mesh"), }; +static const QString full_stage[arraydim()] = { + lit("vertex"), lit("hull"), lit("domain"), lit("geometry"), + lit("pixel"), lit("compute"), lit("amplification"), lit("mesh"), +}; + static const QString hlsl_stage2[arraydim()] = { lit("vs"), lit("hs"), lit("ds"), lit("gs"), lit("ps"), lit("cs"), lit("as"), lit("ms"), }; @@ -284,6 +289,8 @@ ShaderToolOutput ShaderProcessingTool::DisassembleShader(QWidget *window, arg.replace(0, 13, glsl_stage4[int(shaderDetails->stage)]); if(arg.left(13) == lit("{hlsl_stage2}")) arg.replace(0, 13, hlsl_stage2[int(shaderDetails->stage)]); + if(arg.left(12) == lit("{full_stage}")) + arg.replace(0, 12, full_stage[int(stage)]); if(arg.left(11) == lit("{spirv_ver}")) arg.replace(0, 11, spirvVer); if(arg.left(12) == lit("{vulkan_ver}")) @@ -342,6 +349,8 @@ ShaderToolOutput ShaderProcessingTool::CompileShader(QWidget *window, rdcstr sou arg.replace(0, 13, glsl_stage4[int(stage)]); if(arg.left(13) == lit("{hlsl_stage2}")) arg.replace(0, 13, hlsl_stage2[int(stage)]); + if(arg.left(12) == lit("{full_stage}")) + arg.replace(0, 12, full_stage[int(stage)]); if(arg.left(11) == lit("{spirv_ver}")) arg.replace(0, 11, spirvVer); if(arg.left(12) == lit("{vulkan_ver}")) diff --git a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp index d235680ec..95f7844d2 100644 --- a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp @@ -1529,6 +1529,7 @@ bool PipelineStateViewer::SaveShaderFile(const ShaderReflection *shader) case ShaderEncoding::SPIRVAsm: case ShaderEncoding::OpenGLSPIRVAsm: filter = tr("SPIR-V assembly files (*.spvasm)"); break; case ShaderEncoding::DXIL: filter = tr("DXIL Shader files (*.dxbc)"); break; + case ShaderEncoding::Slang: filter = tr("Slang Shader files (*.slang)"); break; case ShaderEncoding::Unknown: case ShaderEncoding::Count: filter = tr("All files (*.*)"); break; } diff --git a/qrenderdoc/Windows/ShaderViewer.cpp b/qrenderdoc/Windows/ShaderViewer.cpp index 5480ddba6..ec08a3bb5 100644 --- a/qrenderdoc/Windows/ShaderViewer.cpp +++ b/qrenderdoc/Windows/ShaderViewer.cpp @@ -1394,8 +1394,10 @@ void ShaderViewer::OnEventChanged(uint32_t eventId) ScintillaEdit *ShaderViewer::AddFileScintilla(const QString &name, const QString &text, ShaderEncoding encoding) { - ScintillaEdit *scintilla = MakeEditor(lit("scintilla") + name, text, - encoding == ShaderEncoding::HLSL ? SCLEX_HLSL : SCLEX_GLSL); + ScintillaEdit *scintilla = + MakeEditor(lit("scintilla") + name, text, + encoding == ShaderEncoding::HLSL || encoding == ShaderEncoding::Slang ? SCLEX_HLSL + : SCLEX_GLSL); scintilla->setReadOnly(true); scintilla->setWindowTitle(name); ((QWidget *)scintilla)->setProperty("name", name); @@ -5379,7 +5381,7 @@ vec2 RD_SelectedRange(); )"); } - else if(encoding == ShaderEncoding::HLSL) + else if(encoding == ShaderEncoding::HLSL || encoding == ShaderEncoding::Slang) { text = lit(R"( ///////////////////////////////////// @@ -5441,7 +5443,7 @@ void ShaderViewer::snippet_samplers() { ShaderEncoding encoding = currentEncoding(); - if(encoding == ShaderEncoding::HLSL) + if(encoding == ShaderEncoding::HLSL || encoding == ShaderEncoding::Slang) { insertSnippet(lit(R"( ///////////////////////////////////// @@ -5484,7 +5486,7 @@ void ShaderViewer::snippet_resources() ShaderEncoding encoding = currentEncoding(); GraphicsAPI api = m_Ctx.APIProps().localRenderer; - if(encoding == ShaderEncoding::HLSL) + if(encoding == ShaderEncoding::HLSL || encoding == ShaderEncoding::Slang) { insertSnippet(lit(R"( ///////////////////////////////////// @@ -6048,7 +6050,8 @@ void ShaderViewer::on_refresh_clicked() QString source = files[0].second; - if(encoding == ShaderEncoding::HLSL || encoding == ShaderEncoding::GLSL) + if(encoding == ShaderEncoding::HLSL || encoding == ShaderEncoding::Slang || + encoding == ShaderEncoding::GLSL) { bool success = ProcessIncludeDirectives(source, files); if(!success) diff --git a/qrenderdoc/Windows/TextureViewer.cpp b/qrenderdoc/Windows/TextureViewer.cpp index bb780d29a..cd30fe561 100644 --- a/qrenderdoc/Windows/TextureViewer.cpp +++ b/qrenderdoc/Windows/TextureViewer.cpp @@ -93,6 +93,7 @@ static QMap encodingExtensions = { {lit("frag"), ShaderEncoding::GLSL}, {lit("spvasm"), ShaderEncoding::SPIRVAsm}, {lit("spvasm"), ShaderEncoding::OpenGLSPIRVAsm}, + {lit("slang"), ShaderEncoding::Slang}, }; Q_DECLARE_METATYPE(Following); @@ -4586,7 +4587,7 @@ void TextureViewer::on_customCreate_clicked() QString src; - if(enc == ShaderEncoding::HLSL) + if(enc == ShaderEncoding::HLSL || enc == ShaderEncoding::Slang) { src = lit("float4 main(float4 pos : SV_Position, float4 uv : TEXCOORD0) : SV_Target0\n" diff --git a/renderdoc/api/replay/renderdoc_tostr.inl b/renderdoc/api/replay/renderdoc_tostr.inl index 911efa5f7..d7fdc77f1 100644 --- a/renderdoc/api/replay/renderdoc_tostr.inl +++ b/renderdoc/api/replay/renderdoc_tostr.inl @@ -1043,6 +1043,7 @@ rdcstr DoStringise(const ShaderEncoding &el) STRINGISE_ENUM_CLASS(DXIL); STRINGISE_ENUM_CLASS_NAMED(OpenGLSPIRV, "SPIR-V (OpenGL)"); STRINGISE_ENUM_CLASS_NAMED(OpenGLSPIRVAsm, "SPIR-V Asm (OpenGL)"); + STRINGISE_ENUM_CLASS(Slang); } END_ENUM_STRINGISE(); } @@ -1065,6 +1066,8 @@ rdcstr DoStringise(const KnownShaderTool &el) STRINGISE_ENUM_CLASS_NAMED(SPIRV_Cross_OpenGL, "SPIRV-Cross (OpenGL SPIR-V)"); STRINGISE_ENUM_CLASS_NAMED(spirv_as_OpenGL, "spirv-as (OpenGL SPIR-V)"); STRINGISE_ENUM_CLASS_NAMED(spirv_dis_OpenGL, "spirv-dis (OpenGL SPIR-V)"); + STRINGISE_ENUM_CLASS_NAMED(slangSPIRV, "slang (Vulkan SPIR-V)"); + STRINGISE_ENUM_CLASS_NAMED(slangDXIL, "slang (DXIL)"); } END_ENUM_STRINGISE(); } diff --git a/renderdoc/api/replay/replay_enums.h b/renderdoc/api/replay/replay_enums.h index 8be5d1004..e0fee52d4 100644 --- a/renderdoc/api/replay/replay_enums.h +++ b/renderdoc/api/replay/replay_enums.h @@ -1862,6 +1862,10 @@ DOCUMENT(R"(Identifies a shader encoding used to pass shader code to an API. DXIL binary shader, used by D3D12. Note that although the container is still DXBC format this is used to distinguish from :data:`DXBC` for compiler I/O matching. +.. data:: Slang + + Slang in string format, used by the slang compiler for compilation to multiple backend formats. + )"); enum class ShaderEncoding : uint32_t { @@ -1875,6 +1879,7 @@ enum class ShaderEncoding : uint32_t DXIL, OpenGLSPIRV, OpenGLSPIRVAsm, + Slang, Count, }; @@ -1944,6 +1949,14 @@ DOCUMENT(R"(Identifies a particular known tool used for shader processing. fxc Shader Compiler with DXBC output. +.. data:: slangSPIRV + + `Slang Shader Compiler `_ with Vulkan SPIR-V output. + +.. data:: slangDXIL + + `Slang Shader Compiler `_ with DXIL output. + )"); enum class KnownShaderTool : uint32_t { @@ -1961,6 +1974,8 @@ enum class KnownShaderTool : uint32_t SPIRV_Cross_OpenGL, spirv_as_OpenGL, spirv_dis_OpenGL, + slangSPIRV, + slangDXIL, Count, }; @@ -1991,6 +2006,8 @@ constexpr inline const char *ToolExecutable(KnownShaderTool tool) : tool == KnownShaderTool::dxcSPIRV ? "dxc" : tool == KnownShaderTool::dxcDXIL ? "dxc" : tool == KnownShaderTool::fxc ? "fxc" + : tool == KnownShaderTool::slangSPIRV ? "slangc" + : tool == KnownShaderTool::slangDXIL ? "slangc" : ""; } @@ -2016,6 +2033,8 @@ constexpr inline ShaderEncoding ToolInput(KnownShaderTool tool) : tool == KnownShaderTool::dxcSPIRV ? ShaderEncoding::HLSL : tool == KnownShaderTool::dxcDXIL ? ShaderEncoding::HLSL : tool == KnownShaderTool::fxc ? ShaderEncoding::HLSL + : tool == KnownShaderTool::slangSPIRV ? ShaderEncoding::Slang + : tool == KnownShaderTool::slangDXIL ? ShaderEncoding::Slang : ShaderEncoding::Unknown; } @@ -2041,6 +2060,8 @@ constexpr inline ShaderEncoding ToolOutput(KnownShaderTool tool) : tool == KnownShaderTool::dxcSPIRV ? ShaderEncoding::SPIRV : tool == KnownShaderTool::dxcDXIL ? ShaderEncoding::DXIL : tool == KnownShaderTool::fxc ? ShaderEncoding::DXBC + : tool == KnownShaderTool::slangSPIRV ? ShaderEncoding::SPIRV + : tool == KnownShaderTool::slangDXIL ? ShaderEncoding::DXIL : ShaderEncoding::Unknown; } @@ -2053,7 +2074,8 @@ DOCUMENT(R"(Check whether or not this is a human readable text representation. constexpr inline bool IsTextRepresentation(ShaderEncoding encoding) { return encoding == ShaderEncoding::HLSL || encoding == ShaderEncoding::GLSL || - encoding == ShaderEncoding::SPIRVAsm || encoding == ShaderEncoding::OpenGLSPIRVAsm; + encoding == ShaderEncoding::SPIRVAsm || encoding == ShaderEncoding::OpenGLSPIRVAsm || + encoding == ShaderEncoding::Slang; } DOCUMENT(R"(A primitive topology used for processing vertex data. diff --git a/renderdoc/driver/d3d12/d3d12_replay.cpp b/renderdoc/driver/d3d12/d3d12_replay.cpp index fe774fa4f..9d0b8eb4d 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.cpp +++ b/renderdoc/driver/d3d12/d3d12_replay.cpp @@ -4184,6 +4184,7 @@ rdcarray D3D12Replay::GetCustomShaderSourcePrefixes() { return { {ShaderEncoding::HLSL, HLSL_CUSTOM_PREFIX}, + {ShaderEncoding::Slang, HLSL_CUSTOM_PREFIX}, }; } diff --git a/renderdoc/driver/shaders/spirv/spirv_reflect.cpp b/renderdoc/driver/shaders/spirv/spirv_reflect.cpp index 19a70c066..99a46d6cf 100644 --- a/renderdoc/driver/shaders/spirv/spirv_reflect.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_reflect.cpp @@ -954,7 +954,7 @@ void Reflector::MakeReflection(const GraphicsAPI sourceAPI, const ShaderStage st case SourceLanguage::ESSL: case SourceLanguage::GLSL: reflection.debugInfo.encoding = ShaderEncoding::GLSL; break; case SourceLanguage::HLSL: reflection.debugInfo.encoding = ShaderEncoding::HLSL; break; - case SourceLanguage::Slang: reflection.debugInfo.encoding = ShaderEncoding::HLSL; break; + case SourceLanguage::Slang: reflection.debugInfo.encoding = ShaderEncoding::Slang; break; case SourceLanguage::OpenCL_C: case SourceLanguage::OpenCL_CPP: case SourceLanguage::CPP_for_OpenCL: @@ -990,6 +990,9 @@ void Reflector::MakeReflection(const GraphicsAPI sourceAPI, const ShaderStage st : KnownShaderTool::spirv_as; break; case Generator::spiregg: reflection.debugInfo.compiler = KnownShaderTool::dxcSPIRV; break; + case Generator::SlangCompiler: + reflection.debugInfo.compiler = KnownShaderTool::slangSPIRV; + break; default: reflection.debugInfo.compiler = KnownShaderTool::Unknown; break; } diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 107779623..15c91413b 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -4383,6 +4383,7 @@ rdcarray VulkanReplay::GetCustomShaderSourcePrefixes() // right binding and helper definitions return { {ShaderEncoding::HLSL, HLSL_CUSTOM_PREFIX}, + {ShaderEncoding::Slang, HLSL_CUSTOM_PREFIX}, }; }