From 623725ef2e2ad132c820367b992ef9626c32f765 Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Sun, 22 Mar 2026 07:41:53 +0100 Subject: [PATCH 1/3] Add chapter on Slang shading language Refs #172 --- README.adoc | 4 +- antora/modules/ROOT/nav.adoc | 1 + ...slang-write-once-run-anywhere-graphic.webp | Bin 0 -> 24208 bytes chapters/slang.adoc | 235 ++++++++++++++++++ 4 files changed, 239 insertions(+), 1 deletion(-) create mode 100644 chapters/images/slang-write-once-run-anywhere-graphic.webp create mode 100644 chapters/slang.adoc diff --git a/README.adoc b/README.adoc index 72d6f4d..8f26213 100644 --- a/README.adoc +++ b/README.adoc @@ -1,4 +1,4 @@ -// Copyright 2019-2024 The Khronos Group, Inc. +// Copyright 2019-2026 The Khronos Group, Inc. // SPDX-License-Identifier: CC-BY-4.0 = Vulkan^®^ Guide @@ -172,6 +172,8 @@ The Vulkan Guide content is also viewable from https://docs.vulkan.org/guide/lat == xref:{chapters}hlsl.adoc[Using HLSL shaders] +== xref:{chapters}slang.adoc[Using Slang shaders] + == xref:{chapters}high_level_shader_language_comparison.adoc[High Level Shader Language Comparison] = When and Why to use Extensions diff --git a/antora/modules/ROOT/nav.adoc b/antora/modules/ROOT/nav.adoc index 6fd940a..0848207 100644 --- a/antora/modules/ROOT/nav.adoc +++ b/antora/modules/ROOT/nav.adoc @@ -66,6 +66,7 @@ ** xref:{chapters}image_copies.adoc[] ** xref:{chapters}common_pitfalls.adoc[] ** xref:{chapters}hlsl.adoc[] +** xref:{chapters}slang.adoc[] ** xref:{chapters}high_level_shader_language_comparison.adoc[] * When and Why to use Extensions ** xref:{chapters}extensions/cleanup.adoc[] diff --git a/chapters/images/slang-write-once-run-anywhere-graphic.webp b/chapters/images/slang-write-once-run-anywhere-graphic.webp new file mode 100644 index 0000000000000000000000000000000000000000..7df32b2b294cc078f0eeff837b38615cb8c6dad5 GIT binary patch literal 24208 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 BwkQAq literal 0 HcmV?d00001 diff --git a/chapters/slang.adoc b/chapters/slang.adoc new file mode 100644 index 0000000..63f57ba --- /dev/null +++ b/chapters/slang.adoc @@ -0,0 +1,235 @@ +// Copyright 2026 Sascha Willems +// SPDX-License-Identifier: CC-BY-4.0 + +ifndef::chapters[:chapters:] +ifndef::images[:images: images/] + += Slang Shading Language in Vulkan + +image::{images}slang-write-once-run-anywhere-graphic.webp[Slang overview] + +Vulkan does not directly consume shaders in a human-readable text format, but instead uses xref:{chapters}what_is_spirv.adoc[SPIR-V] as an intermediate representation. This opens the option to use shader languages other than e.g. GLSL, as long as they can target the Vulkan SPIR-V environment. + +One such language is the link:https://shader-slang.org[Slang Shading Language] developed by NVIDIA. It was designed to address the evolving needs of real-time graphics development, especially in regards to shader code bases getting larger and more complex. It supports multiple APIs, among them is first-class support for Vulkan's SPIR-V. + +Slang is developed in the link:https://github.com/shader-slang[Open Source] and is under the link:https://www.khronos.org/news/press/khronos-group-launches-slang-initiative-hosting-open-source-compiler-contributed-by-nvidia[goverance of Khronos], meaning it has broad industry support and is actively maintained. + +It's syntax is similar to xref:{chapters}HLSL.adoc[HLSL] with additions like modules to make the language easier to use and to better handle complex code bases. + +== Educational resources + +If you are new to Slang, here are some educational points: + +* link:https://shader-slang.org/[Slang website] +* link:https://docs.shader-slang.org/en/latest/external/slang/docs/user-guide/[Slang Users's Guide]. +* link:https://docs.shader-slang.org/en/latest/external/slang/docs/user-guide/a2-01-spirv-target-specific.html[SPIR-V specific functionalities] +* link:https://shader-slang.org/docs/coming-from-hlsl/[Porting from HLSL] +* link:https://shader-slang.org/docs/coming-from-glsl/[Porting from GLSL] +* xref:samples::README.adoc[The Vulkan Samples support Slang shaders] + +== Key differences + +Some of the key differences for Vulkan developers compared to GLSL and HLSL: + +* C{pp} syntax based on HLSL + * Modules + * Interfaces and generics + * Namespaces + * Pointers +* Multiple shader stages in a single file +* Automatic generation of binding points + +== From the application's point-of-view + +From the application's point-of-view, using Slang is exactly the same as using GLSL. As the application always consumes shaders in the SPIR-V format, the only difference is in the tooling to generate the SPIR-V shaders from the desired shading language. + +== Syntax comparison + +Slang and GLSL differ heavily in their syntax. While GLSL is more procedural (like C), Slang is more object-oriented (like C{pp}). + +Here is the same shader written in both languages to give quick comparison on how they basically differ, including the aforementioned namespace that e.g. adds explicit locations: + +=== GLSL + +In GLSL, you need one shader per stage. + +==== Vertex shader + +link:https://godbolt.org/z/6fefo9cWT[Try Online] +[source,glsl] +---- +#version 450 + +layout (location = 0) in vec3 inPos; +layout (location = 1) in vec2 inUV; + +layout (binding = 0) uniform UBO +{ + mat4 projection; + mat4 model; +} ubo; + +layout (location = 0) out vec2 outUV; + +void main() +{ + outUV = inUV; + gl_Position = ubo.projection * ubo.model * vec4(inPos.xyz, 1.0); +} +---- + +==== Fragment shader + +link:https://godbolt.org/z/4ecx89TWE[Try Online] +[source,glsl] +---- +#version 450 + +layout (binding = 1) uniform sampler2D samplerColor; + +layout (location = 0) in vec2 inUV; + +layout (location = 0) out vec4 outFragColor; + +void main() +{ + outFragColor = texture(samplerColor, inUV); +} +---- + +=== Slang + +In Slang, a single file can contain multiple shader stages. This helps reduce duplication. Also note how we don't have to specify explicit bindings, as they're implicitly deduced for `ubo` and `samplerColor` from their ordering. + +link:https://godbolt.org/z/rEYeG6EdY[Try Online] +[source,slang] +---- +struct VSInput +{ + float3 Pos; + float2 UV; + float3 Normal; +}; + +struct VSOutput +{ + float4 Pos : SV_POSITION; + float2 UV; +}; + +struct UBO +{ + float4x4 projection; + float4x4 model; +}; +ConstantBuffer ubo; + +Sampler2D samplerColor; + +[shader("vertex")] +VSOutput vertexMain(VSInput input) +{ + VSOutput output; + output.UV = input.UV; + output.Pos = mul(ubo.projection, mul(ubo.model, float4(input.Pos.xyz, 1.0))); + return output; +} + +[shader("fragment")] +float4 fragmentMain(VSOutput input) +{ + return samplerColor.Sample(input.UV); +} +---- + +== Compiling shaders + +To get SPIR-V from Slang requires a compiler. Just like GLSL and HLSL, Slang comes with both an offline compiler (a binary for multiple operating systems) and a library for runtime compilation. Both can be downloaded via link:https://github.com/shader-slang/slang/releases[github] and are also part of the link:https://vulkan.lunarg.com/sdk/home[Vulkan SDK]. + +=== Offline compilation using the stand-alone compiler + +Compiling a shader offline via the pre-compiled `slangc` binary is similar to compiling with glslang: + +[source] +---- +slangc texture.slang -target spirv -o texture.vert.spv +---- + +This will generate a single SPIR-V file with all shader stages provided in the Slang source file. + +Specific shader stages can be compiled like this: + +[source] +---- +slangc texture.slang -target spirv -entry vertexMain -stage vertex -o texture.vert.spv +---- + +Capabilities are implicitly enabled based on feature usage, but can also be explicitly specified: + +[source] +---- +slangc heap.slang -target spirv -entry vertexMain -stage vertex -o heap.vert.spv -capability spvDescriptorHeapEXT +---- + +The resulting SPIR-V can then be directly loaded by the app, same as SPIR-V generated from GLSL. + +=== Runtime compilation using the library + +Slang can also be integrated into a Vulkan application using the Slang Compiler API. This allows for runtime compilation of shaders. Doing so requires you to include the slang compiler headers and link against the `slang` (or `slang-compiler`) library. + +Compiling Slang to SPIR-V at runtime then is pretty straight-forward: + +[source, cpp] +---- +#include "slang/slang.h" +#include "slang/slang-com-ptr.h" + +... + +// Initialize the Slang shader compiler +slang::createGlobalSession(slangGlobalSession.writeRef()); +auto slangTargets{ std::to_array({ {.format{SLANG_SPIRV}, .profile{slangGlobalSession->findProfile("spirv")} } }) }; +auto slangOptions{ std::to_array({ { slang::CompilerOptionName::EmitSpirvDirectly, {slang::CompilerOptionValueKind::Int, 1} } }) }; +slang::SessionDesc slangSessionDesc{ + .targets{slangTargets.data()}, + .targetCount{SlangInt(slangTargets.size())}, + // Match GLSL's matrix layout + .defaultMatrixLayoutMode = SLANG_MATRIX_LAYOUT_COLUMN_MAJOR, + .compilerOptionEntries{slangOptions.data()}, + .compilerOptionEntryCount{uint32_t(slangOptions.size())} +}; + +// Load and compile the shader +Slang::ComPtr slangSession; +slangGlobalSession->createSession(slangSessionDesc, slangSession.writeRef()); +Slang::ComPtr slangModule{ slangSession->loadModuleFromSource("shader", "shader.slang", nullptr, nullptr) }; +Slang::ComPtr spirv; +slangModule->getTargetCode(0, spirv.writeRef()); +VkShaderModuleCreateInfo shaderModuleCI{ + .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, + .codeSize = spirv->getBufferSize(), + .pCode = (uint32_t*)spirv->getBufferPointer() +}; + +// Create the shader module to be used by the application +VkShaderModule shaderModule{}; +chk(vkCreateShaderModule(device, &shaderModuleCI, nullptr, &shaderModule)); + +// Take shader stages from the single module we just compiled +VkPipelineShaderStageCreateInfo vertexShader{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, + .stage = VK_SHADER_STAGE_VERTEX_BIT, + .module = shaderModule, .pName = "main" +}; +VkPipelineShaderStageCreateInfo fragmentShader{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, + .stage = VK_SHADER_STAGE_FRAGMENT_BIT, + .module = shaderModule, .pName = "main" +}; +VkGraphicsPipelineCreateInfo pipelineCI{ + ... + .stageCount = 2, + .pStages = shaderStages.data(), +}; +chk(vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &pipelineCI, nullptr, &pipeline)); +---- \ No newline at end of file From bbd8952631de53b46b9de7bec9327b1a1d04598b Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Sun, 22 Mar 2026 07:53:07 +0100 Subject: [PATCH 2/3] Minor fixes, also copy .wepb files Refs #172 --- antora/Makefile | 3 ++- chapters/slang.adoc | 12 ++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/antora/Makefile b/antora/Makefile index 85b9640..5e56db4 100644 --- a/antora/Makefile +++ b/antora/Makefile @@ -1,4 +1,4 @@ -# Copyright 2022-2023 The Khronos Group Inc. +# Copyright 2022-2026 The Khronos Group Inc. # SPDX-License-Identifier: Apache-2.0 # Configure Vulkan Guide Antora tree with transformed markup files. @@ -24,6 +24,7 @@ setup_spec: mkdir -p $(ROOT)/images $(CP) $(wildcard chapters/images/[A-Za-z]*.png) $(ROOT)/images/ $(CP) $(wildcard chapters/images/[A-Za-z]*.svg) $(ROOT)/images/ + $(CP) $(wildcard chapters/images/[A-Za-z]*.webp) $(ROOT)/images/ $(CP) $(wildcard images/[A-Za-z]*.png) $(ROOT)/images/ mkdir -p $(ROOT)/images/extensions $(CP) $(wildcard chapters/images/extensions/[A-Za-z]*.png) $(ROOT)/images/extensions diff --git a/chapters/slang.adoc b/chapters/slang.adoc index 63f57ba..7089c76 100644 --- a/chapters/slang.adoc +++ b/chapters/slang.adoc @@ -6,30 +6,30 @@ ifndef::images[:images: images/] = Slang Shading Language in Vulkan -image::{images}slang-write-once-run-anywhere-graphic.webp[Slang overview] - Vulkan does not directly consume shaders in a human-readable text format, but instead uses xref:{chapters}what_is_spirv.adoc[SPIR-V] as an intermediate representation. This opens the option to use shader languages other than e.g. GLSL, as long as they can target the Vulkan SPIR-V environment. One such language is the link:https://shader-slang.org[Slang Shading Language] developed by NVIDIA. It was designed to address the evolving needs of real-time graphics development, especially in regards to shader code bases getting larger and more complex. It supports multiple APIs, among them is first-class support for Vulkan's SPIR-V. +image::{images}slang-write-once-run-anywhere-graphic.webp[Slang overview] + Slang is developed in the link:https://github.com/shader-slang[Open Source] and is under the link:https://www.khronos.org/news/press/khronos-group-launches-slang-initiative-hosting-open-source-compiler-contributed-by-nvidia[goverance of Khronos], meaning it has broad industry support and is actively maintained. -It's syntax is similar to xref:{chapters}HLSL.adoc[HLSL] with additions like modules to make the language easier to use and to better handle complex code bases. +It's syntax is similar to xref:{chapters}hlsl.adoc[HLSL] with additions like modules to make the language easier to use and to better handle complex code bases. == Educational resources If you are new to Slang, here are some educational points: * link:https://shader-slang.org/[Slang website] -* link:https://docs.shader-slang.org/en/latest/external/slang/docs/user-guide/[Slang Users's Guide]. +* link:https://docs.shader-slang.org/en/latest/external/slang/docs/user-guide/[Slang Users's Guide] * link:https://docs.shader-slang.org/en/latest/external/slang/docs/user-guide/a2-01-spirv-target-specific.html[SPIR-V specific functionalities] * link:https://shader-slang.org/docs/coming-from-hlsl/[Porting from HLSL] * link:https://shader-slang.org/docs/coming-from-glsl/[Porting from GLSL] -* xref:samples::README.adoc[The Vulkan Samples support Slang shaders] +* xref:samples::README.adoc[The Vulkan Samples come with Slang shaders] == Key differences -Some of the key differences for Vulkan developers compared to GLSL and HLSL: +Some of the key differences for Vulkan developers compared to GLSL and/or HLSL: * C{pp} syntax based on HLSL * Modules From 0f3375288362daeb63c90f88fb1cc0b38c1765f0 Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Sun, 22 Mar 2026 08:02:45 +0100 Subject: [PATCH 3/3] Additional links, notes on tooling Refs #172 --- chapters/slang.adoc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/chapters/slang.adoc b/chapters/slang.adoc index 7089c76..1544ab5 100644 --- a/chapters/slang.adoc +++ b/chapters/slang.adoc @@ -14,17 +14,21 @@ image::{images}slang-write-once-run-anywhere-graphic.webp[Slang overview] Slang is developed in the link:https://github.com/shader-slang[Open Source] and is under the link:https://www.khronos.org/news/press/khronos-group-launches-slang-initiative-hosting-open-source-compiler-contributed-by-nvidia[goverance of Khronos], meaning it has broad industry support and is actively maintained. -It's syntax is similar to xref:{chapters}hlsl.adoc[HLSL] with additions like modules to make the language easier to use and to better handle complex code bases. +It's syntax is similar to xref:{chapters}hlsl.adoc[HLSL] with additions like modules to make the language easier to use and to better handle complex code bases. + +It has great tooling-support with debuggers like link:https://renderdoc.org/[RenderDoc] and link:https://developer.nvidia.com/nsight-graphics[Night]. Syntax highlighting is available for most popular IDEs like link:https://marketplace.visualstudio.com/items?itemName=shader-slang.slang-vs-extension[Visual Studio] and link:https://marketplace.visualstudio.com/items?itemName=shader-slang.slang-language-extension[Visual Studio Code]. == Educational resources If you are new to Slang, here are some educational points: * link:https://shader-slang.org/[Slang website] +* link:https://shader-slang.org/docs/getting-started/[Getting started with Slang] * link:https://docs.shader-slang.org/en/latest/external/slang/docs/user-guide/[Slang Users's Guide] * link:https://docs.shader-slang.org/en/latest/external/slang/docs/user-guide/a2-01-spirv-target-specific.html[SPIR-V specific functionalities] * link:https://shader-slang.org/docs/coming-from-hlsl/[Porting from HLSL] * link:https://shader-slang.org/docs/coming-from-glsl/[Porting from GLSL] +* link:https://shader-slang.org/slang-playground/[Interactive Slang shader playground] * xref:samples::README.adoc[The Vulkan Samples come with Slang shaders] == Key differences