99
1010#include < lvk/vulkan/VulkanClasses.h>
1111
12+ // Bilingual: GLSL (default) and Slang. Define the macro LVK_DEMO_WITH_SLANG to switch to Slang.
13+
14+ const char * codeTriangleSlang = R"(
15+ struct PushConstants {
16+ float time;
17+ };
18+
19+ [[vk::push_constant]] PushConstants pc;
20+
21+ static const float2 pos[3] = {
22+ float2(-0.6, -0.6),
23+ float2( 0.6, -0.6),
24+ float2( 0.0, 0.6)
25+ };
26+
27+ struct FragmentOutput {
28+ float4 color0 : SV_Target0;
29+ float4 color1 : SV_Target1;
30+ float4 color2 : SV_Target2;
31+ float4 color3 : SV_Target3;
32+ float4 color4 : SV_Target4;
33+ float4 color5 : SV_Target5;
34+ };
35+
36+ [shader("vertex")]
37+ float4 vertexMain(uint vertexID : SV_VertexID) : SV_Position {
38+ return float4(pos[vertexID] * (1.5 + sin(pc.time)) * 0.5, 0.0, 1.0);
39+ }
40+
41+ [shader("fragment")]
42+ FragmentOutput fragmentMain() {
43+ return {
44+ float4(1.0, 0.0, 0.0, 1.0),
45+ float4(0.0, 1.0, 0.0, 1.0),
46+ float4(0.0, 0.0, 1.0, 1.0),
47+ float4(1.0, 0.0, 1.0, 1.0),
48+ float4(1.0, 1.0, 0.0, 1.0),
49+ float4(0.0, 1.0, 1.0, 1.0),
50+ };
51+ }
52+ )" ;
53+
1254const char * codeTriangleVS = R"(
1355#version 460
1456const vec2 pos[3] = vec2[3](
15- vec2(-0.6, -0.6),
16- vec2( 0.6, -0.6),
17- vec2( 0.0, 0.6)
57+ vec2(-0.6, -0.6),
58+ vec2( 0.6, -0.6),
59+ vec2( 0.0, 0.6)
1860);
1961layout(push_constant) uniform constants {
2062 float time;
2163} pc;
2264
2365void main() {
24- gl_Position = vec4(pos[gl_VertexIndex] * (1.5 + sin(pc.time)) * 0.5, 0.0, 1.0);
66+ gl_Position = vec4(pos[gl_VertexIndex] * (1.5 + sin(pc.time)) * 0.5, 0.0, 1.0);
2567}
2668)" ;
2769
@@ -44,13 +86,55 @@ void main() {
4486};
4587)" ;
4688
89+ const char * codeSlang = R"(
90+ struct VertexStageOutput {
91+ float4 sv_Position : SV_Position;
92+ float3 dir : COLOR0;
93+ nointerpolation uint textureId : TEXTUREID;
94+ };
95+
96+ struct PushConstants {
97+ float4x4 mvp;
98+ uint texture0;
99+ };
100+
101+ [[vk::push_constant]] PushConstants pc;
102+
103+ static const float3 vertices[8] = {
104+ float3(-1.0, -1.0, 1.0), float3( 1.0, -1.0, 1.0),
105+ float3( 1.0, 1.0, 1.0), float3(-1.0, 1.0, 1.0),
106+ float3(-1.0, -1.0, -1.0), float3( 1.0, -1.0, -1.0),
107+ float3( 1.0, 1.0, -1.0), float3(-1.0, 1.0, -1.0)
108+ };
109+
110+ [shader("vertex")]
111+ VertexStageOutput vertexMain(uint vertexID : SV_VertexID) {
112+ VertexStageOutput out;
113+ float3 v = vertices[vertexID];
114+ out.sv_Position = mul(float4(v, 1.0), pc.mvp);
115+ out.dir = v;
116+ out.textureId = pc.texture0;
117+ return out;
118+ }
119+
120+ struct PSInput {
121+ float3 dir : COLOR0;
122+ nointerpolation uint textureId : TEXTUREID;
123+ };
124+
125+ [shader("fragment")]
126+ float4 fragmentMain(PSInput input) {
127+ return textureBindlessCube(input.textureId, 0, normalize(input.dir));
128+ }
129+ )" ;
130+
47131const char * codeVS = R"(
48132layout (location=0) out vec3 dir;
49133layout (location=1) out flat uint textureId;
50134
51135const vec3 vertices[8] = vec3[8](
52- vec3(-1.0,-1.0, 1.0), vec3( 1.0,-1.0, 1.0), vec3( 1.0, 1.0, 1.0), vec3(-1.0, 1.0, 1.0),
53- vec3(-1.0,-1.0,-1.0), vec3( 1.0,-1.0,-1.0), vec3( 1.0, 1.0,-1.0), vec3(-1.0, 1.0,-1.0)
136+ vec3(-1.0,-1.0, 1.0), vec3( 1.0,-1.0, 1.0), vec3( 1.0, 1.0, 1.0), vec3(-1.0, 1.0, 1.0),
137+ vec3(-1.0,-1.0,-1.0), vec3( 1.0,-1.0,-1.0), vec3( 1.0, 1.0,-1.0), vec3(-1.0, 1.0,-1.0)
54138);
55139
56140layout(push_constant) uniform constants {
@@ -112,12 +196,21 @@ VULKAN_APP_MAIN {
112196 .debugName = " CubeMap" ,
113197 });
114198
199+ #if defined(LVK_DEMO_WITH_SLANG)
200+ lvk::Holder<lvk::ShaderModuleHandle> vert_ = ctx->createShaderModule ({codeSlang, lvk::Stage_Vert, " Shader Module: main (vert)" });
201+ lvk::Holder<lvk::ShaderModuleHandle> frag_ = ctx->createShaderModule ({codeSlang, lvk::Stage_Frag, " Shader Module: main (frag)" });
202+ lvk::Holder<lvk::ShaderModuleHandle> vertTriangle_ =
203+ ctx->createShaderModule ({codeTriangleSlang, lvk::Stage_Vert, " Shader Module: triangle (vert)" });
204+ lvk::Holder<lvk::ShaderModuleHandle> fragTriangle_ =
205+ ctx->createShaderModule ({codeTriangleSlang, lvk::Stage_Frag, " Shader Module: triangle (frag)" });
206+ #else
115207 lvk::Holder<lvk::ShaderModuleHandle> vert_ = ctx->createShaderModule ({codeVS, lvk::Stage_Vert, " Shader Module: main (vert)" });
116208 lvk::Holder<lvk::ShaderModuleHandle> frag_ = ctx->createShaderModule ({codeFS, lvk::Stage_Frag, " Shader Module: main (frag)" });
117209 lvk::Holder<lvk::ShaderModuleHandle> vertTriangle_ =
118210 ctx->createShaderModule ({codeTriangleVS, lvk::Stage_Vert, " Shader Module: triangle (vert)" });
119211 lvk::Holder<lvk::ShaderModuleHandle> fragTriangle_ =
120212 ctx->createShaderModule ({codeTriangleFS, lvk::Stage_Frag, " Shader Module: triangle (frag)" });
213+ #endif // defined(LVK_DEMO_WITH_SLANG)
121214
122215 lvk::Holder<lvk::RenderPipelineHandle> renderPipelineState_Mesh_ = ctx->createRenderPipeline ({
123216 .smVert = vert_,
0 commit comments