Skip to content

Commit 60de2f0

Browse files
Add Slang and HLSL shaders to first set of samples (KhronosGroup#1384)
* Added Slang shaders for dynamic rendering local read sample * Fix normal calculation for Slang shader * Enable extensions required when running with Slang shaders * Added HLSL shaders for dynamic rendering local read sample * Added SPIR-V files * Added Slang shaders for dynamic rendering sample * Update copyright headers * Trying to fix clang format Seems to have issues with code in defines * Add HLSL and Slang shaders for Vulkan 1.3 hello triangle samples * Update copyrights * Force column-major layout for Slang shader compilation * Add clamping to HLSL and Slang shader * Fix copyright
1 parent 2ae43ba commit 60de2f0

64 files changed

Lines changed: 1043 additions & 36 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

bldsys/cmake/sample_helper.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ endif()
262262
set(SLANG_ENTRY_POINT "main")
263263
add_custom_command(
264264
OUTPUT ${OUTPUT_FILE}
265-
COMMAND ${Vulkan_slang_EXECUTABLE} ${SHADER_FILE_SLANG} -profile ${SLANG_PROFILE} -target spirv -o ${OUTPUT_FILE} -entry ${SLANG_ENTRY_POINT}
265+
COMMAND ${Vulkan_slang_EXECUTABLE} ${SHADER_FILE_SLANG} -profile ${SLANG_PROFILE} -matrix-layout-column-major -target spirv -o ${OUTPUT_FILE} -entry ${SLANG_ENTRY_POINT}
266266
COMMAND ${CMAKE_COMMAND} -E copy ${OUTPUT_FILE} ${directory}
267267
MAIN_DEPENDENCY ${SHADER_FILE_SLANG}
268268
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}

samples/api/hello_triangle_1_3/CMakeLists.txt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,11 @@ add_sample(
2727
NAME "Vulkan 1.3 Hello Triangle"
2828
DESCRIPTION "An introduction into Vulkan using Vulkan 1.3"
2929
SHADER_FILES_GLSL
30-
"hello_triangle_1_3/triangle.vert"
31-
"hello_triangle_1_3/triangle.frag")
30+
"hello_triangle_1_3/glsl/triangle.vert"
31+
"hello_triangle_1_3/glsl/triangle.frag"
32+
SHADER_FILES_HLSL
33+
"hello_triangle_1_3/hlsl/triangle.vert.hlsl"
34+
"hello_triangle_1_3/hlsl/triangle.frag.hlsl"
35+
SHADER_FILES_SLANG
36+
"hello_triangle_1_3/slang/triangle.vert.slang"
37+
"hello_triangle_1_3/slang/triangle.frag.slang")

samples/api/hello_triangle_1_3/hello_triangle_1_3.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,7 @@ void HelloTriangleV13::init_swapchain()
682682
* @param shader_stage The shader stage flag specifying the type of shader (e.g., VK_SHADER_STAGE_VERTEX_BIT).
683683
* @returns A VkShaderModule handle. Aborts execution if shader creation fails.
684684
*/
685-
VkShaderModule HelloTriangleV13::load_shader_module(const char *path, VkShaderStageFlagBits shader_stage)
685+
VkShaderModule HelloTriangleV13::load_shader_module(const std::string &path, VkShaderStageFlagBits shader_stage)
686686
{
687687
auto spirv = vkb::fs::read_shader_binary_u32(path);
688688

@@ -780,15 +780,31 @@ void HelloTriangleV13::init_pipeline()
780780
.pDynamicStates = dynamic_states.data()};
781781

782782
// Load our SPIR-V shaders.
783+
784+
// Samples support different shading languages, all of which are offline compiled to SPIR-V, the shader format that Vulkan uses.
785+
// The shading language to load for can be selected via command line
786+
std::string shader_folder{""};
787+
switch (get_shading_language())
788+
{
789+
case vkb::ShadingLanguage::HLSL:
790+
shader_folder = "hlsl";
791+
break;
792+
case vkb::ShadingLanguage::SLANG:
793+
shader_folder = "slang";
794+
break;
795+
default:
796+
shader_folder = "glsl";
797+
}
798+
783799
std::array<VkPipelineShaderStageCreateInfo, 2> shader_stages = {{
784800
{.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
785801
.stage = VK_SHADER_STAGE_VERTEX_BIT,
786-
.module = load_shader_module("hello_triangle_1_3/triangle.vert.spv", VK_SHADER_STAGE_VERTEX_BIT),
802+
.module = load_shader_module("hello_triangle_1_3/" + shader_folder + "/triangle.vert.spv", VK_SHADER_STAGE_VERTEX_BIT),
787803
.pName = "main"}, // Vertex shader stage
788804
{
789805
.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
790806
.stage = VK_SHADER_STAGE_FRAGMENT_BIT,
791-
.module = load_shader_module("hello_triangle_1_3/triangle.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT),
807+
.module = load_shader_module("hello_triangle_1_3/" + shader_folder + "/triangle.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT),
792808
.pName = "main"} // Fragment shader stage
793809
}};
794810

samples/api/hello_triangle_1_3/hello_triangle_1_3.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ class HelloTriangleV13 : public vkb::Application
154154

155155
void init_swapchain();
156156

157-
VkShaderModule load_shader_module(const char *path, VkShaderStageFlagBits shader_stage);
157+
VkShaderModule load_shader_module(const std::string &path, VkShaderStageFlagBits shader_stage);
158158

159159
void init_pipeline();
160160

samples/api/hpp_hello_triangle_1_3/CMakeLists.txt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,14 @@ add_sample(
2727
NAME "Vulkan 1.3 HPP Hello Triangle"
2828
DESCRIPTION "An introduction into Vulkan using Vulkan 1.3 using Vulkan-Hpp"
2929
SHADER_FILES_GLSL
30-
"hello_triangle_1_3/triangle.vert"
31-
"hello_triangle_1_3/triangle.frag")
30+
"hello_triangle_1_3/glsl/triangle.vert"
31+
"hello_triangle_1_3/glsl/triangle.frag"
32+
SHADER_FILES_HLSL
33+
"hello_triangle_1_3/hlsl/triangle.vert.hlsl"
34+
"hello_triangle_1_3/hlsl/triangle.frag.hlsl"
35+
SHADER_FILES_SLANG
36+
"hello_triangle_1_3/slang/triangle.vert.slang"
37+
"hello_triangle_1_3/slang/triangle.frag.slang")
3238

3339
if(${VKB_${FOLDER_NAME}})
3440
target_compile_definitions(${FOLDER_NAME} PUBLIC VULKAN_HPP_DISPATCH_LOADER_DYNAMIC=1)

samples/api/hpp_hello_triangle_1_3/hpp_hello_triangle_1_3.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -646,12 +646,28 @@ void HPPHelloTriangleV13::init_pipeline()
646646
.pDynamicStates = dynamic_states.data()};
647647

648648
// Load our SPIR-V shaders.
649+
650+
// Samples support different shading languages, all of which are offline compiled to SPIR-V, the shader format that Vulkan uses.
651+
// The shading language to load for can be selected via command line
652+
std::string shader_folder{""};
653+
switch (get_shading_language())
654+
{
655+
case vkb::ShadingLanguage::HLSL:
656+
shader_folder = "hlsl";
657+
break;
658+
case vkb::ShadingLanguage::SLANG:
659+
shader_folder = "slang";
660+
break;
661+
default:
662+
shader_folder = "glsl";
663+
}
664+
649665
std::array<vk::PipelineShaderStageCreateInfo, 2> shader_stages = {{
650666
{.stage = vk::ShaderStageFlagBits::eVertex,
651-
.module = load_shader_module("hello_triangle_1_3/triangle.vert.spv", vk::ShaderStageFlagBits::eVertex),
667+
.module = load_shader_module("hello_triangle_1_3/" + shader_folder + "/triangle.vert.spv", vk::ShaderStageFlagBits::eVertex),
652668
.pName = "main"}, // Vertex shader stage
653669
{.stage = vk::ShaderStageFlagBits::eFragment,
654-
.module = load_shader_module("hello_triangle_1_3/triangle.frag.spv", vk::ShaderStageFlagBits::eFragment),
670+
.module = load_shader_module("hello_triangle_1_3/" + shader_folder + "/triangle.frag.spv", vk::ShaderStageFlagBits::eFragment),
655671
.pName = "main"} // Fragment shader stage
656672
}};
657673

@@ -855,7 +871,7 @@ void HPPHelloTriangleV13::init_vertex_buffer()
855871
* @param shader_stage The shader stage flag specifying the type of shader (e.g., vk::ShaderStageFlagBits::eVertex).
856872
* @returns A VkShaderModule handle. Aborts execution if shader creation fails.
857873
*/
858-
vk::ShaderModule HPPHelloTriangleV13::load_shader_module(const char *path, vk::ShaderStageFlagBits shader_stage)
874+
vk::ShaderModule HPPHelloTriangleV13::load_shader_module(const std::string &path, vk::ShaderStageFlagBits shader_stage)
859875
{
860876
auto spirv = vkb::fs::read_shader_binary_u32(path);
861877

samples/api/hpp_hello_triangle_1_3/hpp_hello_triangle_1_3.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ class HPPHelloTriangleV13 : public vkb::Application
148148
void init_pipeline();
149149
void init_swapchain();
150150
void init_vertex_buffer();
151-
vk::ShaderModule load_shader_module(const char *path, vk::ShaderStageFlagBits shader_stage);
151+
vk::ShaderModule load_shader_module(const std::string &path, vk::ShaderStageFlagBits shader_stage);
152152
vk::Result present_image(uint32_t index);
153153
void render_triangle(uint32_t swapchain_index);
154154
void select_physical_device_and_surface(vkb::Window *window);

samples/extensions/dynamic_rendering/CMakeLists.txt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2020-2024, Holochip Corporation
1+
# Copyright (c) 2020-2025, Holochip Corporation
22
#
33
# SPDX-License-Identifier: Apache-2.0
44
#
@@ -30,4 +30,7 @@ add_sample(
3030
"dynamic_rendering/glsl/gbuffer.frag"
3131
SHADER_FILES_HLSL
3232
"dynamic_rendering/hlsl/gbuffer.vert.hlsl"
33-
"dynamic_rendering/hlsl/gbuffer.frag.hlsl")
33+
"dynamic_rendering/hlsl/gbuffer.frag.hlsl"
34+
SHADER_FILES_SLANG
35+
"dynamic_rendering/slang/gbuffer.vert.slang"
36+
"dynamic_rendering/slang/gbuffer.frag.slang")

samples/extensions/dynamic_rendering_local_read/CMakeLists.txt

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2024, Sascha Willems
1+
# Copyright (c) 2024-2025, Sascha Willems
22
#
33
# SPDX-License-Identifier: Apache-2.0
44
#
@@ -26,9 +26,23 @@ add_sample(
2626
NAME "Dynamic Rendering local reads"
2727
DESCRIPTION "Demonstrates the dynamic rendering local read extension to use input attachments with dynamic rendering"
2828
SHADER_FILES_GLSL
29-
"dynamic_rendering_local_read/composition.frag"
30-
"dynamic_rendering_local_read/composition.vert"
31-
"dynamic_rendering_local_read/scene_opaque.vert"
32-
"dynamic_rendering_local_read/scene_opaque.frag"
33-
"dynamic_rendering_local_read/scene_transparent.vert"
34-
"dynamic_rendering_local_read/scene_transparent.frag")
29+
"dynamic_rendering_local_read/glsl/composition.frag"
30+
"dynamic_rendering_local_read/glsl/composition.vert"
31+
"dynamic_rendering_local_read/glsl/scene_opaque.vert"
32+
"dynamic_rendering_local_read/glsl/scene_opaque.frag"
33+
"dynamic_rendering_local_read/glsl/scene_transparent.vert"
34+
"dynamic_rendering_local_read/glsl/scene_transparent.frag"
35+
SHADER_FILES_HLSL
36+
"dynamic_rendering_local_read/hlsl/composition.frag.hlsl"
37+
"dynamic_rendering_local_read/hlsl/composition.vert.hlsl"
38+
"dynamic_rendering_local_read/hlsl/scene_opaque.vert.hlsl"
39+
"dynamic_rendering_local_read/hlsl/scene_opaque.frag.hlsl"
40+
"dynamic_rendering_local_read/hlsl/scene_transparent.vert.hlsl"
41+
"dynamic_rendering_local_read/hlsl/scene_transparent.frag.hlsl"
42+
SHADER_FILES_SLANG
43+
"dynamic_rendering_local_read/slang/composition.frag.slang"
44+
"dynamic_rendering_local_read/slang/composition.vert.slang"
45+
"dynamic_rendering_local_read/slang/scene_opaque.vert.slang"
46+
"dynamic_rendering_local_read/slang/scene_opaque.frag.slang"
47+
"dynamic_rendering_local_read/slang/scene_transparent.vert.slang"
48+
"dynamic_rendering_local_read/slang/scene_transparent.frag.slang")

samples/extensions/dynamic_rendering_local_read/dynamic_rendering_local_read.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ DynamicRenderingLocalRead::DynamicRenderingLocalRead()
3838
// To simplify barrier setup used for dynamic rendering, we use sync2
3939
add_device_extension(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
4040

41+
// Slang shaders require additional extensions to be enabled
42+
if (get_shading_language() == vkb::ShadingLanguage::SLANG)
43+
{
44+
add_device_extension(VK_KHR_FORMAT_FEATURE_FLAGS_2_EXTENSION_NAME);
45+
add_device_extension(VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME);
46+
}
47+
4148
// Dynamic rendering doesn't use render passes
4249
// To make sure that framework related classes like the user interface are aware of this, we explicitly st the base class' renderpass to a null handle
4350
render_pass = VK_NULL_HANDLE;
@@ -692,8 +699,8 @@ void DynamicRenderingLocalRead::prepare_pipelines()
692699
pipeline_create_info.subpass = 0;
693700
#endif
694701

695-
shader_stages[0] = load_shader("dynamic_rendering_local_read/scene_opaque.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
696-
shader_stages[1] = load_shader("dynamic_rendering_local_read/scene_opaque.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
702+
shader_stages[0] = load_shader("dynamic_rendering_local_read", "scene_opaque.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
703+
shader_stages[1] = load_shader("dynamic_rendering_local_read", "scene_opaque.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
697704
VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &scene_opaque_pass.pipeline));
698705

699706
/*
@@ -731,8 +738,8 @@ void DynamicRenderingLocalRead::prepare_pipelines()
731738
pipeline_create_info.subpass = 2;
732739
#endif
733740

734-
shader_stages[0] = load_shader("dynamic_rendering_local_read/scene_transparent.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
735-
shader_stages[1] = load_shader("dynamic_rendering_local_read/scene_transparent.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
741+
shader_stages[0] = load_shader("dynamic_rendering_local_read", "scene_transparent.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
742+
shader_stages[1] = load_shader("dynamic_rendering_local_read", "scene_transparent.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
736743
VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &scene_transparent_pass.pipeline));
737744

738745
/*
@@ -771,8 +778,8 @@ void DynamicRenderingLocalRead::prepare_pipelines()
771778
empty_vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
772779
pipeline_create_info.pVertexInputState = &empty_vertex_input_state;
773780

774-
shader_stages[0] = load_shader("dynamic_rendering_local_read/composition.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
775-
shader_stages[1] = load_shader("dynamic_rendering_local_read/composition.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
781+
shader_stages[0] = load_shader("dynamic_rendering_local_read", "composition.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
782+
shader_stages[1] = load_shader("dynamic_rendering_local_read", "composition.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
776783
VK_CHECK(vkCreateGraphicsPipelines(get_device().get_handle(), pipeline_cache, 1, &pipeline_create_info, nullptr, &composition_pass.pipeline));
777784
}
778785

0 commit comments

Comments
 (0)